/ Hex Artifact Content
Login

Artifact 5b9243a33726008cc4132897d2be371db12a13be:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 49 4e 53 45 52 54 20 73   handle INSERT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
0210: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 0a 2a  ode that will .*
0220: 2a 0a 2a 2a 20 20 20 28 31 29 20 61 63 71 75 69  *.**   (1) acqui
0230: 72 65 20 61 20 6c 6f 63 6b 20 66 6f 72 20 74 61  re a lock for ta
0240: 62 6c 65 20 70 54 61 62 20 74 68 65 6e 0a 2a 2a  ble pTab then.**
0250: 20 20 20 28 32 29 20 6f 70 65 6e 20 70 54 61 62     (2) open pTab
0260: 20 61 73 20 63 75 72 73 6f 72 20 69 43 75 72 2e   as cursor iCur.
0270: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 20 69  .**.** If pTab i
0280: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
0290: 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 74  D table, then it
02a0: 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
02b0: 4b 45 59 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72  KEY index.** for
02c0: 20 74 68 61 74 20 74 61 62 6c 65 20 74 68 61 74   that table that
02d0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 6f 70 65   is actually ope
02e0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
02f0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 0a 20  ite3OpenTable(. 
0300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0310: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
0320: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
0330: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
0340: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
0350: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
0360: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
0370: 20 69 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   iDb,        /* 
0380: 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
0390: 65 78 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44  ex in sqlite3.aD
03a0: 62 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  b[] */.  Table *
03b0: 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
03c0: 74 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e  table to be open
03d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  ed */.  int opco
03e0: 64 65 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70  de      /* OP_Op
03f0: 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
0400: 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20 56  nWrite */.){.  V
0410: 64 62 65 20 2a 76 3b 0a 20 20 61 73 73 65 72 74  dbe *v;.  assert
0420: 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
0430: 62 29 20 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  b) );.  v = sqli
0440: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0450: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  e);.  assert( op
0460: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
0470: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
0480: 5f 4f 70 65 6e 52 65 61 64 20 29 3b 0a 20 20 73  _OpenRead );.  s
0490: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
04a0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
04b0: 62 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20  b->tnum, .      
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70               (op
04d0: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
04e0: 74 65 29 3f 31 3a 30 2c 20 70 54 61 62 2d 3e 7a  te)?1:0, pTab->z
04f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 48 61 73  Name);.  if( Has
0500: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
0510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0520: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 63 6f 64  dOp4Int(v, opcod
0530: 65 2c 20 69 43 75 72 2c 20 70 54 61 62 2d 3e 74  e, iCur, pTab->t
0540: 6e 75 6d 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  num, iDb, pTab->
0550: 6e 43 6f 6c 29 3b 0a 20 20 20 20 56 64 62 65 43  nCol);.    VdbeC
0560: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
0570: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
0580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
0590: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
05a0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
05b0: 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65  (pTab);.    asse
05c0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
05d0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 74    assert( pPk->t
05e0: 6e 75 6d 3d 70 54 61 62 2d 3e 74 6e 75 6d 20 29  num=pTab->tnum )
05f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0600: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 63 6f 64  eAddOp3(v, opcod
0610: 65 2c 20 69 43 75 72 2c 20 70 50 6b 2d 3e 74 6e  e, iCur, pPk->tn
0620: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
0630: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
0640: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50  yInfo(pParse, pP
0650: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  k);.    VdbeComm
0660: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
0670: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
0680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0690: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
06a0: 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
06b0: 79 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  y string associa
06c0: 74 65 64 20 77 69 74 68 20 69 6e 64 65 78 0a 2a  ted with index.*
06d0: 2a 20 70 49 64 78 2e 20 41 20 63 6f 6c 75 6d 6e  * pIdx. A column
06e0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
06f0: 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61 63 74   has one charact
0700: 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  er for each colu
0710: 6d 6e 20 69 6e 20 0a 2a 2a 20 74 68 65 20 74 61  mn in .** the ta
0720: 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ble, according t
0730: 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  o the affinity o
0740: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 3a 0a 2a 2a  f the column:.**
0750: 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72 20 20  .**  Character  
0760: 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e      Column affin
0770: 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ity.**  --------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 41 27 20 20  ------.**  'A'  
07a0: 20 20 20 20 20 20 20 20 20 20 4e 4f 4e 45 0a 2a            NONE.*
07b0: 2a 20 20 27 42 27 20 20 20 20 20 20 20 20 20 20  *  'B'          
07c0: 20 20 54 45 58 54 0a 2a 2a 20 20 27 43 27 20 20    TEXT.**  'C'  
07d0: 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45 52 49            NUMERI
07e0: 43 0a 2a 2a 20 20 27 44 27 20 20 20 20 20 20 20  C.**  'D'       
07f0: 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a 2a 20       INTEGER.** 
0800: 20 27 46 27 20 20 20 20 20 20 20 20 20 20 20 20   'F'            
0810: 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  REAL.**.** An ex
0820: 74 72 61 20 27 44 27 20 69 73 20 61 70 70 65 6e  tra 'D' is appen
0830: 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ded to the end o
0840: 66 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  f the string to 
0850: 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 72 6f 77  cover the.** row
0860: 69 64 20 74 68 61 74 20 61 70 70 65 61 72 73 20  id that appears 
0870: 61 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  as the last colu
0880: 6d 6e 20 69 6e 20 65 76 65 72 79 20 69 6e 64 65  mn in every inde
0890: 78 2e 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  x..**.** Memory 
08a0: 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20 63  for the buffer c
08b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
08c0: 6c 75 6d 6e 20 69 6e 64 65 78 20 61 66 66 69 6e  lumn index affin
08d0: 69 74 79 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ity string.** is
08e0: 20 6d 61 6e 61 67 65 64 20 61 6c 6f 6e 67 20 77   managed along w
08f0: 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ith the rest of 
0900: 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
0910: 75 72 65 2e 20 49 74 20 77 69 6c 6c 20 62 65 0a  ure. It will be.
0920: 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65 6e  ** released when
0930: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
0940: 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  dex() is called.
0950: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
0960: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
0970: 6e 69 74 79 53 74 72 28 56 64 62 65 20 2a 76 2c  nityStr(Vdbe *v,
0980: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
0990: 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c   if( !pIdx->zCol
09a0: 41 66 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Aff ){.    /* Th
09b0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 63  e first time a c
09c0: 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
09d0: 74 72 69 6e 67 20 66 6f 72 20 61 20 70 61 72 74  tring for a part
09e0: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 69 73 0a  icular index is.
09f0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c      ** required,
0a00: 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
0a10: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 68   and populated h
0a20: 65 72 65 2e 20 49 74 20 69 73 20 74 68 65 6e 20  ere. It is then 
0a30: 73 74 6f 72 65 64 20 61 73 0a 20 20 20 20 2a 2a  stored as.    **
0a40: 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65   a member of the
0a50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
0a60: 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
0a70: 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
0a80: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ** The column af
0a90: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 77 69  finity string wi
0aa0: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ll eventually be
0ab0: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 20 20   deleted by.    
0ac0: 2a 2a 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  ** sqliteDeleteI
0ad0: 6e 64 65 78 28 29 20 77 68 65 6e 20 74 68 65 20  ndex() when the 
0ae0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
0af0: 69 74 73 65 6c 66 20 69 73 20 63 6c 65 61 6e 65  itself is cleane
0b00: 64 0a 20 20 20 20 2a 2a 20 75 70 2e 0a 20 20 20  d.    ** up..   
0b10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   */.    int n;. 
0b20: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
0b30: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
0b40: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
0b50: 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76   sqlite3VdbeDb(v
0b60: 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f  );.    pIdx->zCo
0b70: 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a 29 73  lAff = (char *)s
0b80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
0b90: 77 28 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  w(0, pIdx->nColu
0ba0: 6d 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 21  mn+1);.    if( !
0bb0: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
0bc0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
0bd0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
0be0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0bf0: 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20   }.    for(n=0; 
0c00: 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  n<pIdx->nColumn;
0c10: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   n++){.      i16
0c20: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
0c30: 75 6d 6e 5b 6e 5d 3b 0a 20 20 20 20 20 20 70 49  umn[n];.      pI
0c40: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d  dx->zColAff[n] =
0c50: 20 78 3c 30 20 3f 20 53 51 4c 49 54 45 5f 41 46   x<0 ? SQLITE_AF
0c60: 46 5f 49 4e 54 45 47 45 52 20 3a 20 70 54 61 62  F_INTEGER : pTab
0c70: 2d 3e 61 43 6f 6c 5b 78 5d 2e 61 66 66 69 6e 69  ->aCol[x].affini
0c80: 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ty;.    }.    pI
0c90: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d  dx->zColAff[n] =
0ca0: 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 72 65 74 75   0;.  }. .  retu
0cb0: 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  rn pIdx->zColAff
0cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
0cd0: 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
0ce0: 73 74 72 69 6e 67 20 66 6f 72 20 74 61 62 6c 65  string for table
0cf0: 20 70 54 61 62 2c 20 69 66 20 69 74 20 68 61 73   pTab, if it has
0d00: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
0d10: 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 20 20  n.** computed.  
0d20: 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
0d30: 6f 6e 2c 20 6f 6d 69 74 20 74 72 61 69 6c 69 6e  on, omit trailin
0d40: 67 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  g SQLITE_AFF_NON
0d50: 45 20 61 66 66 69 6e 69 74 69 65 73 2e 0a 2a 2a  E affinities..**
0d60: 0a 2a 2a 20 49 66 20 74 68 65 20 61 66 66 69 6e  .** If the affin
0d70: 69 74 79 20 65 78 69 73 74 73 20 28 69 66 20 69  ity exists (if i
0d80: 74 20 69 73 20 6e 6f 20 65 6e 74 69 72 65 6c 79  t is no entirely
0d90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
0da0: 20 76 61 6c 75 65 73 29 20 61 6e 64 0a 2a 2a 20   values) and.** 
0db0: 69 66 20 69 52 65 67 3e 30 20 74 68 65 6e 20 63  if iReg>0 then c
0dc0: 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
0dd0: 74 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77  ty opcode that w
0de0: 69 6c 6c 20 73 65 74 20 74 68 65 20 61 66 66 69  ill set the affi
0df0: 6e 69 74 69 65 73 0a 2a 2a 20 66 6f 72 20 72 65  nities.** for re
0e00: 67 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20  gister iReg and 
0e10: 66 6f 6c 6c 6f 77 69 6e 67 2e 20 20 4f 72 20 69  following.  Or i
0e20: 66 20 61 66 66 69 6e 69 74 69 65 73 20 65 78 69  f affinities exi
0e30: 73 74 73 20 61 6e 64 20 69 52 65 67 3d 3d 30 2c  sts and iReg==0,
0e40: 0a 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 73 65  .** then just se
0e50: 74 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  t the P4 operand
0e60: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
0e70: 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68 20 73   opcode (which s
0e80: 68 6f 75 6c 64 20 20 62 65 0a 2a 2a 20 61 6e 20  hould  be.** an 
0e90: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 29 20 74  OP_MakeRecord) t
0ea0: 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  o the affinity s
0eb0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  tring..**.** A c
0ec0: 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
0ed0: 74 72 69 6e 67 20 68 61 73 20 6f 6e 65 20 63 68  tring has one ch
0ee0: 61 72 61 63 74 65 72 20 70 65 72 20 63 6f 6c 75  aracter per colu
0ef0: 6d 6e 3a 0a 2a 2a 0a 2a 2a 20 20 43 68 61 72 61  mn:.**.**  Chara
0f00: 63 74 65 72 20 20 20 20 20 20 43 6f 6c 75 6d 6e  cter      Column
0f10: 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 20 2d 2d   affinity.**  --
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
0f40: 20 27 41 27 20 20 20 20 20 20 20 20 20 20 20 20   'A'            
0f50: 4e 4f 4e 45 0a 2a 2a 20 20 27 42 27 20 20 20 20  NONE.**  'B'    
0f60: 20 20 20 20 20 20 20 20 54 45 58 54 0a 2a 2a 20          TEXT.** 
0f70: 20 27 43 27 20 20 20 20 20 20 20 20 20 20 20 20   'C'            
0f80: 4e 55 4d 45 52 49 43 0a 2a 2a 20 20 27 44 27 20  NUMERIC.**  'D' 
0f90: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 47             INTEG
0fa0: 45 52 0a 2a 2a 20 20 27 45 27 20 20 20 20 20 20  ER.**  'E'      
0fb0: 20 20 20 20 20 20 52 45 41 4c 0a 2a 2f 0a 76 6f        REAL.*/.vo
0fc0: 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41  id sqlite3TableA
0fd0: 66 66 69 6e 69 74 79 28 56 64 62 65 20 2a 76 2c  ffinity(Vdbe *v,
0fe0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
0ff0: 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1000: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 41 66  ;.  char *zColAf
1010: 66 20 3d 20 70 54 61 62 2d 3e 7a 43 6f 6c 41 66  f = pTab->zColAf
1020: 66 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 41 66 66  f;.  if( zColAff
1030: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1040: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
1050: 56 64 62 65 44 62 28 76 29 3b 0a 20 20 20 20 7a  VdbeDb(v);.    z
1060: 43 6f 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a  ColAff = (char *
1070: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1080: 52 61 77 28 30 2c 20 70 54 61 62 2d 3e 6e 43 6f  Raw(0, pTab->nCo
1090: 6c 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  l+1);.    if( !z
10a0: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ColAff ){.      
10b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
10d0: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  rn;.    }..    f
10e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
10f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1100: 20 20 7a 43 6f 6c 41 66 66 5b 69 5d 20 3d 20 70    zColAff[i] = p
1110: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66  Tab->aCol[i].aff
1120: 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  inity;.    }.   
1130: 20 64 6f 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 41   do{.      zColA
1140: 66 66 5b 69 2d 2d 5d 20 3d 20 30 3b 0a 20 20 20  ff[i--] = 0;.   
1150: 20 7d 77 68 69 6c 65 28 20 69 3e 3d 30 20 26 26   }while( i>=0 &&
1160: 20 7a 43 6f 6c 41 66 66 5b 69 5d 3d 3d 53 51 4c   zColAff[i]==SQL
1170: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a  ITE_AFF_NONE );.
1180: 20 20 20 20 70 54 61 62 2d 3e 7a 43 6f 6c 41 66      pTab->zColAf
1190: 66 20 3d 20 7a 43 6f 6c 41 66 66 3b 0a 20 20 7d  f = zColAff;.  }
11a0: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74  .  i = sqlite3St
11b0: 72 6c 65 6e 33 30 28 7a 43 6f 6c 41 66 66 29 3b  rlen30(zColAff);
11c0: 0a 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20  .  if( i ){.    
11d0: 69 66 28 20 69 52 65 67 20 29 7b 0a 20 20 20 20  if( iReg ){.    
11e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f0: 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1200: 74 79 2c 20 69 52 65 67 2c 20 69 2c 20 30 2c 20  ty, iReg, i, 0, 
1210: 7a 43 6f 6c 41 66 66 2c 20 69 29 3b 0a 20 20 20  zColAff, i);.   
1220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1230: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1240: 34 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 41 66 66  4(v, -1, zColAff
1250: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1260: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1270: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
1280: 74 61 62 6c 65 20 70 54 61 62 20 69 6e 20 64 61  table pTab in da
1290: 74 61 62 61 73 65 20 69 44 62 20 6f 72 20 61 6e  tabase iDb or an
12a0: 79 20 6f 66 20 69 74 73 20 69 6e 64 69 63 65 73  y of its indices
12b0: 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 70  .** have been op
12c0: 65 6e 65 64 20 61 74 20 61 6e 79 20 70 6f 69 6e  ened at any poin
12d0: 74 20 69 6e 20 74 68 65 20 56 44 42 45 20 70 72  t in the VDBE pr
12e0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 69 73 20 75  ogram. This is u
12f0: 73 65 64 20 74 6f 20 73 65 65 20 69 66 20 0a 2a  sed to see if .*
1300: 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 66  * a statement of
1310: 20 74 68 65 20 66 6f 72 6d 20 20 22 49 4e 53 45   the form  "INSE
1320: 52 54 20 49 4e 54 4f 20 3c 69 44 62 2c 20 70 54  RT INTO <iDb, pT
1330: 61 62 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20  ab> SELECT ..." 
1340: 63 61 6e 20 0a 2a 2a 20 72 75 6e 20 77 69 74 68  can .** run with
1350: 6f 75 74 20 75 73 69 6e 67 20 61 20 74 65 6d 70  out using a temp
1360: 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72 20  orary table for 
1370: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
1380: 68 65 20 53 45 4c 45 43 54 2e 20 0a 2a 2f 0a 73  he SELECT. .*/.s
1390: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 73 54  tatic int readsT
13a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
13b0: 6e 74 20 69 44 62 2c 20 54 61 62 6c 65 20 2a 70  nt iDb, Table *p
13c0: 54 61 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Tab){.  Vdbe *v 
13d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13e0: 28 70 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  (p);.  int i;.  
13f0: 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  int iEnd = sqlit
1400: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1410: 72 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(v);.#ifndef SQ
1420: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1430: 4c 54 41 42 4c 45 0a 20 20 56 54 61 62 6c 65 20  LTABLE.  VTable 
1440: 2a 70 56 54 61 62 20 3d 20 49 73 56 69 72 74 75  *pVTab = IsVirtu
1450: 61 6c 28 70 54 61 62 29 20 3f 20 73 71 6c 69 74  al(pTab) ? sqlit
1460: 65 33 47 65 74 56 54 61 62 6c 65 28 70 2d 3e 64  e3GetVTable(p->d
1470: 62 2c 20 70 54 61 62 29 20 3a 20 30 3b 0a 23 65  b, pTab) : 0;.#e
1480: 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  ndif..  for(i=1;
1490: 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20   i<iEnd; i++){. 
14a0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
14b0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
14c0: 70 28 76 2c 20 69 29 3b 0a 20 20 20 20 61 73 73  p(v, i);.    ass
14d0: 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20  ert( pOp!=0 );. 
14e0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
14f0: 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20  de==OP_OpenRead 
1500: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 69 44 62 20  && pOp->p3==iDb 
1510: 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
1520: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
1530: 74 20 74 6e 75 6d 20 3d 20 70 4f 70 2d 3e 70 32  t tnum = pOp->p2
1540: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 6e 75 6d  ;.      if( tnum
1550: 3d 3d 70 54 61 62 2d 3e 74 6e 75 6d 20 29 7b 0a  ==pTab->tnum ){.
1560: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1580: 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1590: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
15a0: 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
15b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
15c0: 69 66 28 20 74 6e 75 6d 3d 3d 70 49 6e 64 65 78  if( tnum==pIndex
15d0: 2d 3e 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20 20  ->tnum ){.      
15e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1600: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1610: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1620: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70  LTABLE.    if( p
1630: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  Op->opcode==OP_V
1640: 4f 70 65 6e 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Open && pOp->p4.
1650: 70 56 74 61 62 3d 3d 70 56 54 61 62 20 29 7b 0a  pVtab==pVTab ){.
1660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1670: 70 2d 3e 70 34 2e 70 56 74 61 62 21 3d 30 20 29  p->p4.pVtab!=0 )
1680: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1690: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
16a0: 56 54 41 42 20 29 3b 0a 20 20 20 20 20 20 72 65  VTAB );.      re
16b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 23 65  turn 1;.    }.#e
16c0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
16d0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
16e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16f0: 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  INCREMENT./*.** 
1700: 4c 6f 63 61 74 65 20 6f 72 20 63 72 65 61 74 65  Locate or create
1710: 20 61 6e 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20   an AutoincInfo 
1720: 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1730: 61 74 65 64 20 77 69 74 68 20 74 61 62 6c 65 20  ated with table 
1740: 70 54 61 62 0a 2a 2a 20 77 68 69 63 68 20 69 73  pTab.** which is
1750: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
1760: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1770: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 66 6f  gister number fo
1780: 72 20 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a  r the register.*
1790: 2a 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  * that holds the
17a0: 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 2e 0a   maximum rowid..
17b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
17c0: 74 20 6d 6f 73 74 20 6f 6e 65 20 41 75 74 6f 69  t most one Autoi
17d0: 6e 63 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ncInfo structure
17e0: 20 70 65 72 20 74 61 62 6c 65 20 65 76 65 6e 20   per table even 
17f0: 69 66 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74  if the.** same t
1800: 61 62 6c 65 20 69 73 20 61 75 74 6f 69 6e 63 72  able is autoincr
1810: 65 6d 65 6e 74 65 64 20 6d 75 6c 74 69 70 6c 65  emented multiple
1820: 20 74 69 6d 65 73 20 64 75 65 20 74 6f 20 69 6e   times due to in
1830: 73 65 72 74 73 20 77 69 74 68 69 6e 0a 2a 2a 20  serts within.** 
1840: 74 72 69 67 67 65 72 73 2e 20 20 41 20 6e 65 77  triggers.  A new
1850: 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72   AutoincInfo str
1860: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
1870: 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1880: 0a 2a 2a 20 66 69 72 73 74 20 75 73 65 20 6f 66  .** first use of
1890: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 4f 6e   table pTab.  On
18a0: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
18b0: 65 6e 74 20 75 73 65 73 2c 20 74 68 65 20 6f 72  ent uses, the or
18c0: 69 67 69 6e 61 6c 0a 2a 2a 20 41 75 74 6f 69 6e  iginal.** Autoin
18d0: 63 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  cInfo structure 
18e0: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
18f0: 68 72 65 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  hree memory loca
1900: 74 69 6f 6e 73 20 61 72 65 20 61 6c 6c 6f 63 61  tions are alloca
1910: 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ted:.**.**   (1)
1920: 20 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f    Register to ho
1930: 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
1940: 68 65 20 70 54 61 62 20 74 61 62 6c 65 2e 0a 2a  he pTab table..*
1950: 2a 20 20 20 28 32 29 20 20 52 65 67 69 73 74 65  *   (2)  Registe
1960: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
1970: 78 69 6d 75 6d 20 52 4f 57 49 44 20 6f 66 20 70  ximum ROWID of p
1980: 54 61 62 2e 0a 2a 2a 20 20 20 28 33 29 20 20 52  Tab..**   (3)  R
1990: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
19a0: 74 68 65 20 72 6f 77 69 64 20 69 6e 20 73 71 6c  the rowid in sql
19b0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 6f 66 20  ite_sequence of 
19c0: 70 54 61 62 0a 2a 2a 0a 2a 2a 20 54 68 65 20 32  pTab.**.** The 2
19d0: 6e 64 20 72 65 67 69 73 74 65 72 20 69 73 20 74  nd register is t
19e0: 68 65 20 6f 6e 65 20 74 68 61 74 20 69 73 20 72  he one that is r
19f0: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 69  eturned.  That i
1a00: 73 20 61 6c 6c 20 74 68 65 0a 2a 2a 20 69 6e 73  s all the.** ins
1a10: 65 72 74 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  ert routine need
1a20: 73 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 2e  s to know about.
1a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a40: 75 74 6f 49 6e 63 42 65 67 69 6e 28 0a 20 20 50  utoIncBegin(.  P
1a50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a60: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1a70: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
1a80: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db,            /
1a90: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
1aa0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1ab0: 70 54 61 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20  pTab */.  Table 
1ac0: 2a 70 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a  *pTab         /*
1ad0: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
1ae0: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 2a 2f 0a  e writing to */.
1af0: 29 7b 0a 20 20 69 6e 74 20 6d 65 6d 49 64 20 3d  ){.  int memId =
1b00: 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69   0;      /* Regi
1b10: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6d 61 78  ster holding max
1b20: 69 6d 75 6d 20 72 6f 77 69 64 20 2a 2f 0a 20 20  imum rowid */.  
1b30: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
1b40: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
1b50: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 50 61 72  ement ){.    Par
1b60: 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1b70: 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1b80: 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1b90: 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70    AutoincInfo *p
1ba0: 49 6e 66 6f 3b 0a 0a 20 20 20 20 70 49 6e 66 6f  Info;..    pInfo
1bb0: 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41   = pToplevel->pA
1bc0: 69 6e 63 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  inc;.    while( 
1bd0: 70 49 6e 66 6f 20 26 26 20 70 49 6e 66 6f 2d 3e  pInfo && pInfo->
1be0: 70 54 61 62 21 3d 70 54 61 62 20 29 7b 20 70 49  pTab!=pTab ){ pI
1bf0: 6e 66 6f 20 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65  nfo = pInfo->pNe
1c00: 78 74 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 49  xt; }.    if( pI
1c10: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1c20: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
1c30: 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  bMallocRaw(pPars
1c40: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1c50: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
1c60: 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  ( pInfo==0 ) ret
1c70: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 70 49 6e  urn 0;.      pIn
1c80: 66 6f 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70  fo->pNext = pTop
1c90: 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20  level->pAinc;.  
1ca0: 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1cb0: 41 69 6e 63 20 3d 20 70 49 6e 66 6f 3b 0a 20 20  Ainc = pInfo;.  
1cc0: 20 20 20 20 70 49 6e 66 6f 2d 3e 70 54 61 62 20      pInfo->pTab 
1cd0: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 70 49  = pTab;.      pI
1ce0: 6e 66 6f 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  nfo->iDb = iDb;.
1cf0: 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1d00: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20  >nMem++;        
1d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1d20: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6e 61  ister to hold na
1d30: 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  me of table */. 
1d40: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 72 65 67 43       pInfo->regC
1d50: 74 72 20 3d 20 2b 2b 70 54 6f 70 6c 65 76 65 6c  tr = ++pToplevel
1d60: 2d 3e 6e 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78 20  ->nMem;  /* Max 
1d70: 72 6f 77 69 64 20 72 65 67 69 73 74 65 72 20 2a  rowid register *
1d80: 2f 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  /.      pTopleve
1d90: 6c 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20  l->nMem++;      
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1db0: 6f 77 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73  owid in sqlite_s
1dc0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 7d  equence */.    }
1dd0: 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20 70 49 6e  .    memId = pIn
1de0: 66 6f 2d 3e 72 65 67 43 74 72 3b 0a 20 20 7d 0a  fo->regCtr;.  }.
1df0: 20 20 72 65 74 75 72 6e 20 6d 65 6d 49 64 3b 0a    return memId;.
1e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e10: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
1e20: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
1e30: 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 6f 66  nitialize all of
1e40: 20 74 68 65 0a 2a 2a 20 72 65 67 69 73 74 65 72   the.** register
1e50: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 75 74   used by the aut
1e60: 6f 69 6e 63 72 65 6d 65 6e 74 20 74 72 61 63 6b  oincrement track
1e70: 65 72 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  er.  .*/.void sq
1e80: 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65  lite3Autoincreme
1e90: 6e 74 42 65 67 69 6e 28 50 61 72 73 65 20 2a 70  ntBegin(Parse *p
1ea0: 50 61 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e  Parse){.  Autoin
1eb0: 63 49 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20  cInfo *p;       
1ec0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1ed0: 69 6f 6e 20 61 62 6f 75 74 20 61 6e 20 41 55 54  ion about an AUT
1ee0: 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20  OINCREMENT */.  
1ef0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1f00: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
1f10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1f20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
1f30: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1f40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f50: 65 20 6f 6e 6c 79 20 61 75 74 6f 69 6e 63 20 74  e only autoinc t
1f60: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  able */.  int me
1f70: 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
1f80: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1f90: 20 68 6f 6c 64 69 6e 67 20 6d 61 78 20 72 6f 77   holding max row
1fa0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  id */.  int addr
1fb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc0: 20 20 20 2f 2a 20 41 20 56 44 42 45 20 61 64 64     /* A VDBE add
1fd0: 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ress */.  Vdbe *
1fe0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ff0: 65 3b 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64  e;   /* VDBE und
2000: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
2010: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
2020: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2030: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 72 69  alled during tri
2040: 67 67 65 72 2d 67 65 6e 65 72 61 74 69 6f 6e 2e  gger-generation.
2050: 20 20 49 74 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c    It is.  ** onl
2060: 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68  y called from th
2070: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20  e top-level */. 
2080: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
2090: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
20a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20b0: 72 73 65 3d 3d 73 71 6c 69 74 65 33 50 61 72 73  rse==sqlite3Pars
20c0: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
20d0: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
20e0: 76 20 29 3b 20 20 20 2f 2a 20 57 65 20 66 61 69  v );   /* We fai
20f0: 6c 65 64 20 6c 6f 6e 67 20 61 67 6f 20 69 66 20  led long ago if 
2100: 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 2a  this is not so *
2110: 2f 0a 20 20 66 6f 72 28 70 20 3d 20 70 50 61 72  /.  for(p = pPar
2120: 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20 70 20  se->pAinc; p; p 
2130: 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  = p->pNext){.   
2140: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
2150: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 6d 65 6d  p->iDb];.    mem
2160: 49 64 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b 0a  Id = p->regCtr;.
2170: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2180: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2190: 6c 64 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70  ld(db, 0, pDb->p
21a0: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73  Schema) );.    s
21b0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
21c0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44  pParse, 0, p->iD
21d0: 62 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  b, pDb->pSchema-
21e0: 3e 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65  >pSeqTab, OP_Ope
21f0: 6e 52 65 61 64 29 3b 0a 20 20 20 20 73 71 6c 69  nRead);.    sqli
2200: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2210: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 6d 65 6d   OP_Null, 0, mem
2220: 49 64 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a 20 20  Id, memId+1);.  
2230: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2240: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2250: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
2260: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2270: 53 74 72 69 6e 67 38 2c 20 30 2c 20 6d 65 6d 49  String8, 0, memI
2280: 64 2d 31 2c 20 30 2c 20 70 2d 3e 70 54 61 62 2d  d-1, 0, p->pTab-
2290: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
22a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22b0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
22c0: 30 2c 20 61 64 64 72 2b 39 29 3b 20 56 64 62 65  0, addr+9); Vdbe
22d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
22e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2300: 20 30 2c 20 30 2c 20 6d 65 6d 49 64 29 3b 0a 20   0, 0, memId);. 
2310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2320: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 6d  dOp3(v, OP_Ne, m
2330: 65 6d 49 64 2d 31 2c 20 61 64 64 72 2b 37 2c 20  emId-1, addr+7, 
2340: 6d 65 6d 49 64 29 3b 20 56 64 62 65 43 6f 76 65  memId); VdbeCove
2350: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
2360: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2370: 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  (v, SQLITE_JUMPI
2380: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69  FNULL);.    sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23a0: 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 6d 65   OP_Rowid, 0, me
23b0: 6d 49 64 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  mId+1);.    sqli
23c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
23d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 31   OP_Column, 0, 1
23e0: 2c 20 6d 65 6d 49 64 29 3b 0a 20 20 20 20 73 71  , memId);.    sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2400: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
2410: 64 64 72 2b 39 29 3b 0a 20 20 20 20 73 71 6c 69  ddr+9);.    sqli
2420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2430: 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64   OP_Next, 0, add
2440: 72 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+2); VdbeCovera
2450: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
2460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2470: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 6d  OP_Integer, 0, m
2480: 65 6d 49 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  emId);.    sqlit
2490: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
24a0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 7d  OP_Close);.  }.}
24b0: 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
24c0: 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  he maximum rowid
24d0: 20 66 6f 72 20 61 6e 20 61 75 74 6f 69 6e 63 72   for an autoincr
24e0: 65 6d 65 6e 74 20 63 61 6c 63 75 6c 61 74 69 6f  ement calculatio
24f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
2500: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
2510: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
2520: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
2530: 20 68 6f 6c 64 73 20 61 0a 2a 2a 20 6e 65 77 20   holds a.** new 
2540: 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 61 62  rowid that is ab
2550: 6f 75 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74  out to be insert
2560: 65 64 2e 20 20 49 66 20 74 68 61 74 20 6e 65 77  ed.  If that new
2570: 20 72 6f 77 69 64 20 69 73 0a 2a 2a 20 6c 61 72   rowid is.** lar
2580: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ger than the max
2590: 69 6d 75 6d 20 72 6f 77 69 64 20 69 6e 20 74 68  imum rowid in th
25a0: 65 20 6d 65 6d 49 64 20 6d 65 6d 6f 72 79 20 63  e memId memory c
25b0: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ell, then the.**
25c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20   memory cell is 
25d0: 75 70 64 61 74 65 64 2e 20 20 54 68 65 20 73 74  updated.  The st
25e0: 61 63 6b 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ack is unchanged
25f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2600: 20 61 75 74 6f 49 6e 63 53 74 65 70 28 50 61 72   autoIncStep(Par
2610: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2620: 6d 65 6d 49 64 2c 20 69 6e 74 20 72 65 67 52 6f  memId, int regRo
2630: 77 69 64 29 7b 0a 20 20 69 66 28 20 6d 65 6d 49  wid){.  if( memI
2640: 64 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d>0 ){.    sqlit
2650: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
2660: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
2670: 65 6d 4d 61 78 2c 20 6d 65 6d 49 64 2c 20 72 65  emMax, memId, re
2680: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  gRowid);.  }.}..
2690: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
26a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
26b0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
26c0: 77 72 69 74 65 20 61 75 74 6f 69 6e 63 72 65 6d  write autoincrem
26d0: 65 6e 74 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 72  ent.** maximum r
26e0: 6f 77 69 64 20 76 61 6c 75 65 73 20 62 61 63 6b  owid values back
26f0: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
2700: 5f 73 65 71 75 65 6e 63 65 20 72 65 67 69 73 74  _sequence regist
2710: 65 72 2e 0a 2a 2a 20 45 76 65 72 79 20 73 74 61  er..** Every sta
2720: 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 69 67 68  tement that migh
2730: 74 20 64 6f 20 61 6e 20 49 4e 53 45 52 54 20 69  t do an INSERT i
2740: 6e 74 6f 20 61 6e 20 61 75 74 6f 69 6e 63 72 65  nto an autoincre
2750: 6d 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 20 28 65  ment.** table (e
2760: 69 74 68 65 72 20 64 69 72 65 63 74 6c 79 20 6f  ither directly o
2770: 72 20 74 68 72 6f 75 67 68 20 74 72 69 67 67 65  r through trigge
2780: 72 73 29 20 6e 65 65 64 73 20 74 6f 20 63 61 6c  rs) needs to cal
2790: 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
27a0: 65 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  e just before th
27b0: 65 20 22 65 78 69 74 22 20 63 6f 64 65 2e 0a 2a  e "exit" code..*
27c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 75  /.void sqlite3Au
27d0: 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 50  toincrementEnd(P
27e0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
27f0: 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 3b   AutoincInfo *p;
2800: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2810: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71  rse->pVdbe;.  sq
2820: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2830: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
2840: 74 28 20 76 20 29 3b 0a 20 20 66 6f 72 28 70 20  t( v );.  for(p 
2850: 3d 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3b  = pParse->pAinc;
2860: 20 70 3b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   p; p = p->pNext
2870: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
2880: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
2890: 5d 3b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ];.    int j1;. 
28a0: 20 20 20 69 6e 74 20 69 52 65 63 3b 0a 20 20 20     int iRec;.   
28b0: 20 69 6e 74 20 6d 65 6d 49 64 20 3d 20 70 2d 3e   int memId = p->
28c0: 72 65 67 43 74 72 3b 0a 0a 20 20 20 20 69 52 65  regCtr;..    iRe
28d0: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
28e0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
28f0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2900: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
2910: 64 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70 53  d(db, 0, pDb->pS
2920: 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73 71  chema) );.    sq
2930: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
2940: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44 62  Parse, 0, p->iDb
2950: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  , pDb->pSchema->
2960: 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  pSeqTab, OP_Open
2970: 57 72 69 74 65 29 3b 0a 20 20 20 20 6a 31 20 3d  Write);.    j1 =
2980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2990: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
29a0: 2c 20 6d 65 6d 49 64 2b 31 29 3b 20 56 64 62 65  , memId+1); Vdbe
29b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29d0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
29e0: 64 2c 20 30 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a  d, 0, memId+1);.
29f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2a00: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
2a10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2a30: 52 65 63 6f 72 64 2c 20 6d 65 6d 49 64 2d 31 2c  Record, memId-1,
2a40: 20 32 2c 20 69 52 65 63 29 3b 0a 20 20 20 20 73   2, iRec);.    s
2a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2a60: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
2a70: 2c 20 69 52 65 63 2c 20 6d 65 6d 49 64 2b 31 29  , iRec, memId+1)
2a80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2a90: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2aa0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
2ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ac0: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
2ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2ae0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2af0: 65 2c 20 69 52 65 63 29 3b 0a 20 20 7d 0a 7d 0a  e, iRec);.  }.}.
2b00: 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 49 66 20 53  #else./*.** If S
2b10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
2b20: 4e 43 52 45 4d 45 4e 54 20 69 73 20 64 65 66 69  NCREMENT is defi
2b30: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 68  ned, then the th
2b40: 72 65 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ree routines.** 
2b50: 61 62 6f 76 65 20 61 72 65 20 61 6c 6c 20 6e 6f  above are all no
2b60: 2d 6f 70 73 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  -ops.*/.# define
2b70: 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 41 2c   autoIncBegin(A,
2b80: 42 2c 43 29 20 28 30 29 0a 23 20 64 65 66 69 6e  B,C) (0).# defin
2b90: 65 20 61 75 74 6f 49 6e 63 53 74 65 70 28 41 2c  e autoIncStep(A,
2ba0: 42 2c 43 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  B,C).#endif /* S
2bb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
2bc0: 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 0a 2f 2a  NCREMENT */.../*
2bd0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
2be0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
2bf0: 6e 74 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74  nt xferOptimizat
2c00: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
2c10: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
2c20: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
2c30: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44 65 73 74  /.  Table *pDest
2c40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2c50: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 69 6e   table we are in
2c60: 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a  serting into */.
2c70: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
2c80: 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53 45 4c  t,      /* A SEL
2c90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
2ca0: 20 75 73 65 20 61 73 20 74 68 65 20 64 61 74 61   use as the data
2cb0: 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74   source */.  int
2cc0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
2cd0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e     /* How to han
2ce0: 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  dle constraint e
2cf0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  rrors */.  int i
2d00: 44 62 44 65 73 74 20 20 20 20 20 20 20 20 20 20  DbDest          
2d10: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2d20: 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a 29 3b 0a   of pDest */.);.
2d30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2d40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2d50: 20 68 61 6e 64 6c 65 20 53 51 4c 20 6f 66 20 74   handle SQL of t
2d60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
2d70: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 6e 73  ms:.**.**    ins
2d80: 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45 20 28  ert into TABLE (
2d90: 49 44 4c 49 53 54 29 20 76 61 6c 75 65 73 28 45  IDLIST) values(E
2da0: 58 50 52 4c 49 53 54 29 0a 2a 2a 20 20 20 20 69  XPRLIST).**    i
2db0: 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45  nsert into TABLE
2dc0: 20 28 49 44 4c 49 53 54 29 20 73 65 6c 65 63 74   (IDLIST) select
2dd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44 4c 49 53  .**.** The IDLIS
2de0: 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  T following the 
2df0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 61 6c  table name is al
2e00: 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  ways optional.  
2e10: 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a 2a 20 74  If omitted,.** t
2e20: 68 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c  hen a list of al
2e30: 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  l columns for th
2e40: 65 20 74 61 62 6c 65 20 69 73 20 73 75 62 73 74  e table is subst
2e50: 69 74 75 74 65 64 2e 20 20 54 68 65 20 49 44 4c  ituted.  The IDL
2e60: 49 53 54 0a 2a 2a 20 61 70 70 65 61 72 73 20 69  IST.** appears i
2e70: 6e 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61  n the pColumn pa
2e80: 72 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d  rameter.  pColum
2e90: 6e 20 69 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c  n is NULL if IDL
2ea0: 49 53 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a  IST is omitted..
2eb0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20  **.** The pList 
2ec0: 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20  parameter holds 
2ed0: 45 58 50 52 4c 49 53 54 20 69 6e 20 74 68 65 20  EXPRLIST in the 
2ee0: 66 69 72 73 74 20 66 6f 72 6d 20 6f 66 20 74 68  first form of th
2ef0: 65 20 49 4e 53 45 52 54 0a 2a 2a 20 73 74 61 74  e INSERT.** stat
2f00: 65 6d 65 6e 74 20 61 62 6f 76 65 2c 20 61 6e 64  ement above, and
2f10: 20 70 53 65 6c 65 63 74 20 69 73 20 4e 55 4c 4c   pSelect is NULL
2f20: 2e 20 20 46 6f 72 20 74 68 65 20 73 65 63 6f 6e  .  For the secon
2f30: 64 20 66 6f 72 6d 2c 20 70 4c 69 73 74 20 69 73  d form, pList is
2f40: 0a 2a 2a 20 4e 55 4c 4c 20 61 6e 64 20 70 53 65  .** NULL and pSe
2f50: 6c 65 63 74 20 69 73 20 61 20 70 6f 69 6e 74 65  lect is a pointe
2f60: 72 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 20  r to the select 
2f70: 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
2f80: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 64 61  o generate.** da
2f90: 74 61 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72  ta for the inser
2fa0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  t..**.** The cod
2fb0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 6c 6c  e generated foll
2fc0: 6f 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75 72 20  ows one of four 
2fd0: 74 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f 72 20  templates.  For 
2fe0: 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 69 6e 73 65  a simple.** inse
2ff0: 72 74 20 77 69 74 68 20 64 61 74 61 20 63 6f 6d  rt with data com
3000: 69 6e 67 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  ing from a VALUE
3010: 53 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  S clause, the co
3020: 64 65 20 65 78 65 63 75 74 65 73 0a 2a 2a 20 6f  de executes.** o
3030: 6e 63 65 20 73 74 72 61 69 67 68 74 20 64 6f 77  nce straight dow
3040: 6e 20 74 68 72 6f 75 67 68 2e 20 20 50 73 65 75  n through.  Pseu
3050: 64 6f 2d 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20  do-code follows 
3060: 28 77 65 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  (we call this.**
3070: 20 74 68 65 20 22 31 73 74 20 74 65 6d 70 6c 61   the "1st templa
3080: 74 65 22 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te"):.**.**     
3090: 20 20 20 20 6f 70 65 6e 20 77 72 69 74 65 20 63      open write c
30a0: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
30b0: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
30c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 75 74 20  .**         put 
30d0: 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20 65 78  VALUES clause ex
30e0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f 20 72  pressions into r
30f0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
3100: 20 20 20 20 77 72 69 74 65 20 74 68 65 20 72 65      write the re
3110: 73 75 6c 74 69 6e 67 20 72 65 63 6f 72 64 20 69  sulting record i
3120: 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20  nto <table>.**  
3130: 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 0a 2a         cleanup.*
3140: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 65 20 72  *.** The three r
3150: 65 6d 61 69 6e 69 6e 67 20 74 65 6d 70 6c 61 74  emaining templat
3160: 65 73 20 61 73 73 75 6d 65 20 74 68 65 20 73 74  es assume the st
3170: 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
3180: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 49  e form.**.**   I
3190: 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62 6c  NSERT INTO <tabl
31a0: 65 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 0a 2a 2a  e> SELECT ....**
31b0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
31c0: 54 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  T clause is of t
31d0: 68 65 20 72 65 73 74 72 69 63 74 65 64 20 66 6f  he restricted fo
31e0: 72 6d 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  rm "SELECT * FRO
31f0: 4d 20 3c 74 61 62 6c 65 32 3e 22 20 2d 0a 2a 2a  M <table2>" -.**
3200: 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
3210: 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 75  if the SELECT pu
3220: 6c 6c 73 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  lls all columns 
3230: 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
3240: 62 6c 65 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65  ble.** and there
3250: 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20   is no WHERE or 
3260: 4c 49 4d 49 54 20 6f 72 20 47 52 4f 55 50 20 42  LIMIT or GROUP B
3270: 59 20 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c  Y or ORDER BY cl
3280: 61 75 73 65 73 2c 20 61 6e 64 0a 2a 2a 20 69 66  auses, and.** if
3290: 20 3c 74 61 62 6c 65 32 3e 20 61 6e 64 20 3c 74   <table2> and <t
32a0: 61 62 6c 65 31 3e 20 61 72 65 20 64 69 73 74 69  able1> are disti
32b0: 6e 63 74 20 74 61 62 6c 65 73 20 62 75 74 20 68  nct tables but h
32c0: 61 76 65 20 69 64 65 6e 74 69 63 61 6c 0a 2a 2a  ave identical.**
32d0: 20 73 63 68 65 6d 61 73 2c 20 69 6e 63 6c 75 64   schemas, includ
32e0: 69 6e 67 20 61 6c 6c 20 74 68 65 20 73 61 6d 65  ing all the same
32f0: 20 69 6e 64 69 63 65 73 2c 20 74 68 65 6e 20 61   indices, then a
3300: 20 73 70 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a   special optimiz
3310: 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 69 6e 76 6f  ation.** is invo
3320: 6b 65 64 20 74 68 61 74 20 63 6f 70 69 65 73 20  ked that copies 
3330: 72 61 77 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  raw records from
3340: 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72 20 74   <table2> over t
3350: 6f 20 3c 74 61 62 6c 65 31 3e 2e 0a 2a 2a 20 53  o <table1>..** S
3360: 65 65 20 74 68 65 20 78 66 65 72 4f 70 74 69 6d  ee the xferOptim
3370: 69 7a 61 74 69 6f 6e 28 29 20 66 75 6e 63 74 69  ization() functi
3380: 6f 6e 20 66 6f 72 20 74 68 65 20 69 6d 70 6c 65  on for the imple
3390: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 69  mentation of thi
33a0: 73 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 2e 20 20  s.** template.  
33b0: 54 68 69 73 20 69 73 20 74 68 65 20 32 6e 64 20  This is the 2nd 
33c0: 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
33d0: 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20 77          open a w
33e0: 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c  rite cursor to <
33f0: 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20  table>.**       
3400: 20 20 6f 70 65 6e 20 72 65 61 64 20 63 75 72 73    open read curs
3410: 6f 72 20 6f 6e 20 3c 74 61 62 6c 65 32 3e 0a 2a  or on <table2>.*
3420: 2a 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  *         transf
3430: 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 69  er all records i
3440: 6e 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72 20  n <table2> over 
3450: 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20  to <table>.**   
3460: 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73        close curs
3470: 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ors.**         f
3480: 6f 72 65 61 63 68 20 69 6e 64 65 78 20 6f 6e 20  oreach index on 
3490: 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20  <table>.**      
34a0: 20 20 20 20 20 6f 70 65 6e 20 61 20 77 72 69 74       open a writ
34b0: 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  e cursor on the 
34c0: 3c 74 61 62 6c 65 3e 20 69 6e 64 65 78 0a 2a 2a  <table> index.**
34d0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20             open 
34e0: 61 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e  a read cursor on
34f0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
3500: 6e 67 20 3c 74 61 62 6c 65 32 3e 20 69 6e 64 65  ng <table2> inde
3510: 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  x.**           t
3520: 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 65 63 6f  ransfer all reco
3530: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 72 65 61  rds from the rea
3540: 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 20 63  d to the write c
3550: 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20  ursors.**       
3560: 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73 6f 72      close cursor
3570: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64  s.**         end
3580: 20 66 6f 72 65 61 63 68 0a 2a 2a 0a 2a 2a 20 54   foreach.**.** T
3590: 68 65 20 33 72 64 20 74 65 6d 70 6c 61 74 65 20  he 3rd template 
35a0: 69 73 20 66 6f 72 20 77 68 65 6e 20 74 68 65 20  is for when the 
35b0: 73 65 63 6f 6e 64 20 74 65 6d 70 6c 61 74 65 20  second template 
35c0: 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 0a 2a  does not apply.*
35d0: 2a 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54  * and the SELECT
35e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
35f0: 20 72 65 61 64 20 66 72 6f 6d 20 3c 74 61 62 6c   read from <tabl
3600: 65 3e 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 0a  e> at any time..
3610: 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
3620: 20 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20 74 68   code follows th
3630: 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a 2a 0a  is template:.**.
3640: 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c 2d 20  **         X <- 
3650: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74  A.**         got
3660: 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73  o B.**      A: s
3670: 65 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c  etup for the SEL
3680: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c  ECT.**         l
3690: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 72 6f 77  oop over the row
36a0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
36b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 61  **           loa
36c0: 64 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65  d values into re
36d0: 67 69 73 74 65 72 73 20 52 2e 2e 52 2b 6e 0a 2a  gisters R..R+n.*
36e0: 2a 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  *           yiel
36f0: 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  d X.**         e
3700: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
3710: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
3720: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3730: 20 20 20 20 20 20 20 65 6e 64 2d 63 6f 72 6f 75         end-corou
3740: 74 69 6e 65 20 58 0a 2a 2a 20 20 20 20 20 20 42  tine X.**      B
3750: 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63 75 72  : open write cur
3760: 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61  sor to <table> a
3770: 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a  nd its indices.*
3780: 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c 64 20  *      C: yield 
3790: 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f 20 44  X, at EOF goto D
37a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65  .**         inse
37b0: 72 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65  rt the select re
37c0: 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65  sult into <table
37d0: 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 2a 2a  > from R..R+n.**
37e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43 0a           goto C.
37f0: 2a 2a 20 20 20 20 20 20 44 3a 20 63 6c 65 61 6e  **      D: clean
3800: 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 34 74 68  up.**.** The 4th
3810: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 75 73 65   template is use
3820: 64 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  d if the insert 
3830: 73 74 61 74 65 6d 65 6e 74 20 74 61 6b 65 73 20  statement takes 
3840: 69 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72  its.** values fr
3850: 6f 6d 20 61 20 53 45 4c 45 43 54 20 62 75 74 20  om a SELECT but 
3860: 74 68 65 20 64 61 74 61 20 69 73 20 62 65 69 6e  the data is bein
3870: 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  g inserted into 
3880: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20  a table.** that 
3890: 69 73 20 61 6c 73 6f 20 72 65 61 64 20 61 73 20  is also read as 
38a0: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 4c 45  part of the SELE
38b0: 43 54 2e 20 20 49 6e 20 74 68 65 20 74 68 69 72  CT.  In the thir
38c0: 64 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61  d form,.** we ha
38d0: 76 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 74  ve to use an int
38e0: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20  ermediate table 
38f0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
3900: 75 6c 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73  ults of.** the s
3910: 65 6c 65 63 74 2e 20 20 54 68 65 20 74 65 6d 70  elect.  The temp
3920: 6c 61 74 65 20 69 73 20 6c 69 6b 65 20 74 68 69  late is like thi
3930: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
3940: 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20 20 20   X <- A.**      
3950: 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20 20 20     goto B.**    
3960: 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72 20 74    A: setup for t
3970: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
3980: 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74       loop over t
3990: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
39a0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
39b0: 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75 65 20       load value 
39c0: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 52 2e  into register R.
39d0: 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  .R+n.**         
39e0: 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20    yield X.**    
39f0: 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a       end loop.**
3a00: 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
3a10: 20 61 66 74 65 72 20 74 68 65 20 53 45 4c 45 43   after the SELEC
3a20: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64  T.**         end
3a30: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 52 0a 2a 2a   co-routine R.**
3a40: 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65        B: open te
3a50: 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  mp table.**     
3a60: 20 4c 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20   L: yield X, at 
3a70: 45 4f 46 20 67 6f 74 6f 20 4d 0a 2a 2a 20 20 20  EOF goto M.**   
3a80: 20 20 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77        insert row
3a90: 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74   from R..R+n int
3aa0: 6f 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20  o temp table.** 
3ab0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a 2a          goto L.*
3ac0: 2a 20 20 20 20 20 20 4d 3a 20 6f 70 65 6e 20 77  *      M: open w
3ad0: 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c  rite cursor to <
3ae0: 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73 20 69  table> and its i
3af0: 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20  ndices.**       
3b00: 20 20 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61    rewind temp ta
3b10: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 43 3a 20 6c  ble.**      C: l
3b20: 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66  oop over rows of
3b30: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61   intermediate ta
3b40: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
3b50: 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73   transfer values
3b60: 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61   form intermedia
3b70: 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74  te table into <t
3b80: 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20  able>.**        
3b90: 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20   end loop.**    
3ba0: 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a    D: cleanup.*/.
3bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 73 65  void sqlite3Inse
3bc0: 72 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rt(.  Parse *pPa
3bd0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
3be0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
3bf0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
3c00: 4c 69 73 74 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  List,    /* Name
3c10: 20 6f 66 20 74 61 62 6c 65 20 69 6e 74 6f 20 77   of table into w
3c20: 68 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65  hich we are inse
3c30: 72 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63  rting */.  Selec
3c40: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
3c50: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
3c60: 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73  tement to use as
3c70: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
3c80: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
3c90: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 43  olumn,      /* C
3ca0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 6f 72 72  olumn names corr
3cb0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 49 44 4c  esponding to IDL
3cc0: 49 53 54 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  IST. */.  int on
3cd0: 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 20  Error           
3ce0: 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
3cf0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
3d00: 72 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  rs */.){.  sqlit
3d10: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
3d20: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 61 74   /* The main dat
3d30: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20  abase structure 
3d40: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
3d50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
3d60: 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 73 65 72  e table to inser
3d70: 74 20 69 6e 74 6f 2e 20 20 61 6b 61 20 54 41 42  t into.  aka TAB
3d80: 4c 45 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  LE */.  char *zT
3d90: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ab;           /*
3da0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
3db0: 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
3dc0: 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a   are inserting *
3dd0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3de0: 7a 44 62 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  zDb;      /* Nam
3df0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3e00: 65 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 20 74  e holding this t
3e10: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  able */.  int i,
3e20: 20 6a 2c 20 69 64 78 3b 20 20 20 20 20 20 20 20   j, idx;        
3e30: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
3e40: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
3e60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
3e70: 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
3e80: 61 63 68 69 6e 65 20 2a 2f 0a 20 20 49 6e 64 65  achine */.  Inde
3e90: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
3ea0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
3eb0: 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20 6f 66   over indices of
3ec0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
3ed0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  int nColumn;    
3ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3ef0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
3f00: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
3f10: 6e 48 69 64 64 65 6e 20 3d 20 30 3b 20 20 20 20  nHidden = 0;    
3f20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68    /* Number of h
3f30: 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 69 66  idden columns if
3f40: 20 54 41 42 4c 45 20 69 73 20 76 69 72 74 75 61   TABLE is virtua
3f50: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61  l */.  int iData
3f60: 43 75 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Cur = 0;     /* 
3f70: 56 44 42 45 20 63 75 72 73 6f 72 20 74 68 61 74  VDBE cursor that
3f80: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74   is the main dat
3f90: 61 20 72 65 70 6f 73 69 74 6f 72 79 20 2a 2f 0a  a repository */.
3fa0: 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20    int iIdxCur = 
3fb0: 30 3b 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  0;      /* First
3fc0: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
3fd0: 0a 20 20 69 6e 74 20 69 70 6b 43 6f 6c 75 6d 6e  .  int ipkColumn
3fe0: 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 43 6f 6c 75   = -1;   /* Colu
3ff0: 6d 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 49  mn that is the I
4000: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4010: 45 59 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 4f  EY */.  int endO
4020: 66 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a  fLoop;        /*
4030: 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
4040: 6e 64 20 6f 66 20 74 68 65 20 69 6e 73 65 72 74  nd of the insert
4050: 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  ion loop */.  in
4060: 74 20 73 72 63 54 61 62 20 3d 20 30 3b 20 20 20  t srcTab = 0;   
4070: 20 20 20 20 2f 2a 20 44 61 74 61 20 63 6f 6d 65      /* Data come
4080: 73 20 66 72 6f 6d 20 74 68 69 73 20 74 65 6d 70  s from this temp
4090: 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 66 20  orary cursor if 
40a0: 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  >=0 */.  int add
40b0: 72 49 6e 73 54 6f 70 20 3d 20 30 3b 20 20 20 2f  rInsTop = 0;   /
40c0: 2a 20 4a 75 6d 70 20 74 6f 20 6c 61 62 65 6c 20  * Jump to label 
40d0: 22 44 22 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  "D" */.  int add
40e0: 72 43 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f  rCont = 0;     /
40f0: 2a 20 54 6f 70 20 6f 66 20 69 6e 73 65 72 74 20  * Top of insert 
4100: 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 22 43 22 20  loop. Label "C" 
4110: 69 6e 20 74 65 6d 70 6c 61 74 65 73 20 33 20 61  in templates 3 a
4120: 6e 64 20 34 20 2a 2f 0a 20 20 53 65 6c 65 63 74  nd 4 */.  Select
4130: 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
4140: 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
4150: 6f 72 20 53 45 4c 45 43 54 20 6f 6e 20 72 68 73  or SELECT on rhs
4160: 20 6f 66 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20   of INSERT */.  
4170: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
4180: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
4190: 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  f database holdi
41a0: 6e 67 20 54 41 42 4c 45 20 2a 2f 0a 20 20 44 62  ng TABLE */.  Db
41b0: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
41c0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
41d0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
41e0: 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 73 65 72  able being inser
41f0: 74 65 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 75 38  ted into */.  u8
4200: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20   useTempTable = 
4210: 30 3b 20 20 2f 2a 20 53 74 6f 72 65 20 53 45 4c  0;  /* Store SEL
4220: 45 43 54 20 72 65 73 75 6c 74 73 20 69 6e 20 69  ECT results in i
4230: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
4240: 65 20 2a 2f 0a 20 20 75 38 20 61 70 70 65 6e 64  e */.  u8 append
4250: 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Flag = 0;    /* 
4260: 54 72 75 65 20 69 66 20 74 68 65 20 69 6e 73 65  True if the inse
4270: 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20  rt is likely to 
4280: 62 65 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  be an append */.
4290: 20 20 75 38 20 77 69 74 68 6f 75 74 52 6f 77 69    u8 withoutRowi
42a0: 64 3b 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72  d;      /* 0 for
42b0: 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 2e 20 20   normal table.  
42c0: 31 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  1 for WITHOUT RO
42d0: 57 49 44 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  WID table */.  u
42e0: 38 20 62 49 64 4c 69 73 74 49 6e 4f 72 64 65 72  8 bIdListInOrder
42f0: 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 1; /* True if
4300: 20 49 44 4c 49 53 54 20 69 73 20 69 6e 20 74 61   IDLIST is in ta
4310: 62 6c 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 45  ble order */.  E
4320: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
4330: 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
4340: 56 41 4c 55 45 53 28 29 20 74 6f 20 62 65 20 69  VALUES() to be i
4350: 6e 73 65 72 74 65 64 20 20 2a 2f 0a 0a 20 20 2f  nserted  */..  /
4360: 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  * Register alloc
4370: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
4380: 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 20 3d 20  regFromSelect = 
4390: 30 3b 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74  0;/* Base regist
43a0: 65 72 20 66 6f 72 20 64 61 74 61 20 63 6f 6d 69  er for data comi
43b0: 6e 67 20 66 72 6f 6d 20 53 45 4c 45 43 54 20 2a  ng from SELECT *
43c0: 2f 0a 20 20 69 6e 74 20 72 65 67 41 75 74 6f 69  /.  int regAutoi
43d0: 6e 63 20 3d 20 30 3b 20 20 20 2f 2a 20 52 65 67  nc = 0;   /* Reg
43e0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
43f0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
4400: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
4410: 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20 30   regRowCount = 0
4420: 3b 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c  ;  /* Memory cel
4430: 6c 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  l used for the r
4440: 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ow counter */.  
4450: 69 6e 74 20 72 65 67 49 6e 73 3b 20 20 20 20 20  int regIns;     
4460: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6f        /* Block o
4470: 66 20 72 65 67 73 20 68 6f 6c 64 69 6e 67 20 72  f regs holding r
4480: 6f 77 69 64 2b 64 61 74 61 20 62 65 69 6e 67 20  owid+data being 
4490: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
44a0: 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
44b0: 20 20 20 20 2f 2a 20 72 65 67 69 73 74 65 72 73      /* registers
44c0: 20 68 6f 6c 64 69 6e 67 20 69 6e 73 65 72 74 20   holding insert 
44d0: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72  rowid */.  int r
44e0: 65 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  egData;         
44f0: 20 2f 2a 20 72 65 67 69 73 74 65 72 20 68 6f 6c   /* register hol
4500: 64 69 6e 67 20 66 69 72 73 74 20 63 6f 6c 75 6d  ding first colum
4510: 6e 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  n to insert */. 
4520: 20 69 6e 74 20 2a 61 52 65 67 49 64 78 20 3d 20   int *aRegIdx = 
4530: 30 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 20 72 65  0;     /* One re
4540: 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
4550: 20 74 6f 20 65 61 63 68 20 69 6e 64 65 78 20 2a   to each index *
4560: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
4570: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
4580: 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20   int isView;    
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45a0: 54 72 75 65 20 69 66 20 61 74 74 65 6d 70 74 69  True if attempti
45b0: 6e 67 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ng to insert int
45c0: 6f 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 54 72  o a view */.  Tr
45d0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
45e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
45f0: 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e  t of triggers on
4600: 20 70 54 61 62 2c 20 69 66 20 72 65 71 75 69 72   pTab, if requir
4610: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73  ed */.  int tmas
4620: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
4630: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
4640: 72 69 67 67 65 72 20 74 69 6d 65 73 20 2a 2f 0a  rigger times */.
4650: 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
4660: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
4670: 73 65 74 28 26 64 65 73 74 2c 20 30 2c 20 73 69  set(&dest, 0, si
4680: 7a 65 6f 66 28 64 65 73 74 29 29 3b 0a 20 20 69  zeof(dest));.  i
4690: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
46a0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
46b0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
46c0: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
46d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
46e0: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 69   Select object i
46f0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
4700: 73 69 6d 70 6c 65 20 56 41 4c 55 45 53 28 29 20  simple VALUES() 
4710: 6c 69 73 74 20 77 69 74 68 20 61 0a 20 20 2a 2a  list with a.  **
4720: 20 73 69 6e 67 6c 65 20 72 6f 77 20 76 61 6c 75   single row valu
4730: 65 73 20 28 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  es (the common c
4740: 61 73 65 29 20 74 68 65 6e 20 6b 65 65 70 20 74  ase) then keep t
4750: 68 61 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 76  hat one row of v
4760: 61 6c 75 65 73 0a 20 20 2a 2a 20 61 6e 64 20 67  alues.  ** and g
4770: 6f 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 63  o ahead and disc
4780: 61 72 64 20 74 68 65 20 53 65 6c 65 63 74 20 6f  ard the Select o
4790: 62 6a 65 63 74 0a 20 20 2a 2f 0a 20 20 69 66 28  bject.  */.  if(
47a0: 20 70 53 65 6c 65 63 74 20 26 26 20 28 70 53 65   pSelect && (pSe
47b0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
47c0: 20 53 46 5f 56 61 6c 75 65 73 29 21 3d 30 20 26   SF_Values)!=0 &
47d0: 26 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  & pSelect->pPrio
47e0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  r==0 ){.    pLis
47f0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
4800: 69 73 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  ist;.    pSelect
4810: 2d 3e 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20  ->pEList = 0;.  
4820: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4830: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
4840: 74 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20  t);.    pSelect 
4850: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  = 0;.  }..  /* L
4860: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
4870: 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77 69  into which we wi
4880: 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
4890: 6e 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  new information.
48a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
48b0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
48c0: 31 20 29 3b 0a 20 20 7a 54 61 62 20 3d 20 70 54  1 );.  zTab = pT
48d0: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61  abList->a[0].zNa
48e0: 6d 65 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  me;.  if( NEVER(
48f0: 7a 54 61 62 3d 3d 30 29 20 29 20 67 6f 74 6f 20  zTab==0) ) goto 
4900: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
4910: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
4920: 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
4930: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
4940: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
4950: 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  {.    goto inser
4960: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  t_cleanup;.  }. 
4970: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
4980: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
4990: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
49a0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
49b0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 70 44 62 20 3d  ->nDb );.  pDb =
49c0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
49d0: 20 20 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61    zDb = pDb->zNa
49e0: 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  me;.  if( sqlite
49f0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
4a00: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
4a10: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
4a20: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f  , zDb) ){.    go
4a30: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
4a40: 70 3b 0a 20 20 7d 0a 20 20 77 69 74 68 6f 75 74  p;.  }.  without
4a50: 52 6f 77 69 64 20 3d 20 21 48 61 73 52 6f 77 69  Rowid = !HasRowi
4a60: 64 28 70 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 46  d(pTab);..  /* F
4a70: 69 67 75 72 65 20 6f 75 74 20 69 66 20 77 65 20  igure out if we 
4a80: 68 61 76 65 20 61 6e 79 20 74 72 69 67 67 65 72  have any trigger
4a90: 73 20 61 6e 64 20 69 66 20 74 68 65 20 74 61 62  s and if the tab
4aa0: 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 69 6e  le being.  ** in
4ab0: 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61  serted into is a
4ac0: 20 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66 6e 64   view.  */.#ifnd
4ad0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
4ae0: 52 49 47 47 45 52 0a 20 20 70 54 72 69 67 67 65  RIGGER.  pTrigge
4af0: 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
4b00: 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c  ersExist(pParse,
4b10: 20 70 54 61 62 2c 20 54 4b 5f 49 4e 53 45 52 54   pTab, TK_INSERT
4b20: 2c 20 30 2c 20 26 74 6d 61 73 6b 29 3b 0a 20 20  , 0, &tmask);.  
4b30: 69 73 56 69 65 77 20 3d 20 70 54 61 62 2d 3e 70  isView = pTab->p
4b40: 53 65 6c 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65  Select!=0;.#else
4b50: 0a 23 20 64 65 66 69 6e 65 20 70 54 72 69 67 67  .# define pTrigg
4b60: 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 74 6d  er 0.# define tm
4b70: 61 73 6b 20 30 0a 23 20 64 65 66 69 6e 65 20 69  ask 0.# define i
4b80: 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 23  sView 0.#endif.#
4b90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
4ba0: 54 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69  T_VIEW.# undef i
4bb0: 73 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69  sView.# define i
4bc0: 73 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 20  sView 0.#endif. 
4bd0: 20 61 73 73 65 72 74 28 20 28 70 54 72 69 67 67   assert( (pTrigg
4be0: 65 72 20 26 26 20 74 6d 61 73 6b 29 20 7c 7c 20  er && tmask) || 
4bf0: 28 70 54 72 69 67 67 65 72 3d 3d 30 20 26 26 20  (pTrigger==0 && 
4c00: 74 6d 61 73 6b 3d 3d 30 29 20 29 3b 0a 0a 20 20  tmask==0) );..  
4c10: 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 72 65  /* If pTab is re
4c20: 61 6c 6c 79 20 61 20 76 69 65 77 2c 20 6d 61 6b  ally a view, mak
4c30: 65 20 73 75 72 65 20 69 74 20 68 61 73 20 62 65  e sure it has be
4c40: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  en initialized..
4c50: 20 20 2a 2a 20 56 69 65 77 47 65 74 43 6f 6c 75    ** ViewGetColu
4c60: 6d 6e 4e 61 6d 65 73 28 29 20 69 73 20 61 20 6e  mnNames() is a n
4c70: 6f 2d 6f 70 20 69 66 20 70 54 61 62 20 69 73 20  o-op if pTab is 
4c80: 6e 6f 74 20 61 20 76 69 65 77 2e 0a 20 20 2a 2f  not a view..  */
4c90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69  .  if( sqlite3Vi
4ca0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
4cb0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
4cc0: 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  {.    goto inser
4cd0: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  t_cleanup;.  }..
4ce0: 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 69 6e 73 65    /* Cannot inse
4cf0: 72 74 20 69 6e 74 6f 20 61 20 72 65 61 64 2d 6f  rt into a read-o
4d00: 6e 6c 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  nly table..  */.
4d10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
4d20: 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20  eadOnly(pParse, 
4d30: 70 54 61 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a  pTab, tmask) ){.
4d40: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
4d50: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
4d60: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 56 44  /* Allocate a VD
4d70: 42 45 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  BE.  */.  v = sq
4d80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
4d90: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
4da0: 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63   ) goto insert_c
4db0: 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 70 50  leanup;.  if( pP
4dc0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
4dd0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  ) sqlite3VdbeCou
4de0: 6e 74 43 68 61 6e 67 65 73 28 76 29 3b 0a 20 20  ntChanges(v);.  
4df0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
4e00: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
4e10: 65 2c 20 70 53 65 6c 65 63 74 20 7c 7c 20 70 54  e, pSelect || pT
4e20: 72 69 67 67 65 72 2c 20 69 44 62 29 3b 0a 0a 23  rigger, iDb);..#
4e30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4e40: 49 54 5f 58 46 45 52 5f 4f 50 54 0a 20 20 2f 2a  IT_XFER_OPT.  /*
4e50: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
4e60: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4e70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
4e80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61   INSERT INTO <ta
4e90: 62 6c 65 31 3e 20 53 45 4c 45 43 54 20 2a 20 46  ble1> SELECT * F
4ea0: 52 4f 4d 20 3c 74 61 62 6c 65 32 3e 3b 0a 20 20  ROM <table2>;.  
4eb0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 73 70 65  **.  ** Then spe
4ec0: 63 69 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f  cial optimizatio
4ed0: 6e 73 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65  ns can be applie
4ee0: 64 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 20  d that make the 
4ef0: 74 72 61 6e 73 66 65 72 0a 20 20 2a 2a 20 76 65  transfer.  ** ve
4f00: 72 79 20 66 61 73 74 20 61 6e 64 20 77 68 69 63  ry fast and whic
4f10: 68 20 72 65 64 75 63 65 20 66 72 61 67 6d 65 6e  h reduce fragmen
4f20: 74 61 74 69 6f 6e 20 6f 66 20 69 6e 64 69 63 65  tation of indice
4f30: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
4f40: 73 20 69 73 20 74 68 65 20 32 6e 64 20 74 65 6d  s is the 2nd tem
4f50: 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  plate..  */.  if
4f60: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
4f70: 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  xferOptimization
4f80: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
4f90: 53 65 6c 65 63 74 2c 20 6f 6e 45 72 72 6f 72 2c  Select, onError,
4fa0: 20 69 44 62 29 20 29 7b 0a 20 20 20 20 61 73 73   iDb) ){.    ass
4fb0: 65 72 74 28 20 21 70 54 72 69 67 67 65 72 20 29  ert( !pTrigger )
4fc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
4fd0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 67 6f  ist==0 );.    go
4fe0: 74 6f 20 69 6e 73 65 72 74 5f 65 6e 64 3b 0a 20  to insert_end;. 
4ff0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
5000: 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50  ITE_OMIT_XFER_OP
5010: 54 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  T */..  /* If th
5020: 69 73 20 69 73 20 61 6e 20 41 55 54 4f 49 4e 43  is is an AUTOINC
5030: 52 45 4d 45 4e 54 20 74 61 62 6c 65 2c 20 6c 6f  REMENT table, lo
5040: 6f 6b 20 75 70 20 74 68 65 20 73 65 71 75 65 6e  ok up the sequen
5050: 63 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ce number in the
5060: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 73 65 71  .  ** sqlite_seq
5070: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 6e 64 20  uence table and 
5080: 73 74 6f 72 65 20 69 74 20 69 6e 20 6d 65 6d 6f  store it in memo
5090: 72 79 20 63 65 6c 6c 20 72 65 67 41 75 74 6f 69  ry cell regAutoi
50a0: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 41 75  nc..  */.  regAu
50b0: 74 6f 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42  toinc = autoIncB
50c0: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62  egin(pParse, iDb
50d0: 2c 20 70 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 41  , pTab);..  /* A
50e0: 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72  llocate register
50f0: 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
5100: 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  e rowid of the n
5110: 65 77 20 72 6f 77 2c 0a 20 20 2a 2a 20 74 68 65  ew row,.  ** the
5120: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
5130: 6e 65 77 20 72 6f 77 2c 20 61 6e 64 20 74 68 65  new row, and the
5140: 20 61 73 73 65 6d 62 6c 65 64 20 72 6f 77 20 72   assembled row r
5150: 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 72 65  ecord..  */.  re
5160: 67 52 6f 77 69 64 20 3d 20 72 65 67 49 6e 73 20  gRowid = regIns 
5170: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
5180: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
5190: 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b   += pTab->nCol +
51a0: 20 31 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74   1;.  if( IsVirt
51b0: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
51c0: 20 72 65 67 52 6f 77 69 64 2b 2b 3b 0a 20 20 20   regRowid++;.   
51d0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
51e0: 0a 20 20 7d 0a 20 20 72 65 67 44 61 74 61 20 3d  .  }.  regData =
51f0: 20 72 65 67 52 6f 77 69 64 2b 31 3b 0a 0a 20 20   regRowid+1;..  
5200: 2f 2a 20 49 66 20 74 68 65 20 49 4e 53 45 52 54  /* If the INSERT
5210: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 63 6c 75   statement inclu
5220: 64 65 64 20 61 6e 20 49 44 4c 49 53 54 20 74 65  ded an IDLIST te
5230: 72 6d 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  rm, then make su
5240: 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d  re.  ** all elem
5250: 65 6e 74 73 20 6f 66 20 74 68 65 20 49 44 4c 49  ents of the IDLI
5260: 53 54 20 72 65 61 6c 6c 79 20 61 72 65 20 63 6f  ST really are co
5270: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
5280: 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 6d  le and .  ** rem
5290: 65 6d 62 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e  ember the column
52a0: 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20   indices..  **. 
52b0: 20 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   ** If the table
52c0: 20 68 61 73 20 61 6e 20 49 4e 54 45 47 45 52 20   has an INTEGER 
52d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
52e0: 6d 6e 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75  mn and that colu
52f0: 6d 6e 0a 20 20 2a 2a 20 69 73 20 6e 61 6d 65 64  mn.  ** is named
5300: 20 69 6e 20 74 68 65 20 49 44 4c 49 53 54 2c 20   in the IDLIST, 
5310: 74 68 65 6e 20 72 65 63 6f 72 64 20 69 6e 20 74  then record in t
5320: 68 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61 72  he ipkColumn var
5330: 69 61 62 6c 65 0a 20 20 2a 2a 20 74 68 65 20 69  iable.  ** the i
5340: 6e 64 65 78 20 69 6e 74 6f 20 49 44 4c 49 53 54  ndex into IDLIST
5350: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
5360: 6b 65 79 20 63 6f 6c 75 6d 6e 2e 20 20 69 70 6b  key column.  ipk
5370: 43 6f 6c 75 6d 6e 20 69 73 0a 20 20 2a 2a 20 74  Column is.  ** t
5380: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5390: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 73 20 69  primary key as i
53a0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 49 44 4c  t appears in IDL
53b0: 49 53 54 2c 20 6e 6f 74 20 61 73 0a 20 20 2a 2a  IST, not as.  **
53c0: 20 69 73 20 61 70 70 65 61 72 73 20 69 6e 20 74   is appears in t
53d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  he original tabl
53e0: 65 2e 20 20 28 54 68 65 20 69 6e 64 65 78 20 6f  e.  (The index o
53f0: 66 20 74 68 65 20 49 4e 54 45 47 45 52 0a 20 20  f the INTEGER.  
5400: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ** PRIMARY KEY i
5410: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  n the original t
5420: 61 62 6c 65 20 69 73 20 70 54 61 62 2d 3e 69 50  able is pTab->iP
5430: 4b 65 79 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  Key.).  */.  if(
5440: 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20   pColumn ){.    
5450: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
5460: 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  mn->nId; i++){. 
5470: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b       pColumn->a[
5480: 69 5d 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20 20  i].idx = -1;.   
5490: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
54a0: 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20  i<pColumn->nId; 
54b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
54c0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
54d0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
54e0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
54f0: 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69  Cmp(pColumn->a[i
5500: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
5510: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
5520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
5530: 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78 20  olumn->a[i].idx 
5540: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = j;.          i
5550: 66 28 20 69 21 3d 6a 20 29 20 62 49 64 4c 69 73  f( i!=j ) bIdLis
5560: 74 49 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  tInOrder = 0;.  
5570: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70          if( j==p
5580: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
5590: 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f 6c            ipkCol
55a0: 75 6d 6e 20 3d 20 69 3b 20 20 61 73 73 65 72 74  umn = i;  assert
55b0: 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20  ( !withoutRowid 
55c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
55d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
55e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
55f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
5600: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
5610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5620: 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e 2d  IsRowid(pColumn-
5630: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20  >a[i].zName) && 
5640: 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  !withoutRowid ){
5650: 0a 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f  .          ipkCo
5660: 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20  lumn = i;.      
5670: 20 20 20 20 62 49 64 4c 69 73 74 49 6e 4f 72 64      bIdListInOrd
5680: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
5690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
56a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
56b0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
56c0: 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %S has no column
56d0: 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
56e0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
56f0: 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d 3e  st, 0, pColumn->
5700: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
5710: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63         pParse->c
5720: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
5730: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69            goto i
5740: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
5750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5770: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
5780: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  many columns of 
5790: 64 61 74 61 20 61 72 65 20 73 75 70 70 6c 69 65  data are supplie
57a0: 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 0a  d.  If the data.
57b0: 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66    ** is coming f
57c0: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
57d0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65 6e  tement, then gen
57e0: 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69  erate a co-routi
57f0: 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 70 72 6f  ne that.  ** pro
5800: 64 75 63 65 73 20 61 20 73 69 6e 67 6c 65 20 72  duces a single r
5810: 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ow of the SELECT
5820: 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
5830: 69 6f 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20 63  ion.  The.  ** c
5840: 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  o-routine is the
5850: 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20 74   common header t
5860: 6f 20 74 68 65 20 33 72 64 20 61 6e 64 20 34 74  o the 3rd and 4t
5870: 68 20 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20 2a  h templates..  *
5880: 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  /.  if( pSelect 
5890: 29 7b 0a 20 20 20 20 2f 2a 20 44 61 74 61 20 69  ){.    /* Data i
58a0: 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  s coming from a 
58b0: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
58c0: 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  e a co-routine t
58d0: 6f 20 72 75 6e 20 74 68 65 20 53 45 4c 45 43 54  o run the SELECT
58e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 59   */.    int regY
58f0: 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  ield;       /* R
5900: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
5910: 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79  co-routine entry
5920: 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  -point */.    in
5930: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
5940: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5950: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
5960: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
5970: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
5980: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  code */..    reg
5990: 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65  Yield = ++pParse
59a0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72  ->nMem;.    addr
59b0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
59c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
59d0: 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
59e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
59f0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
5a00: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
5a10: 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  rTop);.    sqlit
5a20: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
5a30: 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
5a40: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
5a50: 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73 74  ;.    dest.iSdst
5a60: 20 3d 20 62 49 64 4c 69 73 74 49 6e 4f 72 64 65   = bIdListInOrde
5a70: 72 20 3f 20 72 65 67 44 61 74 61 20 3a 20 30 3b  r ? regData : 0;
5a80: 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20  .    dest.nSdst 
5a90: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
5aa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
5ab0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
5ac0: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
5ad0: 20 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 20    regFromSelect 
5ae0: 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
5af0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5b00: 2d 3e 6e 45 72 72 3d 3d 30 20 7c 7c 20 72 63 20  ->nErr==0 || rc 
5b10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  );.    if( rc ||
5b20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5b30: 64 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f  d ) goto insert_
5b40: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c  cleanup;.    sql
5b50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5b60: 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
5b70: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
5b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
5b90: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
5ba0: 20 2d 20 31 29 3b 20 20 20 20 20 20 20 20 20 20   - 1);          
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5bc0: 6c 61 62 65 6c 20 42 3a 20 2a 2f 0a 20 20 20 20  label B: */.    
5bd0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
5be0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 6e  >pEList );.    n
5bf0: 43 6f 6c 75 6d 6e 20 3d 20 70 53 65 6c 65 63 74  Column = pSelect
5c00: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
5c10: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
5c20: 54 65 6d 70 54 61 62 6c 65 20 74 6f 20 54 52 55  TempTable to TRU
5c30: 45 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  E if the result 
5c40: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
5c50: 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 73  atement.    ** s
5c60: 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
5c70: 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72   into a temporar
5c80: 79 20 74 61 62 6c 65 20 28 74 65 6d 70 6c 61 74  y table (templat
5c90: 65 20 34 29 2e 20 20 53 65 74 20 74 6f 0a 20 20  e 4).  Set to.  
5ca0: 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 65 61    ** FALSE if ea
5cb0: 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  ch output row of
5cc0: 20 74 68 65 20 53 45 4c 45 43 54 20 63 61 6e 20   the SELECT can 
5cd0: 62 65 20 77 72 69 74 74 65 6e 20 64 69 72 65 63  be written direc
5ce0: 74 6c 79 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  tly into.    ** 
5cf0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
5d00: 74 61 62 6c 65 20 28 74 65 6d 70 6c 61 74 65 20  table (template 
5d10: 33 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  3)..    **.    *
5d20: 2a 20 41 20 74 65 6d 70 20 74 61 62 6c 65 20 6d  * A temp table m
5d30: 75 73 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ust be used if t
5d40: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 75  he table being u
5d50: 70 64 61 74 65 64 20 69 73 20 61 6c 73 6f 20 6f  pdated is also o
5d60: 6e 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ne.    ** of the
5d70: 20 74 61 62 6c 65 73 20 62 65 69 6e 67 20 72 65   tables being re
5d80: 61 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ad by the SELECT
5d90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 6c 73   statement.  Als
5da0: 6f 20 75 73 65 20 61 20 0a 20 20 20 20 2a 2a 20  o use a .    ** 
5db0: 74 65 6d 70 20 74 61 62 6c 65 20 69 6e 20 74 68  temp table in th
5dc0: 65 20 63 61 73 65 20 6f 66 20 72 6f 77 20 74 72  e case of row tr
5dd0: 69 67 67 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  iggers..    */. 
5de0: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 20     if( pTrigger 
5df0: 7c 7c 20 72 65 61 64 73 54 61 62 6c 65 28 70 50  || readsTable(pP
5e00: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 29  arse, iDb, pTab)
5e10: 20 29 7b 0a 20 20 20 20 20 20 75 73 65 54 65 6d   ){.      useTem
5e20: 70 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  pTable = 1;.    
5e30: 7d 0a 0a 20 20 20 20 69 66 28 20 75 73 65 54 65  }..    if( useTe
5e40: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
5e50: 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63   /* Invoke the c
5e60: 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 74 72  oroutine to extr
5e70: 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  act information 
5e80: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 0a  from the SELECT.
5e90: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 64 64        ** and add
5ea0: 20 69 74 20 74 6f 20 61 20 74 72 61 6e 73 69 65   it to a transie
5eb0: 6e 74 20 74 61 62 6c 65 20 73 72 63 54 61 62 2e  nt table srcTab.
5ec0: 20 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72    The code gener
5ed0: 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 68 65  ated.      ** he
5ee0: 72 65 20 69 73 20 66 72 6f 6d 20 74 68 65 20 34  re is from the 4
5ef0: 74 68 20 74 65 6d 70 6c 61 74 65 3a 0a 20 20 20  th template:.   
5f00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
5f10: 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65 6d 70      B: open temp
5f20: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
5f30: 20 20 20 20 20 4c 3a 20 79 69 65 6c 64 20 58 2c       L: yield X,
5f40: 20 67 6f 74 6f 20 4d 20 61 74 20 45 4f 46 0a 20   goto M at EOF. 
5f50: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
5f60: 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f 6d 20  insert row from 
5f70: 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65 6d 70  R..R+n into temp
5f80: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
5f90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a 20          goto L. 
5fa0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 4d 3a 20       **      M: 
5fb0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
5fc0: 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20     int regRec;  
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
5fe0: 74 65 72 20 74 6f 20 68 6f 6c 64 20 70 61 63 6b  ter to hold pack
5ff0: 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20  ed record */.   
6000: 20 20 20 69 6e 74 20 72 65 67 54 65 6d 70 52 6f     int regTempRo
6010: 77 69 64 3b 20 20 20 20 2f 2a 20 52 65 67 69 73  wid;    /* Regis
6020: 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 65 6d 70  ter to hold temp
6030: 20 74 61 62 6c 65 20 52 4f 57 49 44 20 2a 2f 0a   table ROWID */.
6040: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4c 3b        int addrL;
6050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
6060: 62 65 6c 20 22 4c 22 20 2a 2f 0a 0a 20 20 20 20  bel "L" */..    
6070: 20 20 73 72 63 54 61 62 20 3d 20 70 50 61 72 73    srcTab = pPars
6080: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
6090: 20 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65   regRec = sqlite
60a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
60b0: 73 65 29 3b 0a 20 20 20 20 20 20 72 65 67 54 65  se);.      regTe
60c0: 6d 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  mpRowid = sqlite
60d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
60e0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
60f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6100: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
6110: 2c 20 73 72 63 54 61 62 2c 20 6e 43 6f 6c 75 6d  , srcTab, nColum
6120: 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4c 20  n);.      addrL 
6130: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6140: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6150: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 20   dest.iSDParm); 
6160: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6180: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6190: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 46 72  akeRecord, regFr
61a0: 6f 6d 53 65 6c 65 63 74 2c 20 6e 43 6f 6c 75 6d  omSelect, nColum
61b0: 6e 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  n, regRec);.    
61c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
61d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
61e0: 69 64 2c 20 73 72 63 54 61 62 2c 20 72 65 67 54  id, srcTab, regT
61f0: 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  empRowid);.     
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6210: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6220: 20 73 72 63 54 61 62 2c 20 72 65 67 52 65 63 2c   srcTab, regRec,
6230: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a   regTempRowid);.
6240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6250: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
6260: 74 6f 2c 20 30 2c 20 61 64 64 72 4c 29 3b 0a 20  to, 0, addrL);. 
6270: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6280: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6290: 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
62a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
62b0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 29 3b  pParse, regRec);
62c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
62d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
62e0: 72 73 65 2c 20 72 65 67 54 65 6d 70 52 6f 77 69  rse, regTempRowi
62f0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  d);.    }.  }els
6300: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
6310: 73 20 74 68 65 20 63 61 73 65 20 69 66 20 74 68  s the case if th
6320: 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 49  e data for the I
6330: 4e 53 45 52 54 20 69 73 20 63 6f 6d 69 6e 67 20  NSERT is coming 
6340: 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 0a 20 20  from a VALUES.  
6350: 20 20 2a 2a 20 63 6c 61 75 73 65 0a 20 20 20 20    ** clause.    
6360: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
6370: 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65 6d 73  xt sNC;.    mems
6380: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
6390: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
63a0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
63b0: 65 3b 0a 20 20 20 20 73 72 63 54 61 62 20 3d 20  e;.    srcTab = 
63c0: 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
63d0: 75 73 65 54 65 6d 70 54 61 62 6c 65 3d 3d 30 20  useTempTable==0 
63e0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  );.    nColumn =
63f0: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
6400: 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66  nExpr : 0;.    f
6410: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
6420: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
6430: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
6440: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
6450: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
6460: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
6470: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
6480: 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
6490: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
64a0: 68 65 72 65 20 69 73 20 6e 6f 20 49 44 4c 49 53  here is no IDLIS
64b0: 54 20 74 65 72 6d 20 62 75 74 20 74 68 65 20 74  T term but the t
64c0: 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6e 74 65  able has an inte
64d0: 67 65 72 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  ger primary.  **
64e0: 20 6b 65 79 2c 20 74 68 65 20 73 65 74 20 74 68   key, the set th
64f0: 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61 72 69  e ipkColumn vari
6500: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 74 65  able to the inte
6510: 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
6520: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 64  .  ** column ind
6530: 65 78 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ex in the origin
6540: 61 6c 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74  al table definit
6550: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
6560: 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43  pColumn==0 && nC
6570: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 69  olumn>0 ){.    i
6580: 70 6b 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  pkColumn = pTab-
6590: 3e 69 50 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f  >iPKey;.  }..  /
65a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
65b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
65c0: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
65d0: 64 61 74 61 20 6d 61 74 63 68 65 73 20 74 68 65  data matches the
65e0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
65f0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
6600: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
6610: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
6620: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
6630: 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) ){.    for(i=0
6640: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6650: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 48 69 64  i++){.      nHid
6660: 64 65 6e 20 2b 3d 20 28 49 73 48 69 64 64 65 6e  den += (IsHidden
6670: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
6680: 6f 6c 5b 69 5d 29 20 3f 20 31 20 3a 20 30 29 3b  ol[i]) ? 1 : 0);
6690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
66a0: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e   pColumn==0 && n
66b0: 43 6f 6c 75 6d 6e 20 26 26 20 6e 43 6f 6c 75 6d  Column && nColum
66c0: 6e 21 3d 28 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e  n!=(pTab->nCol-n
66d0: 48 69 64 64 65 6e 29 20 29 7b 0a 20 20 20 20 73  Hidden) ){.    s
66e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
66f0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
6700: 74 61 62 6c 65 20 25 53 20 68 61 73 20 25 64 20  table %S has %d 
6710: 63 6f 6c 75 6d 6e 73 20 62 75 74 20 25 64 20 76  columns but %d v
6720: 61 6c 75 65 73 20 77 65 72 65 20 73 75 70 70 6c  alues were suppl
6730: 69 65 64 22 2c 0a 20 20 20 20 20 20 20 70 54 61  ied",.       pTa
6740: 62 4c 69 73 74 2c 20 30 2c 20 70 54 61 62 2d 3e  bList, 0, pTab->
6750: 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e 2c 20 6e 43  nCol-nHidden, nC
6760: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  olumn);.    goto
6770: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
6780: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75  .  }.  if( pColu
6790: 6d 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e  mn!=0 && nColumn
67a0: 21 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20 29  !=pColumn->nId )
67b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
67c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
67d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
67e0: 63 6f 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c 75 6d  columns", nColum
67f0: 6e 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29  n, pColumn->nId)
6800: 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  ;.    goto inser
6810: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  t_cleanup;.  }. 
6820: 20 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c     .  /* Initial
6830: 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ize the count of
6840: 20 72 6f 77 73 20 74 6f 20 62 65 20 69 6e 73 65   rows to be inse
6850: 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rted.  */.  if( 
6860: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6870: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a  TE_CountRows ){.
6880: 20 20 20 20 72 65 67 52 6f 77 43 6f 75 6e 74 20      regRowCount 
6890: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
68a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
68b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
68c0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 6f 77  teger, 0, regRow
68d0: 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Count);.  }..  /
68e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
68f0: 20 61 20 76 69 65 77 2c 20 6f 70 65 6e 20 74 68   a view, open th
6900: 65 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 64 20  e table and and 
6910: 61 6c 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  all indices */. 
6920: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
6930: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20      int nIdx;.  
6940: 20 20 6e 49 64 78 20 3d 20 73 71 6c 69 74 65 33    nIdx = sqlite3
6950: 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69  OpenTableAndIndi
6960: 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ces(pParse, pTab
6970: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
6980: 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  -1, 0,.         
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 44               &iD
69b0: 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72  ataCur, &iIdxCur
69c0: 29 3b 0a 20 20 20 20 61 52 65 67 49 64 78 20 3d  );.    aRegIdx =
69d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
69e0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
69f0: 6e 74 29 2a 28 6e 49 64 78 2b 31 29 29 3b 0a 20  nt)*(nIdx+1));. 
6a00: 20 20 20 69 66 28 20 61 52 65 67 49 64 78 3d 3d     if( aRegIdx==
6a10: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
6a20: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
6a30: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
6a40: 30 3b 20 69 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b  0; i<nIdx; i++){
6a50: 0a 20 20 20 20 20 20 61 52 65 67 49 64 78 5b 69  .      aRegIdx[i
6a60: 5d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  ] = ++pParse->nM
6a70: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  em;.    }.  }.. 
6a80: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
6a90: 74 6f 70 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  top of the main 
6aa0: 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a  insertion loop *
6ab0: 2f 0a 20 20 69 66 28 20 75 73 65 54 65 6d 70 54  /.  if( useTempT
6ac0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
6ad0: 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64 65 73 20  his block codes 
6ae0: 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20  the top of loop 
6af0: 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 6d 70 6c  only.  The compl
6b00: 65 74 65 20 6c 6f 6f 70 20 69 73 20 74 68 65 0a  ete loop is the.
6b10: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
6b20: 20 70 73 65 75 64 6f 63 6f 64 65 20 28 74 65 6d   pseudocode (tem
6b30: 70 6c 61 74 65 20 34 29 3a 0a 20 20 20 20 2a 2a  plate 4):.    **
6b40: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
6b50: 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62 6c  rewind temp tabl
6b60: 65 2c 20 69 66 20 65 6d 70 74 79 20 67 6f 74 6f  e, if empty goto
6b70: 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 43   D.    **      C
6b80: 3a 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73  : loop over rows
6b90: 20 6f 66 20 69 6e 74 65 72 6d 65 64 69 61 74 65   of intermediate
6ba0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20   table.    **   
6bb0: 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72          transfer
6bc0: 20 76 61 6c 75 65 73 20 66 6f 72 6d 20 69 6e 74   values form int
6bd0: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20  ermediate table 
6be0: 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 20 20 20  into <table>.   
6bf0: 20 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20   **         end 
6c00: 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  loop.    **     
6c10: 20 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20   D: ....    */. 
6c20: 20 20 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20     addrInsTop = 
6c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c40: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
6c50: 73 72 63 54 61 62 29 3b 20 56 64 62 65 43 6f 76  srcTab); VdbeCov
6c60: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
6c70: 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
6c80: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6c90: 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  v);.  }else if( 
6ca0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 2f  pSelect ){.    /
6cb0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64  * This block cod
6cc0: 65 73 20 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f  es the top of lo
6cd0: 6f 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  op only.  The co
6ce0: 6d 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73 20 74  mplete loop is t
6cf0: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
6d00: 69 6e 67 20 70 73 65 75 64 6f 63 6f 64 65 20 28  ing pseudocode (
6d10: 74 65 6d 70 6c 61 74 65 20 33 29 3a 0a 20 20 20  template 3):.   
6d20: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
6d30: 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20 45  C: yield X, at E
6d40: 4f 46 20 67 6f 74 6f 20 44 0a 20 20 20 20 2a 2a  OF goto D.    **
6d50: 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20           insert 
6d60: 74 68 65 20 73 65 6c 65 63 74 20 72 65 73 75 6c  the select resul
6d70: 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 20 66  t into <table> f
6d80: 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 20 20 20 20 2a  rom R..R+n.    *
6d90: 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43  *         goto C
6da0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 44 3a 20  .    **      D: 
6db0: 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ....    */.    a
6dc0: 64 64 72 49 6e 73 54 6f 70 20 3d 20 61 64 64 72  ddrInsTop = addr
6dd0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
6de0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
6df0: 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
6e00: 72 6d 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  rm);.    VdbeCov
6e10: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
6e20: 20 2f 2a 20 52 75 6e 20 74 68 65 20 42 45 46 4f   /* Run the BEFO
6e30: 52 45 20 61 6e 64 20 49 4e 53 54 45 41 44 20 4f  RE and INSTEAD O
6e40: 46 20 74 72 69 67 67 65 72 73 2c 20 69 66 20 74  F triggers, if t
6e50: 68 65 72 65 20 61 72 65 20 61 6e 79 0a 20 20 2a  here are any.  *
6e60: 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20  /.  endOfLoop = 
6e70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
6e80: 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 74  abel(v);.  if( t
6e90: 6d 61 73 6b 20 26 20 54 52 49 47 47 45 52 5f 42  mask & TRIGGER_B
6ea0: 45 46 4f 52 45 20 29 7b 0a 20 20 20 20 69 6e 74  EFORE ){.    int
6eb0: 20 72 65 67 43 6f 6c 73 20 3d 20 73 71 6c 69 74   regCols = sqlit
6ec0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
6ed0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
6ee0: 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 62 75  l+1);..    /* bu
6ef0: 69 6c 64 20 74 68 65 20 4e 45 57 2e 2a 20 72 65  ild the NEW.* re
6f00: 66 65 72 65 6e 63 65 20 72 6f 77 2e 20 20 4e 6f  ference row.  No
6f10: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 72 65  te that if there
6f20: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 0a 20   is an INTEGER. 
6f30: 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
6f40: 59 20 69 6e 74 6f 20 77 68 69 63 68 20 61 20 4e  Y into which a N
6f50: 55 4c 4c 20 69 73 20 62 65 69 6e 67 20 69 6e 73  ULL is being ins
6f60: 65 72 74 65 64 2c 20 74 68 61 74 20 4e 55 4c 4c  erted, that NULL
6f70: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
6f80: 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20  translated into 
6f90: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
6fa0: 74 68 65 20 72 6f 77 2e 20 20 42 75 74 20 6f 6e  the row.  But on
6fb0: 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67 65   a BEFORE trigge
6fc0: 72 2c 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  r,.    ** we do 
6fd0: 6e 6f 74 20 6b 6e 6f 77 20 77 68 61 74 20 74 68  not know what th
6fe0: 65 20 75 6e 69 71 75 65 20 49 44 20 77 69 6c 6c  e unique ID will
6ff0: 20 62 65 20 28 62 65 63 61 75 73 65 20 74 68 65   be (because the
7000: 20 69 6e 73 65 72 74 20 68 61 73 0a 20 20 20 20   insert has.    
7010: 2a 2a 20 6e 6f 74 20 68 61 70 70 65 6e 65 64 20  ** not happened 
7020: 79 65 74 29 20 73 6f 20 77 65 20 73 75 62 73 74  yet) so we subst
7030: 69 74 75 74 65 20 61 20 72 6f 77 69 64 20 6f 66  itute a rowid of
7040: 20 2d 31 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   -1.    */.    i
7050: 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3c 30 20 29  f( ipkColumn<0 )
7060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7070: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7080: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67  Integer, -1, reg
7090: 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Cols);.    }else
70a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a  {.      int j1;.
70b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 77        assert( !w
70c0: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 3b 0a 20  ithoutRowid );. 
70d0: 20 20 20 20 20 69 66 28 20 75 73 65 54 65 6d 70       if( useTemp
70e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
70f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7100: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
7110: 20 73 72 63 54 61 62 2c 20 69 70 6b 43 6f 6c 75   srcTab, ipkColu
7120: 6d 6e 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20 20  mn, regCols);.  
7130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7140: 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65     assert( pSele
7150: 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 74 68  ct==0 );  /* Oth
7160: 65 72 77 69 73 65 20 75 73 65 54 65 6d 70 54 61  erwise useTempTa
7170: 62 6c 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  ble is true */. 
7180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7190: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
71a0: 4c 69 73 74 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d  List->a[ipkColum
71b0: 6e 5d 2e 70 45 78 70 72 2c 20 72 65 67 43 6f 6c  n].pExpr, regCol
71c0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
71d0: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
71e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
71f0: 6f 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29  otNull, regCols)
7200: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
7210: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7230: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65  _Integer, -1, re
7240: 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  gCols);.      sq
7250: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
7260: 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
7270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7280: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
7290: 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20 56 64 62  t, regCols); Vdb
72a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
72b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 6e    }..    /* Cann
72c0: 6f 74 20 68 61 76 65 20 74 72 69 67 67 65 72 73  ot have triggers
72d0: 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   on a virtual ta
72e0: 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65 20  ble. If it were 
72f0: 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20 2a 2a  possible,.    **
7300: 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f 75 6c   this block woul
7310: 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f 75 6e  d have to accoun
7320: 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63 6f 6c  t for hidden col
7330: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
7340: 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
7350: 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20 20 20  al(pTab) );..   
7360: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 6e   /* Create the n
7370: 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61 0a 20  ew column data. 
7380: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
7390: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
73a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
73b0: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20   pColumn==0 ){. 
73c0: 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a 20 20         j = i;.  
73d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43     for(j=0; j<pC
73f0: 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  olumn->nId; j++)
7400: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7410: 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64  pColumn->a[j].id
7420: 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  x==i ) break;.  
7430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7440: 20 20 20 20 20 20 69 66 28 20 28 21 75 73 65 54        if( (!useT
7450: 65 6d 70 54 61 62 6c 65 20 26 26 20 21 70 4c 69  empTable && !pLi
7460: 73 74 29 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20  st) || (pColumn 
7470: 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e  && j>=pColumn->n
7480: 49 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Id) ){.        s
7490: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
74a0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f  Parse, pTab->aCo
74b0: 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 43  l[i].pDflt, regC
74c0: 6f 6c 73 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20  ols+i+1);.      
74d0: 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d  }else if( useTem
74e0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
74f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7500: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7510: 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 72 65 67  , srcTab, j, reg
7520: 43 6f 6c 73 2b 69 2b 31 29 3b 20 0a 20 20 20 20  Cols+i+1); .    
7530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7540: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
7550: 3d 3d 30 20 29 3b 20 2f 2a 20 4f 74 68 65 72 77  ==0 ); /* Otherw
7560: 69 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65  ise useTempTable
7570: 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20   is true */.    
7580: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7590: 6f 64 65 41 6e 64 43 61 63 68 65 28 70 50 61 72  odeAndCache(pPar
75a0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  se, pList->a[j].
75b0: 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 2b 69  pExpr, regCols+i
75c0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1);.      }.   
75d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
75e0: 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
75f0: 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68 20 61  on a view with a
7600: 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53  n INSTEAD OF INS
7610: 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20 20 20  ERT trigger,.   
7620: 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d   ** do not attem
7630: 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f  pt any conversio
7640: 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65 6d 62  ns before assemb
7650: 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 2e  ling the record.
7660: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
7670: 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  is a real table,
7680: 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65 72 73   attempt convers
7690: 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72 65 64  ions as required
76a0: 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   by the.    ** t
76b0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69  able column affi
76c0: 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  nities..    */. 
76d0: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
76e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
76f0: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
7700: 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2b 31 29  pTab, regCols+1)
7710: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7720: 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72 20 49  Fire BEFORE or I
7730: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
7740: 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  rs */.    sqlite
7750: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
7760: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
7770: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20  , TK_INSERT, 0, 
7780: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20  TRIGGER_BEFORE, 
7790: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 72  .        pTab, r
77a0: 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e 6e 43 6f  egCols-pTab->nCo
77b0: 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e  l-1, onError, en
77c0: 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 73  dOfLoop);..    s
77d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
77e0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
77f0: 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d 3e 6e 43  egCols, pTab->nC
7800: 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ol+1);.  }..  /*
7810: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   Compute the con
7820: 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tent of the next
7830: 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 69   row to insert i
7840: 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 0a 20  nto a range of. 
7850: 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 62 65   ** registers be
7860: 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67 49 6e  ginning at regIn
7870: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
7880: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69 66 28  sView ){.    if(
7890: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
78a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
78b0: 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 56 55   row that the VU
78c0: 70 64 61 74 65 20 6f 70 63 6f 64 65 20 77 69 6c  pdate opcode wil
78d0: 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e 65 20 2a  l delete: none *
78e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
78f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7900: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 6e 73 29  Null, 0, regIns)
7910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7920: 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ipkColumn>=0 ){.
7930: 20 20 20 20 20 20 69 66 28 20 75 73 65 54 65 6d        if( useTem
7940: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
7950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7960: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7970: 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43 6f 6c  , srcTab, ipkCol
7980: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  umn, regRowid);.
7990: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
79a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
79b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
79c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
79d0: 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b 69   regFromSelect+i
79e0: 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77  pkColumn, regRow
79f0: 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
7a00: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
7a10: 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 73   *pOp;.        s
7a20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
7a30: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
7a40: 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ipkColumn].pExpr
7a50: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
7a60: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
7a70: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
7a80: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
7a90: 41 4c 57 41 59 53 28 70 4f 70 29 20 26 26 20 70  ALWAYS(pOp) && p
7aa0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
7ab0: 75 6c 6c 20 26 26 20 21 49 73 56 69 72 74 75 61  ull && !IsVirtua
7ac0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
7ad0: 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61 67 20       appendFlag 
7ae0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
7af0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
7b00: 4e 65 77 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  NewRowid;.      
7b10: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 69 44      pOp->p1 = iD
7b20: 61 74 61 43 75 72 3b 0a 20 20 20 20 20 20 20 20  ataCur;.        
7b30: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 52    pOp->p2 = regR
7b40: 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
7b50: 70 4f 70 2d 3e 70 33 20 3d 20 72 65 67 41 75 74  pOp->p3 = regAut
7b60: 6f 69 6e 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oinc;.        }.
7b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
7b80: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
7b90: 4b 45 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69  KEY expression i
7ba0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 75 73 65  s NULL, then use
7bb0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 0a 20 20 20   OP_NewRowid.   
7bc0: 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65 72 61 74     ** to generat
7bd0: 65 20 61 20 75 6e 69 71 75 65 20 70 72 69 6d 61  e a unique prima
7be0: 72 79 20 6b 65 79 20 76 61 6c 75 65 2e 0a 20 20  ry key value..  
7bf0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7c00: 20 21 61 70 70 65 6e 64 46 6c 61 67 20 29 7b 0a   !appendFlag ){.
7c10: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a          int j1;.
7c20: 20 20 20 20 20 20 20 20 69 66 28 20 21 49 73 56          if( !IsV
7c30: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
7c40: 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73            j1 = s
7c50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7c60: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
7c70: 72 65 67 52 6f 77 69 64 29 3b 20 56 64 62 65 43  regRowid); VdbeC
7c80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ca0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
7cb0: 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43 75 72  wRowid, iDataCur
7cc0: 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 41  , regRowid, regA
7cd0: 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20 20  utoinc);.       
7ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
7cf0: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
7d00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7d10: 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c          j1 = sql
7d20: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7d30: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
7d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d50: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
7d60: 2c 20 72 65 67 52 6f 77 69 64 2c 20 6a 31 2b 32  , regRowid, j1+2
7d70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7d80: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  v);.        }.  
7d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7da0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
7db0: 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f 77 69  stBeInt, regRowi
7dc0: 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
7dd0: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
7de0: 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
7df0: 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 77 69  tual(pTab) || wi
7e00: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
7e10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
7e30: 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 0, regRowid);.
7e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e60: 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p3(v, OP_NewRowi
7e70: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65 67  d, iDataCur, reg
7e80: 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f 69 6e  Rowid, regAutoin
7e90: 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  c);.      append
7ea0: 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Flag = 1;.    }.
7eb0: 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70 28      autoIncStep(
7ec0: 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f 69  pParse, regAutoi
7ed0: 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  nc, regRowid);..
7ee0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 64      /* Compute d
7ef0: 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ata for all colu
7f00: 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77 20 65  mns of the new e
7f10: 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e 67 0a  ntry, beginning.
7f20: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
7f30: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20  first column..  
7f40: 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64 64 65 6e    */.    nHidden
7f50: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
7f60: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
7f70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
7f80: 20 69 52 65 67 53 74 6f 72 65 20 3d 20 72 65 67   iRegStore = reg
7f90: 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20 20 20 20  Rowid+1+i;.     
7fa0: 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50   if( i==pTab->iP
7fb0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Key ){.        /
7fc0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
7fd0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
7fe0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
7ff0: 20 61 6c 77 61 79 73 20 61 20 4e 55 4c 4c 2e 0a   always a NULL..
8000: 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 65          ** Whene
8010: 76 65 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ver this column 
8020: 69 73 20 72 65 61 64 2c 20 74 68 65 20 72 6f 77  is read, the row
8030: 69 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74  id will be subst
8040: 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 2a  ituted.        *
8050: 2a 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  * in its place. 
8060: 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20 74 68 69   Hence, fill thi
8070: 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  s column with a 
8080: 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a 20 20  NULL to avoid.  
8090: 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20        ** taking 
80a0: 75 70 20 64 61 74 61 20 73 70 61 63 65 20 77 69  up data space wi
80b0: 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  th information t
80c0: 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
80d0: 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20 20 20  e used..        
80e0: 2a 2a 20 41 73 20 74 68 65 72 65 20 6d 61 79 20  ** As there may 
80f0: 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f 70 69 65  be shallow copie
8100: 73 20 6f 66 20 74 68 69 73 20 76 61 6c 75 65 2c  s of this value,
8110: 20 6d 61 6b 65 20 69 74 20 61 20 73 6f 66 74 2d   make it a soft-
8120: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  NULL */.        
8130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8140: 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e 75 6c 6c  1(v, OP_SoftNull
8150: 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20  , iRegStore);.  
8160: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8180: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ( pColumn==0 ){.
8190: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
81a0: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
81b0: 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20  ->aCol[i]) ){.  
81c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
81d0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
81e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d  );.          j =
81f0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6e   -1;.          n
8200: 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  Hidden++;.      
8210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8220: 20 20 20 6a 20 3d 20 69 20 2d 20 6e 48 69 64 64     j = i - nHidd
8230: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
8240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8250: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43     for(j=0; j<pC
8260: 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  olumn->nId; j++)
8270: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8280: 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64  pColumn->a[j].id
8290: 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  x==i ) break;.  
82a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
82b0: 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 7c 7c        if( j<0 ||
82c0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28   nColumn==0 || (
82d0: 70 43 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43  pColumn && j>=pC
82e0: 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20  olumn->nId) ){. 
82f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8300: 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
8310: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61  (pParse, pTab->a
8320: 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 69 52  Col[i].pDflt, iR
8330: 65 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20  egStore);.      
8340: 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d  }else if( useTem
8350: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8380: 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 69 52 65  , srcTab, j, iRe
8390: 67 53 74 6f 72 65 29 3b 20 0a 20 20 20 20 20 20  gStore); .      
83a0: 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63  }else if( pSelec
83b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
83c0: 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 21 3d   regFromSelect!=
83d0: 72 65 67 44 61 74 61 20 29 7b 0a 20 20 20 20 20  regData ){.     
83e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
83f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
8400: 70 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63  py, regFromSelec
8410: 74 2b 6a 2c 20 69 52 65 67 53 74 6f 72 65 29 3b  t+j, iRegStore);
8420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8440: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
8450: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
8460: 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 52 65 67 53  [j].pExpr, iRegS
8470: 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tore);.      }. 
8480: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
8490: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 68  erate code to ch
84a0: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
84b0: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 69 6e 64  and generate ind
84c0: 65 78 20 6b 65 79 73 20 61 6e 64 0a 20 20 20 20  ex keys and.    
84d0: 2a 2a 20 64 6f 20 74 68 65 20 69 6e 73 65 72 74  ** do the insert
84e0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ion..    */.#ifn
84f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8500: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
8510: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
8520: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
8530: 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
8540: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
8550: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
8560: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
8570: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b    sqlite3VtabMak
8580: 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  eWritable(pParse
8590: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73  , pTab);.      s
85a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
85b0: 28 76 2c 20 4f 50 5f 56 55 70 64 61 74 65 2c 20  (v, OP_VUpdate, 
85c0: 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c  1, pTab->nCol+2,
85d0: 20 72 65 67 49 6e 73 2c 20 70 56 54 61 62 2c 20   regIns, pVTab, 
85e0: 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20  P4_VTAB);.      
85f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8600: 65 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d  eP5(v, onError==
8610: 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f 45 5f  OE_Default ? OE_
8620: 41 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f 72 29  Abort : onError)
8630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
8640: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
8650: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8660: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  f.    {.      in
8670: 74 20 69 73 52 65 70 6c 61 63 65 3b 20 20 20 20  t isReplace;    
8680: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
8690: 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6d 61  f constraints ma
86a0: 79 20 63 61 75 73 65 20 61 20 72 65 70 6c 61 63  y cause a replac
86b0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
86c0: 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
86d0: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
86e0: 65 2c 20 70 54 61 62 2c 20 61 52 65 67 49 64 78  e, pTab, aRegIdx
86f0: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  , iDataCur, iIdx
8700: 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 72  Cur,.          r
8710: 65 67 49 6e 73 2c 20 30 2c 20 69 70 6b 43 6f 6c  egIns, 0, ipkCol
8720: 75 6d 6e 3e 3d 30 2c 20 6f 6e 45 72 72 6f 72 2c  umn>=0, onError,
8730: 20 65 6e 64 4f 66 4c 6f 6f 70 2c 20 26 69 73 52   endOfLoop, &isR
8740: 65 70 6c 61 63 65 0a 20 20 20 20 20 20 29 3b 0a  eplace.      );.
8750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43        sqlite3FkC
8760: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61  heck(pParse, pTa
8770: 62 2c 20 30 2c 20 72 65 67 49 6e 73 2c 20 30 2c  b, 0, regIns, 0,
8780: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8790: 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  e3CompleteInsert
87a0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
87b0: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  , iDataCur, iIdx
87c0: 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 20 72 65 67 49 6e 73 2c 20 61 52 65 67      regIns, aReg
87f0: 49 64 78 2c 20 30 2c 20 61 70 70 65 6e 64 46 6c  Idx, 0, appendFl
8800: 61 67 2c 20 69 73 52 65 70 6c 61 63 65 3d 3d 30  ag, isReplace==0
8810: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8820: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f  /* Update the co
8830: 75 6e 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  unt of rows that
8840: 20 61 72 65 20 69 6e 73 65 72 74 65 64 0a 20 20   are inserted.  
8850: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
8860: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
8870: 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20  ntRows)!=0 ){.  
8880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8890: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
88a0: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31  , regRowCount, 1
88b0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  );.  }..  if( pT
88c0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a  rigger ){.    /*
88d0: 20 43 6f 64 65 20 41 46 54 45 52 20 74 72 69 67   Code AFTER trig
88e0: 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  gers */.    sqli
88f0: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
8900: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
8910: 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  er, TK_INSERT, 0
8920: 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c  , TRIGGER_AFTER,
8930: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20   .        pTab, 
8940: 72 65 67 44 61 74 61 2d 32 2d 70 54 61 62 2d 3e  regData-2-pTab->
8950: 6e 43 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c 20 65  nCol, onError, e
8960: 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a  ndOfLoop);.  }..
8970: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
8980: 6f 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65  of the main inse
8990: 72 74 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66 20 74  rtion loop, if t
89a0: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 0a 20  he data source. 
89b0: 20 2a 2a 20 69 73 20 61 20 53 45 4c 45 43 54 20   ** is a SELECT 
89c0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
89d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
89e0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
89f0: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75  OfLoop);.  if( u
8a00: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
8a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8a20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
8a30: 20 73 72 63 54 61 62 2c 20 61 64 64 72 43 6f 6e   srcTab, addrCon
8a40: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
8a50: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
8a60: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8a70: 61 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20 20 20  addrInsTop);.   
8a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8a90: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
8aa0: 73 72 63 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  srcTab);.  }else
8ab0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
8ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ad0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
8ae0: 2c 20 30 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  , 0, addrCont);.
8af0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
8b00: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
8b10: 6e 73 54 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  nsTop);.  }..  i
8b20: 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
8b30: 61 62 29 20 26 26 20 21 69 73 56 69 65 77 20 29  ab) && !isView )
8b40: 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  {.    /* Close a
8b50: 6c 6c 20 74 61 62 6c 65 73 20 6f 70 65 6e 65 64  ll tables opened
8b60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44 61 74   */.    if( iDat
8b70: 61 43 75 72 3c 69 49 64 78 43 75 72 20 29 20 73  aCur<iIdxCur ) s
8b80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
8b90: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44  (v, OP_Close, iD
8ba0: 61 74 61 43 75 72 29 3b 0a 20 20 20 20 66 6f 72  ataCur);.    for
8bb0: 28 69 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61  (idx=0, pIdx=pTa
8bc0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
8bd0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
8be0: 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20  t, idx++){.     
8bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c00: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
8c10: 69 64 78 2b 69 49 64 78 43 75 72 29 3b 0a 20 20  idx+iIdxCur);.  
8c20: 20 20 7d 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f    }.  }..insert_
8c30: 65 6e 64 3a 0a 20 20 2f 2a 20 55 70 64 61 74 65  end:.  /* Update
8c40: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
8c50: 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73 74  ence table by st
8c60: 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  oring the conten
8c70: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61  t of the.  ** ma
8c80: 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e  ximum rowid coun
8c90: 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f 72  ter values recor
8ca0: 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  ded while insert
8cb0: 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75  ing into.  ** au
8cc0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c  toincrement tabl
8cd0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
8ce0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
8cf0: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
8d00: 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20  ggerTab==0 ){.  
8d10: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63    sqlite3Autoinc
8d20: 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65  rementEnd(pParse
8d30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
8d40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8d50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 73 65  ber of rows inse
8d60: 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 72 6f  rted. If this ro
8d70: 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67  utine is .  ** g
8d80: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 62  enerating code b
8d90: 65 63 61 75 73 65 20 6f 66 20 61 20 63 61 6c 6c  ecause of a call
8da0: 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73 74 65   to sqlite3Neste
8db0: 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74  dParse(), do not
8dc0: 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  .  ** invoke the
8dd0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
8de0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  on..  */.  if( (
8df0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
8e00: 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26 20 21  _CountRows) && !
8e10: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
8e20: 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  & !pParse->pTrig
8e30: 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 73 71  gerTab ){.    sq
8e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8e50: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8e60: 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29   regRowCount, 1)
8e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e80: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
8e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8ea0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8eb0: 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  0, COLNAME_NAME,
8ec0: 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22   "rows inserted"
8ed0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8ee0: 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 63 6c  ;.  }..insert_cl
8ef0: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
8f00: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
8f10: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73  , pTabList);.  s
8f20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8f30: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
8f40: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
8f50: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
8f60: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  ct);.  sqlite3Id
8f70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8f80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74  Column);.  sqlit
8f90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 52 65  e3DbFree(db, aRe
8fa0: 67 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d 61 6b  gIdx);.}../* Mak
8fb0: 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22 20  e sure "isView" 
8fc0: 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f 73  and other macros
8fd0: 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20 61   defined above a
8fe0: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74  re undefined. Ot
8ff0: 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 79 20  herwise.** they 
9000: 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77 69  may interfere wi
9010: 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f  th compilation o
9020: 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  f other function
9030: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a 2a  s in this file.*
9040: 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65 72  * (or in another
9050: 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20 66   file, if this f
9060: 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74  ile becomes part
9070: 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   of the amalgama
9080: 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64 65  tion).  */.#ifde
9090: 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65 66  f isView. #undef
90a0: 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a 23   isView.#endif.#
90b0: 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a 20  ifdef pTrigger. 
90c0: 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72 0a  #undef pTrigger.
90d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 74 6d  #endif.#ifdef tm
90e0: 61 73 6b 0a 20 23 75 6e 64 65 66 20 74 6d 61 73  ask. #undef tmas
90f0: 6b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  k.#endif../*.** 
9100: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
9110: 20 64 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63   do constraint c
9120: 68 65 63 6b 73 20 70 72 69 6f 72 20 74 6f 20 61  hecks prior to a
9130: 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55  n INSERT or an U
9140: 50 44 41 54 45 0a 2a 2a 20 6f 6e 20 74 61 62 6c  PDATE.** on tabl
9150: 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  e pTab..**.** Th
9160: 65 20 72 65 67 4e 65 77 44 61 74 61 20 70 61 72  e regNewData par
9170: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 66 69  ameter is the fi
9180: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
9190: 61 20 72 61 6e 67 65 20 74 68 61 74 20 63 6f 6e  a range that con
91a0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74  tains.** the dat
91b0: 61 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  a to be inserted
91c0: 20 6f 72 20 74 68 65 20 64 61 74 61 20 61 66 74   or the data aft
91d0: 65 72 20 74 68 65 20 75 70 64 61 74 65 2e 20 20  er the update.  
91e0: 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  There will be.**
91f0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 72 65   pTab->nCol+1 re
9200: 67 69 73 74 65 72 73 20 69 6e 20 74 68 69 73 20  gisters in this 
9210: 72 61 6e 67 65 2e 20 20 54 68 65 20 66 69 72 73  range.  The firs
9220: 74 20 72 65 67 69 73 74 65 72 20 28 74 68 65 20  t register (the 
9230: 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 4e  one.** that regN
9240: 65 77 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f  ewData points to
9250: 29 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  ) will contain t
9260: 68 65 20 6e 65 77 20 72 6f 77 69 64 2c 20 6f 72  he new rowid, or
9270: 20 4e 55 4c 4c 20 69 6e 20 74 68 65 0a 2a 2a 20   NULL in the.** 
9280: 63 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f 55  case of a WITHOU
9290: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
92a0: 54 68 65 20 73 65 63 6f 6e 64 20 72 65 67 69 73  The second regis
92b0: 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
92c0: 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e   will.** contain
92d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
92e0: 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
92f0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 74 68 69  column.  The thi
9300: 72 64 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  rd register will
9310: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  .** contain the 
9320: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73  content of the s
9330: 65 63 6f 6e 64 20 74 61 62 6c 65 20 63 6f 6c 75  econd table colu
9340: 6d 6e 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  mn.  And so fort
9350: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67  h..**.** The reg
9360: 4f 6c 64 44 61 74 61 20 70 61 72 61 6d 65 74 65  OldData paramete
9370: 72 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  r is similar to 
9380: 72 65 67 4e 65 77 44 61 74 61 20 65 78 63 65 70  regNewData excep
9390: 74 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  t that it contai
93a0: 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 20 70  ns.** the data p
93b0: 72 69 6f 72 20 74 6f 20 61 6e 20 55 50 44 41 54  rior to an UPDAT
93c0: 45 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 66  E rather than af
93d0: 74 65 72 77 61 72 64 73 2e 20 20 72 65 67 4f 6c  terwards.  regOl
93e0: 64 44 61 74 61 20 69 73 20 7a 65 72 6f 0a 2a 2a  dData is zero.**
93f0: 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 54 2e 20   for an INSERT. 
9400: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
9410: 6e 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  n distinguish be
9420: 74 77 65 65 6e 20 55 50 44 41 54 45 20 61 6e 64  tween UPDATE and
9430: 20 49 4e 53 45 52 54 20 62 79 0a 2a 2a 20 63 68   INSERT by.** ch
9440: 65 63 6b 69 6e 67 20 72 65 67 4f 6c 64 44 61 74  ecking regOldDat
9450: 61 20 66 6f 72 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  a for zero..**.*
9460: 2a 20 46 6f 72 20 61 6e 20 55 50 44 41 54 45 2c  * For an UPDATE,
9470: 20 74 68 65 20 70 6b 43 68 6e 67 20 62 6f 6f 6c   the pkChng bool
9480: 65 61 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ean is true if t
9490: 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  he true primary 
94a0: 6b 65 79 20 28 74 68 65 0a 2a 2a 20 72 6f 77 69  key (the.** rowi
94b0: 64 20 66 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 74  d for a normal t
94c0: 61 62 6c 65 20 6f 72 20 74 68 65 20 50 52 49 4d  able or the PRIM
94d0: 41 52 59 20 4b 45 59 20 66 6f 72 20 61 20 57 49  ARY KEY for a WI
94e0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
94f0: 65 29 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d  e).** might be m
9500: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 55  odified by the U
9510: 50 44 41 54 45 2e 20 20 49 66 20 70 6b 43 68 6e  PDATE.  If pkChn
9520: 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  g is false, then
9530: 20 74 68 65 20 6b 65 79 20 6f 66 0a 2a 2a 20 74   the key of.** t
9540: 68 65 20 69 44 61 74 61 43 75 72 20 63 6f 6e 74  he iDataCur cont
9550: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  ent table is gua
9560: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
9570: 63 68 61 6e 67 65 64 20 62 79 20 74 68 65 20 55  changed by the U
9580: 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  PDATE..**.** For
9590: 20 61 6e 20 49 4e 53 45 52 54 2c 20 74 68 65 20   an INSERT, the 
95a0: 70 6b 43 68 6e 67 20 62 6f 6f 6c 65 61 6e 20 69  pkChng boolean i
95b0: 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72  ndicates whether
95c0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 69   or not the rowi
95d0: 64 0a 2a 2a 20 77 61 73 20 65 78 70 6c 69 63 69  d.** was explici
95e0: 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 73  tly specified as
95f0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 49 4e 53   part of the INS
9600: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ERT statement.  
9610: 49 66 20 70 6b 43 68 6e 67 0a 2a 2a 20 69 73 20  If pkChng.** is 
9620: 7a 65 72 6f 2c 20 69 74 20 6d 65 61 6e 73 20 74  zero, it means t
9630: 68 61 74 20 74 68 65 20 65 69 74 68 65 72 20 72  hat the either r
9640: 6f 77 69 64 20 69 73 20 63 6f 6d 70 75 74 65 64  owid is computed
9650: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
9660: 72 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 74 61  r.** that the ta
9670: 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54  ble is a WITHOUT
9680: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61 6e 64   ROWID table and
9690: 20 68 61 73 20 6e 6f 20 72 6f 77 69 64 2e 20 20   has no rowid.  
96a0: 4f 6e 20 61 6e 20 49 4e 53 45 52 54 2c 0a 2a 2a  On an INSERT,.**
96b0: 20 70 6b 43 68 6e 67 20 77 69 6c 6c 20 6f 6e 6c   pkChng will onl
96c0: 79 20 62 65 20 74 72 75 65 20 69 66 20 74 68 65  y be true if the
96d0: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
96e0: 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 69 6e  t provides an in
96f0: 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 20 66  teger.** value f
9700: 6f 72 20 65 69 74 68 65 72 20 74 68 65 20 72 6f  or either the ro
9710: 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 74  wid column or it
9720: 73 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  s INTEGER PRIMAR
9730: 59 20 4b 45 59 20 61 6c 69 61 73 2e 0a 2a 2a 0a  Y KEY alias..**.
9740: 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
9750: 72 61 74 65 64 20 62 79 20 74 68 69 73 20 72 6f  rated by this ro
9760: 75 74 69 6e 65 20 77 69 6c 6c 20 73 74 6f 72 65  utine will store
9770: 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72 69   new index entri
9780: 65 73 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  es into.** regis
9790: 74 65 72 73 20 69 64 65 6e 74 69 66 69 65 64 20  ters identified 
97a0: 62 79 20 61 52 65 67 49 64 78 5b 5d 2e 20 20 4e  by aRegIdx[].  N
97b0: 6f 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  o index entry is
97c0: 20 63 72 65 61 74 65 64 20 66 6f 72 0a 2a 2a 20   created for.** 
97d0: 69 6e 64 69 63 65 73 20 77 68 65 72 65 20 61 52  indices where aR
97e0: 65 67 49 64 78 5b 69 5d 3d 3d 30 2e 20 20 54 68  egIdx[i]==0.  Th
97f0: 65 20 6f 72 64 65 72 20 6f 66 20 69 6e 64 69 63  e order of indic
9800: 65 73 20 69 6e 20 61 52 65 67 49 64 78 5b 5d 20  es in aRegIdx[] 
9810: 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61  is.** the same a
9820: 73 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 69  s the order of i
9830: 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 6c 69  ndices on the li
9840: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 69 6e 64  nked list of ind
9850: 69 63 65 73 0a 2a 2a 20 61 74 20 70 54 61 62 2d  ices.** at pTab-
9860: 3e 70 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  >pIndex..**.** T
9870: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
9880: 61 76 65 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  ave already open
9890: 65 64 20 77 72 69 74 65 61 62 6c 65 20 63 75 72  ed writeable cur
98a0: 73 6f 72 73 20 6f 6e 20 74 68 65 20 6d 61 69 6e  sors on the main
98b0: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 61 6c  .** table and al
98c0: 6c 20 61 70 70 6c 69 63 61 62 6c 65 20 69 6e 64  l applicable ind
98d0: 69 63 65 73 20 28 74 68 61 74 20 69 73 20 74 6f  ices (that is to
98e0: 20 73 61 79 2c 20 61 6c 6c 20 69 6e 64 69 63 65   say, all indice
98f0: 73 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 61  s for which.** a
9900: 52 65 67 49 64 78 5b 5d 20 69 73 20 6e 6f 74 20  RegIdx[] is not 
9910: 7a 65 72 6f 29 2e 20 20 69 44 61 74 61 43 75 72  zero).  iDataCur
9920: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
9930: 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  or the main tabl
9940: 65 20 77 68 65 6e 0a 2a 2a 20 69 6e 73 65 72 74  e when.** insert
9950: 69 6e 67 20 6f 72 20 75 70 64 61 74 69 6e 67 20  ing or updating 
9960: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 6f  a rowid table, o
9970: 72 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  r the cursor for
9980: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
9990: 0a 2a 2a 20 69 6e 64 65 78 20 77 68 65 6e 20 6f  .** index when o
99a0: 70 65 72 61 74 69 6e 67 20 6f 6e 20 61 20 57 49  perating on a WI
99b0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
99c0: 65 2e 20 20 69 49 64 78 43 75 72 20 69 73 20 74  e.  iIdxCur is t
99d0: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 66 6f 72  he cursor.** for
99e0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   the first index
99f0: 20 69 6e 20 74 68 65 20 70 54 61 62 2d 3e 70 49   in the pTab->pI
9a00: 6e 64 65 78 20 6c 69 73 74 2e 20 20 43 75 72 73  ndex list.  Curs
9a10: 6f 72 73 20 66 6f 72 20 6f 74 68 65 72 20 69 6e  ors for other in
9a20: 64 69 63 65 73 0a 2a 2a 20 61 72 65 20 61 74 20  dices.** are at 
9a30: 69 49 64 78 43 75 72 2b 4e 20 66 6f 72 20 74 68  iIdxCur+N for th
9a40: 65 20 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f  e N-th element o
9a50: 66 20 74 68 65 20 70 54 61 62 2d 3e 70 49 6e 64  f the pTab->pInd
9a60: 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ex list..**.** T
9a70: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
9a80: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
9a90: 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  to check constra
9aa0: 69 6e 74 73 2e 20 20 4e 4f 54 20 4e 55 4c 4c 2c  ints.  NOT NULL,
9ab0: 0a 2a 2a 20 43 48 45 43 4b 2c 20 61 6e 64 20 55  .** CHECK, and U
9ac0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
9ad0: 73 20 61 72 65 20 61 6c 6c 20 63 68 65 63 6b 65  s are all checke
9ae0: 64 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  d.  If a constra
9af0: 69 6e 74 20 66 61 69 6c 73 2c 0a 2a 2a 20 74 68  int fails,.** th
9b00: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
9b10: 74 65 20 61 63 74 69 6f 6e 20 69 73 20 70 65 72  te action is per
9b20: 66 6f 72 6d 65 64 2e 20 20 54 68 65 72 65 20 61  formed.  There a
9b30: 72 65 20 66 69 76 65 20 70 6f 73 73 69 62 6c 65  re five possible
9b40: 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a 20 52 4f 4c  .** actions: ROL
9b50: 4c 42 41 43 4b 2c 20 41 42 4f 52 54 2c 20 46 41  LBACK, ABORT, FA
9b60: 49 4c 2c 20 52 45 50 4c 41 43 45 2c 20 61 6e 64  IL, REPLACE, and
9b70: 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20 20   IGNORE..**.**  
9b80: 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
9b90: 20 41 63 74 69 6f 6e 20 20 20 20 20 20 20 57 68   Action       Wh
9ba0: 61 74 20 48 61 70 70 65 6e 73 0a 2a 2a 20 20 2d  at Happens.**  -
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d  ----------   ---
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bf0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e 79 20 20 20  -----.**  any   
9c00: 20 20 20 20 20 20 20 20 20 20 20 52 4f 4c 4c 42             ROLLB
9c10: 41 43 4b 20 20 20 20 20 54 68 65 20 63 75 72 72  ACK     The curr
9c20: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
9c30: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  is rolled back a
9c40: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
9c70: 70 28 29 20 72 65 74 75 72 6e 73 20 69 6d 6d 65  p() returns imme
9c80: 64 69 61 74 65 6c 79 20 77 69 74 68 20 61 0a 2a  diately with a.*
9c90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
9cc0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9cd0: 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20  T..**.**  any   
9ce0: 20 20 20 20 20 20 20 20 20 20 20 41 42 4f 52 54             ABORT
9cf0: 20 20 20 20 20 20 20 20 42 61 63 6b 20 6f 75 74          Back out
9d00: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 74 68   changes from th
9d10: 65 20 63 75 72 72 65 6e 74 20 63 6f 6d 6d 61 6e  e current comman
9d20: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 6f 6e 6c 79 20 28 64 6f 20 6e 6f 74      only (do not
9d50: 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 20 72   do a complete r
9d60: 6f 6c 6c 62 61 63 6b 29 20 74 68 65 6e 0a 2a 2a  ollback) then.**
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
9da0: 65 70 28 29 20 74 6f 20 72 65 74 75 72 6e 20 69  ep() to return i
9db0: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74               wit
9de0: 68 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  h SQLITE_CONSTRA
9df0: 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20  INT..**.**  any 
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 41 49               FAI
9e10: 4c 20 20 20 20 20 20 20 20 20 53 71 6c 69 74 65  L         Sqlite
9e20: 33 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e 73  3_step() returns
9e30: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
9e40: 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  h a.**          
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64        return cod
9e70: 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53  e of SQLITE_CONS
9e80: 54 52 41 49 4e 54 2e 20 20 54 68 65 0a 2a 2a 20  TRAINT.  The.** 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
9eb0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
9ec0: 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  t rolled back an
9ed0: 64 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20  d any.**        
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 20          changes 
9f00: 74 6f 20 70 72 69 6f 72 20 72 6f 77 73 20 61 72  to prior rows ar
9f10: 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2a 0a 2a  e retained..**.*
9f20: 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20  *  any          
9f30: 20 20 20 20 49 47 4e 4f 52 45 20 20 20 20 20 20      IGNORE      
9f40: 20 54 68 65 20 61 74 74 65 6d 70 74 20 69 6e 20   The attempt in 
9f50: 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65  insert or update
9f60: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9f90: 6f 77 20 69 73 20 73 6b 69 70 70 65 64 2c 20 77  ow is skipped, w
9fa0: 69 74 68 6f 75 74 20 74 68 72 6f 77 69 6e 67 20  ithout throwing 
9fb0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 20  an error..**    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 63              Proc
9fe0: 65 73 73 69 6e 67 20 63 6f 6e 74 69 6e 75 65 73  essing continues
9ff0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
a000: 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow..**          
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 20 28 54 68 65 72 65 20 69 73 20        (There is 
a030: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
a040: 70 20 74 6f 20 69 67 6e 6f 72 65 44 65 73 74 2e  p to ignoreDest.
a050: 29 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20 4e 55 4c  ).**.**  NOT NUL
a060: 4c 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43  L         REPLAC
a070: 45 20 20 20 20 20 20 54 68 65 20 4e 55 4c 4c 20  E      The NULL 
a080: 76 61 6c 75 65 20 69 73 20 72 65 70 6c 61 63 65  value is replace
a090: 20 62 79 20 74 68 65 20 64 65 66 61 75 6c 74 0a   by the default.
a0a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74    value for that
a0d0: 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65   column.  If the
a0e0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a   default value.*
a0f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 61 63   is NULL, the ac
a120: 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  tion is the same
a130: 20 61 73 20 41 42 4f 52 54 2e 0a 2a 2a 0a 2a 2a   as ABORT..**.**
a140: 20 20 55 4e 49 51 55 45 20 20 20 20 20 20 20 20    UNIQUE        
a150: 20 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20     REPLACE      
a160: 54 68 65 20 6f 74 68 65 72 20 72 6f 77 20 74 68  The other row th
a170: 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
a180: 68 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20  h the row.**    
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 69 6e              bein
a1b0: 67 20 69 6e 73 65 72 74 65 64 20 69 73 20 72 65  g inserted is re
a1c0: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 43 48  moved..**.**  CH
a1d0: 45 43 4b 20 20 20 20 20 20 20 20 20 20 20 20 52  ECK            R
a1e0: 45 50 4c 41 43 45 20 20 20 20 20 20 49 6c 6c 65  EPLACE      Ille
a1f0: 67 61 6c 2e 20 20 54 68 65 20 72 65 73 75 6c 74  gal.  The result
a200: 73 20 69 6e 20 61 6e 20 65 78 63 65 70 74 69 6f  s in an exceptio
a210: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63 68 20 61  n..**.** Which a
a220: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 73  ction to take is
a230: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
a240: 68 65 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72  he overrideError
a250: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 4f   parameter..** O
a260: 72 20 69 66 20 6f 76 65 72 72 69 64 65 45 72 72  r if overrideErr
a270: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 2c 20  or==OE_Default, 
a280: 74 68 65 6e 20 74 68 65 20 70 50 61 72 73 65 2d  then the pParse-
a290: 3e 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74  >onError paramet
a2a0: 65 72 0a 2a 2a 20 69 73 20 75 73 65 64 2e 20 20  er.** is used.  
a2b0: 4f 72 20 69 66 20 70 50 61 72 73 65 2d 3e 6f 6e  Or if pParse->on
a2c0: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
a2d0: 74 20 74 68 65 6e 20 74 68 65 20 6f 6e 45 72 72  t then the onErr
a2e0: 6f 72 20 76 61 6c 75 65 0a 2a 2a 20 66 6f 72 20  or value.** for 
a2f0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
a300: 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  s used..*/.void 
a310: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
a320: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
a330: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a340: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
a350: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
a360: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
a370: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
a380: 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 73 65 72  able being inser
a390: 74 65 64 20 6f 72 20 75 70 64 61 74 65 64 20 2a  ted or updated *
a3a0: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
a3b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  ,        /* Use 
a3c0: 72 65 67 69 73 74 65 72 20 61 52 65 67 49 64 78  register aRegIdx
a3d0: 5b 69 5d 20 66 6f 72 20 69 6e 64 65 78 20 69 2e  [i] for index i.
a3e0: 20 20 30 20 66 6f 72 20 75 6e 75 73 65 64 20 2a    0 for unused *
a3f0: 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  /.  int iDataCur
a400: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f  ,        /* Cano
a410: 6e 69 63 61 6c 20 64 61 74 61 20 63 75 72 73 6f  nical data curso
a420: 72 20 28 6d 61 69 6e 20 74 61 62 6c 65 20 6f 72  r (main table or
a430: 20 50 4b 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20   PK index) */.  
a440: 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20 20 20  int iIdxCur,    
a450: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
a460: 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  dex cursor */.  
a470: 69 6e 74 20 72 65 67 4e 65 77 44 61 74 61 2c 20  int regNewData, 
a480: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
a490: 67 69 73 74 65 72 20 69 6e 20 61 20 72 61 6e 67  gister in a rang
a4a0: 65 20 68 6f 6c 64 69 6e 67 20 76 61 6c 75 65 73  e holding values
a4b0: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
a4c0: 69 6e 74 20 72 65 67 4f 6c 64 44 61 74 61 2c 20  int regOldData, 
a4d0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
a4e0: 20 63 6f 6e 74 65 6e 74 2e 20 20 30 20 66 6f 72   content.  0 for
a4f0: 20 49 4e 53 45 52 54 73 20 2a 2f 0a 20 20 75 38   INSERTs */.  u8
a500: 20 70 6b 43 68 6e 67 2c 20 20 20 20 20 20 20 20   pkChng,        
a510: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
a520: 66 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20 50  f the rowid or P
a530: 52 49 4d 41 52 59 20 4b 45 59 20 63 68 61 6e 67  RIMARY KEY chang
a540: 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 72  ed */.  u8 overr
a550: 69 64 65 45 72 72 6f 72 2c 20 20 20 20 2f 2a 20  ideError,    /* 
a560: 4f 76 65 72 72 69 64 65 20 6f 6e 45 72 72 6f 72  Override onError
a570: 20 74 6f 20 74 68 69 73 20 69 66 20 6e 6f 74 20   to this if not 
a580: 4f 45 5f 44 65 66 61 75 6c 74 20 2a 2f 0a 20 20  OE_Default */.  
a590: 69 6e 74 20 69 67 6e 6f 72 65 44 65 73 74 2c 20  int ignoreDest, 
a5a0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
a5b0: 74 68 69 73 20 6c 61 62 65 6c 20 6f 6e 20 61 6e  this label on an
a5c0: 20 4f 45 5f 49 67 6e 6f 72 65 20 72 65 73 6f 6c   OE_Ignore resol
a5d0: 75 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ution */.  int *
a5e0: 70 62 4d 61 79 52 65 70 6c 61 63 65 20 20 20 20  pbMayReplace    
a5f0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74  /* OUT: Set to t
a600: 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69 6e  rue if constrain
a610: 74 20 6d 61 79 20 63 61 75 73 65 20 61 20 72 65  t may cause a re
a620: 70 6c 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 56 64  place */.){.  Vd
a630: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
a640: 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72     /* VDBE under
a650: 20 63 6f 6e 73 74 72 75 74 69 6f 6e 20 2a 2f 0a   constrution */.
a660: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
a670: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
a680: 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  r to one of the 
a690: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 49 6e 64  indices */.  Ind
a6a0: 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
a6b0: 20 20 2f 2a 20 54 68 65 20 50 52 49 4d 41 52 59    /* The PRIMARY
a6c0: 20 4b 45 59 20 69 6e 64 65 78 20 2a 2f 0a 20 20   KEY index */.  
a6d0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
a6e0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a6f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
a700: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
a710: 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f        /* loop co
a720: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
a730: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
a740: 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70 20 63 6f  /* Index loop co
a750: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
a760: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
a770: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
a780: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  umns */.  int on
a790: 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  Error;         /
a7a0: 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
a7b0: 75 74 69 6f 6e 20 73 74 72 61 74 65 67 79 20 2a  ution strategy *
a7c0: 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20  /.  int j1;     
a7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
a7e0: 65 73 73 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74  ess of jump inst
a7f0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
a800: 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 30   seenReplace = 0
a810: 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 52 45 50  ; /* True if REP
a820: 4c 41 43 45 20 69 73 20 75 73 65 64 20 74 6f 20  LACE is used to 
a830: 72 65 73 6f 6c 76 65 20 49 4e 54 20 50 4b 20 63  resolve INT PK c
a840: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
a850: 20 6e 50 6b 46 69 65 6c 64 3b 20 20 20 20 20 20   nPkField;      
a860: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
a870: 69 65 6c 64 73 20 69 6e 20 50 52 49 4d 41 52 59  ields in PRIMARY
a880: 20 4b 45 59 2e 20 31 20 66 6f 72 20 52 4f 57 49   KEY. 1 for ROWI
a890: 44 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e  D tables */.  in
a8a0: 74 20 69 70 6b 54 6f 70 20 3d 20 30 3b 20 20 20  t ipkTop = 0;   
a8b0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
a8c0: 20 72 6f 77 69 64 20 63 68 61 6e 67 65 20 63 6f   rowid change co
a8d0: 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 20 2a  nstraint check *
a8e0: 2f 0a 20 20 69 6e 74 20 69 70 6b 42 6f 74 74 6f  /.  int ipkBotto
a8f0: 6d 20 3d 20 30 3b 20 20 20 2f 2a 20 42 6f 74 74  m = 0;   /* Bott
a900: 6f 6d 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  om of the rowid 
a910: 63 68 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e  change constrain
a920: 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 38 20  t check */.  u8 
a930: 69 73 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  isUpdate;       
a940: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
a950: 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
a960: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  peration */.  u8
a970: 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d   bAffinityDone =
a980: 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20   0;  /* True if 
a990: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
a9a0: 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 62 65  operation has be
a9b0: 65 6e 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74 20  en run */.  int 
a9c0: 72 65 67 52 6f 77 69 64 20 3d 20 2d 31 3b 20 20  regRowid = -1;  
a9d0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
a9e0: 64 69 6e 67 20 52 4f 57 49 44 20 76 61 6c 75 65  ding ROWID value
a9f0: 20 2a 2f 0a 0a 20 20 69 73 55 70 64 61 74 65 20   */..  isUpdate 
aa00: 3d 20 72 65 67 4f 6c 64 44 61 74 61 21 3d 30 3b  = regOldData!=0;
aa10: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
aa20: 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  db;.  v = sqlite
aa30: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
aa40: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
aa50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
aa60: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
aa70: 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c 65  ;  /* This table
aa80: 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20 2a   is not a VIEW *
aa90: 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  /.  nCol = pTab-
aaa0: 3e 6e 43 6f 6c 3b 0a 20 20 0a 20 20 2f 2a 20 70  >nCol;.  .  /* p
aab0: 50 6b 20 69 73 20 74 68 65 20 50 52 49 4d 41 52  Pk is the PRIMAR
aac0: 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
aad0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
aae0: 62 6c 65 73 20 61 6e 64 20 4e 55 4c 4c 20 66 6f  bles and NULL fo
aaf0: 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 72 6f  r.  ** normal ro
ab00: 77 69 64 20 74 61 62 6c 65 73 2e 20 20 6e 50 6b  wid tables.  nPk
ab10: 46 69 65 6c 64 20 69 73 20 74 68 65 20 6e 75 6d  Field is the num
ab20: 62 65 72 20 6f 66 20 6b 65 79 20 66 69 65 6c 64  ber of key field
ab30: 73 20 69 6e 20 74 68 65 20 0a 20 20 2a 2a 20 70  s in the .  ** p
ab40: 50 6b 20 69 6e 64 65 78 20 6f 72 20 31 20 66 6f  Pk index or 1 fo
ab50: 72 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e  r a rowid table.
ab60: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
ab70: 2c 20 6e 50 6b 46 69 65 6c 64 20 69 73 20 74 68  , nPkField is th
ab80: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
ab90: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 74   fields in the t
aba0: 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  rue primary key 
abb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 2a 2f  of the table. */
abc0: 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
abd0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 6b  pTab) ){.    pPk
abe0: 20 3d 20 30 3b 0a 20 20 20 20 6e 50 6b 46 69 65   = 0;.    nPkFie
abf0: 6c 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ld = 1;.  }else{
ac00: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
ac10: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
ac20: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 6e 50 6b  x(pTab);.    nPk
ac30: 46 69 65 6c 64 20 3d 20 70 50 6b 2d 3e 6e 4b 65  Field = pPk->nKe
ac40: 79 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  yCol;.  }..  /* 
ac50: 52 65 63 6f 72 64 20 74 68 61 74 20 74 68 69 73  Record that this
ac60: 20 6d 6f 64 75 6c 65 20 68 61 73 20 73 74 61 72   module has star
ac70: 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ted */.  VdbeMod
ac80: 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
ac90: 42 45 47 49 4e 3a 20 47 65 6e 43 6e 73 74 43 6b  BEGIN: GenCnstCk
aca0: 73 28 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  s(%d,%d,%d,%d,%d
acb0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
acc0: 20 20 20 20 20 20 20 20 20 69 44 61 74 61 43 75           iDataCu
acd0: 72 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 4e  r, iIdxCur, regN
ace0: 65 77 44 61 74 61 2c 20 72 65 67 4f 6c 64 44 61  ewData, regOldDa
acf0: 74 61 2c 20 70 6b 43 68 6e 67 29 29 3b 0a 0a 20  ta, pkChng));.. 
ad00: 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 4e 4f 54   /* Test all NOT
ad10: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
ad20: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
ad30: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
ad40: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62  .    if( i==pTab
ad50: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
ad60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
ad70: 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70  .    onError = p
ad80: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
ad90: 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 6e  Null;.    if( on
ada0: 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
adb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
adc0: 66 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72  f( overrideError
add0: 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  !=OE_Default ){.
ade0: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20        onError = 
adf0: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20  overrideError;. 
ae00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45     }else if( onE
ae10: 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
ae20: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
ae30: 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r = OE_Abort;.  
ae40: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6e 45 72    }.    if( onEr
ae50: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
ae60: 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  && pTab->aCol[i]
ae70: 2e 70 44 66 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  .pDflt==0 ){.   
ae80: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f     onError = OE_
ae90: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
aea0: 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72   assert( onError
aeb0: 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c  ==OE_Rollback ||
aec0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
aed0: 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f  rt || onError==O
aee0: 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 7c  E_Fail.        |
aef0: 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67  | onError==OE_Ig
af00: 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d  nore || onError=
af10: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20  =OE_Replace );. 
af20: 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72     switch( onErr
af30: 6f 72 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  or ){.      case
af40: 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20   OE_Abort:.     
af50: 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
af60: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  rt(pParse);.    
af70: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
af80: 75 67 68 20 2a 2f 0a 20 20 20 20 20 20 63 61 73  ugh */.      cas
af90: 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20  e OE_Rollback:. 
afa0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
afb0: 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l: {.        cha
afc0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
afd0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
afe0: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
aff0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
b020: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
b030: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b040: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
b050: 74 49 66 4e 75 6c 6c 2c 20 53 51 4c 49 54 45 5f  tIfNull, SQLITE_
b060: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
b070: 4c 4c 2c 20 6f 6e 45 72 72 6f 72 2c 0a 20 20 20  LL, onError,.   
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 20 20 72 65 67 4e 65 77 44 61 74         regNewDat
b0a0: 61 2b 31 2b 69 2c 20 7a 4d 73 67 2c 20 50 34 5f  a+1+i, zMsg, P4_
b0b0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
b0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b0d0: 6e 67 65 50 35 28 76 2c 20 50 35 5f 43 6f 6e 73  ngeP5(v, P5_Cons
b0e0: 74 72 61 69 6e 74 4e 6f 74 4e 75 6c 6c 29 3b 0a  traintNotNull);.
b0f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b100: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b120: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
b130: 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  nore: {.        
b140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b150: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
b160: 72 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20  regNewData+1+i, 
b170: 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20  ignoreDest);.   
b180: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b190: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  e(v);.        br
b1a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b1b0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b1c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e        assert( on
b1d0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
b1e0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6a 31 20  e );.        j1 
b1f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b200: 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
b210: 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31 2b  l, regNewData+1+
b220: 69 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  i); VdbeCoverage
b230: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
b240: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b250: 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  rse, pTab->aCol[
b260: 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 4e 65 77  i].pDflt, regNew
b270: 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20 20  Data+1+i);.     
b280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b290: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
b2a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b2b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b2c0: 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 43  .  /* Test all C
b2d0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
b2e0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
b2f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b300: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65    if( pTab->pChe
b310: 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  ck && (db->flags
b320: 20 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65   & SQLITE_Ignore
b330: 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20  Checks)==0 ){.  
b340: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 65    ExprList *pChe
b350: 63 6b 20 3d 20 70 54 61 62 2d 3e 70 43 68 65 63  ck = pTab->pChec
b360: 6b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  k;.    pParse->c
b370: 6b 42 61 73 65 20 3d 20 72 65 67 4e 65 77 44 61  kBase = regNewDa
b380: 74 61 2b 31 3b 0a 20 20 20 20 6f 6e 45 72 72 6f  ta+1;.    onErro
b390: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
b3a0: 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20  r!=OE_Default ? 
b3b0: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 20 3a 20  overrideError : 
b3c0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 66 6f  OE_Abort;.    fo
b3d0: 72 28 69 3d 30 3b 20 69 3c 70 43 68 65 63 6b 2d  r(i=0; i<pCheck-
b3e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b3f0: 20 20 20 20 69 6e 74 20 61 6c 6c 4f 6b 20 3d 20      int allOk = 
b400: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
b410: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
b420: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
b430: 28 70 50 61 72 73 65 2c 20 70 43 68 65 63 6b 2d  (pParse, pCheck-
b440: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 6c 6c  >a[i].pExpr, all
b450: 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  Ok, SQLITE_JUMPI
b460: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66  FNULL);.      if
b470: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67  ( onError==OE_Ig
b480: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
b490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4a0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
b4b0: 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20   ignoreDest);.  
b4c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4d0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b4e0: 20 70 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e 7a 4e   pCheck->a[i].zN
b4f0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
b500: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d   zName==0 ) zNam
b510: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
b520: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 45  .        if( onE
b530: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
b540: 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f   ) onError = OE_
b550: 41 62 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a 20 52  Abort; /* IMP: R
b560: 2d 31 35 35 36 39 2d 36 33 36 32 35 20 2a 2f 0a  -15569-63625 */.
b570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
b580: 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
b590: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
b5a0: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 2c 0a 20  STRAINT_CHECK,. 
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45               onE
b5d0: 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  rror, zName, P4_
b5e0: 54 52 41 4e 53 49 45 4e 54 2c 0a 20 20 20 20 20  TRANSIENT,.     
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
b610: 74 72 61 69 6e 74 43 68 65 63 6b 29 3b 0a 20 20  traintCheck);.  
b620: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b630: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b640: 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b 0a 20  bel(v, allOk);. 
b650: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b660: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b670: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
b680: 2f 0a 0a 20 20 2f 2a 20 49 66 20 72 6f 77 69 64  /..  /* If rowid
b690: 20 69 73 20 63 68 61 6e 67 69 6e 67 2c 20 6d 61   is changing, ma
b6a0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
b6b0: 72 6f 77 69 64 20 64 6f 65 73 20 6e 6f 74 20 70  rowid does not p
b6c0: 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 65  reviously.  ** e
b6d0: 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 62 6c  xist in the tabl
b6e0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 6b  e..  */.  if( pk
b6f0: 43 68 6e 67 20 26 26 20 70 50 6b 3d 3d 30 20 29  Chng && pPk==0 )
b700: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 6f  {.    int addrRo
b710: 77 69 64 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  widOk = sqlite3V
b720: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b730: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
b740: 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e 20  out what action 
b750: 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65 20  to take in case 
b760: 6f 66 20 61 20 72 6f 77 69 64 20 63 6f 6c 6c 69  of a rowid colli
b770: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 6f 6e 45 72  sion */.    onEr
b780: 72 6f 72 20 3d 20 70 54 61 62 2d 3e 6b 65 79 43  ror = pTab->keyC
b790: 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f 76 65  onf;.    if( ove
b7a0: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
b7b0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
b7c0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69  onError = overri
b7d0: 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  deError;.    }el
b7e0: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
b7f0: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
b800: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
b810: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20  _Abort;.    }.. 
b820: 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65 20     if( isUpdate 
b830: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 6b 43 68  ){.      /* pkCh
b840: 6e 67 21 3d 30 20 64 6f 65 73 20 6e 6f 74 20 6d  ng!=0 does not m
b850: 65 61 6e 20 74 68 61 74 20 74 68 65 20 72 6f 77  ean that the row
b860: 69 64 20 68 61 73 20 63 68 61 6e 67 65 2c 20 6f  id has change, o
b870: 6e 6c 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a  nly that.      *
b880: 2a 20 69 74 20 6d 69 67 68 74 20 68 61 76 65 20  * it might have 
b890: 63 68 61 6e 67 65 64 2e 20 20 53 6b 69 70 20 74  changed.  Skip t
b8a0: 68 65 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67 69  he conflict logi
b8b0: 63 20 62 65 6c 6f 77 20 69 66 20 74 68 65 20 72  c below if the r
b8c0: 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 69 73  owid.      ** is
b8d0: 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20   unchanged. */. 
b8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
b900: 20 72 65 67 4e 65 77 44 61 74 61 2c 20 61 64 64   regNewData, add
b910: 72 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4f 6c 64  rRowidOk, regOld
b920: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
b930: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b940: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
b950: 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  LL);.      VdbeC
b960: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b970: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
b980: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 72   response to a r
b990: 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74 20 69 73  owid conflict is
b9a0: 20 52 45 50 4c 41 43 45 20 62 75 74 20 74 68 65   REPLACE but the
b9b0: 20 72 65 73 70 6f 6e 73 65 0a 20 20 20 20 2a 2a   response.    **
b9c0: 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 55   to some other U
b9d0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
b9e0: 20 69 73 20 46 41 49 4c 20 6f 72 20 49 47 4e 4f   is FAIL or IGNO
b9f0: 52 45 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  RE, then we need
ba00: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 66 65 72  .    ** to defer
ba10: 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 6f 66 20   the running of 
ba20: 74 68 65 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69  the rowid confli
ba30: 63 74 20 63 68 65 63 6b 69 6e 67 20 75 6e 74 69  ct checking unti
ba40: 6c 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74  l after.    ** t
ba50: 68 65 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  he UNIQUE constr
ba60: 61 69 6e 74 73 20 68 61 76 65 20 72 75 6e 2e 0a  aints have run..
ba70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
ba80: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
ba90: 63 65 20 26 26 20 6f 76 65 72 72 69 64 65 45 72  ce && overrideEr
baa0: 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
bab0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ){.      for(pId
bac0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
bad0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
bae0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
baf0: 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
bb00: 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c  or==OE_Ignore ||
bb10: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
bb20: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
bb30: 20 20 20 20 20 69 70 6b 54 6f 70 20 3d 20 73 71       ipkTop = sq
bb40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
bb50: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
bb60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bb70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bb80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
bb90: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
bba0: 65 20 6e 65 77 20 72 6f 77 69 64 20 61 6c 72 65  e new rowid alre
bbb0: 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
bbc0: 65 20 74 61 62 6c 65 2e 20 20 53 6b 69 70 0a 20  e table.  Skip. 
bbd0: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
bbe0: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67  ing conflict log
bbf0: 69 63 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ic if it does no
bc00: 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  t. */.    sqlite
bc10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bc20: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61  P_NotExists, iDa
bc30: 74 61 43 75 72 2c 20 61 64 64 72 52 6f 77 69 64  taCur, addrRowid
bc40: 4f 6b 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b  Ok, regNewData);
bc50: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
bc60: 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  e(v);..    /* Ge
bc70: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
bc80: 20 64 65 61 6c 73 20 77 69 74 68 20 61 20 72 6f   deals with a ro
bc90: 77 69 64 20 63 6f 6c 6c 69 73 69 6f 6e 20 2a 2f  wid collision */
bca0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45  .    switch( onE
bcb0: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 64 65  rror ){.      de
bcc0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
bcd0: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
bce0: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ort;.        /* 
bcf0: 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  Fall thru into t
bd00: 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  he next case */.
bd10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
bd20: 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a  se OE_Rollback:.
bd30: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62        case OE_Ab
bd40: 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ort:.      case 
bd50: 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20  OE_Fail: {.     
bd60: 20 20 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43     sqlite3RowidC
bd70: 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
bd80: 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 54 61 62 29  , onError, pTab)
bd90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
bda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
bdb0: 61 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20  ase OE_Replace: 
bdc0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
bdd0: 74 68 65 72 65 20 61 72 65 20 44 45 4c 45 54 45  there are DELETE
bde0: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 68 69   triggers on thi
bdf0: 73 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  s table and the.
be00: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63 75 72          ** recur
be10: 73 69 76 65 2d 74 72 69 67 67 65 72 73 20 66 6c  sive-triggers fl
be20: 61 67 20 69 73 20 73 65 74 2c 20 63 61 6c 6c 20  ag is set, call 
be30: 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74  GenerateRowDelet
be40: 65 28 29 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  e() to.        *
be50: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 63 6f 6e  * remove the con
be60: 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 66 72 6f  flicting row fro
be70: 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 69  m the table. Thi
be80: 73 20 77 69 6c 6c 20 66 69 72 65 0a 20 20 20 20  s will fire.    
be90: 20 20 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67      ** the trigg
bea0: 65 72 73 20 61 6e 64 20 72 65 6d 6f 76 65 20 62  ers and remove b
beb0: 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 6e  oth the table an
bec0: 64 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65  d index b-tree e
bed0: 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
bee0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  **.        ** Ot
bef0: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
bf00: 65 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72  e are no trigger
bf10: 73 20 6f 72 20 74 68 65 20 72 65 63 75 72 73 69  s or the recursi
bf20: 76 65 2d 74 72 69 67 67 65 72 73 0a 20 20 20 20  ve-triggers.    
bf30: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 6e      ** flag is n
bf40: 6f 74 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  ot set, but the 
bf50: 74 61 62 6c 65 20 68 61 73 20 6f 6e 65 20 6f 72  table has one or
bf60: 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 2c 20 63   more indexes, c
bf70: 61 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  all .        ** 
bf80: 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78  GenerateRowIndex
bf90: 44 65 6c 65 74 65 28 29 2e 20 54 68 69 73 20 72  Delete(). This r
bfa0: 65 6d 6f 76 65 73 20 74 68 65 20 69 6e 64 65 78  emoves the index
bfb0: 20 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73 20   b-tree entries 
bfc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79  .        ** only
bfd0: 2e 20 54 68 65 20 74 61 62 6c 65 20 62 2d 74 72  . The table b-tr
bfe0: 65 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ee entry will be
bff0: 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
c000: 20 6e 65 77 20 65 6e 74 72 79 20 0a 20 20 20 20   new entry .    
c010: 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 69      ** when it i
c020: 73 20 69 6e 73 65 72 74 65 64 2e 20 20 0a 20 20  s inserted.  .  
c030: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c040: 20 2a 2a 20 49 66 20 65 69 74 68 65 72 20 47 65   ** If either Ge
c050: 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28  nerateRowDelete(
c060: 29 20 6f 72 20 47 65 6e 65 72 61 74 65 52 6f 77  ) or GenerateRow
c070: 49 6e 64 65 78 44 65 6c 65 74 65 28 29 20 69 73  IndexDelete() is
c080: 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 20 20 20   called,.       
c090: 20 2a 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 20   ** also invoke 
c0a0: 4d 75 6c 74 69 57 72 69 74 65 28 29 20 74 6f 20  MultiWrite() to 
c0b0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
c0c0: 69 73 20 56 44 42 45 20 6d 61 79 20 72 65 71 75  is VDBE may requ
c0d0: 69 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ire.        ** s
c0e0: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
c0f0: 6b 20 28 69 66 20 74 68 65 20 73 74 61 74 65 6d  k (if the statem
c100: 65 6e 74 20 69 73 20 61 62 6f 72 74 65 64 20 61  ent is aborted a
c110: 66 74 65 72 20 74 68 65 20 64 65 6c 65 74 65 0a  fter the delete.
c120: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 73          ** takes
c130: 20 70 6c 61 63 65 29 2e 20 45 61 72 6c 69 65 72   place). Earlier
c140: 20 76 65 72 73 69 6f 6e 73 20 63 61 6c 6c 65 64   versions called
c150: 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
c160: 74 65 28 29 20 72 65 67 61 72 64 6c 65 73 73 2c  te() regardless,
c170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20  .        ** but 
c180: 62 65 69 6e 67 20 6d 6f 72 65 20 73 65 6c 65 63  being more selec
c190: 74 69 76 65 20 68 65 72 65 20 61 6c 6c 6f 77 73  tive here allows
c1a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
c1b0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
c1c0: 20 20 20 20 20 2a 2a 20 20 20 52 45 50 4c 41 43       **   REPLAC
c1d0: 45 20 49 4e 54 4f 20 74 28 72 6f 77 69 64 29 20  E INTO t(rowid) 
c1e0: 56 41 4c 55 45 53 28 24 6e 65 77 72 6f 77 69 64  VALUES($newrowid
c1f0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
c200: 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 77       ** to run w
c210: 69 74 68 6f 75 74 20 61 20 73 74 61 74 65 6d 65  ithout a stateme
c220: 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  nt journal if th
c230: 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 64 65 78  ere are no index
c240: 65 73 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  es on the.      
c250: 20 20 2a 2a 20 74 61 62 6c 65 2e 0a 20 20 20 20    ** table..    
c260: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54      */.        T
c270: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
c280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
c290: 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ( db->flags&SQLI
c2a0: 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 20 29  TE_RecTriggers )
c2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69  {.          pTri
c2c0: 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
c2d0: 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72  iggersExist(pPar
c2e0: 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c  se, pTab, TK_DEL
c2f0: 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ETE, 0, 0);.    
c300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
c310: 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71  ( pTrigger || sq
c320: 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28  lite3FkRequired(
c330: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
c340: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
c350: 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
c360: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
c370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e        sqlite3Gen
c380: 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70  erateRowDelete(p
c390: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 54 72  Parse, pTab, pTr
c3a0: 69 67 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c  igger, iDataCur,
c3b0: 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20   iIdxCur,.      
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
c3e0: 4e 65 77 44 61 74 61 2c 20 31 2c 20 30 2c 20 4f  NewData, 1, 0, O
c3f0: 45 5f 52 65 70 6c 61 63 65 2c 20 31 29 3b 0a 20  E_Replace, 1);. 
c400: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
c410: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 29 7b   pTab->pIndex ){
c420: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c430: 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61  e3MultiWrite(pPa
c440: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
c450: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
c460: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70 50  owIndexDelete(pP
c470: 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61 74  arse, pTab, iDat
c480: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20 30  aCur, iIdxCur, 0
c490: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c4a0: 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61 63 65       seenReplace
c4b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
c4c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c4d0: 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
c4e0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 61  e: {.        /*a
c4f0: 73 73 65 72 74 28 20 73 65 65 6e 52 65 70 6c 61  ssert( seenRepla
c500: 63 65 3d 3d 30 20 29 3b 2a 2f 0a 20 20 20 20 20  ce==0 );*/.     
c510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c520: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
c530: 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b   0, ignoreDest);
c540: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c550: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
c570: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
c580: 72 52 6f 77 69 64 4f 6b 29 3b 0a 20 20 20 20 69  rRowidOk);.    i
c590: 66 28 20 69 70 6b 54 6f 70 20 29 7b 0a 20 20 20  f( ipkTop ){.   
c5a0: 20 20 20 69 70 6b 42 6f 74 74 6f 6d 20 3d 20 73     ipkBottom = s
c5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
c5c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
c5d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c5e0: 75 6d 70 48 65 72 65 28 76 2c 20 69 70 6b 54 6f  umpHere(v, ipkTo
c5f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
c600: 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 55 4e 49   /* Test all UNI
c610: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  QUE constraints 
c620: 62 79 20 63 72 65 61 74 69 6e 67 20 65 6e 74 72  by creating entr
c630: 69 65 73 20 66 6f 72 20 65 61 63 68 20 55 4e 49  ies for each UNI
c640: 51 55 45 0a 20 20 2a 2a 20 69 6e 64 65 78 20 61  QUE.  ** index a
c650: 6e 64 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  nd making sure t
c660: 68 61 74 20 64 75 70 6c 69 63 61 74 65 20 65 6e  hat duplicate en
c670: 74 72 69 65 73 20 64 6f 20 6e 6f 74 20 61 6c 72  tries do not alr
c680: 65 61 64 79 20 65 78 69 73 74 2e 0a 20 20 2a 2a  eady exist..  **
c690: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 76   Compute the rev
c6a0: 69 73 65 64 20 72 65 63 6f 72 64 20 65 6e 74 72  ised record entr
c6b0: 69 65 73 20 66 6f 72 20 69 6e 64 69 63 65 73 20  ies for indices 
c6c0: 61 73 20 77 65 20 67 6f 2e 0a 20 20 2a 2a 0a 20  as we go..  **. 
c6d0: 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
c6e0: 73 6f 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  so handles the c
c6f0: 61 73 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41  ase of the PRIMA
c700: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
c710: 20 61 0a 20 20 2a 2a 20 57 49 54 48 4f 55 54 20   a.  ** WITHOUT 
c720: 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a  ROWID table..  *
c730: 2f 0a 20 20 66 6f 72 28 69 78 3d 30 2c 20 70 49  /.  for(ix=0, pI
c740: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
c750: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
c760: 2d 3e 70 4e 65 78 74 2c 20 69 78 2b 2b 29 7b 0a  ->pNext, ix++){.
c770: 20 20 20 20 69 6e 74 20 72 65 67 49 64 78 3b 20      int regIdx; 
c780: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67           /* Rang
c790: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  e of registers h
c7a0: 6f 6c 64 20 63 6f 6e 65 6e 74 20 66 6f 72 20 70  old conent for p
c7b0: 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  Idx */.    int r
c7c0: 65 67 52 3b 20 20 20 20 20 20 20 20 20 20 20 20  egR;            
c7d0: 2f 2a 20 52 61 6e 67 65 20 6f 66 20 72 65 67 69  /* Range of regi
c7e0: 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 63 6f  sters holding co
c7f0: 6e 66 6c 69 63 74 69 6e 67 20 50 4b 20 2a 2f 0a  nflicting PK */.
c800: 20 20 20 20 69 6e 74 20 69 54 68 69 73 43 75 72      int iThisCur
c810: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ;        /* Curs
c820: 6f 72 20 66 6f 72 20 74 68 69 73 20 55 4e 49 51  or for this UNIQ
c830: 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  UE index */.    
c840: 69 6e 74 20 61 64 64 72 55 6e 69 71 75 65 4f 6b  int addrUniqueOk
c850: 3b 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;    /* Jump her
c860: 65 20 69 66 20 74 68 65 20 55 4e 49 51 55 45 20  e if the UNIQUE 
c870: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61  constraint is sa
c880: 74 69 73 66 69 65 64 20 2a 2f 0a 0a 20 20 20 20  tisfied */..    
c890: 69 66 28 20 61 52 65 67 49 64 78 5b 69 78 5d 3d  if( aRegIdx[ix]=
c8a0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
c8b0: 2f 2a 20 53 6b 69 70 20 69 6e 64 69 63 65 73 20  /* Skip indices 
c8c0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
c8d0: 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 41  ge */.    if( bA
c8e0: 66 66 69 6e 69 74 79 44 6f 6e 65 3d 3d 30 20 29  ffinityDone==0 )
c8f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
c900: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
c910: 70 54 61 62 2c 20 72 65 67 4e 65 77 44 61 74 61  pTab, regNewData
c920: 2b 31 29 3b 0a 20 20 20 20 20 20 62 41 66 66 69  +1);.      bAffi
c930: 6e 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  nityDone = 1;.  
c940: 20 20 7d 0a 20 20 20 20 69 54 68 69 73 43 75 72    }.    iThisCur
c950: 20 3d 20 69 49 64 78 43 75 72 2b 69 78 3b 0a 20   = iIdxCur+ix;. 
c960: 20 20 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 20     addrUniqueOk 
c970: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c980: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
c990: 2f 2a 20 53 6b 69 70 20 70 61 72 74 69 61 6c 20  /* Skip partial 
c9a0: 69 6e 64 69 63 65 73 20 66 6f 72 20 77 68 69 63  indices for whic
c9b0: 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
c9c0: 73 65 20 69 73 20 6e 6f 74 20 74 72 75 65 20 2a  se is not true *
c9d0: 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  /.    if( pIdx->
c9e0: 70 50 61 72 74 49 64 78 57 68 65 72 65 20 29 7b  pPartIdxWhere ){
c9f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ca00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ca10: 75 6c 6c 2c 20 30 2c 20 61 52 65 67 49 64 78 5b  ull, 0, aRegIdx[
ca20: 69 78 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ix]);.      pPar
ca30: 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72 65 67  se->ckBase = reg
ca40: 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20 20 20 20  NewData+1;.     
ca50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
ca60: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  lse(pParse, pIdx
ca70: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
ca80: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20   addrUniqueOk,. 
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
cab0: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
cac0: 20 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65    pParse->ckBase
cad0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
cae0: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72 65 63   /* Create a rec
caf0: 6f 72 64 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ord for this ind
cb00: 65 78 20 65 6e 74 72 79 20 61 73 20 69 74 20 73  ex entry as it s
cb10: 68 6f 75 6c 64 20 61 70 70 65 61 72 20 61 66 74  hould appear aft
cb20: 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  er.    ** the in
cb30: 73 65 72 74 20 6f 72 20 75 70 64 61 74 65 2e 20  sert or update. 
cb40: 20 53 74 6f 72 65 20 74 68 61 74 20 72 65 63 6f   Store that reco
cb50: 72 64 20 69 6e 20 74 68 65 20 61 52 65 67 49 64  rd in the aRegId
cb60: 78 5b 69 78 5d 20 72 65 67 69 73 74 65 72 0a 20  x[ix] register. 
cb70: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 49 64 78     */.    regIdx
cb80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
cb90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
cba0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
cbb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
cbc0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
cbd0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69  ){.      int iFi
cbe0: 65 6c 64 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  eld = pIdx->aiCo
cbf0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69  lumn[i];.      i
cc00: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
cc10: 69 46 69 65 6c 64 3c 30 20 7c 7c 20 69 46 69 65  iField<0 || iFie
cc20: 6c 64 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ld==pTab->iPKey 
cc30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
cc40: 65 67 52 6f 77 69 64 3d 3d 72 65 67 49 64 78 2b  egRowid==regIdx+
cc50: 69 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  i ) continue; /*
cc60: 20 52 4f 57 49 44 20 61 6c 72 65 61 64 79 20 69   ROWID already i
cc70: 6e 20 72 65 67 49 64 78 2b 69 20 2a 2f 0a 20 20  n regIdx+i */.  
cc80: 20 20 20 20 20 20 78 20 3d 20 72 65 67 4e 65 77        x = regNew
cc90: 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 65  Data;.        re
cca0: 67 52 6f 77 69 64 20 3d 20 20 70 49 64 78 2d 3e  gRowid =  pIdx->
ccb0: 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3f 20  pPartIdxWhere ? 
ccc0: 2d 31 20 3a 20 72 65 67 49 64 78 2b 69 3b 0a 20  -1 : regIdx+i;. 
ccd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cce0: 20 20 20 20 78 20 3d 20 69 46 69 65 6c 64 20 2b      x = iField +
ccf0: 20 72 65 67 4e 65 77 44 61 74 61 20 2b 20 31 3b   regNewData + 1;
cd00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
cd10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cd20: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 78 2c  (v, OP_SCopy, x,
cd30: 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20 20 20   regIdx+i);.    
cd40: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cd50: 2c 20 22 25 73 22 2c 20 69 46 69 65 6c 64 3c 30  , "%s", iField<0
cd60: 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 54 61   ? "rowid" : pTa
cd70: 62 2d 3e 61 43 6f 6c 5b 69 46 69 65 6c 64 5d 2e  b->aCol[iField].
cd80: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
cd90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cda0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
cdb0: 65 63 6f 72 64 2c 20 72 65 67 49 64 78 2c 20 70  ecord, regIdx, p
cdc0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 52  Idx->nColumn, aR
cdd0: 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20  egIdx[ix]);.    
cde0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cdf0: 22 66 6f 72 20 25 73 22 2c 20 70 49 64 78 2d 3e  "for %s", pIdx->
ce00: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c  zName));.    sql
ce10: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
ce20: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
ce30: 73 65 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78  se, regIdx, pIdx
ce40: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 0a 20 20 20  ->nColumn);..   
ce50: 20 2f 2a 20 49 6e 20 61 6e 20 55 50 44 41 54 45   /* In an UPDATE
ce60: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 66 20 74   operation, if t
ce70: 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65  his index is the
ce80: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
ce90: 65 78 20 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20  ex .    ** of a 
cea0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
ceb0: 62 6c 65 20 61 6e 64 20 74 68 65 72 65 20 68 61  ble and there ha
cec0: 73 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  s been no change
ced0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 69 6d   the.    ** prim
cee0: 61 72 79 20 6b 65 79 2c 20 74 68 65 6e 20 6e 6f  ary key, then no
cef0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 69 73 20 70 6f   collision is po
cf00: 73 73 69 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c  ssible.  The col
cf10: 6c 69 73 69 6f 6e 20 64 65 74 65 63 74 69 6f 6e  lision detection
cf20: 0a 20 20 20 20 2a 2a 20 6c 6f 67 69 63 20 62 65  .    ** logic be
cf30: 6c 6f 77 20 63 61 6e 20 61 6c 6c 20 62 65 20 73  low can all be s
cf40: 6b 69 70 70 65 64 2e 20 2a 2f 0a 20 20 20 20 69  kipped. */.    i
cf50: 66 28 20 69 73 55 70 64 61 74 65 20 26 26 20 70  f( isUpdate && p
cf60: 50 6b 3d 3d 70 49 64 78 20 26 26 20 70 6b 43 68  Pk==pIdx && pkCh
cf70: 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ng==0 ){.      s
cf80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cf90: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 55 6e  eLabel(v, addrUn
cfa0: 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 20 20 63  iqueOk);.      c
cfb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
cfc0: 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
cfd0: 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74  what action to t
cfe0: 61 6b 65 20 69 6e 20 63 61 73 65 20 74 68 65 72  ake in case ther
cff0: 65 20 69 73 20 61 20 75 6e 69 71 75 65 6e 65 73  e is a uniquenes
d000: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
d010: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 49 64 78    onError = pIdx
d020: 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  ->onError;.    i
d030: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  f( onError==OE_N
d040: 6f 6e 65 20 29 7b 20 0a 20 20 20 20 20 20 73 71  one ){ .      sq
d050: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
d060: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
d070: 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  gIdx, pIdx->nCol
d080: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
d090: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d0a0: 62 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75  bel(v, addrUniqu
d0b0: 65 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  eOk);.      cont
d0c0: 69 6e 75 65 3b 20 20 2f 2a 20 70 49 64 78 20 69  inue;  /* pIdx i
d0d0: 73 20 6e 6f 74 20 61 20 55 4e 49 51 55 45 20 69  s not a UNIQUE i
d0e0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ndex */.    }.  
d0f0: 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72    if( overrideEr
d100: 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror!=OE_Default 
d110: 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  ){.      onError
d120: 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72   = overrideError
d130: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d140: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
d150: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
d160: 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  rror = OE_Abort;
d170: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
d180: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
d190: 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  if the new index
d1a0: 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 75   entry will be u
d1b0: 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 73 71 6c  nique */.    sql
d1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
d1d0: 74 28 76 2c 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69  t(v, OP_NoConfli
d1e0: 63 74 2c 20 69 54 68 69 73 43 75 72 2c 20 61 64  ct, iThisCur, ad
d1f0: 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20  drUniqueOk,.    
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 72 65 67 49 64 78 2c 20 70 49 64       regIdx, pId
d220: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
d230: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
d240: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
d250: 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f  ode to handle co
d260: 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  llisions */.    
d270: 72 65 67 52 20 3d 20 28 70 49 64 78 3d 3d 70 50  regR = (pIdx==pP
d280: 6b 29 20 3f 20 72 65 67 49 64 78 20 3a 20 73 71  k) ? regIdx : sq
d290: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
d2a0: 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 46 69 65  e(pParse, nPkFie
d2b0: 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 55  ld);.    if( isU
d2c0: 70 64 61 74 65 20 7c 7c 20 6f 6e 45 72 72 6f 72  pdate || onError
d2d0: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  ==OE_Replace ){.
d2e0: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
d2f0: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
d300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d310: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
d320: 6f 77 69 64 2c 20 69 54 68 69 73 43 75 72 2c 20  owid, iThisCur, 
d330: 72 65 67 52 29 3b 0a 20 20 20 20 20 20 20 20 2f  regR);.        /
d340: 2a 20 43 6f 6e 66 6c 69 63 74 20 6f 6e 6c 79 20  * Conflict only 
d350: 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  if the rowid of 
d360: 74 68 65 20 65 78 69 73 74 69 6e 67 20 69 6e 64  the existing ind
d370: 65 78 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  ex entry.       
d380: 20 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74   ** is different
d390: 20 66 72 6f 6d 20 6f 6c 64 2d 72 6f 77 69 64 20   from old-rowid 
d3a0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
d3b0: 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  sUpdate ){.     
d3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d3d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
d3e0: 20 72 65 67 52 2c 20 61 64 64 72 55 6e 69 71 75   regR, addrUniqu
d3f0: 65 4f 6b 2c 20 72 65 67 4f 6c 64 44 61 74 61 29  eOk, regOldData)
d400: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
d410: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
d420: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
d430: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  L);.          Vd
d440: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d460: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
d470: 74 20 78 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t x;.        /* 
d480: 45 78 74 72 61 63 74 20 74 68 65 20 50 52 49 4d  Extract the PRIM
d490: 41 52 59 20 4b 45 59 20 66 72 6f 6d 20 74 68 65  ARY KEY from the
d4a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
d4b0: 78 20 65 6e 74 72 79 20 61 6e 64 0a 20 20 20 20  x entry and.    
d4c0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
d4d0: 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67  in registers reg
d4e0: 52 2e 2e 72 65 67 52 2b 6e 50 6b 2d 31 20 2a 2f  R..regR+nPk-1 */
d4f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
d500: 78 21 3d 70 50 6b 20 29 7b 0a 20 20 20 20 20 20  x!=pPk ){.      
d510: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d520: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
d530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  ){.            x
d540: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
d550: 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
d560: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  k->aiColumn[i]);
d570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d590: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 68  , OP_Column, iTh
d5a0: 69 73 43 75 72 2c 20 78 2c 20 72 65 67 52 2b 69  isCur, x, regR+i
d5b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
d5c0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
d5d0: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
d5e0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
d600: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
d610: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
d620: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
d630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d640: 20 20 69 66 28 20 69 73 55 70 64 61 74 65 20 29    if( isUpdate )
d650: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
d660: 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
d670: 65 73 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41  essing the PRIMA
d680: 52 59 20 4b 45 59 20 6f 66 20 61 20 57 49 54 48  RY KEY of a WITH
d690: 4f 55 54 20 52 4f 57 49 44 20 0a 20 20 20 20 20  OUT ROWID .     
d6a0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6f       ** table, o
d6b0: 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69 66 20  nly conflict if 
d6c0: 74 68 65 20 6e 65 77 20 50 52 49 4d 41 52 59 20  the new PRIMARY 
d6d0: 4b 45 59 20 76 61 6c 75 65 73 20 61 72 65 20 61  KEY values are a
d6e0: 63 74 75 61 6c 6c 79 0a 20 20 20 20 20 20 20 20  ctually.        
d6f0: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
d700: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 20 20 20  rom the old..   
d710: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
d720: 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 55 4e 49      ** For a UNI
d730: 51 55 45 20 69 6e 64 65 78 2c 20 6f 6e 6c 79 20  QUE index, only 
d740: 63 6f 6e 66 6c 69 63 74 20 69 66 20 74 68 65 20  conflict if the 
d750: 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75  PRIMARY KEY valu
d760: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
d770: 6f 66 20 74 68 65 20 6d 61 74 63 68 65 64 20 69  of the matched i
d780: 6e 64 65 78 20 72 6f 77 20 61 72 65 20 64 69 66  ndex row are dif
d790: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
d7a0: 6f 72 69 67 69 6e 61 6c 20 50 52 49 4d 41 52 59  original PRIMARY
d7b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4b 45  .          ** KE
d7c0: 59 20 76 61 6c 75 65 73 20 6f 66 20 74 68 69 73  Y values of this
d7d0: 20 72 6f 77 20 62 65 66 6f 72 65 20 74 68 65 20   row before the 
d7e0: 75 70 64 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20  update.  */.    
d7f0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75        int addrJu
d800: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
d810: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 70  CurrentAddr(v)+p
d820: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  Pk->nKeyCol;.   
d830: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
d840: 4f 50 5f 4e 65 3b 0a 20 20 20 20 20 20 20 20 20  OP_Ne;.         
d850: 20 69 6e 74 20 72 65 67 43 6d 70 20 3d 20 28 49   int regCmp = (I
d860: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
d870: 28 70 49 64 78 29 20 3f 20 72 65 67 49 64 78 20  (pIdx) ? regIdx 
d880: 3a 20 72 65 67 52 29 3b 0a 20 20 0a 20 20 20 20  : regR);.  .    
d890: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d8a0: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
d8b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
d8c0: 20 63 68 61 72 20 2a 70 34 20 3d 20 28 63 68 61   char *p4 = (cha
d8d0: 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  r*)sqlite3Locate
d8e0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
d8f0: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b  pPk->azColl[i]);
d900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
d910: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
d920: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
d930: 66 28 20 69 3d 3d 28 70 50 6b 2d 3e 6e 4b 65 79  f( i==(pPk->nKey
d940: 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Col-1) ){.      
d950: 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70          addrJump
d960: 20 3d 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 3b   = addrUniqueOk;
d970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .              o
d980: 70 20 3d 20 4f 50 5f 45 71 3b 0a 20 20 20 20 20  p = OP_Eq;.     
d990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d9b0: 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20 0a 20  AddOp4(v, op, . 
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
d9d0: 65 67 4f 6c 64 44 61 74 61 2b 31 2b 78 2c 20 61  egOldData+1+x, a
d9e0: 64 64 72 4a 75 6d 70 2c 20 72 65 67 43 6d 70 2b  ddrJump, regCmp+
d9f0: 69 2c 20 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45  i, p4, P4_COLLSE
da00: 51 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  Q.            );
da10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
da20: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
da30: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55  (v, SQLITE_NOTNU
da40: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
da50: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
da60: 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  v, op==OP_Eq);. 
da70: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
da80: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
da90: 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20  =OP_Ne);.       
daa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
dab0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dac0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
dad0: 64 65 20 74 68 61 74 20 65 78 65 63 75 74 65 73  de that executes
dae0: 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65   if the new inde
daf0: 78 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 75  x entry is not u
db00: 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 61 73 73  nique */.    ass
db10: 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  ert( onError==OE
db20: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45  _Rollback || onE
db30: 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c  rror==OE_Abort |
db40: 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61  | onError==OE_Fa
db50: 69 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e  il.        || on
db60: 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65  Error==OE_Ignore
db70: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
db80: 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 73  Replace );.    s
db90: 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29  witch( onError )
dba0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  {.      case OE_
dbb0: 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20  Rollback:.      
dbc0: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20  case OE_Abort:. 
dbd0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
dbe0: 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l: {.        sql
dbf0: 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
dc00: 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45  aint(pParse, onE
dc10: 72 72 6f 72 2c 20 70 49 64 78 29 3b 0a 20 20 20  rror, pIdx);.   
dc20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc30: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
dc40: 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20  E_Ignore: {.    
dc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dc60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
dc70: 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74 29  , 0, ignoreDest)
dc80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dc90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
dca0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
dcb0: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
dcc0: 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ger = 0;.       
dcd0: 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72   assert( onError
dce0: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a  ==OE_Replace );.
dcf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
dd00: 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65  ultiWrite(pParse
dd10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
dd20: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
dd30: 52 65 63 54 72 69 67 67 65 72 73 20 29 7b 0a 20  RecTriggers ){. 
dd40: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
dd50: 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
dd60: 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c  ersExist(pParse,
dd70: 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45   pTab, TK_DELETE
dd80: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
dd90: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
dda0: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
ddb0: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
ddc0: 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74  , pTrigger, iDat
ddd0: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 2c 20  regR, nPkField, 
de10: 30 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 70  0, OE_Replace, p
de20: 49 64 78 3d 3d 70 50 6b 29 3b 0a 20 20 20 20 20  Idx==pPk);.     
de30: 20 20 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d     seenReplace =
de40: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
de50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
de60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
de70: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
de80: 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20  addrUniqueOk);. 
de90: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
dea0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
deb0: 65 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d  e, regIdx, pIdx-
dec0: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69  >nColumn);.    i
ded0: 66 28 20 72 65 67 52 21 3d 72 65 67 49 64 78 20  f( regR!=regIdx 
dee0: 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
def0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
df00: 2c 20 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64  , regR, nPkField
df10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 70 6b  );.  }.  if( ipk
df20: 54 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Top ){.    sqlit
df30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
df40: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 70 6b 54  OP_Goto, 0, ipkT
df50: 6f 70 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  op+1);.    sqlit
df60: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
df70: 2c 20 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a 20 20  , ipkBottom);.  
df80: 7d 0a 20 20 0a 20 20 2a 70 62 4d 61 79 52 65 70  }.  .  *pbMayRep
df90: 6c 61 63 65 20 3d 20 73 65 65 6e 52 65 70 6c 61  lace = seenRepla
dfa0: 63 65 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65  ce;.  VdbeModule
dfb0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 4e 44  Comment((v, "END
dfc0: 3a 20 47 65 6e 43 6e 73 74 43 6b 73 28 25 64 29  : GenCnstCks(%d)
dfd0: 22 2c 20 73 65 65 6e 52 65 70 6c 61 63 65 29 29  ", seenReplace))
dfe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
dff0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
e000: 73 20 63 6f 64 65 20 74 6f 20 66 69 6e 69 73 68  s code to finish
e010: 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55   the INSERT or U
e020: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a  PDATE operation.
e030: 2a 2a 20 74 68 61 74 20 77 61 73 20 73 74 61 72  ** that was star
e040: 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63  ted by a prior c
e050: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 47 65  all to sqlite3Ge
e060: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
e070: 43 68 65 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e  Checks..** A con
e080: 73 65 63 75 74 69 76 65 20 72 61 6e 67 65 20 6f  secutive range o
e090: 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  f registers star
e0a0: 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77 44 61  ting at regNewDa
e0b0: 74 61 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ta contains the.
e0c0: 2a 2a 20 72 6f 77 69 64 20 61 6e 64 20 74 68 65  ** rowid and the
e0d0: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 69   content to be i
e0e0: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nserted..**.** T
e0f0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
e100: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
e110: 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
e120: 61 73 20 74 68 65 20 66 69 72 73 74 20 73 69 78  as the first six
e130: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  .** arguments to
e140: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
e150: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
e160: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e170: 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69  3CompleteInserti
e180: 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
e190: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
e1a0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
e1b0: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
e1c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
e1d0: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
e1e0: 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e   we are insertin
e1f0: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61  g */.  int iData
e200: 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75  Cur,       /* Cu
e210: 72 73 6f 72 20 6f 66 20 74 68 65 20 63 61 6e 6f  rsor of the cano
e220: 6e 69 63 61 6c 20 64 61 74 61 20 73 6f 75 72 63  nical data sourc
e230: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
e240: 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ur,        /* Fi
e250: 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72  rst index cursor
e260: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
e270: 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 52 61 6e  Data,     /* Ran
e280: 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ge of content */
e290: 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c  .  int *aRegIdx,
e2a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
e2b0: 65 72 20 75 73 65 64 20 62 79 20 65 61 63 68 20  er used by each 
e2c0: 69 6e 64 65 78 2e 20 20 30 20 66 6f 72 20 75 6e  index.  0 for un
e2d0: 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  used indices */.
e2e0: 20 20 69 6e 74 20 69 73 55 70 64 61 74 65 2c 20    int isUpdate, 
e2f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
e300: 72 20 55 50 44 41 54 45 2c 20 46 61 6c 73 65 20  r UPDATE, False 
e310: 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20  for INSERT */.  
e320: 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
e330: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
e340: 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  his is likely to
e350: 20 62 65 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f   be an append */
e360: 0a 20 20 69 6e 74 20 75 73 65 53 65 65 6b 52 65  .  int useSeekRe
e370: 73 75 6c 74 20 20 20 2f 2a 20 54 72 75 65 20 74  sult   /* True t
e380: 6f 20 73 65 74 20 74 68 65 20 55 53 45 53 45 45  o set the USESEE
e390: 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 6e 20  KRESULT flag on 
e3a0: 4f 50 5f 5b 49 64 78 5d 49 6e 73 65 72 74 20 2a  OP_[Idx]Insert *
e3b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  /.){.  Vdbe *v; 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
e3d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e3e0: 73 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  s under construc
e3f0: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
e400: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  *pIdx;        /*
e410: 20 41 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20   An index being 
e420: 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70 64 61  inserted or upda
e430: 74 65 64 20 2a 2f 0a 20 20 75 38 20 70 69 6b 5f  ted */.  u8 pik_
e440: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20  flags;       /* 
e450: 66 6c 61 67 20 76 61 6c 75 65 73 20 70 61 73 73  flag values pass
e460: 65 64 20 74 6f 20 74 68 65 20 62 74 72 65 65 20  ed to the btree 
e470: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20  insert */.  int 
e480: 72 65 67 44 61 74 61 3b 20 20 20 20 20 20 20 20  regData;        
e490: 2f 2a 20 43 6f 6e 74 65 6e 74 20 72 65 67 69 73  /* Content regis
e4a0: 74 65 72 73 20 28 61 66 74 65 72 20 74 68 65 20  ters (after the 
e4b0: 72 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e 74 20  rowid) */.  int 
e4c0: 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
e4d0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
e4e0: 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 72 65  ing assembled re
e4f0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62  cord for the tab
e500: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
e510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e520: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
e530: 20 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e   u8 bAffinityDon
e540: 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  e = 0; /* True i
e550: 66 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 68 61  f OP_Affinity ha
e560: 73 20 62 65 65 6e 20 72 75 6e 20 61 6c 72 65 61  s been run alrea
e570: 64 79 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c  dy */..  v = sql
e580: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e590: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
e5a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e5b0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
e5c0: 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61  0 );  /* This ta
e5d0: 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45  ble is not a VIE
e5e0: 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  W */.  for(i=0, 
e5f0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e600: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e610: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
e620: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
e630: 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
e640: 65 3b 0a 20 20 20 20 62 41 66 66 69 6e 69 74 79  e;.    bAffinity
e650: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66  Done = 1;.    if
e660: 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
e670: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73  Where ){.      s
e680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e690: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 61  (v, OP_IsNull, a
e6a0: 52 65 67 49 64 78 5b 69 5d 2c 20 73 71 6c 69 74  RegIdx[i], sqlit
e6b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e6c0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56  r(v)+2);.      V
e6d0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e6e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e6f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e700: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
e710: 78 43 75 72 2b 69 2c 20 61 52 65 67 49 64 78 5b  xCur+i, aRegIdx[
e720: 69 5d 29 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  i]);.    pik_fla
e730: 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  gs = 0;.    if( 
e740: 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20 29 20  useSeekResult ) 
e750: 70 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c  pik_flags = OPFL
e760: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
e770: 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d  ;.    if( IsPrim
e780: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
e790: 29 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70  ) && !HasRowid(p
e7a0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 61 73  Tab) ){.      as
e7b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
e7c0: 73 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sted==0 );.     
e7d0: 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50   pik_flags |= OP
e7e0: 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20  FLAG_NCHANGE;.  
e7f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 69 6b 5f    }.    if( pik_
e800: 66 6c 61 67 73 20 29 20 20 73 71 6c 69 74 65 33  flags )  sqlite3
e810: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
e820: 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  pik_flags);.  }.
e830: 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
e840: 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 3b 0a  pTab) ) return;.
e850: 20 20 72 65 67 44 61 74 61 20 3d 20 72 65 67 4e    regData = regN
e860: 65 77 44 61 74 61 20 2b 20 31 3b 0a 20 20 72 65  ewData + 1;.  re
e870: 67 52 65 63 20 3d 20 73 71 6c 69 74 65 33 47 65  gRec = sqlite3Ge
e880: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
e890: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e8a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
e8b0: 52 65 63 6f 72 64 2c 20 72 65 67 44 61 74 61 2c  Record, regData,
e8c0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 72 65 67   pTab->nCol, reg
e8d0: 52 65 63 29 3b 0a 20 20 69 66 28 20 21 62 41 66  Rec);.  if( !bAf
e8e0: 66 69 6e 69 74 79 44 6f 6e 65 20 29 20 73 71 6c  finityDone ) sql
e8f0: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
e900: 79 28 76 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20  y(v, pTab, 0);. 
e910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
e920: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
e930: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
e940: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
e950: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
e960: 65 64 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c  ed ){.    pik_fl
e970: 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
e980: 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20  {.    pik_flags 
e990: 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  = OPFLAG_NCHANGE
e9a0: 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20  ;.    pik_flags 
e9b0: 7c 3d 20 28 69 73 55 70 64 61 74 65 3f 4f 50 46  |= (isUpdate?OPF
e9c0: 4c 41 47 5f 49 53 55 50 44 41 54 45 3a 4f 50 46  LAG_ISUPDATE:OPF
e9d0: 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 29 3b 0a  LAG_LASTROWID);.
e9e0: 20 20 7d 0a 20 20 69 66 28 20 61 70 70 65 6e 64    }.  if( append
e9f0: 42 69 61 73 20 29 7b 0a 20 20 20 20 70 69 6b 5f  Bias ){.    pik_
ea00: 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f  flags |= OPFLAG_
ea10: 41 50 50 45 4e 44 3b 0a 20 20 7d 0a 20 20 69 66  APPEND;.  }.  if
ea20: 28 20 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20  ( useSeekResult 
ea30: 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  ){.    pik_flags
ea40: 20 7c 3d 20 4f 50 46 4c 41 47 5f 55 53 45 53 45   |= OPFLAG_USESE
ea50: 45 4b 52 45 53 55 4c 54 3b 0a 20 20 7d 0a 20 20  EKRESULT;.  }.  
ea60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ea70: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
ea80: 69 44 61 74 61 43 75 72 2c 20 72 65 67 52 65 63  iDataCur, regRec
ea90: 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b 0a 20  , regNewData);. 
eaa0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
eab0: 73 74 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  sted ){.    sqli
eac0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
ead0: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  v, -1, pTab->zNa
eae0: 6d 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  me, P4_TRANSIENT
eaf0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
eb00: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
eb10: 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f  pik_flags);.}../
eb20: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75  *.** Allocate cu
eb30: 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 70 54  rsors for the pT
eb40: 61 62 20 74 61 62 6c 65 20 61 6e 64 20 61 6c 6c  ab table and all
eb50: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
eb60: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
eb70: 65 20 74 6f 20 6f 70 65 6e 20 61 6e 64 20 69 6e  e to open and in
eb80: 69 74 69 61 6c 69 7a 65 64 20 74 68 6f 73 65 20  itialized those 
eb90: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  cursors..**.** T
eba0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
ebb0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 6f  e object that co
ebc0: 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70 6c  ntains the compl
ebd0: 65 74 65 20 64 61 74 61 20 28 6e 6f 72 6d 61 6c  ete data (normal
ebe0: 6c 79 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ly.** the table 
ebf0: 69 74 73 65 6c 66 2c 20 62 75 74 20 74 68 65 20  itself, but the 
ec00: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
ec10: 78 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66  x in the case of
ec20: 20 61 20 57 49 54 48 4f 55 54 0a 2a 2a 20 52 4f   a WITHOUT.** RO
ec30: 57 49 44 20 74 61 62 6c 65 29 20 69 73 20 72 65  WID table) is re
ec40: 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 44 61 74  turned in *piDat
ec50: 61 43 75 72 2e 20 20 54 68 65 20 66 69 72 73 74  aCur.  The first
ec60: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73   index cursor is
ec70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
ec80: 2a 70 69 49 64 78 43 75 72 2e 20 20 54 68 65 20  *piIdxCur.  The 
ec90: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65  number of indice
eca0: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
ecb0: 2a 0a 2a 2a 20 55 73 65 20 69 42 61 73 65 20 61  *.** Use iBase a
ecc0: 73 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73  s the first curs
ecd0: 6f 72 20 28 65 69 74 68 65 72 20 74 68 65 20 2a  or (either the *
ece0: 70 69 44 61 74 61 43 75 72 20 66 6f 72 20 72 6f  piDataCur for ro
ecf0: 77 69 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  wid tables.** or
ed00: 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   the first index
ed10: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
ed20: 49 44 20 74 61 62 6c 65 73 29 20 69 66 20 69 74  ID tables) if it
ed30: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
ed40: 2e 0a 2a 2a 20 49 66 20 69 42 61 73 65 20 69 73  ..** If iBase is
ed50: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
ed60: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e 65 78  allocate the nex
ed70: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75 72 73  t available curs
ed80: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  or..**.** For a 
ed90: 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 2a 70 69  rowid table, *pi
eda0: 44 61 74 61 43 75 72 20 77 69 6c 6c 20 62 65 20  DataCur will be 
edb0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 6c 65 73 73  exactly one less
edc0: 20 74 68 61 6e 20 2a 70 69 49 64 78 43 75 72 2e   than *piIdxCur.
edd0: 0a 2a 2a 20 46 6f 72 20 61 20 57 49 54 48 4f 55  .** For a WITHOU
ede0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20 2a  T ROWID table, *
edf0: 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20 62  piDataCur will b
ee00: 65 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  e somewhere in t
ee10: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20 2a  he range.** of *
ee20: 70 69 49 64 78 43 75 72 73 2c 20 64 65 70 65 6e  piIdxCurs, depen
ee30: 64 69 6e 67 20 6f 6e 20 77 68 65 72 65 20 74 68  ding on where th
ee40: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
ee50: 64 65 78 20 61 70 70 65 61 72 73 20 6f 6e 20 74  dex appears on t
ee60: 68 65 0a 2a 2a 20 70 54 61 62 2d 3e 70 49 6e 64  he.** pTab->pInd
ee70: 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ex list..**.** I
ee80: 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
ee90: 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ual table, then 
eea0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
eeb0: 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 74 68 65 0a  a no-op and the.
eec0: 2a 2a 20 2a 70 69 44 61 74 61 43 75 72 20 61 6e  ** *piDataCur an
eed0: 64 20 2a 70 69 49 64 78 43 75 72 20 76 61 6c 75  d *piIdxCur valu
eee0: 65 73 20 61 72 65 20 6c 65 66 74 20 75 6e 69 6e  es are left unin
eef0: 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 69 6e  itialized..*/.in
ef00: 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62  t sqlite3OpenTab
ef10: 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a 20 20  leAndIndices(.  
ef20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ef30: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ef40: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
ef50: 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61 62  pTab,     /* Tab
ef60: 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
ef70: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
ef80: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65 6e        /* OP_Open
ef90: 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
efa0: 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 42  rite */.  int iB
efb0: 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 55 73  ase,       /* Us
efc0: 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 20 74  e this for the t
efd0: 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
efe0: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 2a 2f 0a  there is one */.
eff0: 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 2c 20 20    u8 *aToOpen,  
f000: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
f010: 4c 3a 20 62 6f 6f 6c 65 61 6e 20 66 6f 72 20 65  L: boolean for e
f020: 61 63 68 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ach table and in
f030: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  dex */.  int *pi
f040: 44 61 74 61 43 75 72 2c 20 20 2f 2a 20 57 72 69  DataCur,  /* Wri
f050: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
f060: 73 6f 75 72 63 65 20 63 75 72 73 6f 72 20 6e 75  source cursor nu
f070: 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  mber here */.  i
f080: 6e 74 20 2a 70 69 49 64 78 43 75 72 20 20 20 20  nt *piIdxCur    
f090: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
f0a0: 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  st index cursor 
f0b0: 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 29  number here */.)
f0c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
f0d0: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 44 61 74   iDb;.  int iDat
f0e0: 61 43 75 72 3b 0a 20 20 49 6e 64 65 78 20 2a 70  aCur;.  Index *p
f0f0: 49 64 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Idx;.  Vdbe *v;.
f100: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f  .  assert( op==O
f110: 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c 20 6f 70  P_OpenRead || op
f120: 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29  ==OP_OpenWrite )
f130: 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
f140: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 2f  l(pTab) ){.    /
f150: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f160: 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 76 69  s a no-op for vi
f170: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 4c 65  rtual tables. Le
f180: 61 76 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20  ave the output. 
f190: 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20     ** variables 
f1a0: 2a 70 69 44 61 74 61 43 75 72 20 61 6e 64 20 2a  *piDataCur and *
f1b0: 70 69 49 64 78 43 75 72 20 75 6e 69 6e 69 74 69  piIdxCur uniniti
f1c0: 61 6c 69 7a 65 64 20 73 6f 20 74 68 61 74 20 76  alized so that v
f1d0: 61 6c 67 72 69 6e 64 0a 20 20 20 20 2a 2a 20 63  algrind.    ** c
f1e0: 61 6e 20 64 65 74 65 63 74 20 69 66 20 74 68 65  an detect if the
f1f0: 79 20 61 72 65 20 75 73 65 64 20 62 79 20 6d 69  y are used by mi
f200: 73 74 61 6b 65 20 69 6e 20 74 68 65 20 63 61 6c  stake in the cal
f210: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ler. */.    retu
f220: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 44 62 20  rn 0;.  }.  iDb 
f230: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
f240: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
f250: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f260: 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  );.  v = sqlite3
f270: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
f280: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
f290: 29 3b 0a 20 20 69 66 28 20 69 42 61 73 65 3c 30  );.  if( iBase<0
f2a0: 20 29 20 69 42 61 73 65 20 3d 20 70 50 61 72 73   ) iBase = pPars
f2b0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 69 44 61 74 61  e->nTab;.  iData
f2c0: 43 75 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a 20  Cur = iBase++;. 
f2d0: 20 69 66 28 20 70 69 44 61 74 61 43 75 72 20 29   if( piDataCur )
f2e0: 20 2a 70 69 44 61 74 61 43 75 72 20 3d 20 69 44   *piDataCur = iD
f2f0: 61 74 61 43 75 72 3b 0a 20 20 69 66 28 20 48 61  ataCur;.  if( Ha
f300: 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
f310: 28 61 54 6f 4f 70 65 6e 3d 3d 30 20 7c 7c 20 61  (aToOpen==0 || a
f320: 54 6f 4f 70 65 6e 5b 30 5d 29 20 29 7b 0a 20 20  ToOpen[0]) ){.  
f330: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
f340: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 61 74 61  le(pParse, iData
f350: 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Cur, iDb, pTab, 
f360: 6f 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  op);.  }else{.  
f370: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
f380: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
f390: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 6f 70 3d 3d  pTab->tnum, op==
f3a0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 70 54  OP_OpenWrite, pT
f3b0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ab->zName);.  }.
f3c0: 20 20 69 66 28 20 70 69 49 64 78 43 75 72 20 29    if( piIdxCur )
f3d0: 20 2a 70 69 49 64 78 43 75 72 20 3d 20 69 42 61   *piIdxCur = iBa
f3e0: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  se;.  for(i=0, p
f3f0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
f400: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
f410: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
f420: 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72 20      int iIdxCur 
f430: 3d 20 69 42 61 73 65 2b 2b 3b 0a 20 20 20 20 61  = iBase++;.    a
f440: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
f450: 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
f460: 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 49  ema );.    if( I
f470: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
f480: 28 70 49 64 78 29 20 26 26 20 21 48 61 73 52 6f  (pIdx) && !HasRo
f490: 77 69 64 28 70 54 61 62 29 20 26 26 20 70 69 44  wid(pTab) && piD
f4a0: 61 74 61 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ataCur ){.      
f4b0: 2a 70 69 44 61 74 61 43 75 72 20 3d 20 69 49 64  *piDataCur = iId
f4c0: 78 43 75 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xCur;.    }.    
f4d0: 69 66 28 20 61 54 6f 4f 70 65 6e 3d 3d 30 20 7c  if( aToOpen==0 |
f4e0: 7c 20 61 54 6f 4f 70 65 6e 5b 69 2b 31 5d 20 29  | aToOpen[i+1] )
f4f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f500: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
f510: 20 69 49 64 78 43 75 72 2c 20 70 49 64 78 2d 3e   iIdxCur, pIdx->
f520: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
f530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
f540: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
f550: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 56  , pIdx);.      V
f560: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f570: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
f580: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
f590: 69 66 28 20 69 42 61 73 65 3e 70 50 61 72 73 65  if( iBase>pParse
f5a0: 2d 3e 6e 54 61 62 20 29 20 70 50 61 72 73 65 2d  ->nTab ) pParse-
f5b0: 3e 6e 54 61 62 20 3d 20 69 42 61 73 65 3b 0a 20  >nTab = iBase;. 
f5c0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 0a 23   return i;.}...#
f5d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f5e0: 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  T./*.** The foll
f5f0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
f600: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
f610: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
f620: 65 0a 2a 2a 20 74 72 61 6e 73 66 65 72 20 6f 70  e.** transfer op
f630: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
f640: 65 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ed.  This is use
f650: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
f660: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20 2d   purposes only -
f670: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
f680: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
f690: 69 7a 61 74 69 6f 6e 20 72 65 61 6c 6c 79 0a 2a  ization really.*
f6a0: 2a 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  * is happening w
f6b0: 68 65 6e 20 69 74 20 69 73 20 73 75 70 70 6f 73  hen it is suppos
f6c0: 65 64 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ed to..*/.int sq
f6d0: 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
f6e0: 75 6e 74 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  unt;.#endif /* S
f6f0: 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a  QLITE_TEST */...
f700: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f710: 4d 49 54 5f 58 46 45 52 5f 4f 50 54 0a 2f 2a 0a  MIT_XFER_OPT./*.
f720: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 63 6f 6c 6c  ** Check to coll
f730: 61 74 69 6f 6e 20 6e 61 6d 65 73 20 74 6f 20 73  ation names to s
f740: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 63  ee if they are c
f750: 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a 2f 0a 73 74  ompatible..*/.st
f760: 61 74 69 63 20 69 6e 74 20 78 66 65 72 43 6f 6d  atic int xferCom
f770: 70 61 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e  patibleCollation
f780: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c  (const char *z1,
f790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29   const char *z2)
f7a0: 7b 0a 20 20 69 66 28 20 7a 31 3d 3d 30 20 29 7b  {.  if( z1==0 ){
f7b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 32 3d 3d  .    return z2==
f7c0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 32 3d  0;.  }.  if( z2=
f7d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f7e0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f7f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f800: 7a 31 2c 20 7a 32 29 3d 3d 30 3b 0a 7d 0a 0a 0a  z1, z2)==0;.}...
f810: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
f820: 65 65 20 69 66 20 69 6e 64 65 78 20 70 53 72 63  ee if index pSrc
f830: 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 61   is compatible a
f840: 73 20 61 20 73 6f 75 72 63 65 20 6f 66 20 64 61  s a source of da
f850: 74 61 0a 2a 2a 20 66 6f 72 20 69 6e 64 65 78 20  ta.** for index 
f860: 70 44 65 73 74 20 69 6e 20 61 6e 20 69 6e 73 65  pDest in an inse
f870: 72 74 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  rt transfer opti
f880: 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 72  mization.  The r
f890: 75 6c 65 73 0a 2a 2a 20 66 6f 72 20 61 20 63 6f  ules.** for a co
f8a0: 6d 70 61 74 69 62 6c 65 20 69 6e 64 65 78 3a 0a  mpatible index:.
f8b0: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65  **.**    *   The
f8c0: 20 69 6e 64 65 78 20 69 73 20 6f 76 65 72 20 74   index is over t
f8d0: 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63  he same set of c
f8e0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20 20  olumns.**    *  
f8f0: 20 54 68 65 20 73 61 6d 65 20 44 45 53 43 20 61   The same DESC a
f900: 6e 64 20 41 53 43 20 6d 61 72 6b 69 6e 67 73 20  nd ASC markings 
f910: 6f 63 63 75 72 73 20 6f 6e 20 61 6c 6c 20 63 6f  occurs on all co
f920: 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20 20 20  lumns.**    *   
f930: 54 68 65 20 73 61 6d 65 20 6f 6e 45 72 72 6f 72  The same onError
f940: 20 70 72 6f 63 65 73 73 69 6e 67 20 28 4f 45 5f   processing (OE_
f950: 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
f960: 2c 20 65 74 63 29 0a 2a 2a 20 20 20 20 2a 20 20  , etc).**    *  
f970: 20 54 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   The same collat
f980: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
f990: 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20  each column.**  
f9a0: 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20    *   The index 
f9b0: 68 61 73 20 74 68 65 20 65 78 61 63 74 20 73 61  has the exact sa
f9c0: 6d 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  me WHERE clause.
f9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66  */.static int xf
f9e0: 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65  erCompatibleInde
f9f0: 78 28 49 6e 64 65 78 20 2a 70 44 65 73 74 2c 20  x(Index *pDest, 
fa00: 49 6e 64 65 78 20 2a 70 53 72 63 29 7b 0a 20 20  Index *pSrc){.  
fa10: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
fa20: 20 70 44 65 73 74 20 26 26 20 70 53 72 63 20 29   pDest && pSrc )
fa30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
fa40: 74 2d 3e 70 54 61 62 6c 65 21 3d 70 53 72 63 2d  t->pTable!=pSrc-
fa50: 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20 69 66 28  >pTable );.  if(
fa60: 20 70 44 65 73 74 2d 3e 6e 4b 65 79 43 6f 6c 21   pDest->nKeyCol!
fa70: 3d 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pSrc->nKeyCol )
fa80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
fa90: 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 6e    /* Different n
faa0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fab0: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   */.  }.  if( pD
fac0: 65 73 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 53  est->onError!=pS
fad0: 72 63 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  rc->onError ){. 
fae0: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
faf0: 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6e 66  * Different conf
fb00: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
fb10: 73 74 72 61 74 65 67 69 65 73 20 2a 2f 0a 20 20  strategies */.  
fb20: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
fb30: 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  Src->nKeyCol; i+
fb40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
fb50: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d 70  ->aiColumn[i]!=p
fb60: 44 65 73 74 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  Dest->aiColumn[i
fb70: 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ] ){.      retur
fb80: 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72  n 0;   /* Differ
fb90: 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 64 65  ent columns inde
fba0: 78 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  xed */.    }.   
fbb0: 20 69 66 28 20 70 53 72 63 2d 3e 61 53 6f 72 74   if( pSrc->aSort
fbc0: 4f 72 64 65 72 5b 69 5d 21 3d 70 44 65 73 74 2d  Order[i]!=pDest-
fbd0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
fbe0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
fbf0: 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74  ;   /* Different
fc00: 20 73 6f 72 74 20 6f 72 64 65 72 73 20 2a 2f 0a   sort orders */.
fc10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 78      }.    if( !x
fc20: 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 43 6f 6c  ferCompatibleCol
fc30: 6c 61 74 69 6f 6e 28 70 53 72 63 2d 3e 61 7a 43  lation(pSrc->azC
fc40: 6f 6c 6c 5b 69 5d 2c 70 44 65 73 74 2d 3e 61 7a  oll[i],pDest->az
fc50: 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20  Coll[i]) ){.    
fc60: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
fc70: 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   Different colla
fc80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 2a  ting sequences *
fc90: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  /.    }.  }.  if
fca0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
fcb0: 70 61 72 65 28 70 53 72 63 2d 3e 70 50 61 72 74  pare(pSrc->pPart
fcc0: 49 64 78 57 68 65 72 65 2c 20 70 44 65 73 74 2d  IdxWhere, pDest-
fcd0: 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c 20  >pPartIdxWhere, 
fce0: 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
fcf0: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 44 69 66 66  n 0;     /* Diff
fd00: 65 72 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75  erent WHERE clau
fd10: 73 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ses */.  }..  /*
fd20: 20 49 66 20 6e 6f 20 74 65 73 74 20 61 62 6f 76   If no test abov
fd30: 65 20 66 61 69 6c 73 20 74 68 65 6e 20 74 68 65  e fails then the
fd40: 20 69 6e 64 69 63 65 73 20 6d 75 73 74 20 62 65   indices must be
fd50: 20 63 6f 6d 70 61 74 69 62 6c 65 20 2a 2f 0a 20   compatible */. 
fd60: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
fd70: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 68 65 20  .** Attempt the 
fd80: 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a  transfer optimiz
fd90: 61 74 69 6f 6e 20 6f 6e 20 49 4e 53 45 52 54 73  ation on INSERTs
fda0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
fdb0: 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
fdc0: 54 4f 20 74 61 62 31 20 53 45 4c 45 43 54 20 2a  TO tab1 SELECT *
fdd0: 20 46 52 4f 4d 20 74 61 62 32 3b 0a 2a 2a 0a 2a   FROM tab2;.**.*
fde0: 2a 20 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d  * The xfer optim
fdf0: 69 7a 61 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  ization transfer
fe00: 73 20 72 61 77 20 72 65 63 6f 72 64 73 20 66 72  s raw records fr
fe10: 6f 6d 20 74 61 62 32 20 6f 76 65 72 20 74 6f 20  om tab2 over to 
fe20: 74 61 62 31 2e 20 20 0a 2a 2a 20 43 6f 6c 75 6d  tab1.  .** Colum
fe30: 6e 73 20 61 72 65 20 6e 6f 74 20 64 65 63 6f 64  ns are not decod
fe40: 65 64 20 61 6e 64 20 72 65 61 73 73 65 6d 62 6c  ed and reassembl
fe50: 65 64 2c 20 77 68 69 63 68 20 67 72 65 61 74 6c  ed, which greatl
fe60: 79 20 69 6d 70 72 6f 76 65 73 0a 2a 2a 20 70 65  y improves.** pe
fe70: 72 66 6f 72 6d 61 6e 63 65 2e 20 20 52 61 77 20  rformance.  Raw 
fe80: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 61 72  index records ar
fe90: 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
fea0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 0a 2a   the same way..*
feb0: 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20 6f 70  *.** The xfer op
fec0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6f 6e  timization is on
fed0: 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
fee0: 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 61 72  tab1 and tab2 ar
fef0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a 2a  e compatible..**
ff00: 20 54 68 65 72 65 20 61 72 65 20 6c 6f 74 73 20   There are lots 
ff10: 6f 66 20 72 75 6c 65 73 20 66 6f 72 20 64 65 74  of rules for det
ff20: 65 72 6d 69 6e 69 6e 67 20 63 6f 6d 70 61 74 69  ermining compati
ff30: 62 69 6c 69 74 79 20 2d 20 73 65 65 20 63 6f 6d  bility - see com
ff40: 6d 65 6e 74 73 0a 2a 2a 20 65 6d 62 65 64 64 65  ments.** embedde
ff50: 64 20 69 6e 20 74 68 65 20 63 6f 64 65 20 66 6f  d in the code fo
ff60: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
ff70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
ff80: 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 74 68  turns TRUE if th
ff90: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
ffa0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
ffb0: 62 65 20 75 73 65 64 2e 0a 2a 2a 20 53 6f 6d 65  be used..** Some
ffc0: 74 69 6d 65 73 20 74 68 65 20 78 66 65 72 20 6f  times the xfer o
ffd0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c  ptimization will
ffe0: 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74 68   only work if th
fff0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
10000 62 6c 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20  ble.** is empty 
10010 2d 20 61 20 66 61 63 74 6f 72 20 74 68 61 74 20  - a factor that 
10020 63 61 6e 20 6f 6e 6c 79 20 62 65 20 64 65 74 65  can only be dete
10030 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
10040 6d 65 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20  me.  In that.** 
10050 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
10060 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
10070 65 20 66 6f 72 20 74 68 65 20 78 66 65 72 20 6f  e for the xfer o
10080 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62 75 74 20  ptimization but 
10090 61 6c 73 6f 0a 2a 2a 20 64 6f 65 73 20 61 20 74  also.** does a t
100a0 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 74 68  est to see if th
100b0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
100c0 62 6c 65 20 69 73 20 65 6d 70 74 79 20 61 6e 64  ble is empty and
100d0 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65 0a   jumps over the.
100e0 2a 2a 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61  ** xfer optimiza
100f0 74 69 6f 6e 20 63 6f 64 65 20 69 66 20 74 68 65  tion code if the
10100 20 74 65 73 74 20 66 61 69 6c 73 2e 20 20 49 6e   test fails.  In
10110 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
10120 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
10130 72 6e 73 20 46 41 4c 53 45 20 73 6f 20 74 68 61  rns FALSE so tha
10140 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  t the caller wil
10150 6c 20 6b 6e 6f 77 20 74 6f 20 67 6f 20 61 68 65  l know to go ahe
10160 61 64 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a  ad and generate.
10170 2a 2a 20 61 6e 20 75 6e 6f 70 74 69 6d 69 7a 65  ** an unoptimize
10180 64 20 74 72 61 6e 73 66 65 72 2e 20 20 54 68 69  d transfer.  Thi
10190 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 72  s routine also r
101a0 65 74 75 72 6e 73 20 46 41 4c 53 45 20 69 66 20  eturns FALSE if 
101b0 74 68 65 72 65 0a 2a 2a 20 69 73 20 6e 6f 20 63  there.** is no c
101c0 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 78  hance that the x
101d0 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
101e0 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 2e   can be applied.
101f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69  .**.** This opti
10200 6d 69 7a 61 74 69 6f 6e 20 69 73 20 70 61 72 74  mization is part
10210 69 63 75 6c 61 72 6c 79 20 75 73 65 66 75 6c 20  icularly useful 
10220 61 74 20 6d 61 6b 69 6e 67 20 56 41 43 55 55 4d  at making VACUUM
10230 20 72 75 6e 20 66 61 73 74 65 72 2e 0a 2a 2f 0a   run faster..*/.
10240 73 74 61 74 69 63 20 69 6e 74 20 78 66 65 72 4f  static int xferO
10250 70 74 69 6d 69 7a 61 74 69 6f 6e 28 0a 20 20 50  ptimization(.  P
10260 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10270 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
10280 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
10290 65 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 20  e *pDest,       
102a0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77    /* The table w
102b0 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20  e are inserting 
102c0 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74  into */.  Select
102d0 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
102e0 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
102f0 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20  ement to use as 
10300 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
10310 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
10320 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  ,          /* Ho
10330 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73  w to handle cons
10340 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f  traint errors */
10350 0a 20 20 69 6e 74 20 69 44 62 44 65 73 74 20 20  .  int iDbDest  
10360 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10370 64 61 74 61 62 61 73 65 20 6f 66 20 70 44 65 73  database of pDes
10380 74 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  t */.){.  ExprLi
10390 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
103a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
103b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
103c0 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
103d0 54 61 62 6c 65 20 2a 70 53 72 63 3b 20 20 20 20  Table *pSrc;    
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 6e   /* The table in
10400 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10410 20 6f 66 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   of SELECT */.  
10420 49 6e 64 65 78 20 2a 70 53 72 63 49 64 78 2c 20  Index *pSrcIdx, 
10430 2a 70 44 65 73 74 49 64 78 3b 20 20 20 20 20 20  *pDestIdx;      
10440 20 2f 2a 20 53 6f 75 72 63 65 20 61 6e 64 20 64   /* Source and d
10450 65 73 74 69 6e 61 74 69 6f 6e 20 69 6e 64 69 63  estination indic
10460 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  es */.  struct S
10470 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
10480 65 6d 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  em;      /* An e
10490 6c 65 6d 65 6e 74 20 6f 66 20 70 53 65 6c 65 63  lement of pSelec
104a0 74 2d 3e 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  t->pSrc */.  int
104b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
104e0 0a 20 20 69 6e 74 20 69 44 62 53 72 63 3b 20 20  .  int iDbSrc;  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
10510 61 73 65 20 6f 66 20 70 53 72 63 20 2a 2f 0a 20  ase of pSrc */. 
10520 20 69 6e 74 20 69 53 72 63 2c 20 69 44 65 73 74   int iSrc, iDest
10530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10540 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 66 72 6f    /* Cursors fro
10550 6d 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73  m source and des
10560 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  tination */.  in
10570 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 20  t addr1, addr2; 
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10590 2a 20 4c 6f 6f 70 20 61 64 64 72 65 73 73 65 73  * Loop addresses
105a0 20 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 44   */.  int emptyD
105b0 65 73 74 54 65 73 74 20 3d 20 30 3b 20 20 20 20  estTest = 0;    
105c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
105d0 73 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d  s of test for em
105e0 70 74 79 20 70 44 65 73 74 20 2a 2f 0a 20 20 69  pty pDest */.  i
105f0 6e 74 20 65 6d 70 74 79 53 72 63 54 65 73 74 20  nt emptySrcTest 
10600 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10610 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 65  /* Address of te
10620 73 74 20 66 6f 72 20 65 6d 70 74 79 20 70 53 72  st for empty pSr
10630 63 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  c */.  Vdbe *v; 
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
10660 44 42 45 20 77 65 20 61 72 65 20 62 75 69 6c 64  DBE we are build
10670 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ing */.  int reg
10680 41 75 74 6f 69 6e 63 3b 20 20 20 20 20 20 20 20  Autoinc;        
10690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
106a0 6f 72 79 20 72 65 67 69 73 74 65 72 20 75 73 65  ory register use
106b0 64 20 62 79 20 41 55 54 4f 49 4e 43 20 2a 2f 0a  d by AUTOINC */.
106c0 20 20 69 6e 74 20 64 65 73 74 48 61 73 55 6e 69    int destHasUni
106d0 71 75 65 49 64 78 20 3d 20 30 3b 20 20 20 20 20  queIdx = 0;     
106e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 44     /* True if pD
106f0 65 73 74 20 68 61 73 20 61 20 55 4e 49 51 55 45  est has a UNIQUE
10700 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
10710 72 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77 69  regData, regRowi
10720 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
10730 52 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e  Registers holdin
10740 67 20 64 61 74 61 20 61 6e 64 20 72 6f 77 69 64  g data and rowid
10750 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65 6c 65   */..  if( pSele
10760 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ct==0 ){.    ret
10770 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 75 73 74  urn 0;   /* Must
10780 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
10790 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e   INSERT INTO ...
107a0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a 20   SELECT ... */. 
107b0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
107c0 3e 70 57 69 74 68 20 7c 7c 20 70 53 65 6c 65 63  >pWith || pSelec
107d0 74 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20  t->pWith ){.    
107e0 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  /* Do not attemp
107f0 74 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  t to process thi
10800 73 20 71 75 65 72 79 20 69 66 20 74 68 65 72 65  s query if there
10810 20 61 72 65 20 61 6e 20 57 49 54 48 20 63 6c 61   are an WITH cla
10820 75 73 65 73 0a 20 20 20 20 2a 2a 20 61 74 74 61  uses.    ** atta
10830 63 68 65 64 20 74 6f 20 69 74 2e 20 50 72 6f 63  ched to it. Proc
10840 65 65 64 69 6e 67 20 6d 61 79 20 67 65 6e 65 72  eeding may gener
10850 61 74 65 20 61 20 66 61 6c 73 65 20 22 6e 6f 20  ate a false "no 
10860 73 75 63 68 20 74 61 62 6c 65 3a 20 78 78 78 22  such table: xxx"
10870 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66  .    ** error if
10880 20 70 53 65 6c 65 63 74 20 72 65 61 64 73 20 66   pSelect reads f
10890 72 6f 6d 20 61 20 43 54 45 20 6e 61 6d 65 64 20  rom a CTE named 
108a0 22 78 78 78 22 2e 20 20 2a 2f 0a 20 20 20 20 72  "xxx".  */.    r
108b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
108c0 66 28 20 73 71 6c 69 74 65 33 54 72 69 67 67 65  f( sqlite3Trigge
108d0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 44  rList(pParse, pD
108e0 65 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  est) ){.    retu
108f0 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31 20  rn 0;   /* tab1 
10900 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 74 72  must not have tr
10910 69 67 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 23 69  iggers */.  }.#i
10920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10930 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10940 20 69 66 28 20 70 44 65 73 74 2d 3e 74 61 62 46   if( pDest->tabF
10950 6c 61 67 73 20 26 20 54 46 5f 56 69 72 74 75 61  lags & TF_Virtua
10960 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
10970 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75 73  0;   /* tab1 mus
10980 74 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74 75  t not be a virtu
10990 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a  al table */.  }.
109a0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 6e 45  #endif.  if( onE
109b0 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
109c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 44 65 73   ){.    if( pDes
109d0 74 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 20 6f 6e  t->iPKey>=0 ) on
109e0 45 72 72 6f 72 20 3d 20 70 44 65 73 74 2d 3e 6b  Error = pDest->k
109f0 65 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20  eyConf;.    if( 
10a00 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
10a10 75 6c 74 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20  ult ) onError = 
10a20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  OE_Abort;.  }.  
10a30 61 73 73 65 72 74 28 70 53 65 6c 65 63 74 2d 3e  assert(pSelect->
10a40 70 53 72 63 29 3b 20 20 20 2f 2a 20 61 6c 6c 6f  pSrc);   /* allo
10a50 63 61 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  cated even if th
10a60 65 72 65 20 69 73 20 6e 6f 20 46 52 4f 4d 20 63  ere is no FROM c
10a70 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
10a80 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 6e 53  Select->pSrc->nS
10a90 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  rc!=1 ){.    ret
10aa0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d  urn 0;   /* FROM
10ab0 20 63 6c 61 75 73 65 20 6d 75 73 74 20 68 61 76   clause must hav
10ac0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 74 65  e exactly one te
10ad0 72 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  rm */.  }.  if( 
10ae0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61  pSelect->pSrc->a
10af0 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20  [0].pSelect ){. 
10b00 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
10b10 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 61  * FROM clause ca
10b20 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73  nnot contain a s
10b30 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
10b40 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 57   if( pSelect->pW
10b50 68 65 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75  here ){.    retu
10b60 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
10b70 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
10b80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
10b90 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
10ba0 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ct->pOrderBy ){.
10bb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
10bc0 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
10bd0 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
10be0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d  BY clause */.  }
10bf0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6e 65 65  .  /* Do not nee
10c00 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 61 20  d to test for a 
10c10 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
10c20 49 66 20 48 41 56 49 4e 47 20 69 73 20 70 72 65  If HAVING is pre
10c30 73 65 6e 74 20 62 75 74 0a 20 20 2a 2a 20 74 68  sent but.  ** th
10c40 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
10c50 42 59 2c 20 77 65 20 77 69 6c 6c 20 67 65 74 20  BY, we will get 
10c60 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69  an error. */.  i
10c70 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f  f( pSelect->pGro
10c80 75 70 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  upBy ){.    retu
10c90 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
10ca0 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
10cb0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
10cc0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
10cd0 65 6c 65 63 74 2d 3e 70 4c 69 6d 69 74 20 29 7b  elect->pLimit ){
10ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
10cf0 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e   /* SELECT may n
10d00 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
10d10 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20  clause */.  }.  
10d20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
10d30 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
10d40 2f 2a 20 4d 75 73 74 20 62 65 20 73 6f 20 69 66  /* Must be so if
10d50 20 70 4c 69 6d 69 74 3d 3d 30 20 2a 2f 0a 20 20   pLimit==0 */.  
10d60 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  if( pSelect->pPr
10d70 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
10d80 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
10d90 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
10da0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 2a 2f 0a  mpound query */.
10db0 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
10dc0 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
10dd0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
10de0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10df0 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62  SELECT may not b
10e00 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  e DISTINCT */.  
10e10 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
10e20 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
10e30 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
10e40 30 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  0 );.  if( pELis
10e50 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
10e60 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
10e70 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
10e80 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
10e90 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2a 2f  ly one column */
10ea0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10eb0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
10ec0 72 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  r );.  if( pELis
10ed0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
10ee0 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
10ef0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10f00 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
10f10 75 73 74 20 62 65 20 74 68 65 20 73 70 65 63 69  ust be the speci
10f20 61 6c 20 6f 70 65 72 61 74 6f 72 20 22 2a 22 20  al operator "*" 
10f30 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  */.  }..  /* At 
10f40 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 68 61  this point we ha
10f50 76 65 20 65 73 74 61 62 6c 69 73 68 65 64 20 74  ve established t
10f60 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
10f70 74 20 69 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  t is of the.  **
10f80 20 63 6f 72 72 65 63 74 20 73 79 6e 74 61 63 74   correct syntact
10f90 69 63 20 66 6f 72 6d 20 74 6f 20 70 61 72 74 69  ic form to parti
10fa0 63 69 70 61 74 65 20 69 6e 20 74 68 69 73 20 6f  cipate in this o
10fb0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f  ptimization.  No
10fc0 77 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  w.  ** we have t
10fd0 6f 20 63 68 65 63 6b 20 74 68 65 20 73 65 6d 61  o check the sema
10fe0 6e 74 69 63 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ntics..  */.  pI
10ff0 74 65 6d 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  tem = pSelect->p
11000 53 72 63 2d 3e 61 3b 0a 20 20 70 53 72 63 20 3d  Src->a;.  pSrc =
11010 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
11020 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
11030 30 2c 20 70 49 74 65 6d 29 3b 0a 20 20 69 66 28  0, pItem);.  if(
11040 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
11050 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46  return 0;   /* F
11060 52 4f 4d 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ROM clause does 
11070 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  not contain a re
11080 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a  al table */.  }.
11090 20 20 69 66 28 20 70 53 72 63 3d 3d 70 44 65 73    if( pSrc==pDes
110a0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
110b0 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 61 6e 64  0;   /* tab1 and
110c0 20 74 61 62 32 20 6d 61 79 20 6e 6f 74 20 62 65   tab2 may not be
110d0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20   the same table 
110e0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 48 61 73  */.  }.  if( Has
110f0 52 6f 77 69 64 28 70 44 65 73 74 29 21 3d 48 61  Rowid(pDest)!=Ha
11100 73 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a  sRowid(pSrc) ){.
11110 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11120 2f 2a 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65  /* source and de
11130 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
11140 6f 74 68 20 62 65 20 57 49 54 48 4f 55 54 20 52  oth be WITHOUT R
11150 4f 57 49 44 20 6f 72 20 6e 6f 74 20 2a 2f 0a 20  OWID or not */. 
11160 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11170 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11180 42 4c 45 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  BLE.  if( pSrc->
11190 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69  tabFlags & TF_Vi
111a0 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  rtual ){.    ret
111b0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 32  urn 0;   /* tab2
111c0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 76   must not be a v
111d0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
111e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
111f0 20 70 53 72 63 2d 3e 70 53 65 6c 65 63 74 20 29   pSrc->pSelect )
11200 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
11210 20 20 2f 2a 20 74 61 62 32 20 6d 61 79 20 6e 6f    /* tab2 may no
11220 74 20 62 65 20 61 20 76 69 65 77 20 2a 2f 0a 20  t be a view */. 
11230 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e   }.  if( pDest->
11240 6e 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e 43 6f 6c  nCol!=pSrc->nCol
11250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11260 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
11270 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
11280 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74 61 62   the same in tab
11290 31 20 61 6e 64 20 74 61 62 32 20 2a 2f 0a 20 20  1 and tab2 */.  
112a0 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
112b0 50 4b 65 79 21 3d 70 53 72 63 2d 3e 69 50 4b 65  PKey!=pSrc->iPKe
112c0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
112d0 30 3b 20 20 20 2f 2a 20 42 6f 74 68 20 74 61 62  0;   /* Both tab
112e0 6c 65 73 20 6d 75 73 74 20 68 61 76 65 20 74 68  les must have th
112f0 65 20 73 61 6d 65 20 49 4e 54 45 47 45 52 20 50  e same INTEGER P
11300 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
11310 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
11320 44 65 73 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  Dest->nCol; i++)
11330 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 44  {.    Column *pD
11340 65 73 74 43 6f 6c 20 3d 20 26 70 44 65 73 74 2d  estCol = &pDest-
11350 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 43 6f  >aCol[i];.    Co
11360 6c 75 6d 6e 20 2a 70 53 72 63 43 6f 6c 20 3d 20  lumn *pSrcCol = 
11370 26 70 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a  &pSrc->aCol[i];.
11380 20 20 20 20 69 66 28 20 70 44 65 73 74 43 6f 6c      if( pDestCol
11390 2d 3e 61 66 66 69 6e 69 74 79 21 3d 70 53 72 63  ->affinity!=pSrc
113a0 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b  Col->affinity ){
113b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
113c0 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
113d0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
113e0 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   on all columns 
113f0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
11400 20 21 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65   !xferCompatible
11410 43 6f 6c 6c 61 74 69 6f 6e 28 70 44 65 73 74 43  Collation(pDestC
11420 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20 70 53 72 63 43  ol->zColl, pSrcC
11430 6f 6c 2d 3e 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  ol->zColl) ){.  
11440 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11450 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
11460 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 74  quence must be t
11470 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63  he same on all c
11480 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
11490 20 20 20 20 69 66 28 20 70 44 65 73 74 43 6f 6c      if( pDestCol
114a0 2d 3e 6e 6f 74 4e 75 6c 6c 20 26 26 20 21 70 53  ->notNull && !pS
114b0 72 63 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 29  rcCol->notNull )
114c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
114d0 3b 20 20 20 20 2f 2a 20 74 61 62 32 20 6d 75 73  ;    /* tab2 mus
114e0 74 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 20 69 66  t be NOT NULL if
114f0 20 74 61 62 31 20 69 73 20 2a 2f 0a 20 20 20 20   tab1 is */.    
11500 7d 0a 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74  }.    /* Default
11510 20 76 61 6c 75 65 73 20 66 6f 72 20 73 65 63 6f   values for seco
11520 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
11530 74 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 20 74  t columns need t
11540 6f 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20  o match. */.    
11550 69 66 28 20 69 3e 30 0a 20 20 20 20 20 26 26 20  if( i>0.     && 
11560 28 28 70 44 65 73 74 43 6f 6c 2d 3e 7a 44 66 6c  ((pDestCol->zDfl
11570 74 3d 3d 30 29 21 3d 28 70 53 72 63 43 6f 6c 2d  t==0)!=(pSrcCol-
11580 3e 7a 44 66 6c 74 3d 3d 30 29 20 0a 20 20 20 20  >zDflt==0) .    
11590 20 20 20 20 20 7c 7c 20 28 70 44 65 73 74 43 6f       || (pDestCo
115a0 6c 2d 3e 7a 44 66 6c 74 20 26 26 20 73 74 72 63  l->zDflt && strc
115b0 6d 70 28 70 44 65 73 74 43 6f 6c 2d 3e 7a 44 66  mp(pDestCol->zDf
115c0 6c 74 2c 20 70 53 72 63 43 6f 6c 2d 3e 7a 44 66  lt, pSrcCol->zDf
115d0 6c 74 29 21 3d 30 29 29 0a 20 20 20 20 29 7b 0a  lt)!=0)).    ){.
115e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
115f0 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61     /* Default va
11600 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
11610 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 63 6f   same for all co
11620 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
11630 20 7d 0a 20 20 66 6f 72 28 70 44 65 73 74 49 64   }.  for(pDestId
11640 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b  x=pDest->pIndex;
11650 20 70 44 65 73 74 49 64 78 3b 20 70 44 65 73 74   pDestIdx; pDest
11660 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e  Idx=pDestIdx->pN
11670 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 49 73  ext){.    if( Is
11680 55 6e 69 71 75 65 49 6e 64 65 78 28 70 44 65 73  UniqueIndex(pDes
11690 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 64  tIdx) ){.      d
116a0 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20  estHasUniqueIdx 
116b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 1;.    }.    f
116c0 6f 72 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d  or(pSrcIdx=pSrc-
116d0 3e 70 49 6e 64 65 78 3b 20 70 53 72 63 49 64 78  >pIndex; pSrcIdx
116e0 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63 49 64  ; pSrcIdx=pSrcId
116f0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
11700 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74 69   if( xferCompati
11710 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49 64  bleIndex(pDestId
11720 78 2c 20 70 53 72 63 49 64 78 29 20 29 20 62 72  x, pSrcIdx) ) br
11730 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
11740 66 28 20 70 53 72 63 49 64 78 3d 3d 30 20 29 7b  f( pSrcIdx==0 ){
11750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
11760 20 20 20 20 2f 2a 20 70 44 65 73 74 49 64 78 20      /* pDestIdx 
11770 68 61 73 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e  has no correspon
11780 64 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 70 53  ding index in pS
11790 72 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  rc */.    }.  }.
117a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
117b0 4d 49 54 5f 43 48 45 43 4b 0a 20 20 69 66 28 20  MIT_CHECK.  if( 
117c0 70 44 65 73 74 2d 3e 70 43 68 65 63 6b 20 26 26  pDest->pCheck &&
117d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
117e0 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e 70 43  Compare(pSrc->pC
117f0 68 65 63 6b 2c 70 44 65 73 74 2d 3e 70 43 68 65  heck,pDest->pChe
11800 63 6b 2c 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  ck,-1) ){.    re
11810 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 61 62  turn 0;   /* Tab
11820 6c 65 73 20 68 61 76 65 20 64 69 66 66 65 72 65  les have differe
11830 6e 74 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  nt CHECK constra
11840 69 6e 74 73 2e 20 20 54 69 63 6b 65 74 20 23 32  ints.  Ticket #2
11850 32 35 32 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69  252 */.  }.#endi
11860 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
11870 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11880 59 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20  Y.  /* Disallow 
11890 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74  the transfer opt
118a0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65  imization if the
118b0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
118c0 6c 65 20 63 6f 6e 73 74 61 69 6e 73 0a 20 20 2a  le constains.  *
118d0 2a 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  * any foreign ke
118e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
118f0 54 68 69 73 20 69 73 20 6d 6f 72 65 20 72 65 73  This is more res
11900 74 72 69 63 74 69 76 65 20 74 68 61 6e 20 6e 65  trictive than ne
11910 63 65 73 73 61 72 79 2e 0a 20 20 2a 2a 20 42 75  cessary..  ** Bu
11920 74 20 74 68 65 20 6d 61 69 6e 20 62 65 6e 65 66  t the main benef
11930 69 63 69 61 72 79 20 6f 66 20 74 68 65 20 74 72  iciary of the tr
11940 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
11950 69 6f 6e 20 69 73 20 74 68 65 20 56 41 43 55 55  ion is the VACUU
11960 4d 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2c  M .  ** command,
11970 20 61 6e 64 20 74 68 65 20 56 41 43 55 55 4d 20   and the VACUUM 
11980 63 6f 6d 6d 61 6e 64 20 64 69 73 61 62 6c 65 73  command disables
11990 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
119a0 73 74 72 61 69 6e 74 73 2e 20 20 53 6f 0a 20 20  straints.  So.  
119b0 2a 2a 20 74 68 65 20 65 78 74 72 61 20 63 6f 6d  ** the extra com
119c0 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 6d 61 6b  plication to mak
119d0 65 20 74 68 69 73 20 72 75 6c 65 20 6c 65 73 73  e this rule less
119e0 20 72 65 73 74 72 69 63 74 69 76 65 20 69 73 20   restrictive is 
119f0 70 72 6f 62 61 62 6c 79 0a 20 20 2a 2a 20 6e 6f  probably.  ** no
11a00 74 20 77 6f 72 74 68 20 74 68 65 20 65 66 66 6f  t worth the effo
11a10 72 74 2e 20 20 54 69 63 6b 65 74 20 5b 36 32 38  rt.  Ticket [628
11a20 34 64 66 38 39 64 65 62 64 66 61 36 31 64 62 38  4df89debdfa61db8
11a30 30 37 33 65 30 36 32 39 30 38 61 66 30 63 39 62  073e062908af0c9b
11a40 36 31 31 38 65 5d 0a 20 20 2a 2f 0a 20 20 69 66  6118e].  */.  if
11a50 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
11a60 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 6f  lags & SQLITE_Fo
11a70 72 65 69 67 6e 4b 65 79 73 29 21 3d 30 20 26 26  reignKeys)!=0 &&
11a80 20 70 44 65 73 74 2d 3e 70 46 4b 65 79 21 3d 30   pDest->pFKey!=0
11a90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11aa0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
11ab0 66 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  f( (pParse->db->
11ac0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
11ad0 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a  ountRows)!=0 ){.
11ae0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
11af0 2a 20 78 66 65 72 20 6f 70 74 20 64 6f 65 73 20  * xfer opt does 
11b00 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
11b10 74 68 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f  th PRAGMA count_
11b20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 7d 0a 0a  changes */.  }..
11b30 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
11b40 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
11b50 73 20 74 68 61 74 20 74 68 65 20 78 66 65 72 20  s that the xfer 
11b60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
11b70 61 74 0a 20 20 2a 2a 20 6c 65 61 73 74 20 61 20  at.  ** least a 
11b80 70 6f 73 73 69 62 69 6c 69 74 79 2c 20 74 68 6f  possibility, tho
11b90 75 67 68 20 69 74 20 6d 69 67 68 74 20 6f 6e 6c  ugh it might onl
11ba0 79 20 77 6f 72 6b 20 69 66 20 74 68 65 20 64 65  y work if the de
11bb0 73 74 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a 20 74  stination.  ** t
11bc0 61 62 6c 65 20 28 74 61 62 31 29 20 69 73 20 69  able (tab1) is i
11bd0 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
11be0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
11bf0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
11c00 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2b  3_xferopt_count+
11c10 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69 44 62 53  +;.#endif.  iDbS
11c20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  rc = sqlite3Sche
11c30 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
11c40 2d 3e 64 62 2c 20 70 53 72 63 2d 3e 70 53 63 68  ->db, pSrc->pSch
11c50 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ema);.  v = sqli
11c60 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11c70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
11c80 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
11c90 61 72 73 65 2c 20 69 44 62 53 72 63 29 3b 0a 20  arse, iDbSrc);. 
11ca0 20 69 53 72 63 20 3d 20 70 50 61 72 73 65 2d 3e   iSrc = pParse->
11cb0 6e 54 61 62 2b 2b 3b 0a 20 20 69 44 65 73 74 20  nTab++;.  iDest 
11cc0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
11cd0 3b 0a 20 20 72 65 67 41 75 74 6f 69 6e 63 20 3d  ;.  regAutoinc =
11ce0 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 70 50   autoIncBegin(pP
11cf0 61 72 73 65 2c 20 69 44 62 44 65 73 74 2c 20 70  arse, iDbDest, p
11d00 44 65 73 74 29 3b 0a 20 20 72 65 67 44 61 74 61  Dest);.  regData
11d10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11d20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
11d30 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
11d40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11d50 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  rse);.  sqlite3O
11d60 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
11d70 20 69 44 65 73 74 2c 20 69 44 62 44 65 73 74 2c   iDest, iDbDest,
11d80 20 70 44 65 73 74 2c 20 4f 50 5f 4f 70 65 6e 57   pDest, OP_OpenW
11d90 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
11da0 20 48 61 73 52 6f 77 69 64 28 70 44 65 73 74 29   HasRowid(pDest)
11db0 20 7c 7c 20 64 65 73 74 48 61 73 55 6e 69 71 75   || destHasUniqu
11dc0 65 49 64 78 20 29 3b 0a 20 20 69 66 28 20 28 70  eIdx );.  if( (p
11dd0 44 65 73 74 2d 3e 69 50 4b 65 79 3c 30 20 26 26  Dest->iPKey<0 &&
11de0 20 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 21 3d   pDest->pIndex!=
11df0 30 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28  0)          /* (
11e00 31 29 20 2a 2f 0a 20 20 20 7c 7c 20 64 65 73 74  1) */.   || dest
11e10 48 61 73 55 6e 69 71 75 65 49 64 78 20 20 20 20  HasUniqueIdx    
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
11e40 20 2a 2f 0a 20 20 20 7c 7c 20 28 6f 6e 45 72 72   */.   || (onErr
11e50 6f 72 21 3d 4f 45 5f 41 62 6f 72 74 20 26 26 20  or!=OE_Abort && 
11e60 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 6f 6c 6c  onError!=OE_Roll
11e70 62 61 63 6b 29 20 20 20 2f 2a 20 28 33 29 20 2a  back)   /* (3) *
11e80 2f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  /.  ){.    /* In
11e90 20 73 6f 6d 65 20 63 69 72 63 75 6d 73 74 61 6e   some circumstan
11ea0 63 65 73 2c 20 77 65 20 61 72 65 20 61 62 6c 65  ces, we are able
11eb0 20 74 6f 20 72 75 6e 20 74 68 65 20 78 66 65 72   to run the xfer
11ec0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
11ed0 20 20 2a 2a 20 6f 6e 6c 79 20 69 66 20 74 68 65    ** only if the
11ee0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
11ef0 6c 65 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  le is initially 
11f00 65 6d 70 74 79 2e 20 20 54 68 69 73 20 63 6f 64  empty.  This cod
11f10 65 20 6d 61 6b 65 73 0a 20 20 20 20 2a 2a 20 74  e makes.    ** t
11f20 68 61 74 20 64 65 74 65 72 6d 69 6e 61 74 69 6f  hat determinatio
11f30 6e 2e 20 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75  n.  Conditions u
11f40 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20 64  nder which the d
11f50 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 0a  estination must.
11f60 20 20 20 20 2a 2a 20 62 65 20 65 6d 70 74 79 3a      ** be empty:
11f70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
11f80 31 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  1) There is no I
11f90 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
11fa0 45 59 20 62 75 74 20 74 68 65 72 65 20 61 72 65  EY but there are
11fb0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
11fc0 20 20 20 20 20 28 49 66 20 74 68 65 20 64 65 73       (If the des
11fd0 74 69 6e 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20  tination is not 
11fe0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c  initially empty,
11ff0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
12000 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 6f 66 20  s.    **     of 
12010 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 6d 69  index entries mi
12020 67 68 74 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ght need to chan
12030 67 65 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge.).    **.    
12040 2a 2a 20 28 32 29 20 54 68 65 20 64 65 73 74 69  ** (2) The desti
12050 6e 61 74 69 6f 6e 20 68 61 73 20 61 20 75 6e 69  nation has a uni
12060 71 75 65 20 69 6e 64 65 78 2e 20 20 28 54 68 65  que index.  (The
12070 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
12080 6f 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 69  on .    **     i
12090 73 20 75 6e 61 62 6c 65 20 74 6f 20 74 65 73 74  s unable to test
120a0 20 75 6e 69 71 75 65 6e 65 73 73 2e 29 0a 20 20   uniqueness.).  
120b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 33 29 20    **.    ** (3) 
120c0 6f 6e 45 72 72 6f 72 20 69 73 20 73 6f 6d 65 74  onError is somet
120d0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
120e0 4f 45 5f 41 62 6f 72 74 20 61 6e 64 20 4f 45 5f  OE_Abort and OE_
120f0 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  Rollback..    */
12100 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
12110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12120 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 65  , OP_Rewind, iDe
12130 73 74 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  st, 0); VdbeCove
12140 72 61 67 65 28 76 29 3b 0a 20 20 20 20 65 6d 70  rage(v);.    emp
12150 74 79 44 65 73 74 54 65 73 74 20 3d 20 73 71 6c  tyDestTest = sql
12160 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12170 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
12180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12190 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
121a0 72 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48  r1);.  }.  if( H
121b0 61 73 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b  asRowid(pSrc) ){
121c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
121d0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53  Table(pParse, iS
121e0 72 63 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63  rc, iDbSrc, pSrc
121f0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
12200 20 20 20 20 65 6d 70 74 79 53 72 63 54 65 73 74      emptySrcTest
12210 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12220 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12230 64 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62  d, iSrc, 0); Vdb
12240 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12250 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b    if( pDest->iPK
12260 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ey>=0 ){.      a
12270 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
12280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12290 6f 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52  owid, iSrc, regR
122a0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 64 64  owid);.      add
122b0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
122c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
122d0 45 78 69 73 74 73 2c 20 69 44 65 73 74 2c 20 30  Exists, iDest, 0
122e0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
122f0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
12300 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
12310 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
12320 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72  (pParse, onError
12330 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  , pDest);.      
12340 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
12350 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
12360 20 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70       autoIncStep
12370 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f  (pParse, regAuto
12380 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  inc, regRowid);.
12390 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44      }else if( pD
123a0 65 73 74 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29  est->pIndex==0 )
123b0 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  {.      addr1 = 
123c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
123d0 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
123e0 2c 20 69 44 65 73 74 2c 20 72 65 67 52 6f 77 69  , iDest, regRowi
123f0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
12400 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
12410 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12420 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63  , OP_Rowid, iSrc
12430 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
12440 20 20 20 61 73 73 65 72 74 28 20 28 70 44 65 73     assert( (pDes
12450 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  t->tabFlags & TF
12460 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3d  _Autoincrement)=
12470 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
12480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12490 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
124a0 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b   iSrc, regData);
124b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
124c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
124d0 65 72 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44  ert, iDest, regD
124e0 61 74 61 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  ata, regRowid);.
124f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12500 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
12510 47 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47  G_NCHANGE|OPFLAG
12520 5f 4c 41 53 54 52 4f 57 49 44 7c 4f 50 46 4c 41  _LASTROWID|OPFLA
12530 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
12540 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
12550 50 34 28 76 2c 20 2d 31 2c 20 70 44 65 73 74 2d  P4(v, -1, pDest-
12560 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
12570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12580 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 53  2(v, OP_Next, iS
12590 72 63 2c 20 61 64 64 72 31 29 3b 20 56 64 62 65  rc, addr1); Vdbe
125a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
125b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125c0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
125d0 69 53 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  iSrc, 0);.    sq
125e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
125f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65  v, OP_Close, iDe
12600 73 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  st, 0);.  }else{
12610 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
12620 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
12630 62 44 65 73 74 2c 20 70 44 65 73 74 2d 3e 74 6e  bDest, pDest->tn
12640 75 6d 2c 20 31 2c 20 70 44 65 73 74 2d 3e 7a 4e  um, 1, pDest->zN
12650 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
12660 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
12670 65 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63 2d  e, iDbSrc, pSrc-
12680 3e 74 6e 75 6d 2c 20 30 2c 20 70 53 72 63 2d 3e  >tnum, 0, pSrc->
12690 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  zName);.  }.  fo
126a0 72 28 70 44 65 73 74 49 64 78 3d 70 44 65 73 74  r(pDestIdx=pDest
126b0 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65 73 74 49  ->pIndex; pDestI
126c0 64 78 3b 20 70 44 65 73 74 49 64 78 3d 70 44 65  dx; pDestIdx=pDe
126d0 73 74 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  stIdx->pNext){. 
126e0 20 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70     for(pSrcIdx=p
126f0 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 41 4c 57  Src->pIndex; ALW
12700 41 59 53 28 70 53 72 63 49 64 78 29 3b 20 70 53  AYS(pSrcIdx); pS
12710 72 63 49 64 78 3d 70 53 72 63 49 64 78 2d 3e 70  rcIdx=pSrcIdx->p
12720 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
12730 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49   xferCompatibleI
12740 6e 64 65 78 28 70 44 65 73 74 49 64 78 2c 20 70  ndex(pDestIdx, p
12750 53 72 63 49 64 78 29 20 29 20 62 72 65 61 6b 3b  SrcIdx) ) break;
12760 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
12770 74 28 20 70 53 72 63 49 64 78 20 29 3b 0a 20 20  t( pSrcIdx );.  
12780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12790 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
127a0 61 64 2c 20 69 53 72 63 2c 20 70 53 72 63 49 64  ad, iSrc, pSrcId
127b0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 53 72 63 29  x->tnum, iDbSrc)
127c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
127d0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
127e0 61 72 73 65 2c 20 70 53 72 63 49 64 78 29 3b 0a  arse, pSrcIdx);.
127f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
12800 28 76 2c 20 22 25 73 22 2c 20 70 53 72 63 49 64  (v, "%s", pSrcId
12810 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
12820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12830 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
12840 65 2c 20 69 44 65 73 74 2c 20 70 44 65 73 74 49  e, iDest, pDestI
12850 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 44 65 73  dx->tnum, iDbDes
12860 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
12870 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
12880 70 50 61 72 73 65 2c 20 70 44 65 73 74 49 64 78  pParse, pDestIdx
12890 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
128a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
128b0 46 4c 41 47 5f 42 55 4c 4b 43 53 52 29 3b 0a 20  FLAG_BULKCSR);. 
128c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
128d0 76 2c 20 22 25 73 22 2c 20 70 44 65 73 74 49 64  v, "%s", pDestId
128e0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
128f0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
12900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12910 52 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30 29  Rewind, iSrc, 0)
12920 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12930 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12940 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12950 6f 77 4b 65 79 2c 20 69 53 72 63 2c 20 72 65 67  owKey, iSrc, reg
12960 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
12970 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12980 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 44  OP_IdxInsert, iD
12990 65 73 74 2c 20 72 65 67 44 61 74 61 2c 20 31 29  est, regData, 1)
129a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
129b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
129c0 78 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31 2b  xt, iSrc, addr1+
129d0 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
129e0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
129f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12a00 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
12a10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12a20 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c   OP_Close, iSrc,
12a30 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12a40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12a50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20 30  _Close, iDest, 0
12a60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6d 70  );.  }.  if( emp
12a70 74 79 53 72 63 54 65 73 74 20 29 20 73 71 6c 69  tySrcTest ) sqli
12a80 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12a90 76 2c 20 65 6d 70 74 79 53 72 63 54 65 73 74 29  v, emptySrcTest)
12aa0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
12ab0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
12ac0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
12ad0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12ae0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
12af0 44 61 74 61 29 3b 0a 20 20 69 66 28 20 65 6d 70  Data);.  if( emp
12b00 74 79 44 65 73 74 54 65 73 74 20 29 7b 0a 20 20  tyDestTest ){.  
12b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b20 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op2(v, OP_Halt, 
12b30 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
12b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
12b50 6d 70 48 65 72 65 28 76 2c 20 65 6d 70 74 79 44  mpHere(v, emptyD
12b60 65 73 74 54 65 73 74 29 3b 0a 20 20 20 20 73 71  estTest);.    sq
12b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12b80 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65  v, OP_Close, iDe
12b90 73 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  st, 0);.    retu
12ba0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
12bb0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12bc0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12bd0 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50  ITE_OMIT_XFER_OP
12be0 54 20 2a 2f 0a                                   T */.