/ Hex Artifact Content
Login

Artifact ba455ebb100283ccc5da03da3498fcbca48ce6bb:


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 6f 70  ode that will op
0220: 65 6e 20 61 20 74 61 62 6c 65 20 66 6f 72 20 72  en a table for r
0230: 65 61 64 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  eading..*/.void 
0240: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
0250: 28 0a 20 20 50 61 72 73 65 20 2a 70 2c 20 20 20  (.  Parse *p,   
0260: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
0270: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
0280: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  DBE */.  int iCu
0290: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
02a0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
02b0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
02c0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
02d0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
02e0: 69 6e 64 65 78 20 69 6e 20 73 71 6c 69 74 65 33  index in sqlite3
02f0: 2e 61 44 62 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c  .aDb[] */.  Tabl
0300: 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54  e *pTab,    /* T
0310: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6f  he table to be o
0320: 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  pened */.  int o
0330: 70 63 6f 64 65 20 20 20 20 20 20 2f 2a 20 4f 50  pcode      /* OP
0340: 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f  _OpenRead or OP_
0350: 4f 70 65 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a  OpenWrite */.){.
0360: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28    Vdbe *v;.  if(
0370: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
0380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 20 3d   ) return;.  v =
0390: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
03a0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  p);.  assert( op
03b0: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
03c0: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
03d0: 5f 4f 70 65 6e 52 65 61 64 20 29 3b 0a 20 20 73  _OpenRead );.  s
03e0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
03f0: 70 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  p, iDb, pTab->tn
0400: 75 6d 2c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  um, (opcode==OP_
0410: 4f 70 65 6e 57 72 69 74 65 29 3f 31 3a 30 2c 20  OpenWrite)?1:0, 
0420: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
0430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0440: 33 28 76 2c 20 6f 70 63 6f 64 65 2c 20 69 43 75  3(v, opcode, iCu
0450: 72 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  r, pTab->tnum, i
0460: 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
0470: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
0480: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
0490: 50 54 52 28 70 54 61 62 2d 3e 6e 43 6f 6c 29 2c  PTR(pTab->nCol),
04a0: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 56 64   P4_INT32);.  Vd
04b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
04c0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
04d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
04e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
04f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
0500: 69 74 79 20 73 74 72 69 6e 67 20 61 73 73 6f 63  ity string assoc
0510: 69 61 74 65 64 20 77 69 74 68 20 69 6e 64 65 78  iated with index
0520: 0a 2a 2a 20 70 49 64 78 2e 20 41 20 63 6f 6c 75  .** pIdx. A colu
0530: 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
0540: 6e 67 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61  ng has one chara
0550: 63 74 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f  cter for each co
0560: 6c 75 6d 6e 20 69 6e 20 0a 2a 2a 20 74 68 65 20  lumn in .** the 
0570: 74 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67  table, according
0580: 20 74 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79   to the affinity
0590: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 3a 0a   of the column:.
05a0: 2a 2a 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72  **.**  Character
05b0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66        Column aff
05c0: 69 6e 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d  inity.**  ------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 61 27  --------.**  'a'
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 54 45 58 54              TEXT
0600: 0a 2a 2a 20 20 27 62 27 20 20 20 20 20 20 20 20  .**  'b'        
0610: 20 20 20 20 4e 4f 4e 45 0a 2a 2a 20 20 27 63 27      NONE.**  'c'
0620: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45              NUME
0630: 52 49 43 0a 2a 2a 20 20 27 64 27 20 20 20 20 20  RIC.**  'd'     
0640: 20 20 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a         INTEGER.*
0650: 2a 20 20 27 65 27 20 20 20 20 20 20 20 20 20 20  *  'e'          
0660: 20 20 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 41 6e 20    REAL.**.** An 
0670: 65 78 74 72 61 20 27 62 27 20 69 73 20 61 70 70  extra 'b' is app
0680: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  ended to the end
0690: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 74   of the string t
06a0: 6f 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 72  o cover the.** r
06b0: 6f 77 69 64 20 74 68 61 74 20 61 70 70 65 61 72  owid that appear
06c0: 73 20 61 73 20 74 68 65 20 6c 61 73 74 20 63 6f  s as the last co
06d0: 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 69 6e  lumn in every in
06e0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72  dex..**.** Memor
06f0: 79 20 66 6f 72 20 74 68 65 20 62 75 66 66 65 72  y for the buffer
0700: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
0710: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 61 66 66  column index aff
0720: 69 6e 69 74 79 20 73 74 72 69 6e 67 0a 2a 2a 20  inity string.** 
0730: 69 73 20 6d 61 6e 61 67 65 64 20 61 6c 6f 6e 67  is managed along
0740: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f   with the rest o
0750: 66 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  f the Index stru
0760: 63 74 75 72 65 2e 20 49 74 20 77 69 6c 6c 20 62  cture. It will b
0770: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68  e.** released wh
0780: 65 6e 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  en sqlite3Delete
0790: 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65  Index() is calle
07a0: 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  d..*/.const char
07b0: 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   *sqlite3IndexAf
07c0: 66 69 6e 69 74 79 53 74 72 28 56 64 62 65 20 2a  finityStr(Vdbe *
07d0: 76 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  v, Index *pIdx){
07e0: 0a 20 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43  .  if( !pIdx->zC
07f0: 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 2f 2a 20  olAff ){.    /* 
0800: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0810: 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
0820: 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 61   string for a pa
0830: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 69  rticular index i
0840: 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
0850: 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
0860: 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
0870: 20 68 65 72 65 2e 20 49 74 20 69 73 20 74 68 65   here. It is the
0880: 6e 20 73 74 6f 72 65 64 20 61 73 0a 20 20 20 20  n stored as.    
0890: 2a 2a 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ** a member of t
08a0: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
08b0: 72 65 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e  re for subsequen
08c0: 74 20 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t use..    **.  
08d0: 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    ** The column 
08e0: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
08f0: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
0900: 62 65 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20  be deleted by.  
0910: 20 20 2a 2a 20 73 71 6c 69 74 65 44 65 6c 65 74    ** sqliteDelet
0920: 65 49 6e 64 65 78 28 29 20 77 68 65 6e 20 74 68  eIndex() when th
0930: 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
0940: 65 20 69 74 73 65 6c 66 20 69 73 20 63 6c 65 61  e itself is clea
0950: 6e 65 64 0a 20 20 20 20 2a 2a 20 75 70 2e 0a 20  ned.    ** up.. 
0960: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b     */.    int n;
0970: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
0980: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
0990: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
09a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 44 62   = sqlite3VdbeDb
09b0: 28 76 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 7a  (v);.    pIdx->z
09c0: 43 6f 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a  ColAff = (char *
09d0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
09e0: 52 61 77 28 30 2c 20 70 49 64 78 2d 3e 6e 43 6f  Raw(0, pIdx->nCo
09f0: 6c 75 6d 6e 2b 32 29 3b 0a 20 20 20 20 69 66 28  lumn+2);.    if(
0a00: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
0a10: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
0a20: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0a30: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
0a40: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30     }.    for(n=0
0a50: 3b 20 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; n<pIdx->nColum
0a60: 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  n; n++){.      p
0a70: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20  Idx->zColAff[n] 
0a80: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
0a90: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 5d 2e  x->aiColumn[n]].
0aa0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a  affinity;.    }.
0ab0: 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66      pIdx->zColAf
0ac0: 66 5b 6e 2b 2b 5d 20 3d 20 53 51 4c 49 54 45 5f  f[n++] = SQLITE_
0ad0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 49  AFF_NONE;.    pI
0ae0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d  dx->zColAff[n] =
0af0: 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 72 65 74 75   0;.  }. .  retu
0b00: 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  rn pIdx->zColAff
0b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 50  ;.}../*.** Set P
0b20: 34 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  4 of the most re
0b30: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
0b40: 6f 70 63 6f 64 65 20 74 6f 20 61 20 63 6f 6c 75  opcode to a colu
0b50: 6d 6e 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73  mn affinity.** s
0b60: 74 72 69 6e 67 20 66 6f 72 20 74 61 62 6c 65 20  tring for table 
0b70: 70 54 61 62 2e 20 41 20 63 6f 6c 75 6d 6e 20 61  pTab. A column a
0b80: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 68  ffinity string h
0b90: 61 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  as one character
0ba0: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  .** for each col
0bb0: 75 6d 6e 20 69 6e 64 65 78 65 64 20 62 79 20 74  umn indexed by t
0bc0: 68 65 20 69 6e 64 65 78 2c 20 61 63 63 6f 72 64  he index, accord
0bd0: 69 6e 67 20 74 6f 20 74 68 65 20 61 66 66 69 6e  ing to the affin
0be0: 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ity of the.** co
0bf0: 6c 75 6d 6e 3a 0a 2a 2a 0a 2a 2a 20 20 43 68 61  lumn:.**.**  Cha
0c00: 72 61 63 74 65 72 20 20 20 20 20 20 43 6f 6c 75  racter      Colu
0c10: 6d 6e 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 20  mn affinity.**  
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
0c40: 2a 20 20 27 61 27 20 20 20 20 20 20 20 20 20 20  *  'a'          
0c50: 20 20 54 45 58 54 0a 2a 2a 20 20 27 62 27 20 20    TEXT.**  'b'  
0c60: 20 20 20 20 20 20 20 20 20 20 4e 4f 4e 45 0a 2a            NONE.*
0c70: 2a 20 20 27 63 27 20 20 20 20 20 20 20 20 20 20  *  'c'          
0c80: 20 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 20 27 64    NUMERIC.**  'd
0c90: 27 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54  '            INT
0ca0: 45 47 45 52 0a 2a 2a 20 20 27 65 27 20 20 20 20  EGER.**  'e'    
0cb0: 20 20 20 20 20 20 20 20 52 45 41 4c 0a 2a 2f 0a          REAL.*/.
0cc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c  void sqlite3Tabl
0cd0: 65 41 66 66 69 6e 69 74 79 53 74 72 28 56 64 62  eAffinityStr(Vdb
0ce0: 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54 61  e *v, Table *pTa
0cf0: 62 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 69 72  b){.  /* The fir
0d00: 73 74 20 74 69 6d 65 20 61 20 63 6f 6c 75 6d 6e  st time a column
0d10: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
0d20: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
0d30: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 73 20  r table.  ** is 
0d40: 72 65 71 75 69 72 65 64 2c 20 69 74 20 69 73 20  required, it is 
0d50: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
0d60: 70 75 6c 61 74 65 64 20 68 65 72 65 2e 20 49 74  pulated here. It
0d70: 20 69 73 20 74 68 65 6e 20 0a 20 20 2a 2a 20 73   is then .  ** s
0d80: 74 6f 72 65 64 20 61 73 20 61 20 6d 65 6d 62 65  tored as a membe
0d90: 72 20 6f 66 20 74 68 65 20 54 61 62 6c 65 20 73  r of the Table s
0da0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 73 75 62  tructure for sub
0db0: 73 65 71 75 65 6e 74 20 75 73 65 2e 0a 20 20 2a  sequent use..  *
0dc0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  *.  ** The colum
0dd0: 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
0de0: 67 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  g will eventuall
0df0: 79 20 62 65 20 64 65 6c 65 74 65 64 20 62 79 0a  y be deleted by.
0e00: 20 20 2a 2a 20 73 71 6c 69 74 65 33 44 65 6c 65    ** sqlite3Dele
0e10: 74 65 54 61 62 6c 65 28 29 20 77 68 65 6e 20 74  teTable() when t
0e20: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
0e30: 72 65 20 69 74 73 65 6c 66 20 69 73 20 63 6c 65  re itself is cle
0e40: 61 6e 65 64 20 75 70 2e 0a 20 20 2a 2f 0a 20 20  aned up..  */.  
0e50: 69 66 28 20 21 70 54 61 62 2d 3e 7a 43 6f 6c 41  if( !pTab->zColA
0e60: 66 66 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ff ){.    char *
0e70: 7a 43 6f 6c 41 66 66 3b 0a 20 20 20 20 69 6e 74  zColAff;.    int
0e80: 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   i;.    sqlite3 
0e90: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62  *db = sqlite3Vdb
0ea0: 65 44 62 28 76 29 3b 0a 0a 20 20 20 20 7a 43 6f  eDb(v);..    zCo
0eb0: 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a 29 73  lAff = (char *)s
0ec0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
0ed0: 77 28 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b  w(0, pTab->nCol+
0ee0: 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
0ef0: 6c 41 66 66 20 29 7b 0a 20 20 20 20 20 20 64 62  lAff ){.      db
0f00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
0f10: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
0f20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
0f30: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
0f40: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
0f50: 7a 43 6f 6c 41 66 66 5b 69 5d 20 3d 20 70 54 61  zColAff[i] = pTa
0f60: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e  b->aCol[i].affin
0f70: 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ity;.    }.    z
0f80: 43 6f 6c 41 66 66 5b 70 54 61 62 2d 3e 6e 43 6f  ColAff[pTab->nCo
0f90: 6c 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  l] = '\0';..    
0fa0: 70 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 20 3d 20  pTab->zColAff = 
0fb0: 7a 43 6f 6c 41 66 66 3b 0a 20 20 7d 0a 0a 20 20  zColAff;.  }..  
0fc0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0fd0: 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d  eP4(v, -1, pTab-
0fe0: 3e 7a 43 6f 6c 41 66 66 2c 20 30 29 3b 0a 7d 0a  >zColAff, 0);.}.
0ff0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
1000: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 74 61  n-zero if the ta
1010: 62 6c 65 20 70 54 61 62 20 69 6e 20 64 61 74 61  ble pTab in data
1020: 62 61 73 65 20 69 44 62 20 6f 72 20 61 6e 79 20  base iDb or any 
1030: 6f 66 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a  of its indices.*
1040: 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  * have been open
1050: 65 64 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20  ed at any point 
1060: 69 6e 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  in the VDBE prog
1070: 72 61 6d 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ram beginning at
1080: 20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 69 53 74   location.** iSt
1090: 61 72 74 41 64 64 72 20 74 68 72 6f 75 67 68 74  artAddr throught
10a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10b0: 70 72 6f 67 72 61 6d 2e 20 20 54 68 69 73 20 69  program.  This i
10c0: 73 20 75 73 65 64 20 74 6f 20 73 65 65 20 69 66  s used to see if
10d0: 20 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74   .** a statement
10e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 20 22 49   of the form  "I
10f0: 4e 53 45 52 54 20 49 4e 54 4f 20 3c 69 44 62 2c  NSERT INTO <iDb,
1100: 20 70 54 61 62 3e 20 53 45 4c 45 43 54 20 2e 2e   pTab> SELECT ..
1110: 2e 22 20 63 61 6e 20 0a 2a 2a 20 72 75 6e 20 77  ." can .** run w
1120: 69 74 68 6f 75 74 20 75 73 69 6e 67 20 74 65 6d  ithout using tem
1130: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72  porary table for
1140: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1150: 74 68 65 20 53 45 4c 45 43 54 2e 20 0a 2a 2f 0a  the SELECT. .*/.
1160: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 73  static int reads
1170: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
1180: 69 6e 74 20 69 53 74 61 72 74 41 64 64 72 2c 20  int iStartAddr, 
1190: 69 6e 74 20 69 44 62 2c 20 54 61 62 6c 65 20 2a  int iDb, Table *
11a0: 70 54 61 62 29 7b 0a 20 20 56 64 62 65 20 2a 76  pTab){.  Vdbe *v
11b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
11c0: 65 28 70 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e(p);.  int i;. 
11d0: 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69   int iEnd = sqli
11e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
11f0: 64 72 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53  dr(v);.#ifndef S
1200: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1210: 41 4c 54 41 42 4c 45 0a 20 20 56 54 61 62 6c 65  ALTABLE.  VTable
1220: 20 2a 70 56 54 61 62 20 3d 20 49 73 56 69 72 74   *pVTab = IsVirt
1230: 75 61 6c 28 70 54 61 62 29 20 3f 20 73 71 6c 69  ual(pTab) ? sqli
1240: 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 2d 3e  te3GetVTable(p->
1250: 64 62 2c 20 70 54 61 62 29 20 3a 20 30 3b 0a 23  db, pTab) : 0;.#
1260: 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 69  endif..  for(i=i
1270: 53 74 61 72 74 41 64 64 72 3b 20 69 3c 69 45 6e  StartAddr; i<iEn
1280: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62  d; i++){.    Vdb
1290: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
12a0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 69  e3VdbeGetOp(v, i
12b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12c0: 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  Op!=0 );.    if(
12d0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
12e0: 5f 4f 70 65 6e 52 65 61 64 20 26 26 20 70 4f 70  _OpenRead && pOp
12f0: 2d 3e 70 33 3d 3d 69 44 62 20 29 7b 0a 20 20 20  ->p3==iDb ){.   
1300: 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
1310: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6e 75 6d  ;.      int tnum
1320: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
1330: 20 20 69 66 28 20 74 6e 75 6d 3d 3d 70 54 61 62    if( tnum==pTab
1340: 2d 3e 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20 20  ->tnum ){.      
1350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1360: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 49    }.      for(pI
1370: 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
1380: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
1390: 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
13a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6e  {.        if( tn
13b0: 75 6d 3d 3d 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  um==pIndex->tnum
13c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
13d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
13e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1400: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1410: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
1420: 63 6f 64 65 3d 3d 4f 50 5f 56 4f 70 65 6e 20 26  code==OP_VOpen &
1430: 26 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3d  & pOp->p4.pVtab=
1440: 3d 70 56 54 61 62 20 29 7b 0a 20 20 20 20 20 20  =pVTab ){.      
1450: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
1460: 70 56 74 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  pVtab!=0 );.    
1470: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1480: 34 74 79 70 65 3d 3d 50 34 5f 56 54 41 42 20 29  4type==P4_VTAB )
1490: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
14a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
14c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14d0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
14e0: 45 4e 54 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  ENT./*.** Locate
14f0: 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 41 75   or create an Au
1500: 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75 63 74  toincInfo struct
1510: 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1520: 69 74 68 20 74 61 62 6c 65 20 70 54 61 62 0a 2a  ith table pTab.*
1530: 2a 20 77 68 69 63 68 20 69 73 20 69 6e 20 64 61  * which is in da
1540: 74 61 62 61 73 65 20 69 44 62 2e 20 20 52 65 74  tabase iDb.  Ret
1550: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
1560: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1570: 72 65 67 69 73 74 65 72 0a 2a 2a 20 74 68 61 74  register.** that
1580: 20 68 6f 6c 64 73 20 74 68 65 20 6d 61 78 69 6d   holds the maxim
1590: 75 6d 20 72 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  um rowid..**.** 
15a0: 54 68 65 72 65 20 69 73 20 61 74 20 6d 6f 73 74  There is at most
15b0: 20 6f 6e 65 20 41 75 74 6f 69 6e 63 49 6e 66 6f   one AutoincInfo
15c0: 20 73 74 72 75 63 74 75 72 65 20 70 65 72 20 74   structure per t
15d0: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  able even if the
15e0: 0a 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 69  .** same table i
15f0: 73 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 65  s autoincremente
1600: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
1610: 20 64 75 65 20 74 6f 20 69 6e 73 65 72 74 73 20   due to inserts 
1620: 77 69 74 68 69 6e 0a 2a 2a 20 74 72 69 67 67 65  within.** trigge
1630: 72 73 2e 20 20 41 20 6e 65 77 20 41 75 74 6f 69  rs.  A new Autoi
1640: 6e 63 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ncInfo structure
1650: 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20 74   is created if t
1660: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 66 69  his is the.** fi
1670: 72 73 74 20 75 73 65 20 6f 66 20 74 61 62 6c 65  rst use of table
1680: 20 70 54 61 62 2e 20 20 4f 6e 20 32 6e 64 20 61   pTab.  On 2nd a
1690: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 75 73  nd subsequent us
16a0: 65 73 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  es, the original
16b0: 0a 2a 2a 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20  .** AutoincInfo 
16c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
16d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 65 65 20 6d  d..**.** Three m
16e0: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
16f0: 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 3a 0a 2a  are allocated:.*
1700: 2a 0a 2a 2a 20 20 20 28 31 29 20 20 52 65 67 69  *.**   (1)  Regi
1710: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ster to hold the
1720: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 54 61   name of the pTa
1730: 62 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28 32  b table..**   (2
1740: 29 20 20 52 65 67 69 73 74 65 72 20 74 6f 20 68  )  Register to h
1750: 6f 6c 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  old the maximum 
1760: 52 4f 57 49 44 20 6f 66 20 70 54 61 62 2e 0a 2a  ROWID of pTab..*
1770: 2a 20 20 20 28 33 29 20 20 52 65 67 69 73 74 65  *   (3)  Registe
1780: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 6f  r to hold the ro
1790: 77 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65  wid in sqlite_se
17a0: 71 75 65 6e 63 65 20 6f 66 20 70 54 61 62 0a 2a  quence of pTab.*
17b0: 2a 0a 2a 2a 20 54 68 65 20 32 6e 64 20 72 65 67  *.** The 2nd reg
17c0: 69 73 74 65 72 20 69 73 20 74 68 65 20 6f 6e 65  ister is the one
17d0: 20 74 68 61 74 20 69 73 20 72 65 74 75 72 6e 65   that is returne
17e0: 64 2e 20 20 54 68 61 74 20 69 73 20 61 6c 6c 20  d.  That is all 
17f0: 74 68 65 0a 2a 2a 20 69 6e 73 65 72 74 20 72 6f  the.** insert ro
1800: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 6b  utine needs to k
1810: 6e 6f 77 20 61 62 6f 75 74 2e 0a 2a 2f 0a 73 74  now about..*/.st
1820: 61 74 69 63 20 69 6e 74 20 61 75 74 6f 49 6e 63  atic int autoInc
1830: 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
1840: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
1850: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1860: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
1870: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1880: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
1890: 65 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 2a  e holding pTab *
18a0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
18b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
18c0: 61 62 6c 65 20 77 65 20 61 72 65 20 77 72 69 74  able we are writ
18d0: 69 6e 67 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69  ing to */.){.  i
18e0: 6e 74 20 6d 65 6d 49 64 20 3d 20 30 3b 20 20 20  nt memId = 0;   
18f0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1900: 6f 6c 64 69 6e 67 20 6d 61 78 69 6d 75 6d 20 72  olding maximum r
1910: 6f 77 69 64 20 2a 2f 0a 20 20 69 66 28 20 70 54  owid */.  if( pT
1920: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1930: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
1940: 29 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 54  ){.    Parse *pT
1950: 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1960: 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1970: 50 61 72 73 65 29 3b 0a 20 20 20 20 41 75 74 6f  Parse);.    Auto
1980: 69 6e 63 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  incInfo *pInfo;.
1990: 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 70 54 6f  .    pInfo = pTo
19a0: 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20  plevel->pAinc;. 
19b0: 20 20 20 77 68 69 6c 65 28 20 70 49 6e 66 6f 20     while( pInfo 
19c0: 26 26 20 70 49 6e 66 6f 2d 3e 70 54 61 62 21 3d  && pInfo->pTab!=
19d0: 70 54 61 62 20 29 7b 20 70 49 6e 66 6f 20 3d 20  pTab ){ pInfo = 
19e0: 70 49 6e 66 6f 2d 3e 70 4e 65 78 74 3b 20 7d 0a  pInfo->pNext; }.
19f0: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30      if( pInfo==0
1a00: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 20   ){.      pInfo 
1a10: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1a20: 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64 62 2c  cRaw(pParse->db,
1a30: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 29   sizeof(*pInfo))
1a40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
1a50: 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  o==0 ) return 0;
1a60: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 70 4e  .      pInfo->pN
1a70: 65 78 74 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  ext = pToplevel-
1a80: 3e 70 41 69 6e 63 3b 0a 20 20 20 20 20 20 70 54  >pAinc;.      pT
1a90: 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 20 3d  oplevel->pAinc =
1aa0: 20 70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 70 49   pInfo;.      pI
1ab0: 6e 66 6f 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  nfo->pTab = pTab
1ac0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ;.      pInfo->i
1ad0: 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20  Db = iDb;.      
1ae0: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d 65 6d 2b  pToplevel->nMem+
1af0: 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +;              
1b00: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1b10: 74 6f 20 68 6f 6c 64 20 6e 61 6d 65 20 6f 66 20  to hold name of 
1b20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70  table */.      p
1b30: 49 6e 66 6f 2d 3e 72 65 67 43 74 72 20 3d 20 2b  Info->regCtr = +
1b40: 2b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d 65 6d  +pToplevel->nMem
1b50: 3b 20 20 2f 2a 20 4d 61 78 20 72 6f 77 69 64 20  ;  /* Max rowid 
1b60: 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20  register */.    
1b70: 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d 65    pToplevel->nMe
1b80: 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  m++;            
1b90: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69        /* Rowid i
1ba0: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
1bb0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6d  e */.    }.    m
1bc0: 65 6d 49 64 20 3d 20 70 49 6e 66 6f 2d 3e 72 65  emId = pInfo->re
1bd0: 67 43 74 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gCtr;.  }.  retu
1be0: 72 6e 20 6d 65 6d 49 64 3b 0a 7d 0a 0a 2f 2a 0a  rn memId;.}../*.
1bf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c00: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
1c10: 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
1c20: 69 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a  ize all of the.*
1c30: 2a 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  * register used 
1c40: 62 79 20 74 68 65 20 61 75 74 6f 69 6e 63 72 65  by the autoincre
1c50: 6d 65 6e 74 20 74 72 61 63 6b 65 72 2e 20 20 0a  ment tracker.  .
1c60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
1c70: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69  utoincrementBegi
1c80: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1c90: 7b 0a 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20  {.  AutoincInfo 
1ca0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
1cb0: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
1cc0: 6f 75 74 20 61 6e 20 41 55 54 4f 49 4e 43 52 45  out an AUTOINCRE
1cd0: 4d 45 4e 54 20 2a 2f 0a 20 20 73 71 6c 69 74 65  MENT */.  sqlite
1ce0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cf0: 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
1d00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d10: 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  */.  Db *pDb;   
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 6e 6c 79  /* Database only
1d40: 20 61 75 74 6f 69 6e 63 20 74 61 62 6c 65 20 2a   autoinc table *
1d50: 2f 0a 20 20 69 6e 74 20 6d 65 6d 49 64 3b 20 20  /.  int memId;  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d70: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
1d80: 6e 67 20 6d 61 78 20 72 6f 77 69 64 20 2a 2f 0a  ng max rowid */.
1d90: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db0: 41 20 56 44 42 45 20 61 64 64 72 65 73 73 20 2a  A VDBE address *
1dc0: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
1dd0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
1de0: 2a 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  * VDBE under con
1df0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
1e00: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e10: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
1e20: 64 75 72 69 6e 67 20 74 72 69 67 67 65 72 2d 67  during trigger-g
1e30: 65 6e 65 72 61 74 69 6f 6e 2e 20 20 49 74 20 69  eneration.  It i
1e40: 73 0a 20 20 2a 2a 20 6f 6e 6c 79 20 63 61 6c 6c  s.  ** only call
1e50: 65 64 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 2d  ed from the top-
1e60: 6c 65 76 65 6c 20 2a 2f 0a 20 20 61 73 73 65 72  level */.  asser
1e70: 74 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67  t( pParse->pTrig
1e80: 67 65 72 54 61 62 3d 3d 30 20 29 3b 0a 20 20 61  gerTab==0 );.  a
1e90: 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 73  ssert( pParse==s
1ea0: 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1eb0: 76 65 6c 28 70 50 61 72 73 65 29 20 29 3b 0a 0a  vel(pParse) );..
1ec0: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 20 20    assert( v );  
1ed0: 20 2f 2a 20 57 65 20 66 61 69 6c 65 64 20 6c 6f   /* We failed lo
1ee0: 6e 67 20 61 67 6f 20 69 66 20 74 68 69 73 20 69  ng ago if this i
1ef0: 73 20 6e 6f 74 20 73 6f 20 2a 2f 0a 20 20 66 6f  s not so */.  fo
1f00: 72 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 41  r(p = pParse->pA
1f10: 69 6e 63 3b 20 70 3b 20 70 20 3d 20 70 2d 3e 70  inc; p; p = p->p
1f20: 4e 65 78 74 29 7b 0a 20 20 20 20 70 44 62 20 3d  Next){.    pDb =
1f30: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
1f40: 5d 3b 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20 70  ];.    memId = p
1f50: 2d 3e 72 65 67 43 74 72 3b 0a 20 20 20 20 73 71  ->regCtr;.    sq
1f60: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
1f70: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44 62  Parse, 0, p->iDb
1f80: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  , pDb->pSchema->
1f90: 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  pSeqTab, OP_Open
1fa0: 52 65 61 64 29 3b 0a 20 20 20 20 61 64 64 72 20  Read);.    addr 
1fb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1fc0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1fe0: 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
1ff0: 2c 20 30 2c 20 6d 65 6d 49 64 2d 31 2c 20 30 2c  , 0, memId-1, 0,
2000: 20 70 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   p->pTab->zName,
2010: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2020: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2030: 5f 52 65 77 69 6e 64 2c 20 30 2c 20 61 64 64 72  _Rewind, 0, addr
2040: 2b 39 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +9);.    sqlite3
2050: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2060: 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 6d  _Column, 0, 0, m
2070: 65 6d 49 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  emId);.    sqlit
2080: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2090: 4f 50 5f 4e 65 2c 20 6d 65 6d 49 64 2d 31 2c 20  OP_Ne, memId-1, 
20a0: 61 64 64 72 2b 37 2c 20 6d 65 6d 49 64 29 3b 0a  addr+7, memId);.
20b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
20c0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
20d0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
20e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
2100: 2c 20 30 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a 20  , 0, memId+1);. 
2110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2120: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
2130: 6e 2c 20 30 2c 20 31 2c 20 6d 65 6d 49 64 29 3b  n, 0, 1, memId);
2140: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2150: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2160: 6f 2c 20 30 2c 20 61 64 64 72 2b 39 29 3b 0a 20  o, 0, addr+9);. 
2170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2180: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
2190: 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20   0, addr+2);.   
21a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
21c0: 2c 20 30 2c 20 6d 65 6d 49 64 29 3b 0a 20 20 20  , 0, memId);.   
21d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21e0: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
21f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
2200: 64 61 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  date the maximum
2210: 20 72 6f 77 69 64 20 66 6f 72 20 61 6e 20 61 75   rowid for an au
2220: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 63 61 6c 63  toincrement calc
2230: 75 6c 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ulation..**.** T
2240: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
2250: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ld be called whe
2260: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
2270: 20 73 74 61 63 6b 20 68 6f 6c 64 73 20 61 0a 2a   stack holds a.*
2280: 2a 20 6e 65 77 20 72 6f 77 69 64 20 74 68 61 74  * new rowid that
2290: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
22a0: 69 6e 73 65 72 74 65 64 2e 20 20 49 66 20 74 68  inserted.  If th
22b0: 61 74 20 6e 65 77 20 72 6f 77 69 64 20 69 73 0a  at new rowid is.
22c0: 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ** larger than t
22d0: 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  he maximum rowid
22e0: 20 69 6e 20 74 68 65 20 6d 65 6d 49 64 20 6d 65   in the memId me
22f0: 6d 6f 72 79 20 63 65 6c 6c 2c 20 74 68 65 6e 20  mory cell, then 
2300: 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65  the.** memory ce
2310: 6c 6c 20 69 73 20 75 70 64 61 74 65 64 2e 20 20  ll is updated.  
2320: 54 68 65 20 73 74 61 63 6b 20 69 73 20 75 6e 63  The stack is unc
2330: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
2340: 63 20 76 6f 69 64 20 61 75 74 6f 49 6e 63 53 74  c void autoIncSt
2350: 65 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ep(Parse *pParse
2360: 2c 20 69 6e 74 20 6d 65 6d 49 64 2c 20 69 6e 74  , int memId, int
2370: 20 72 65 67 52 6f 77 69 64 29 7b 0a 20 20 69 66   regRowid){.  if
2380: 28 20 6d 65 6d 49 64 3e 30 20 29 7b 0a 20 20 20  ( memId>0 ){.   
2390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23a0: 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
23b0: 2c 20 4f 50 5f 4d 65 6d 4d 61 78 2c 20 6d 65 6d  , OP_MemMax, mem
23c0: 49 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  Id, regRowid);. 
23d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
23e0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
23f0: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
2400: 65 64 20 74 6f 20 77 72 69 74 65 20 61 75 74 6f  ed to write auto
2410: 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 6d 61 78  increment.** max
2420: 69 6d 75 6d 20 72 6f 77 69 64 20 76 61 6c 75 65  imum rowid value
2430: 73 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  s back into the 
2440: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
2450: 72 65 67 69 73 74 65 72 2e 0a 2a 2a 20 45 76 65  register..** Eve
2460: 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
2470: 74 20 6d 69 67 68 74 20 64 6f 20 61 6e 20 49 4e  t might do an IN
2480: 53 45 52 54 20 69 6e 74 6f 20 61 6e 20 61 75 74  SERT into an aut
2490: 6f 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 61  oincrement.** ta
24a0: 62 6c 65 20 28 65 69 74 68 65 72 20 64 69 72 65  ble (either dire
24b0: 63 74 6c 79 20 6f 72 20 74 68 72 6f 75 67 68 20  ctly or through 
24c0: 74 72 69 67 67 65 72 73 29 20 6e 65 65 64 73 20  triggers) needs 
24d0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
24e0: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 62 65 66  routine just bef
24f0: 6f 72 65 20 74 68 65 20 22 65 78 69 74 22 20 63  ore the "exit" c
2500: 6f 64 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ode..*/.void sql
2510: 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e  ite3Autoincremen
2520: 74 45 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  tEnd(Parse *pPar
2530: 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63 49 6e  se){.  AutoincIn
2540: 66 6f 20 2a 70 3b 0a 20 20 56 64 62 65 20 2a 76  fo *p;.  Vdbe *v
2550: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2560: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2570: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2580: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
2590: 66 6f 72 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  for(p = pParse->
25a0: 70 41 69 6e 63 3b 20 70 3b 20 70 20 3d 20 70 2d  pAinc; p; p = p-
25b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 44 62 20  >pNext){.    Db 
25c0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
25d0: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 69 6e 74  p->iDb];.    int
25e0: 20 6a 31 2c 20 6a 32 2c 20 6a 33 2c 20 6a 34 2c   j1, j2, j3, j4,
25f0: 20 6a 35 3b 0a 20 20 20 20 69 6e 74 20 69 52 65   j5;.    int iRe
2600: 63 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 49 64  c;.    int memId
2610: 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b 0a 0a 20   = p->regCtr;.. 
2620: 20 20 20 69 52 65 63 20 3d 20 73 71 6c 69 74 65     iRec = sqlite
2630: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2640: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
2650: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
2660: 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44 62  , 0, p->iDb, pDb
2670: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
2680: 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  ab, OP_OpenWrite
2690: 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
26a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
26b0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 6d 65 6d   OP_NotNull, mem
26c0: 49 64 2b 31 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Id+1);.    j2 = 
26d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26e0: 30 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 29 3b  0(v, OP_Rewind);
26f0: 0a 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74 65  .    j3 = sqlite
2700: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2710: 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20  P_Column, 0, 0, 
2720: 69 52 65 63 29 3b 0a 20 20 20 20 6a 34 20 3d 20  iRec);.    j4 = 
2730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2740: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 6d 65 6d 49  3(v, OP_Eq, memI
2750: 64 2d 31 2c 20 30 2c 20 69 52 65 63 29 3b 0a 20  d-1, 0, iRec);. 
2760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2770: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
2780: 20 30 2c 20 6a 33 29 3b 0a 20 20 20 20 73 71 6c   0, j3);.    sql
2790: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
27a0: 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 73 71 6c  (v, j2);.    sql
27b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27c0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
27d0: 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a 20 20 20 20  , memId+1);.    
27e0: 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j5 = sqlite3Vdbe
27f0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
2800: 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  o);.    sqlite3V
2810: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
2820: 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  4);.    sqlite3V
2830: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2840: 52 6f 77 69 64 2c 20 30 2c 20 6d 65 6d 49 64 2b  Rowid, 0, memId+
2850: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
2860: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
2870: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
2880: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
2890: 35 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  5);.    sqlite3V
28a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
28b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6d 65 6d 49  MakeRecord, memI
28c0: 64 2d 31 2c 20 32 2c 20 69 52 65 63 29 3b 0a 20  d-1, 2, iRec);. 
28d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
28f0: 74 2c 20 30 2c 20 69 52 65 63 2c 20 6d 65 6d 49  t, 0, iRec, memI
2900: 64 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d+1);.    sqlite
2910: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2920: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
2930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2940: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
2950: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
2960: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
2970: 50 61 72 73 65 2c 20 69 52 65 63 29 3b 0a 20 20  Parse, iRec);.  
2980: 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20  }.}.#else./*.** 
2990: 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  If SQLITE_OMIT_A
29a0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
29b0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
29c0: 65 20 74 68 72 65 65 20 72 6f 75 74 69 6e 65 73  e three routines
29d0: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 61 6c  .** above are al
29e0: 6c 20 6e 6f 2d 6f 70 73 0a 2a 2f 0a 23 20 64 65  l no-ops.*/.# de
29f0: 66 69 6e 65 20 61 75 74 6f 49 6e 63 42 65 67 69  fine autoIncBegi
2a00: 6e 28 41 2c 42 2c 43 29 20 28 30 29 0a 23 20 64  n(A,B,C) (0).# d
2a10: 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 53 74 65  efine autoIncSte
2a20: 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 20  p(A,B,C).#endif 
2a30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
2a40: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a  UTOINCREMENT */.
2a50: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
2a60: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
2a70: 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d  ic int xferOptim
2a80: 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  ization(.  Parse
2a90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2aa0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
2ab0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
2ac0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Dest,         /*
2ad0: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
2ae0: 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  e inserting into
2af0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
2b00: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41  elect,      /* A
2b10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2b20: 74 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  t to use as the 
2b30: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
2b40: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
2b50: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
2b60: 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69   handle constrai
2b70: 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  nt errors */.  i
2b80: 6e 74 20 69 44 62 44 65 73 74 20 20 20 20 20 20  nt iDbDest      
2b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2ba0: 62 61 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f  base of pDest */
2bb0: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .);../*.** This 
2bc0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 20  routine is call 
2bd0: 74 6f 20 68 61 6e 64 6c 65 20 53 51 4c 20 6f 66  to handle SQL of
2be0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2bf0: 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69  orms:.**.**    i
2c00: 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45  nsert into TABLE
2c10: 20 28 49 44 4c 49 53 54 29 20 76 61 6c 75 65 73   (IDLIST) values
2c20: 28 45 58 50 52 4c 49 53 54 29 0a 2a 2a 20 20 20  (EXPRLIST).**   
2c30: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42   insert into TAB
2c40: 4c 45 20 28 49 44 4c 49 53 54 29 20 73 65 6c 65  LE (IDLIST) sele
2c50: 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44 4c  ct.**.** The IDL
2c60: 49 53 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  IST following th
2c70: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
2c80: 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 2e  always optional.
2c90: 20 20 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a 2a    If omitted,.**
2ca0: 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66 20   then a list of 
2cb0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20  all columns for 
2cc0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 73 75 62  the table is sub
2cd0: 73 74 69 74 75 74 65 64 2e 20 20 54 68 65 20 49  stituted.  The I
2ce0: 44 4c 49 53 54 0a 2a 2a 20 61 70 70 65 61 72 73  DLIST.** appears
2cf0: 20 69 6e 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20   in the pColumn 
2d00: 70 61 72 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c  parameter.  pCol
2d10: 75 6d 6e 20 69 73 20 4e 55 4c 4c 20 69 66 20 49  umn is NULL if I
2d20: 44 4c 49 53 54 20 69 73 20 6f 6d 69 74 74 65 64  DLIST is omitted
2d30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73  ..**.** The pLis
2d40: 74 20 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64  t parameter hold
2d50: 73 20 45 58 50 52 4c 49 53 54 20 69 6e 20 74 68  s EXPRLIST in th
2d60: 65 20 66 69 72 73 74 20 66 6f 72 6d 20 6f 66 20  e first form of 
2d70: 74 68 65 20 49 4e 53 45 52 54 0a 2a 2a 20 73 74  the INSERT.** st
2d80: 61 74 65 6d 65 6e 74 20 61 62 6f 76 65 2c 20 61  atement above, a
2d90: 6e 64 20 70 53 65 6c 65 63 74 20 69 73 20 4e 55  nd pSelect is NU
2da0: 4c 4c 2e 20 20 46 6f 72 20 74 68 65 20 73 65 63  LL.  For the sec
2db0: 6f 6e 64 20 66 6f 72 6d 2c 20 70 4c 69 73 74 20  ond form, pList 
2dc0: 69 73 0a 2a 2a 20 4e 55 4c 4c 20 61 6e 64 20 70  is.** NULL and p
2dd0: 53 65 6c 65 63 74 20 69 73 20 61 20 70 6f 69 6e  Select is a poin
2de0: 74 65 72 20 74 6f 20 74 68 65 20 73 65 6c 65 63  ter to the selec
2df0: 74 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  t statement used
2e00: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
2e10: 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 73  data for the ins
2e20: 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ert..**.** The c
2e30: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
2e40: 6c 6c 6f 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75  llows one of fou
2e50: 72 20 74 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f  r templates.  Fo
2e60: 72 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73 65  r a simple.** se
2e70: 6c 65 63 74 20 77 69 74 68 20 64 61 74 61 20 63  lect with data c
2e80: 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 56 41 4c  oming from a VAL
2e90: 55 45 53 20 63 6c 61 75 73 65 2c 20 74 68 65 20  UES clause, the 
2ea0: 63 6f 64 65 20 65 78 65 63 75 74 65 73 0a 2a 2a  code executes.**
2eb0: 20 6f 6e 63 65 20 73 74 72 61 69 67 68 74 20 64   once straight d
2ec0: 6f 77 6e 20 74 68 72 6f 75 67 68 2e 20 20 50 73  own through.  Ps
2ed0: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 6c 6c 6f 77  eudo-code follow
2ee0: 73 20 28 77 65 20 63 61 6c 6c 20 74 68 69 73 0a  s (we call this.
2ef0: 2a 2a 20 74 68 65 20 22 31 73 74 20 74 65 6d 70  ** the "1st temp
2f00: 6c 61 74 65 22 29 3a 0a 2a 2a 0a 2a 2a 20 20 20  late"):.**.**   
2f10: 20 20 20 20 20 20 6f 70 65 6e 20 77 72 69 74 65        open write
2f20: 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c   cursor to <tabl
2f30: 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63  e> and its indic
2f40: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 75  es.**         pu
2f50: 74 73 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ts VALUES clause
2f60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 6e 74   expressions ont
2f70: 6f 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 20  o the stack.**  
2f80: 20 20 20 20 20 20 20 77 72 69 74 65 20 74 68 65         write the
2f90: 20 72 65 73 75 6c 74 69 6e 67 20 72 65 63 6f 72   resulting recor
2fa0: 64 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a  d into <table>.*
2fb0: 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75  *         cleanu
2fc0: 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  p.**.** The thre
2fd0: 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 6d 70  e remaining temp
2fe0: 6c 61 74 65 73 20 61 73 73 75 6d 65 20 74 68 65  lates assume the
2ff0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
3000: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
3010: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74    INSERT INTO <t
3020: 61 62 6c 65 3e 20 53 45 4c 45 43 54 20 2e 2e 2e  able> SELECT ...
3030: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  .**.** If the SE
3040: 4c 45 43 54 20 63 6c 61 75 73 65 20 69 73 20 6f  LECT clause is o
3050: 66 20 74 68 65 20 72 65 73 74 72 69 63 74 65 64  f the restricted
3060: 20 66 6f 72 6d 20 22 53 45 4c 45 43 54 20 2a 20   form "SELECT * 
3070: 46 52 4f 4d 20 3c 74 61 62 6c 65 32 3e 22 20 2d  FROM <table2>" -
3080: 0a 2a 2a 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  .** in other wor
3090: 64 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ds if the SELECT
30a0: 20 70 75 6c 6c 73 20 61 6c 6c 20 63 6f 6c 75 6d   pulls all colum
30b0: 6e 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ns from a single
30c0: 20 74 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 74 68   table.** and th
30d0: 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20  ere is no WHERE 
30e0: 6f 72 20 4c 49 4d 49 54 20 6f 72 20 47 52 4f 55  or LIMIT or GROU
30f0: 50 20 42 59 20 6f 72 20 4f 52 44 45 52 20 42 59  P BY or ORDER BY
3100: 20 63 6c 61 75 73 65 73 2c 20 61 6e 64 0a 2a 2a   clauses, and.**
3110: 20 69 66 20 3c 74 61 62 6c 65 32 3e 20 61 6e 64   if <table2> and
3120: 20 3c 74 61 62 6c 65 31 3e 20 61 72 65 20 64 69   <table1> are di
3130: 73 74 69 6e 63 74 20 74 61 62 6c 65 73 20 62 75  stinct tables bu
3140: 74 20 68 61 76 65 20 69 64 65 6e 74 69 63 61 6c  t have identical
3150: 0a 2a 2a 20 73 63 68 65 6d 61 73 2c 20 69 6e 63  .** schemas, inc
3160: 6c 75 64 69 6e 67 20 61 6c 6c 20 74 68 65 20 73  luding all the s
3170: 61 6d 65 20 69 6e 64 69 63 65 73 2c 20 74 68 65  ame indices, the
3180: 6e 20 61 20 73 70 65 63 69 61 6c 20 6f 70 74 69  n a special opti
3190: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 69  mization.** is i
31a0: 6e 76 6f 6b 65 64 20 74 68 61 74 20 63 6f 70 69  nvoked that copi
31b0: 65 73 20 72 61 77 20 72 65 63 6f 72 64 73 20 66  es raw records f
31c0: 72 6f 6d 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65  rom <table2> ove
31d0: 72 20 74 6f 20 3c 74 61 62 6c 65 31 3e 2e 0a 2a  r to <table1>..*
31e0: 2a 20 53 65 65 20 74 68 65 20 78 66 65 72 4f 70  * See the xferOp
31f0: 74 69 6d 69 7a 61 74 69 6f 6e 28 29 20 66 75 6e  timization() fun
3200: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6d  ction for the im
3210: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
3220: 74 68 69 73 0a 2a 2a 20 74 65 6d 70 6c 61 74 65  this.** template
3230: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 32  .  This is the 2
3240: 6e 64 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  nd template..**.
3250: 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20  **         open 
3260: 61 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 74  a write cursor t
3270: 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20  o <table>.**    
3280: 20 20 20 20 20 6f 70 65 6e 20 72 65 61 64 20 63       open read c
3290: 75 72 73 6f 72 20 6f 6e 20 3c 74 61 62 6c 65 32  ursor on <table2
32a0: 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 72 61  >.**         tra
32b0: 6e 73 66 65 72 20 61 6c 6c 20 72 65 63 6f 72 64  nsfer all record
32c0: 73 20 69 6e 20 3c 74 61 62 6c 65 32 3e 20 6f 76  s in <table2> ov
32d0: 65 72 20 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a  er to <table>.**
32e0: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 63           close c
32f0: 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20  ursors.**       
3300: 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 20    foreach index 
3310: 6f 6e 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20  on <table>.**   
3320: 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20 77          open a w
3330: 72 69 74 65 20 63 75 72 73 6f 72 20 6f 6e 20 74  rite cursor on t
3340: 68 65 20 3c 74 61 62 6c 65 3e 20 69 6e 64 65 78  he <table> index
3350: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f 70  .**           op
3360: 65 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  en a read cursor
3370: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
3380: 6e 64 69 6e 67 20 3c 74 61 62 6c 65 32 3e 20 69  nding <table2> i
3390: 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 20 20  ndex.**         
33a0: 20 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72    transfer all r
33b0: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
33c0: 72 65 61 64 20 74 6f 20 74 68 65 20 77 72 69 74  read to the writ
33d0: 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20  e cursors.**    
33e0: 20 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75 72         close cur
33f0: 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  sors.**         
3400: 65 6e 64 20 66 6f 72 65 61 63 68 0a 2a 2a 0a 2a  end foreach.**.*
3410: 2a 20 54 68 65 20 33 72 64 20 74 65 6d 70 6c 61  * The 3rd templa
3420: 74 65 20 69 73 20 66 6f 72 20 77 68 65 6e 20 74  te is for when t
3430: 68 65 20 73 65 63 6f 6e 64 20 74 65 6d 70 6c 61  he second templa
3440: 74 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c  te does not appl
3450: 79 0a 2a 2a 20 61 6e 64 20 74 68 65 20 53 45 4c  y.** and the SEL
3460: 45 43 54 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ECT clause does 
3470: 6e 6f 74 20 72 65 61 64 20 66 72 6f 6d 20 3c 74  not read from <t
3480: 61 62 6c 65 3e 20 61 74 20 61 6e 79 20 74 69 6d  able> at any tim
3490: 65 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61  e..** The genera
34a0: 74 65 64 20 63 6f 64 65 20 66 6f 6c 6c 6f 77 73  ted code follows
34b0: 20 74 68 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a   this template:.
34c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 45 4f  **.**         EO
34d0: 46 20 3c 2d 20 30 0a 2a 2a 20 20 20 20 20 20 20  F <- 0.**       
34e0: 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20 20    X <- A.**     
34f0: 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20 20      goto B.**   
3500: 20 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72 20     A: setup for 
3510: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  the SELECT.**   
3520: 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72 20        loop over 
3530: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20  the rows in the 
3540: 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
3550: 20 20 20 20 6c 6f 61 64 20 76 61 6c 75 65 73 20      load values 
3560: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20 52  into registers R
3570: 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ..R+n.**        
3580: 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20     yield X.**   
3590: 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a        end loop.*
35a0: 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75  *         cleanu
35b0: 70 20 61 66 74 65 72 20 74 68 65 20 53 45 4c 45  p after the SELE
35c0: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 45 4f  CT.**         EO
35d0: 46 20 3c 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20  F <- 1.**       
35e0: 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20    yield X.**    
35f0: 20 20 20 20 20 67 6f 74 6f 20 41 0a 2a 2a 20 20       goto A.**  
3600: 20 20 20 20 42 3a 20 6f 70 65 6e 20 77 72 69 74      B: open writ
3610: 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62  e cursor to <tab
3620: 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69  le> and its indi
3630: 63 65 73 0a 2a 2a 20 20 20 20 20 20 43 3a 20 79  ces.**      C: y
3640: 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20 20 20 20  ield X.**       
3650: 20 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 44 0a    if EOF goto D.
3660: 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65 72  **         inser
3670: 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65 73  t the select res
3680: 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e  ult into <table>
3690: 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 2a 2a 20   from R..R+n.** 
36a0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43 0a 2a          goto C.*
36b0: 2a 20 20 20 20 20 20 44 3a 20 63 6c 65 61 6e 75  *      D: cleanu
36c0: 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 34 74 68 20  p.**.** The 4th 
36d0: 74 65 6d 70 6c 61 74 65 20 69 73 20 75 73 65 64  template is used
36e0: 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 73   if the insert s
36f0: 74 61 74 65 6d 65 6e 74 20 74 61 6b 65 73 20 69  tatement takes i
3700: 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72 6f  ts.** values fro
3710: 6d 20 61 20 53 45 4c 45 43 54 20 62 75 74 20 74  m a SELECT but t
3720: 68 65 20 64 61 74 61 20 69 73 20 62 65 69 6e 67  he data is being
3730: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
3740: 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20 69   table.** that i
3750: 73 20 61 6c 73 6f 20 72 65 61 64 20 61 73 20 70  s also read as p
3760: 61 72 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  art of the SELEC
3770: 54 2e 20 20 49 6e 20 74 68 65 20 74 68 69 72 64  T.  In the third
3780: 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61 76   form,.** we hav
3790: 65 20 74 6f 20 75 73 65 20 61 20 69 6e 74 65 72  e to use a inter
37a0: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20 74 6f  mediate table to
37b0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
37c0: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 6c  ts of.** the sel
37d0: 65 63 74 2e 20 20 54 68 65 20 74 65 6d 70 6c 61  ect.  The templa
37e0: 74 65 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  te is like this:
37f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 45  .**.**         E
3800: 4f 46 20 3c 2d 20 30 0a 2a 2a 20 20 20 20 20 20  OF <- 0.**      
3810: 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20     X <- A.**    
3820: 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20       goto B.**  
3830: 20 20 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72      A: setup for
3840: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3850: 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72         loop over
3860: 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
3870: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
3880: 20 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75         load valu
3890: 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
38a0: 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20  R..R+n.**       
38b0: 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20      yield X.**  
38c0: 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a         end loop.
38d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e  **         clean
38e0: 75 70 20 61 66 74 65 72 20 74 68 65 20 53 45 4c  up after the SEL
38f0: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 45  ECT.**         E
3900: 4f 46 20 3c 2d 20 31 0a 2a 2a 20 20 20 20 20 20  OF <- 1.**      
3910: 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20     yield X.**   
3920: 20 20 20 20 20 20 68 61 6c 74 2d 65 72 72 6f 72        halt-error
3930: 0a 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e  .**      B: open
3940: 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20   temp table.**  
3950: 20 20 20 20 4c 3a 20 79 69 65 6c 64 20 58 0a 2a      L: yield X.*
3960: 2a 20 20 20 20 20 20 20 20 20 69 66 20 45 4f 46  *         if EOF
3970: 20 67 6f 74 6f 20 4d 0a 2a 2a 20 20 20 20 20 20   goto M.**      
3980: 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20 66 72     insert row fr
3990: 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74  om R..R+n into t
39a0: 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  emp table.**    
39b0: 20 20 20 20 20 67 6f 74 6f 20 4c 0a 2a 2a 20 20       goto L.**  
39c0: 20 20 20 20 4d 3a 20 6f 70 65 6e 20 77 72 69 74      M: open writ
39d0: 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62  e cursor to <tab
39e0: 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69  le> and its indi
39f0: 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  ces.**         r
3a00: 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62 6c 65  ewind temp table
3a10: 0a 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70  .**      C: loop
3a20: 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69 6e   over rows of in
3a30: 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65  termediate table
3a40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 72  .**           tr
3a50: 61 6e 73 66 65 72 20 76 61 6c 75 65 73 20 66 6f  ansfer values fo
3a60: 72 6d 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  rm intermediate 
3a70: 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74 61 62 6c  table into <tabl
3a80: 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e  e>.**         en
3a90: 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 44  d loop.**      D
3aa0: 3a 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f 69  : cleanup.*/.voi
3ab0: 64 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28  d sqlite3Insert(
3ac0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3ad0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
3ae0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3af0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
3b00: 74 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  t,    /* Name of
3b10: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
3b20: 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  h we are inserti
3b30: 6e 67 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ng */.  ExprList
3b40: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a   *pList,      /*
3b50: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
3b60: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a  to be inserted *
3b70: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
3b80: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53  ect,      /* A S
3b90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3ba0: 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64 61  to use as the da
3bb0: 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 49  ta source */.  I
3bc0: 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20  dList *pColumn, 
3bd0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
3be0: 61 6d 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ames correspondi
3bf0: 6e 67 20 74 6f 20 49 44 4c 49 53 54 2e 20 2a 2f  ng to IDLIST. */
3c00: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20  .  int onError  
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
3c20: 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72  to handle constr
3c30: 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 29  aint errors */.)
3c40: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
3c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3c60: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
3c70: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 61  tructure */.  Ta
3c80: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
3c90: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
3ca0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 2e   to insert into.
3cb0: 20 20 61 6b 61 20 54 41 42 4c 45 20 2a 2f 0a 20    aka TABLE */. 
3cc0: 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20 20   char *zTab;    
3cd0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3ce0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  f the table into
3cf0: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e   which we are in
3d00: 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  serting */.  con
3d10: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
3d20: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3d30: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
3d40: 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
3d50: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 69 64 78  .  int i, j, idx
3d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  ;        /* Loop
3d70: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 56   counters */.  V
3d80: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
3d90: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3da0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3db0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
3dc0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
3dd0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
3de0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 69  r looping over i
3df0: 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
3e00: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ble */.  int nCo
3e10: 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
3e20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
3e30: 6d 6e 73 20 69 6e 20 74 68 65 20 64 61 74 61 20  mns in the data 
3e40: 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 64 64 65 6e  */.  int nHidden
3e50: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75   = 0;      /* Nu
3e60: 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20 63  mber of hidden c
3e70: 6f 6c 75 6d 6e 73 20 69 66 20 54 41 42 4c 45 20  olumns if TABLE 
3e80: 69 73 20 76 69 72 74 75 61 6c 20 2a 2f 0a 20 20  is virtual */.  
3e90: 69 6e 74 20 62 61 73 65 43 75 72 20 3d 20 30 3b  int baseCur = 0;
3ea0: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 43 75        /* VDBE Cu
3eb0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
3ec0: 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6b 65  pTab */.  int ke
3ed0: 79 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  yColumn = -1;   
3ee0: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20 69  /* Column that i
3ef0: 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  s the INTEGER PR
3f00: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69  IMARY KEY */.  i
3f10: 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20  nt endOfLoop;   
3f20: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
3f30: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
3f40: 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20   insertion loop 
3f50: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 54 65 6d 70  */.  int useTemp
3f60: 54 61 62 6c 65 20 3d 20 30 3b 20 2f 2a 20 53 74  Table = 0; /* St
3f70: 6f 72 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ore SELECT resul
3f80: 74 73 20 69 6e 20 69 6e 74 65 72 6d 65 64 69 61  ts in intermedia
3f90: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  te table */.  in
3fa0: 74 20 73 72 63 54 61 62 20 3d 20 30 3b 20 20 20  t srcTab = 0;   
3fb0: 20 20 20 20 2f 2a 20 44 61 74 61 20 63 6f 6d 65      /* Data come
3fc0: 73 20 66 72 6f 6d 20 74 68 69 73 20 74 65 6d 70  s from this temp
3fd0: 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 66 20  orary cursor if 
3fe0: 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  >=0 */.  int add
3ff0: 72 49 6e 73 54 6f 70 20 3d 20 30 3b 20 20 20 2f  rInsTop = 0;   /
4000: 2a 20 4a 75 6d 70 20 74 6f 20 6c 61 62 65 6c 20  * Jump to label 
4010: 22 44 22 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  "D" */.  int add
4020: 72 43 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f  rCont = 0;     /
4030: 2a 20 54 6f 70 20 6f 66 20 69 6e 73 65 72 74 20  * Top of insert 
4040: 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 22 43 22 20  loop. Label "C" 
4050: 69 6e 20 74 65 6d 70 6c 61 74 65 73 20 33 20 61  in templates 3 a
4060: 6e 64 20 34 20 2a 2f 0a 20 20 69 6e 74 20 61 64  nd 4 */.  int ad
4070: 64 72 53 65 6c 65 63 74 20 3d 20 30 3b 20 20 20  drSelect = 0;   
4080: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 63 6f  /* Address of co
4090: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 69 6d 70  routine that imp
40a0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 53 45 4c 45  lements the SELE
40b0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
40c0: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
40d0: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
40e0: 20 53 45 4c 45 43 54 20 6f 6e 20 72 68 73 20 6f   SELECT on rhs o
40f0: 66 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69 6e  f INSERT */.  in
4100: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
4110: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
4120: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
4130: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 44 62 20 2a   TABLE */.  Db *
4140: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
4150: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
4160: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
4170: 6c 65 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  le being inserte
4180: 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  d into */.  int 
4190: 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 30 3b 20  appendFlag = 0; 
41a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
41b0: 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c   insert is likel
41c0: 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e  y to be an appen
41d0: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69 73  d */..  /* Regis
41e0: 74 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ter allocations 
41f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 6f 6d  */.  int regFrom
4200: 53 65 6c 65 63 74 20 3d 20 30 3b 2f 2a 20 42 61  Select = 0;/* Ba
4210: 73 65 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  se register for 
4220: 64 61 74 61 20 63 6f 6d 69 6e 67 20 66 72 6f 6d  data coming from
4230: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74   SELECT */.  int
4240: 20 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 30 3b   regAutoinc = 0;
4250: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
4260: 6f 6c 64 69 6e 67 20 74 68 65 20 41 55 54 4f 49  olding the AUTOI
4270: 4e 43 52 45 4d 45 4e 54 20 63 6f 75 6e 74 65 72  NCREMENT counter
4280: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77   */.  int regRow
4290: 43 6f 75 6e 74 20 3d 20 30 3b 20 20 2f 2a 20 4d  Count = 0;  /* M
42a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64 20  emory cell used 
42b0: 66 6f 72 20 74 68 65 20 72 6f 77 20 63 6f 75 6e  for the row coun
42c0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
42d0: 49 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ins;           /
42e0: 2a 20 42 6c 6f 63 6b 20 6f 66 20 72 65 67 73 20  * Block of regs 
42f0: 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 2b 64 61  holding rowid+da
4300: 74 61 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  ta being inserte
4310: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  d */.  int regRo
4320: 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  wid;         /* 
4330: 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e  registers holdin
4340: 67 20 69 6e 73 65 72 74 20 72 6f 77 69 64 20 2a  g insert rowid *
4350: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 3b  /.  int regData;
4360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 67            /* reg
4370: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 66 69  ister holding fi
4380: 72 73 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 69 6e  rst column to in
4390: 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sert */.  int re
43a0: 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
43b0: 2f 2a 20 48 6f 6c 64 73 20 74 68 65 20 61 73 73  /* Holds the ass
43c0: 65 6d 62 6c 69 65 64 20 72 6f 77 20 72 65 63 6f  emblied row reco
43d0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  rd */.  int regE
43e0: 6f 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  of = 0;       /*
43f0: 20 52 65 67 69 73 74 65 72 20 72 65 63 6f 72 64   Register record
4400: 69 6e 67 20 65 6e 64 20 6f 66 20 53 45 4c 45 43  ing end of SELEC
4410: 54 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  T data */.  int 
4420: 2a 61 52 65 67 49 64 78 20 3d 20 30 3b 20 20 20  *aRegIdx = 0;   
4430: 20 20 2f 2a 20 4f 6e 65 20 72 65 67 69 73 74 65    /* One registe
4440: 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 65  r allocated to e
4450: 61 63 68 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69  ach index */..#i
4460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4470: 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20  T_TRIGGER.  int 
4480: 69 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20  isView;         
4490: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
44a0: 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  if attempting to
44b0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 76   insert into a v
44c0: 69 65 77 20 2a 2f 0a 20 20 54 72 69 67 67 65 72  iew */.  Trigger
44d0: 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20 20   *pTrigger;     
44e0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
44f0: 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61 62  triggers on pTab
4500: 2c 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  , if required */
4510: 0a 20 20 69 6e 74 20 74 6d 61 73 6b 3b 20 20 20  .  int tmask;   
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4530: 2a 20 4d 61 73 6b 20 6f 66 20 74 72 69 67 67 65  * Mask of trigge
4540: 72 20 74 69 6d 65 73 20 2a 2f 0a 23 65 6e 64 69  r times */.#endi
4550: 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
4560: 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ->db;.  memset(&
4570: 64 65 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  dest, 0, sizeof(
4580: 64 65 73 74 29 29 3b 0a 20 20 69 66 28 20 70 50  dest));.  if( pP
4590: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
45a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
45b0: 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  {.    goto inser
45c0: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  t_cleanup;.  }..
45d0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
45e0: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
45f0: 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
4600: 72 74 69 6e 67 20 6e 65 77 20 69 6e 66 6f 72 6d  rting new inform
4610: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  ation..  */.  as
4620: 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e  sert( pTabList->
4630: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 7a 54 61  nSrc==1 );.  zTa
4640: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
4650: 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  0].zName;.  if( 
4660: 4e 45 56 45 52 28 7a 54 61 62 3d 3d 30 29 20 29  NEVER(zTab==0) )
4670: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
4680: 61 6e 75 70 3b 0a 20 20 70 54 61 62 20 3d 20 73  anup;.  pTab = s
4690: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
46a0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
46b0: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61  List);.  if( pTa
46c0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  b==0 ){.    goto
46d0: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
46e0: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
46f0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
4700: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
4710: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
4720: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
4730: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
4740: 69 44 62 5d 3b 0a 20 20 7a 44 62 20 3d 20 70 44  iDb];.  zDb = pD
4750: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  b->zName;.  if( 
4760: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
4770: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
4780: 49 4e 53 45 52 54 2c 20 70 54 61 62 2d 3e 7a 4e  INSERT, pTab->zN
4790: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
47a0: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
47b0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
47c0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
47d0: 20 77 65 20 68 61 76 65 20 61 6e 79 20 74 72 69   we have any tri
47e0: 67 67 65 72 73 20 61 6e 64 20 69 66 20 74 68 65  ggers and if the
47f0: 20 74 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a   table being.  *
4800: 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
4810: 69 73 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a 23  is a view.  */.#
4820: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4830: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 70 54 72  IT_TRIGGER.  pTr
4840: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
4850: 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61  riggersExist(pPa
4860: 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 49 4e  rse, pTab, TK_IN
4870: 53 45 52 54 2c 20 30 2c 20 26 74 6d 61 73 6b 29  SERT, 0, &tmask)
4880: 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54 61  ;.  isView = pTa
4890: 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 23  b->pSelect!=0;.#
48a0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 54  else.# define pT
48b0: 72 69 67 67 65 72 20 30 0a 23 20 64 65 66 69 6e  rigger 0.# defin
48c0: 65 20 74 6d 61 73 6b 20 30 0a 23 20 64 65 66 69  e tmask 0.# defi
48d0: 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65 6e 64  ne isView 0.#end
48e0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
48f0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 75 6e 64  _OMIT_VIEW.# und
4900: 65 66 20 69 73 56 69 65 77 0a 23 20 64 65 66 69  ef isView.# defi
4910: 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65 6e 64  ne isView 0.#end
4920: 69 66 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  if.  assert( (pT
4930: 72 69 67 67 65 72 20 26 26 20 74 6d 61 73 6b 29  rigger && tmask)
4940: 20 7c 7c 20 28 70 54 72 69 67 67 65 72 3d 3d 30   || (pTrigger==0
4950: 20 26 26 20 74 6d 61 73 6b 3d 3d 30 29 20 29 3b   && tmask==0) );
4960: 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
4970: 73 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 2c  s really a view,
4980: 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 68 61   make sure it ha
4990: 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
49a0: 65 64 2e 0a 20 20 2a 2a 20 56 69 65 77 47 65 74  ed..  ** ViewGet
49b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 69 73  ColumnNames() is
49c0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 70 54 61 62   a no-op if pTab
49d0: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 28   is not a view (
49e0: 6f 72 20 76 69 72 74 75 61 6c 20 0a 20 20 2a 2a  or virtual .  **
49f0: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 29 2e 0a   module table)..
4a00: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
4a10: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
4a20: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
4a30: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  b) ){.    goto i
4a40: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
4a50: 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20   }..  /* Ensure 
4a60: 74 68 61 74 3a 0a 20 20 2a 20 20 28 61 29 20 74  that:.  *  (a) t
4a70: 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
4a80: 72 65 61 64 2d 6f 6e 6c 79 2c 20 0a 20 20 2a 20  read-only, .  * 
4a90: 20 28 62 29 20 74 68 61 74 20 69 66 20 69 74 20   (b) that if it 
4aa0: 69 73 20 61 20 76 69 65 77 20 74 68 65 6e 20 4f  is a view then O
4ab0: 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72  N INSERT trigger
4ac0: 73 20 65 78 69 73 74 0a 20 20 2a 2f 0a 20 20 69  s exist.  */.  i
4ad0: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
4ae0: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
4af0: 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a 20 20 20  b, tmask) ){.   
4b00: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
4b10: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
4b20: 41 6c 6c 6f 63 61 74 65 20 61 20 56 44 42 45 0a  Allocate a VDBE.
4b30: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
4b40: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
4b50: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
4b60: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
4b70: 6e 75 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73  nup;.  if( pPars
4b80: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 20 73  e->nested==0 ) s
4b90: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
4ba0: 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73 71 6c  hanges(v);.  sql
4bb0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
4bc0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
4bd0: 70 53 65 6c 65 63 74 20 7c 7c 20 70 54 72 69 67  pSelect || pTrig
4be0: 67 65 72 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  ger, iDb);..#ifn
4bf0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4c00: 58 46 45 52 5f 4f 50 54 0a 20 20 2f 2a 20 49 66  XFER_OPT.  /* If
4c10: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
4c20: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20  s of the form.  
4c30: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 49 4e  **.  **       IN
4c40: 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62 6c 65  SERT INTO <table
4c50: 31 3e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  1> SELECT * FROM
4c60: 20 3c 74 61 62 6c 65 32 3e 3b 0a 20 20 2a 2a 0a   <table2>;.  **.
4c70: 20 20 2a 2a 20 54 68 65 6e 20 73 70 65 63 69 61    ** Then specia
4c80: 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  l optimizations 
4c90: 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20 74  can be applied t
4ca0: 68 61 74 20 6d 61 6b 65 20 74 68 65 20 74 72 61  hat make the tra
4cb0: 6e 73 66 65 72 0a 20 20 2a 2a 20 76 65 72 79 20  nsfer.  ** very 
4cc0: 66 61 73 74 20 61 6e 64 20 77 68 69 63 68 20 72  fast and which r
4cd0: 65 64 75 63 65 20 66 72 61 67 6d 65 6e 74 61 74  educe fragmentat
4ce0: 69 6f 6e 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a  ion of indices..
4cf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
4d00: 73 20 74 68 65 20 32 6e 64 20 74 65 6d 70 6c 61  s the 2nd templa
4d10: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  te..  */.  if( p
4d20: 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 78 66 65  Column==0 && xfe
4d30: 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50  rOptimization(pP
4d40: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
4d50: 65 63 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 69 44  ect, onError, iD
4d60: 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b) ){.    assert
4d70: 28 20 21 70 54 72 69 67 67 65 72 20 29 3b 0a 20  ( !pTrigger );. 
4d80: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
4d90: 3d 3d 30 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ==0 );.    goto 
4da0: 69 6e 73 65 72 74 5f 65 6e 64 3b 0a 20 20 7d 0a  insert_end;.  }.
4db0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4dc0: 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 20 2a  _OMIT_XFER_OPT *
4dd0: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
4de0: 69 73 20 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d  is an AUTOINCREM
4df0: 45 4e 54 20 74 61 62 6c 65 2c 20 6c 6f 6f 6b 20  ENT table, look 
4e00: 75 70 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  up the sequence 
4e10: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
4e20: 2a 2a 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ** sqlite_sequen
4e30: 63 65 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f  ce table and sto
4e40: 72 65 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 20  re it in memory 
4e50: 63 65 6c 6c 20 72 65 67 41 75 74 6f 69 6e 63 2e  cell regAutoinc.
4e60: 0a 20 20 2a 2f 0a 20 20 72 65 67 41 75 74 6f 69  .  */.  regAutoi
4e70: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42 65 67 69  nc = autoIncBegi
4e80: 6e 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  n(pParse, iDb, p
4e90: 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Tab);..  /* Figu
4ea0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
4eb0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
4ec0: 61 72 65 20 73 75 70 70 6c 69 65 64 2e 20 20 49  are supplied.  I
4ed0: 66 20 74 68 65 20 64 61 74 61 0a 20 20 2a 2a 20  f the data.  ** 
4ee0: 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61  is coming from a
4ef0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4f00: 74 2c 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  t, then generate
4f10: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
4f20: 61 74 0a 20 20 2a 2a 20 70 72 6f 64 75 63 65 73  at.  ** produces
4f30: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
4f40: 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 65   the SELECT on e
4f50: 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ach invocation. 
4f60: 20 54 68 65 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75   The.  ** co-rou
4f70: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 6d 6d  tine is the comm
4f80: 6f 6e 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  on header to the
4f90: 20 33 72 64 20 61 6e 64 20 34 74 68 20 74 65 6d   3rd and 4th tem
4fa0: 70 6c 61 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  plates..  */.  i
4fb0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
4fc0: 20 20 2f 2a 20 44 61 74 61 20 69 73 20 63 6f 6d    /* Data is com
4fd0: 69 6e 67 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ing from a SELEC
4fe0: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
4ff0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
5000: 68 61 74 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  hat SELECT.    *
5010: 2a 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  * as a co-routin
5020: 65 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  e.  The code is 
5030: 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 74  common to both t
5040: 68 65 20 33 72 64 20 61 6e 64 20 34 74 68 0a 20  he 3rd and 4th. 
5050: 20 20 20 2a 2a 20 74 65 6d 70 6c 61 74 65 73 3a     ** templates:
5060: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
5070: 20 20 20 20 20 20 20 45 4f 46 20 3c 2d 20 30 0a         EOF <- 0.
5080: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 58      **         X
5090: 20 3c 2d 20 41 0a 20 20 20 20 2a 2a 20 20 20 20   <- A.    **    
50a0: 20 20 20 20 20 67 6f 74 6f 20 42 0a 20 20 20 20       goto B.    
50b0: 2a 2a 20 20 20 20 20 20 41 3a 20 73 65 74 75 70  **      A: setup
50c0: 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 0a   for the SELECT.
50d0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
50e0: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
50f0: 6c 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  les in the SELEC
5100: 54 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  T.    **        
5110: 20 20 20 6c 6f 61 64 20 76 61 6c 75 65 20 69 6e     load value in
5120: 74 6f 20 72 65 67 69 73 74 65 72 20 52 2e 2e 52  to register R..R
5130: 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  +n.    **       
5140: 20 20 20 20 79 69 65 6c 64 20 58 0a 20 20 20 20      yield X.    
5150: 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c  **         end l
5160: 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  oop.    **      
5170: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
5180: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
5190: 2a 2a 20 20 20 20 20 20 20 20 20 45 4f 46 20 3c  **         EOF <
51a0: 2d 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  - 1.    **      
51b0: 20 20 20 79 69 65 6c 64 20 58 0a 20 20 20 20 2a     yield X.    *
51c0: 2a 20 20 20 20 20 20 20 20 20 68 61 6c 74 2d 65  *         halt-e
51d0: 72 72 6f 72 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rror.    **.    
51e0: 2a 2a 20 4f 6e 20 65 61 63 68 20 69 6e 76 6f 63  ** On each invoc
51f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 2d  ation of the co-
5200: 72 6f 75 74 69 6e 65 2c 20 69 74 20 70 75 74 73  routine, it puts
5210: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
5220: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
5230: 43 54 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72  CT result into r
5240: 65 67 69 73 74 65 72 73 20 64 65 73 74 2e 69 4d  egisters dest.iM
5250: 65 6d 2e 2e 2e 64 65 73 74 2e 69 4d 65 6d 2b 64  em...dest.iMem+d
5260: 65 73 74 2e 6e 4d 65 6d 2d 31 2e 0a 20 20 20 20  est.nMem-1..    
5270: 2a 2a 20 28 54 68 65 73 65 20 6f 75 74 70 75 74  ** (These output
5280: 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 61   registers are a
5290: 6c 6c 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69  llocated by sqli
52a0: 74 65 33 53 65 6c 65 63 74 28 29 2e 29 20 20 57  te3Select().)  W
52b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  hen.    ** the S
52c0: 45 4c 45 43 54 20 63 6f 6d 70 6c 65 74 65 73 2c  ELECT completes,
52d0: 20 69 74 20 73 65 74 73 20 74 68 65 20 45 4f 46   it sets the EOF
52e0: 20 66 6c 61 67 20 73 74 6f 72 65 64 20 69 6e 20   flag stored in 
52f0: 72 65 67 45 6f 66 2e 0a 20 20 20 20 2a 2f 0a 20  regEof..    */. 
5300: 20 20 20 69 6e 74 20 72 63 2c 20 6a 31 3b 0a 0a     int rc, j1;..
5310: 20 20 20 20 72 65 67 45 6f 66 20 3d 20 2b 2b 70      regEof = ++p
5320: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5330: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5340: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
5350: 2c 20 30 2c 20 72 65 67 45 6f 66 29 3b 20 20 20  , 0, regEof);   
5360: 20 20 20 2f 2a 20 45 4f 46 20 3c 2d 20 30 20 2a     /* EOF <- 0 *
5370: 2f 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  /.    VdbeCommen
5380: 74 28 28 76 2c 20 22 53 45 4c 45 43 54 20 65 6f  t((v, "SELECT eo
5390: 66 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 73  f flag"));.    s
53a0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
53b0: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
53c0: 43 6f 72 6f 75 74 69 6e 65 2c 20 2b 2b 70 50 61  Coroutine, ++pPa
53d0: 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
53e0: 61 64 64 72 53 65 6c 65 63 74 20 3d 20 73 71 6c  addrSelect = sql
53f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5400: 64 64 72 28 76 29 2b 32 3b 0a 20 20 20 20 73 71  ddr(v)+2;.    sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5420: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 61  v, OP_Integer, a
5430: 64 64 72 53 65 6c 65 63 74 2d 31 2c 20 64 65 73  ddrSelect-1, des
5440: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 6a 31  t.iParm);.    j1
5450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5460: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
5470: 20 30 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65   0, 0);.    Vdbe
5480: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
5490: 70 20 6f 76 65 72 20 53 45 4c 45 43 54 20 63 6f  p over SELECT co
54a0: 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20 20  routine"));..   
54b0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
54c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
54d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
54e0: 65 6e 74 20 61 6e 64 20 65 78 65 63 75 74 65 20  ent and execute 
54f0: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  it. */.    rc = 
5500: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
5510: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
5520: 64 65 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72  dest);.    asser
5530: 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
5540: 3d 30 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20  =0 || rc );.    
5550: 69 66 28 20 72 63 20 7c 7c 20 4e 45 56 45 52 28  if( rc || NEVER(
5560: 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20 7c 7c  pParse->nErr) ||
5570: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5580: 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  d ){.      goto 
5590: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
55a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
55b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
55c0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
55d0: 67 45 6f 66 29 3b 20 20 20 20 20 20 20 20 20 2f  gEof);         /
55e0: 2a 20 45 4f 46 20 3c 2d 20 31 20 2a 2f 0a 20 20  * EOF <- 1 */.  
55f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5600: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
5610: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 20 20 20   dest.iParm);   
5620: 2f 2a 20 79 69 65 6c 64 20 58 20 2a 2f 0a 20 20  /* yield X */.  
5630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5640: 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op2(v, OP_Halt, 
5650: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 2c  SQLITE_INTERNAL,
5660: 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20   OE_Abort);.    
5670: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
5680: 22 45 6e 64 20 6f 66 20 53 45 4c 45 43 54 20 63  "End of SELECT c
5690: 6f 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  oroutine"));.   
56a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
56b0: 48 65 72 65 28 76 2c 20 6a 31 29 3b 20 20 20 20  Here(v, j1);    
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 20 20 20 20 20 20 2f 2a 20 6c 61 62 65 6c 20 42        /* label B
56e0: 3a 20 2a 2f 0a 0a 20 20 20 20 72 65 67 46 72 6f  : */..    regFro
56f0: 6d 53 65 6c 65 63 74 20 3d 20 64 65 73 74 2e 69  mSelect = dest.i
5700: 4d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Mem;.    assert(
5710: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
5720: 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20   );.    nColumn 
5730: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
5740: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
5750: 73 65 72 74 28 20 64 65 73 74 2e 6e 4d 65 6d 3d  sert( dest.nMem=
5760: 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20 20 20  =nColumn );..   
5770: 20 2f 2a 20 53 65 74 20 75 73 65 54 65 6d 70 54   /* Set useTempT
5780: 61 62 6c 65 20 74 6f 20 54 52 55 45 20 69 66 20  able to TRUE if 
5790: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
57a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
57b0: 6e 74 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  nt.    ** should
57c0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
57d0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
57e0: 6c 65 20 28 74 65 6d 70 6c 61 74 65 20 34 29 2e  le (template 4).
57f0: 20 20 53 65 74 20 74 6f 0a 20 20 20 20 2a 2a 20    Set to.    ** 
5800: 46 41 4c 53 45 20 69 66 20 65 61 63 68 2a 20 72  FALSE if each* r
5810: 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ow of the SELECT
5820: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
5830: 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 0a 20 20  directly into.  
5840: 20 20 2a 2a 20 74 68 65 20 64 65 73 74 69 6e 61    ** the destina
5850: 74 69 6f 6e 20 74 61 62 6c 65 20 28 74 65 6d 70  tion table (temp
5860: 6c 61 74 65 20 33 29 2e 0a 20 20 20 20 2a 2a 0a  late 3)..    **.
5870: 20 20 20 20 2a 2a 20 41 20 74 65 6d 70 20 74 61      ** A temp ta
5880: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
5890: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   if the table be
58a0: 69 6e 67 20 75 70 64 61 74 65 64 20 69 73 20 61  ing updated is a
58b0: 6c 73 6f 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 6f  lso one.    ** o
58c0: 66 20 74 68 65 20 74 61 62 6c 65 73 20 62 65 69  f the tables bei
58d0: 6e 67 20 72 65 61 64 20 62 79 20 74 68 65 20 53  ng read by the S
58e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
58f0: 20 20 41 6c 73 6f 20 75 73 65 20 61 20 0a 20 20    Also use a .  
5900: 20 20 2a 2a 20 74 65 6d 70 20 74 61 62 6c 65 20    ** temp table 
5910: 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 72  in the case of r
5920: 6f 77 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20  ow triggers..   
5930: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 72 69   */.    if( pTri
5940: 67 67 65 72 20 7c 7c 20 72 65 61 64 73 54 61 62  gger || readsTab
5950: 6c 65 28 70 50 61 72 73 65 2c 20 61 64 64 72 53  le(pParse, addrS
5960: 65 6c 65 63 74 2c 20 69 44 62 2c 20 70 54 61 62  elect, iDb, pTab
5970: 29 20 29 7b 0a 20 20 20 20 20 20 75 73 65 54 65  ) ){.      useTe
5980: 6d 70 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  mpTable = 1;.   
5990: 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 73 65 54   }..    if( useT
59a0: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
59b0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
59c0: 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 74  coroutine to ext
59d0: 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
59e0: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
59f0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 64  .      ** and ad
5a00: 64 20 69 74 20 74 6f 20 61 20 74 72 61 6e 73 69  d it to a transi
5a10: 65 6e 74 20 74 61 62 6c 65 20 73 72 63 54 61 62  ent table srcTab
5a20: 2e 20 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  .  The code gene
5a30: 72 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 68  rated.      ** h
5a40: 65 72 65 20 69 73 20 66 72 6f 6d 20 74 68 65 20  ere is from the 
5a50: 34 74 68 20 74 65 6d 70 6c 61 74 65 3a 0a 20 20  4th template:.  
5a60: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
5a70: 20 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65 6d       B: open tem
5a80: 70 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  p table.      **
5a90: 20 20 20 20 20 20 4c 3a 20 79 69 65 6c 64 20 58        L: yield X
5aa0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
5ab0: 20 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 4d 0a    if EOF goto M.
5ac0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
5ad0: 20 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f 6d   insert row from
5ae0: 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65 6d   R..R+n into tem
5af0: 70 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  p table.      **
5b00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a           goto L.
5b10: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 4d 3a        **      M:
5b20: 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ....      */.  
5b30: 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20      int regRec; 
5b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
5b50: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 70 61 63  ster to hold pac
5b60: 6b 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ked record */.  
5b70: 20 20 20 20 69 6e 74 20 72 65 67 54 65 6d 70 52      int regTempR
5b80: 6f 77 69 64 3b 20 20 20 20 2f 2a 20 52 65 67 69  owid;    /* Regi
5b90: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 65 6d  ster to hold tem
5ba0: 70 20 74 61 62 6c 65 20 52 4f 57 49 44 20 2a 2f  p table ROWID */
5bb0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
5bc0: 6f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  op;         /* L
5bd0: 61 62 65 6c 20 22 4c 22 20 2a 2f 0a 20 20 20 20  abel "L" */.    
5be0: 20 20 69 6e 74 20 61 64 64 72 49 66 3b 20 20 20    int addrIf;   
5bf0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5c00: 73 20 6f 66 20 6a 75 6d 70 20 74 6f 20 4d 20 2a  s of jump to M *
5c10: 2f 0a 0a 20 20 20 20 20 20 73 72 63 54 61 62 20  /..      srcTab 
5c20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
5c30: 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20 3d  ;.      regRec =
5c40: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5c50: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5c60: 20 20 72 65 67 54 65 6d 70 52 6f 77 69 64 20 3d    regTempRowid =
5c70: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5c80: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5ca0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
5cb0: 68 65 6d 65 72 61 6c 2c 20 73 72 63 54 61 62 2c  hemeral, srcTab,
5cc0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5cd0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
5ce0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5cf0: 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69  OP_Yield, dest.i
5d00: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 61 64 64  Parm);.      add
5d10: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
5d20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
5d30: 2c 20 72 65 67 45 6f 66 29 3b 0a 20 20 20 20 20  , regEof);.     
5d40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d50: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5d60: 6f 72 64 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65  ord, regFromSele
5d70: 63 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ct, nColumn, reg
5d80: 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
5d90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5da0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 73 72   OP_NewRowid, sr
5db0: 63 54 61 62 2c 20 72 65 67 54 65 6d 70 52 6f 77  cTab, regTempRow
5dc0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
5dd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5de0: 4f 50 5f 49 6e 73 65 72 74 2c 20 73 72 63 54 61  OP_Insert, srcTa
5df0: 62 2c 20 72 65 67 52 65 63 2c 20 72 65 67 54 65  b, regRec, regTe
5e00: 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  mpRowid);.      
5e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e20: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
5e30: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
5e40: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
5e50: 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b  Here(v, addrIf);
5e60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
5e70: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5e80: 72 73 65 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  rse, regRec);.  
5e90: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5ea0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5eb0: 2c 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b  , regTempRowid);
5ec0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5ed0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
5ee0: 68 65 20 63 61 73 65 20 69 66 20 74 68 65 20 64  he case if the d
5ef0: 61 74 61 20 66 6f 72 20 74 68 65 20 49 4e 53 45  ata for the INSE
5f00: 52 54 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  RT is coming fro
5f10: 6d 20 61 20 56 41 4c 55 45 53 0a 20 20 20 20 2a  m a VALUES.    *
5f20: 2a 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  * clause.    */.
5f30: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
5f40: 73 4e 43 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  sNC;.    memset(
5f50: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
5f60: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
5f70: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
5f80: 20 20 20 20 73 72 63 54 61 62 20 3d 20 2d 31 3b      srcTab = -1;
5f90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65  .    assert( use
5fa0: 54 65 6d 70 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  TempTable==0 );.
5fb0: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c      nColumn = pL
5fc0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5fd0: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
5fe0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
5ff0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6000: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
6010: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c  prNames(&sNC, pL
6020: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
6030: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
6040: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
6050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6060: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
6070: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
6080: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
6090: 73 6f 75 72 63 65 20 64 61 74 61 20 6d 61 74 63  source data matc
60a0: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  hes the number. 
60b0: 20 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74   ** of columns t
60c0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  o be inserted in
60d0: 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  to the table..  
60e0: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
60f0: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
6100: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
6110: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6120: 20 20 20 6e 48 69 64 64 65 6e 20 2b 3d 20 28 49     nHidden += (I
6130: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
6140: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 3f 20  Tab->aCol[i]) ? 
6150: 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  1 : 0);.    }.  
6160: 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d  }.  if( pColumn=
6170: 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 20 26 26  =0 && nColumn &&
6180: 20 6e 43 6f 6c 75 6d 6e 21 3d 28 70 54 61 62 2d   nColumn!=(pTab-
6190: 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e 29 20 29  >nCol-nHidden) )
61a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
61b0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
61c0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 53 20        "table %S 
61d0: 68 61 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62  has %d columns b
61e0: 75 74 20 25 64 20 76 61 6c 75 65 73 20 77 65 72  ut %d values wer
61f0: 65 20 73 75 70 70 6c 69 65 64 22 2c 0a 20 20 20  e supplied",.   
6200: 20 20 20 20 70 54 61 62 4c 69 73 74 2c 20 30 2c      pTabList, 0,
6210: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e 48 69 64   pTab->nCol-nHid
6220: 64 65 6e 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  den, nColumn);. 
6230: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
6240: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66  leanup;.  }.  if
6250: 28 20 70 43 6f 6c 75 6d 6e 21 3d 30 20 26 26 20  ( pColumn!=0 && 
6260: 6e 43 6f 6c 75 6d 6e 21 3d 70 43 6f 6c 75 6d 6e  nColumn!=pColumn
6270: 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 73 71 6c  ->nId ){.    sql
6280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6290: 72 73 65 2c 20 22 25 64 20 76 61 6c 75 65 73 20  rse, "%d values 
62a0: 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
62b0: 20 6e 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 75 6d   nColumn, pColum
62c0: 6e 2d 3e 6e 49 64 29 3b 0a 20 20 20 20 67 6f 74  n->nId);.    got
62d0: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
62e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
62f0: 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  he INSERT statem
6300: 65 6e 74 20 69 6e 63 6c 75 64 65 64 20 61 6e 20  ent included an 
6310: 49 44 4c 49 53 54 20 74 65 72 6d 2c 20 74 68 65  IDLIST term, the
6320: 6e 20 6d 61 6b 65 20 73 75 72 65 0a 20 20 2a 2a  n make sure.  **
6330: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66   all elements of
6340: 20 74 68 65 20 49 44 4c 49 53 54 20 72 65 61 6c   the IDLIST real
6350: 6c 79 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  ly are columns o
6360: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
6370: 0a 20 20 2a 2a 20 72 65 6d 65 6d 62 65 72 20 74  .  ** remember t
6380: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65  he column indice
6390: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  s..  **.  ** If 
63a0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
63b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
63c0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   KEY column and 
63d0: 74 68 61 74 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  that column.  **
63e0: 20 69 73 20 6e 61 6d 65 64 20 69 6e 20 74 68 65   is named in the
63f0: 20 49 44 4c 49 53 54 2c 20 74 68 65 6e 20 72 65   IDLIST, then re
6400: 63 6f 72 64 20 69 6e 20 74 68 65 20 6b 65 79 43  cord in the keyC
6410: 6f 6c 75 6d 6e 20 76 61 72 69 61 62 6c 65 0a 20  olumn variable. 
6420: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
6430: 74 6f 20 49 44 4c 49 53 54 20 6f 66 20 74 68 65  to IDLIST of the
6440: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c   primary key col
6450: 75 6d 6e 2e 20 20 6b 65 79 43 6f 6c 75 6d 6e 20  umn.  keyColumn 
6460: 69 73 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  is.  ** the inde
6470: 78 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  x of the primary
6480: 20 6b 65 79 20 61 73 20 69 74 20 61 70 70 65 61   key as it appea
6490: 72 73 20 69 6e 20 49 44 4c 49 53 54 2c 20 6e 6f  rs in IDLIST, no
64a0: 74 20 61 73 0a 20 20 2a 2a 20 69 73 20 61 70 70  t as.  ** is app
64b0: 65 61 72 73 20 69 6e 20 74 68 65 20 6f 72 69 67  ears in the orig
64c0: 69 6e 61 6c 20 74 61 62 6c 65 2e 20 20 28 54 68  inal table.  (Th
64d0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 70  e index of the p
64e0: 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
64f0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
6500: 74 61 62 6c 65 20 69 73 20 70 54 61 62 2d 3e 69  table is pTab->i
6510: 50 4b 65 79 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  PKey.).  */.  if
6520: 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ( pColumn ){.   
6530: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
6540: 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  umn->nId; i++){.
6550: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61        pColumn->a
6560: 5b 69 5d 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20  [i].idx = -1;.  
6570: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
6580: 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   i<pColumn->nId;
6590: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
65a0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
65b0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
65c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
65d0: 49 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b  ICmp(pColumn->a[
65e0: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
65f0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
6600: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
6610: 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78  Column->a[i].idx
6620: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
6630: 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( j==pTab->iPK
6640: 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
6650: 20 20 6b 65 79 43 6f 6c 75 6d 6e 20 3d 20 69 3b    keyColumn = i;
6660: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6670: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6690: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61        if( j>=pTa
66a0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
66b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
66c0: 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e 2d 3e 61  Rowid(pColumn->a
66d0: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
66e0: 20 20 20 20 20 20 20 20 6b 65 79 43 6f 6c 75 6d          keyColum
66f0: 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d  n = i;.        }
6700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6710: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6720: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
6730: 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  S has no column 
6740: 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
6750: 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73           pTabLis
6760: 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 61  t, 0, pColumn->a
6770: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
6780: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68        pParse->ch
6790: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
67a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e           goto in
67b0: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
67c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
67d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
67e0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49  If there is no I
67f0: 44 4c 49 53 54 20 74 65 72 6d 20 62 75 74 20 74  DLIST term but t
6800: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
6810: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 0a  integer primary.
6820: 20 20 2a 2a 20 6b 65 79 2c 20 74 68 65 20 73 65    ** key, the se
6830: 74 20 74 68 65 20 6b 65 79 43 6f 6c 75 6d 6e 20  t the keyColumn 
6840: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
6850: 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75  primary key colu
6860: 6d 6e 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  mn index.  ** in
6870: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61   the original ta
6880: 62 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ble definition..
6890: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75    */.  if( pColu
68a0: 6d 6e 3d 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e  mn==0 && nColumn
68b0: 3e 30 20 29 7b 0a 20 20 20 20 6b 65 79 43 6f 6c  >0 ){.    keyCol
68c0: 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  umn = pTab->iPKe
68d0: 79 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  y;.  }.    .  /*
68e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
68f0: 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 74 6f  count of rows to
6900: 20 62 65 20 69 6e 73 65 72 74 65 64 0a 20 20 2a   be inserted.  *
6910: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  /.  if( db->flag
6920: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
6930: 52 6f 77 73 20 29 7b 0a 20 20 20 20 72 65 67 52  Rows ){.    regR
6940: 6f 77 43 6f 75 6e 74 20 3d 20 2b 2b 70 50 61 72  owCount = ++pPar
6950: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
6960: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6970: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
6980: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 29 3b 0a  , regRowCount);.
6990: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
69a0: 73 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 2c  s is not a view,
69b0: 20 6f 70 65 6e 20 74 68 65 20 74 61 62 6c 65 20   open the table 
69c0: 61 6e 64 20 61 6e 64 20 61 6c 6c 20 69 6e 64 69  and and all indi
69d0: 63 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ces */.  if( !is
69e0: 56 69 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  View ){.    int 
69f0: 6e 49 64 78 3b 0a 0a 20 20 20 20 62 61 73 65 43  nIdx;..    baseC
6a00: 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ur = pParse->nTa
6a10: 62 3b 0a 20 20 20 20 6e 49 64 78 20 3d 20 73 71  b;.    nIdx = sq
6a20: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e  lite3OpenTableAn
6a30: 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c  dIndices(pParse,
6a40: 20 70 54 61 62 2c 20 62 61 73 65 43 75 72 2c 20   pTab, baseCur, 
6a50: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20  OP_OpenWrite);. 
6a60: 20 20 20 61 52 65 67 49 64 78 20 3d 20 73 71 6c     aRegIdx = sql
6a70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
6a80: 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
6a90: 28 6e 49 64 78 2b 31 29 29 3b 0a 20 20 20 20 69  (nIdx+1));.    i
6aa0: 66 28 20 61 52 65 67 49 64 78 3d 3d 30 20 29 7b  f( aRegIdx==0 ){
6ab0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 73 65  .      goto inse
6ac0: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  rt_cleanup;.    
6ad0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
6ae0: 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nIdx; i++){.   
6af0: 20 20 20 61 52 65 67 49 64 78 5b 69 5d 20 3d 20     aRegIdx[i] = 
6b00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6b10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6b20: 54 68 69 73 20 69 73 20 74 68 65 20 74 6f 70 20  This is the top 
6b30: 6f 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65  of the main inse
6b40: 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20  rtion loop */.  
6b50: 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65  if( useTempTable
6b60: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
6b70: 62 6c 6f 63 6b 20 63 6f 64 65 73 20 74 68 65 20  block codes the 
6b80: 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79  top of loop only
6b90: 2e 20 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  .  The complete 
6ba0: 6c 6f 6f 70 20 69 73 20 74 68 65 0a 20 20 20 20  loop is the.    
6bb0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65  ** following pse
6bc0: 75 64 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61 74  udocode (templat
6bd0: 65 20 34 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e 4):.    **.   
6be0: 20 2a 2a 20 20 20 20 20 20 20 20 20 72 65 77 69   **         rewi
6bf0: 6e 64 20 74 65 6d 70 20 74 61 62 6c 65 0a 20 20  nd temp table.  
6c00: 20 20 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f    **      C: loo
6c10: 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69  p over rows of i
6c20: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
6c30: 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
6c40: 20 20 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75     transfer valu
6c50: 65 73 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64  es form intermed
6c60: 69 61 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20  iate table into 
6c70: 3c 74 61 62 6c 65 3e 0a 20 20 20 20 2a 2a 20 20  <table>.    **  
6c80: 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a         end loop.
6c90: 20 20 20 20 2a 2a 20 20 20 20 20 20 44 3a 20 2e      **      D: .
6ca0: 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64  ...    */.    ad
6cb0: 64 72 49 6e 73 54 6f 70 20 3d 20 73 71 6c 69 74  drInsTop = sqlit
6cc0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6cd0: 4f 50 5f 52 65 77 69 6e 64 2c 20 73 72 63 54 61  OP_Rewind, srcTa
6ce0: 62 29 3b 0a 20 20 20 20 61 64 64 72 43 6f 6e 74  b);.    addrCont
6cf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
6d00: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
6d10: 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63  }else if( pSelec
6d20: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  t ){.    /* This
6d30: 20 62 6c 6f 63 6b 20 63 6f 64 65 73 20 74 68 65   block codes the
6d40: 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c   top of loop onl
6d50: 79 2e 20 20 54 68 65 20 63 6f 6d 70 6c 65 74 65  y.  The complete
6d60: 20 6c 6f 6f 70 20 69 73 20 74 68 65 0a 20 20 20   loop is the.   
6d70: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73   ** following ps
6d80: 65 75 64 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61  eudocode (templa
6d90: 74 65 20 33 29 3a 0a 20 20 20 20 2a 2a 0a 20 20  te 3):.    **.  
6da0: 20 20 2a 2a 20 20 20 20 20 20 43 3a 20 79 69 65    **      C: yie
6db0: 6c 64 20 58 0a 20 20 20 20 2a 2a 20 20 20 20 20  ld X.    **     
6dc0: 20 20 20 20 69 66 20 45 4f 46 20 67 6f 74 6f 20      if EOF goto 
6dd0: 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  D.    **        
6de0: 20 69 6e 73 65 72 74 20 74 68 65 20 73 65 6c 65   insert the sele
6df0: 63 74 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 3c  ct result into <
6e00: 74 61 62 6c 65 3e 20 66 72 6f 6d 20 52 2e 2e 52  table> from R..R
6e10: 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  +n.    **       
6e20: 20 20 67 6f 74 6f 20 43 0a 20 20 20 20 2a 2a 20    goto C.    ** 
6e30: 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20 20       D: ....    
6e40: 2a 2f 0a 20 20 20 20 61 64 64 72 43 6f 6e 74 20  */.    addrCont 
6e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6e60: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6e70: 20 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20   dest.iParm);.  
6e80: 20 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 73    addrInsTop = s
6e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6ea0: 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
6eb0: 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  f);.  }..  /* Al
6ec0: 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73  locate registers
6ed0: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
6ee0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   rowid of the ne
6ef0: 77 20 72 6f 77 2c 0a 20 20 2a 2a 20 74 68 65 20  w row,.  ** the 
6f00: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  content of the n
6f10: 65 77 20 72 6f 77 2c 20 61 6e 64 20 74 68 65 20  ew row, and the 
6f20: 61 73 73 65 6d 62 6c 69 65 64 20 72 6f 77 20 72  assemblied row r
6f30: 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 72 65  ecord..  */.  re
6f40: 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72  gRecord = ++pPar
6f50: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52  se->nMem;.  regR
6f60: 6f 77 69 64 20 3d 20 72 65 67 49 6e 73 20 3d 20  owid = regIns = 
6f70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
6f80: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6f90: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 31  = pTab->nCol + 1
6fa0: 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ;.  if( IsVirtua
6fb0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 72  l(pTab) ){.    r
6fc0: 65 67 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70  egRowid++;.    p
6fd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
6fe0: 20 7d 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72   }.  regData = r
6ff0: 65 67 52 6f 77 69 64 2b 31 3b 0a 0a 20 20 2f 2a  egRowid+1;..  /*
7000: 20 52 75 6e 20 74 68 65 20 42 45 46 4f 52 45 20   Run the BEFORE 
7010: 61 6e 64 20 49 4e 53 54 45 41 44 20 4f 46 20 74  and INSTEAD OF t
7020: 72 69 67 67 65 72 73 2c 20 69 66 20 74 68 65 72  riggers, if ther
7030: 65 20 61 72 65 20 61 6e 79 0a 20 20 2a 2f 0a 20  e are any.  */. 
7040: 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c   endOfLoop = sql
7050: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
7060: 6c 28 76 29 3b 0a 20 20 69 66 28 20 74 6d 61 73  l(v);.  if( tmas
7070: 6b 20 26 20 54 52 49 47 47 45 52 5f 42 45 46 4f  k & TRIGGER_BEFO
7080: 52 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  RE ){.    int re
7090: 67 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 47  gCols = sqlite3G
70a0: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
70b0: 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  se, pTab->nCol+1
70c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 62 75 69 6c 64  );..    /* build
70d0: 20 74 68 65 20 4e 45 57 2e 2a 20 72 65 66 65 72   the NEW.* refer
70e0: 65 6e 63 65 20 72 6f 77 2e 20 20 4e 6f 74 65 20  ence row.  Note 
70f0: 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
7100: 20 61 6e 20 49 4e 54 45 47 45 52 0a 20 20 20 20   an INTEGER.    
7110: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ** PRIMARY KEY i
7120: 6e 74 6f 20 77 68 69 63 68 20 61 20 4e 55 4c 4c  nto which a NULL
7130: 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
7140: 65 64 2c 20 74 68 61 74 20 4e 55 4c 4c 20 77 69  ed, that NULL wi
7150: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 61  ll be.    ** tra
7160: 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 75  nslated into a u
7170: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 74 68 65  nique ID for the
7180: 20 72 6f 77 2e 20 20 42 75 74 20 6f 6e 20 61 20   row.  But on a 
7190: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 2c 0a  BEFORE trigger,.
71a0: 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
71b0: 20 6b 6e 6f 77 20 77 68 61 74 20 74 68 65 20 75   know what the u
71c0: 6e 69 71 75 65 20 49 44 20 77 69 6c 6c 20 62 65  nique ID will be
71d0: 20 28 62 65 63 61 75 73 65 20 74 68 65 20 69 6e   (because the in
71e0: 73 65 72 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  sert has.    ** 
71f0: 6e 6f 74 20 68 61 70 70 65 6e 65 64 20 79 65 74  not happened yet
7200: 29 20 73 6f 20 77 65 20 73 75 62 73 74 69 74 75  ) so we substitu
7210: 74 65 20 61 20 72 6f 77 69 64 20 6f 66 20 2d 31  te a rowid of -1
7220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7230: 6b 65 79 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  keyColumn<0 ){. 
7240: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7250: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7260: 65 67 65 72 2c 20 2d 31 2c 20 72 65 67 43 6f 6c  eger, -1, regCol
7270: 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
7280: 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20       int j1;.   
7290: 20 20 20 69 66 28 20 75 73 65 54 65 6d 70 54 61     if( useTempTa
72a0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
72b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
72c0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
72d0: 72 63 54 61 62 2c 20 6b 65 79 43 6f 6c 75 6d 6e  rcTab, keyColumn
72e0: 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20  , regCols);.    
72f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7300: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
7310: 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72  ==0 );  /* Other
7320: 77 69 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c  wise useTempTabl
7330: 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20  e is true */.   
7340: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7350: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
7360: 73 74 2d 3e 61 5b 6b 65 79 43 6f 6c 75 6d 6e 5d  st->a[keyColumn]
7370: 2e 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 29  .pExpr, regCols)
7380: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7390: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
73a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
73b0: 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  Null, regCols);.
73c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
73d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
73e0: 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67 43 6f  teger, -1, regCo
73f0: 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ls);.      sqlit
7400: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
7410: 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , j1);.      sql
7420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
7430: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
7440: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 0a  regCols);.    }.
7450: 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68  .    /* Cannot h
7460: 61 76 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20  ave triggers on 
7470: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
7480: 20 49 66 20 69 74 20 77 65 72 65 20 70 6f 73 73   If it were poss
7490: 69 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ible,.    ** thi
74a0: 73 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 68 61  s block would ha
74b0: 76 65 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ve to account fo
74c0: 72 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 2e  r hidden column.
74d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
74e0: 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
74f0: 54 61 62 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Tab) );..    /* 
7500: 43 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 63  Create the new c
7510: 6f 6c 75 6d 6e 20 64 61 74 61 0a 20 20 20 20 2a  olumn data.    *
7520: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
7530: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
7540: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
7550: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
7560: 20 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20     j = i;.      
7570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
7580: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d  or(j=0; j<pColum
7590: 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  n->nId; j++){.  
75a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
75b0: 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69  umn->a[j].idx==i
75c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
75d0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
75e0: 20 20 69 66 28 20 28 21 75 73 65 54 65 6d 70 54    if( (!useTempT
75f0: 61 62 6c 65 20 26 26 20 21 70 4c 69 73 74 29 20  able && !pList) 
7600: 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20 26 26 20 6a  || (pColumn && j
7610: 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 20  >=pColumn->nId) 
7620: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7630: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
7640: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  e, pTab->aCol[i]
7650: 2e 70 44 66 6c 74 2c 20 72 65 67 43 6f 6c 73 2b  .pDflt, regCols+
7660: 69 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i+1);.      }els
7670: 65 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62  e if( useTempTab
7680: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
7690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
76a0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
76b0: 63 54 61 62 2c 20 6a 2c 20 72 65 67 43 6f 6c 73  cTab, j, regCols
76c0: 2b 69 2b 31 29 3b 20 0a 20 20 20 20 20 20 7d 65  +i+1); .      }e
76d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
76e0: 65 72 74 28 20 70 53 65 6c 65 63 74 3d 3d 30 20  ert( pSelect==0 
76f0: 29 3b 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ); /* Otherwise 
7700: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 69 73 20  useTempTable is 
7710: 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  true */.        
7720: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
7730: 6e 64 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  ndCache(pParse, 
7740: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  pList->a[j].pExp
7750: 72 2c 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b  r, regCols+i+1);
7760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
7770: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
7780: 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 6e 20 61  s an INSERT on a
7790: 20 76 69 65 77 20 77 69 74 68 20 61 6e 20 49 4e   view with an IN
77a0: 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20  STEAD OF INSERT 
77b0: 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20  trigger,.    ** 
77c0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 61  do not attempt a
77d0: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62  ny conversions b
77e0: 65 66 6f 72 65 20 61 73 73 65 6d 62 6c 69 6e 67  efore assembling
77f0: 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20   the record..   
7800: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
7810: 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 61 74 74   real table, att
7820: 65 6d 70 74 20 63 6f 6e 76 65 72 73 69 6f 6e 73  empt conversions
7830: 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
7840: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
7850: 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 69   column affiniti
7860: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
7870: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
7880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
78a0: 6e 69 74 79 2c 20 72 65 67 43 6f 6c 73 2b 31 2c  nity, regCols+1,
78b0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
78c0: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
78d0: 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
78e0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Tab);.    }..   
78f0: 20 2f 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20   /* Fire BEFORE 
7900: 6f 72 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72  or INSTEAD OF tr
7910: 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71  iggers */.    sq
7920: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
7930: 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  ger(pParse, pTri
7940: 67 67 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  gger, TK_INSERT,
7950: 20 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f   0, TRIGGER_BEFO
7960: 52 45 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61  RE, .        pTa
7970: 62 2c 20 72 65 67 43 6f 6c 73 2d 70 54 61 62 2d  b, regCols-pTab-
7980: 3e 6e 43 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72  >nCol-1, onError
7990: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20  , endOfLoop);.. 
79a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
79b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
79c0: 65 2c 20 72 65 67 43 6f 6c 73 2c 20 70 54 61 62  e, regCols, pTab
79d0: 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a  ->nCol+1);.  }..
79e0: 20 20 2f 2a 20 50 75 73 68 20 74 68 65 20 72 65    /* Push the re
79f0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
7a00: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e  the new entry on
7a10: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  to the stack.  T
7a20: 68 65 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 6e  he.  ** record n
7a30: 75 6d 62 65 72 20 69 73 20 61 20 72 61 6e 64 6f  umber is a rando
7a40: 6d 6c 79 20 67 65 6e 65 72 61 74 65 20 69 6e 74  mly generate int
7a50: 65 67 65 72 20 63 72 65 61 74 65 64 20 62 79 20  eger created by 
7a60: 4e 65 77 52 6f 77 69 64 0a 20 20 2a 2a 20 65 78  NewRowid.  ** ex
7a70: 63 65 70 74 20 77 68 65 6e 20 74 68 65 20 74 61  cept when the ta
7a80: 62 6c 65 20 68 61 73 20 61 6e 20 49 4e 54 45 47  ble has an INTEG
7a90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
7aa0: 6f 6c 75 6d 6e 2c 20 69 6e 20 77 68 69 63 68 0a  olumn, in which.
7ab0: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 72 65    ** case the re
7ac0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 74  cord number is t
7ad0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
7ae0: 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2f 0a 20 20  column. .  */.  
7af0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
7b00: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
7b10: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
7b20: 2f 2a 20 54 68 65 20 72 6f 77 20 74 68 61 74 20  /* The row that 
7b30: 74 68 65 20 56 55 70 64 61 74 65 20 6f 70 63 6f  the VUpdate opco
7b40: 64 65 20 77 69 6c 6c 20 64 65 6c 65 74 65 3a 20  de will delete: 
7b50: 6e 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  none */.      sq
7b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7b70: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
7b80: 65 67 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20  egIns);.    }.  
7b90: 20 20 69 66 28 20 6b 65 79 43 6f 6c 75 6d 6e 3e    if( keyColumn>
7ba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
7bb0: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  useTempTable ){.
7bc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7bd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7be0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
7bf0: 6b 65 79 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  keyColumn, regRo
7c00: 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid);.      }els
7c10: 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b  e if( pSelect ){
7c20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7c30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7c40: 5f 53 43 6f 70 79 2c 20 72 65 67 46 72 6f 6d 53  _SCopy, regFromS
7c50: 65 6c 65 63 74 2b 6b 65 79 43 6f 6c 75 6d 6e 2c  elect+keyColumn,
7c60: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
7c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7c80: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
7c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7ca0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
7cb0: 69 73 74 2d 3e 61 5b 6b 65 79 43 6f 6c 75 6d 6e  ist->a[keyColumn
7cc0: 5d 2e 70 45 78 70 72 2c 20 72 65 67 52 6f 77 69  ].pExpr, regRowi
7cd0: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  d);.        pOp 
7ce0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
7cf0: 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Op(v, -1);.     
7d00: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4f     if( ALWAYS(pO
7d10: 70 29 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  p) && pOp->opcod
7d20: 65 3d 3d 4f 50 5f 4e 75 6c 6c 20 26 26 20 21 49  e==OP_Null && !I
7d30: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
7d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
7d50: 6e 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  ndFlag = 1;.    
7d60: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
7d70: 65 20 3d 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3b  e = OP_NewRowid;
7d80: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
7d90: 70 31 20 3d 20 62 61 73 65 43 75 72 3b 0a 20 20  p1 = baseCur;.  
7da0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
7db0: 3d 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 20 20  = regRowid;.    
7dc0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20        pOp->p3 = 
7dd0: 72 65 67 41 75 74 6f 69 6e 63 3b 0a 20 20 20 20  regAutoinc;.    
7de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7df0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52      /* If the PR
7e00: 49 4d 41 52 59 20 4b 45 59 20 65 78 70 72 65 73  IMARY KEY expres
7e10: 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  sion is NULL, th
7e20: 65 6e 20 75 73 65 20 4f 50 5f 4e 65 77 52 6f 77  en use OP_NewRow
7e30: 69 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  id.      ** to g
7e40: 65 6e 65 72 61 74 65 20 61 20 75 6e 69 71 75 65  enerate a unique
7e50: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
7e60: 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ue..      */.   
7e70: 20 20 20 69 66 28 20 21 61 70 70 65 6e 64 46 6c     if( !appendFl
7e80: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ag ){.        in
7e90: 74 20 6a 31 3b 0a 20 20 20 20 20 20 20 20 69 66  t j1;.        if
7ea0: 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
7eb0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
7ec0: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
7ed0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
7ee0: 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 69 64 29 3b  Null, regRowid);
7ef0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7f00: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7f10: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 62 61 73  OP_NewRowid, bas
7f20: 65 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20  eCur, regRowid, 
7f30: 72 65 67 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20  regAutoinc);.   
7f40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7f50: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
7f60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d  {.          j1 =
7f80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7f90: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
7fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7fb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
7fc0: 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 69 64 2c 20  Null, regRowid, 
7fd0: 6a 31 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  j1+2);.        }
7fe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7ff0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
8000: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52  _MustBeInt, regR
8010: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
8020: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
8030: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
8040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8050: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
8060: 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  ll, 0, regRowid)
8070: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8090: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp3(v, OP_NewRo
80a0: 77 69 64 2c 20 62 61 73 65 43 75 72 2c 20 72 65  wid, baseCur, re
80b0: 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f 69  gRowid, regAutoi
80c0: 6e 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e  nc);.      appen
80d0: 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d  dFlag = 1;.    }
80e0: 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70  .    autoIncStep
80f0: 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f  (pParse, regAuto
8100: 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  inc, regRowid);.
8110: 0a 20 20 20 20 2f 2a 20 50 75 73 68 20 6f 6e 74  .    /* Push ont
8120: 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 64 61 74  o the stack, dat
8130: 61 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  a for all column
8140: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  s of the new ent
8150: 72 79 2c 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  ry, beginning.  
8160: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 69    ** with the fi
8170: 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  rst column..    
8180: 2a 2f 0a 20 20 20 20 6e 48 69 64 64 65 6e 20 3d  */.    nHidden =
8190: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
81a0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
81b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
81c0: 52 65 67 53 74 6f 72 65 20 3d 20 72 65 67 52 6f  RegStore = regRo
81d0: 77 69 64 2b 31 2b 69 3b 0a 20 20 20 20 20 20 69  wid+1+i;.      i
81e0: 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( i==pTab->iPKe
81f0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
8200: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
8210: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8220: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 61   KEY column is a
8230: 6c 77 61 79 73 20 61 20 4e 55 4c 4c 2e 0a 20 20  lways a NULL..  
8240: 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 65 76 65        ** Wheneve
8250: 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73  r this column is
8260: 20 72 65 61 64 2c 20 74 68 65 20 72 65 63 6f 72   read, the recor
8270: 64 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 62 65  d number will be
8280: 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20   substituted.   
8290: 20 20 20 20 20 2a 2a 20 69 6e 20 69 74 73 20 70       ** in its p
82a0: 6c 61 63 65 2e 20 20 53 6f 20 77 69 6c 6c 20 66  lace.  So will f
82b0: 69 6c 6c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ill this column 
82c0: 77 69 74 68 20 61 20 4e 55 4c 4c 20 74 6f 20 61  with a NULL to a
82d0: 76 6f 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  void.        ** 
82e0: 74 61 6b 69 6e 67 20 75 70 20 64 61 74 61 20 73  taking up data s
82f0: 70 61 63 65 20 77 69 74 68 20 69 6e 66 6f 72 6d  pace with inform
8300: 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
8310: 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 2a  never be used. *
8320: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
8330: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8340: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 53  P_Null, 0, iRegS
8350: 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 63  tore);.        c
8360: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
8370: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75  .      if( pColu
8380: 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  mn==0 ){.       
8390: 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
83a0: 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
83b0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i]) ){.         
83c0: 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75   assert( IsVirtu
83d0: 61 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20  al(pTab) );.    
83e0: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
83f0: 20 20 20 20 20 20 20 20 6e 48 69 64 64 65 6e 2b          nHidden+
8400: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
8410: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20  {.          j = 
8420: 69 20 2d 20 6e 48 69 64 64 65 6e 3b 0a 20 20 20  i - nHidden;.   
8430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8440: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
8450: 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e  j=0; j<pColumn->
8460: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
8470: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e       if( pColumn
8480: 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69 20 29 20  ->a[j].idx==i ) 
8490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
84a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
84b0: 66 28 20 6a 3c 30 20 7c 7c 20 6e 43 6f 6c 75 6d  f( j<0 || nColum
84c0: 6e 3d 3d 30 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e  n==0 || (pColumn
84d0: 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e   && j>=pColumn->
84e0: 6e 49 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nId) ){.        
84f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
8500: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43  pParse, pTab->aC
8510: 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 69 52 65  ol[i].pDflt, iRe
8520: 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d  gStore);.      }
8530: 65 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d 70  else if( useTemp
8540: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
8550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8560: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
8570: 20 73 72 63 54 61 62 2c 20 6a 2c 20 69 52 65 67   srcTab, j, iReg
8580: 53 74 6f 72 65 29 3b 20 0a 20 20 20 20 20 20 7d  Store); .      }
8590: 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63 74  else if( pSelect
85a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
85b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
85c0: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 46 72   OP_SCopy, regFr
85d0: 6f 6d 53 65 6c 65 63 74 2b 6a 2c 20 69 52 65 67  omSelect+j, iReg
85e0: 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 65  Store);.      }e
85f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8600: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8610: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  rse, pList->a[j]
8620: 2e 70 45 78 70 72 2c 20 69 52 65 67 53 74 6f 72  .pExpr, iRegStor
8630: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
8640: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
8650: 74 65 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  te code to check
8660: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
8670: 20 67 65 6e 65 72 61 74 65 20 69 6e 64 65 78 20   generate index 
8680: 6b 65 79 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  keys and.    ** 
8690: 64 6f 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e  do the insertion
86a0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
86b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
86c0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
86d0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
86e0: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
86f0: 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
8700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
8710: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
8720: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73  , pTab);.      s
8730: 71 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72  qlite3VtabMakeWr
8740: 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  itable(pParse, p
8750: 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tab);.      sqli
8760: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8770: 20 4f 50 5f 56 55 70 64 61 74 65 2c 20 31 2c 20   OP_VUpdate, 1, 
8780: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c 20 72 65  pTab->nCol+2, re
8790: 67 49 6e 73 2c 20 70 56 54 61 62 2c 20 50 34 5f  gIns, pVTab, P4_
87a0: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 73 71 6c  VTAB);.      sql
87b0: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
87c0: 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  rse);.    }else.
87d0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
87e0: 20 20 20 69 6e 74 20 69 73 52 65 70 6c 61 63 65     int isReplace
87f0: 3b 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74  ;    /* Set to t
8800: 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69 6e  rue if constrain
8810: 74 73 20 6d 61 79 20 63 61 75 73 65 20 61 20 72  ts may cause a r
8820: 65 70 6c 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  eplace */.      
8830: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
8840: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
8850: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 62 61  pParse, pTab, ba
8860: 73 65 43 75 72 2c 20 72 65 67 49 6e 73 2c 20 61  seCur, regIns, a
8870: 52 65 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  RegIdx,.        
8880: 20 20 6b 65 79 43 6f 6c 75 6d 6e 3e 3d 30 2c 20    keyColumn>=0, 
8890: 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f  0, onError, endO
88a0: 66 4c 6f 6f 70 2c 20 26 69 73 52 65 70 6c 61 63  fLoop, &isReplac
88b0: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
88c0: 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b 28   sqlite3FkCheck(
88d0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
88e0: 20 72 65 67 49 6e 73 29 3b 0a 20 20 20 20 20 20   regIns);.      
88f0: 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65 49  sqlite3CompleteI
8900: 6e 73 65 72 74 69 6f 6e 28 0a 20 20 20 20 20 20  nsertion(.      
8910: 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62      pParse, pTab
8920: 2c 20 62 61 73 65 43 75 72 2c 20 72 65 67 49 6e  , baseCur, regIn
8930: 73 2c 20 61 52 65 67 49 64 78 2c 20 30 2c 20 61  s, aRegIdx, 0, a
8940: 70 70 65 6e 64 46 6c 61 67 2c 20 69 73 52 65 70  ppendFlag, isRep
8950: 6c 61 63 65 3d 3d 30 0a 20 20 20 20 20 20 29 3b  lace==0.      );
8960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8970: 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 75 6e   Update the coun
8980: 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 61  t of rows that a
8990: 72 65 20 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f  re inserted.  */
89a0: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
89b0: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
89c0: 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20  Rows)!=0 ){.    
89d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
89e0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
89f0: 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b  regRowCount, 1);
8a00: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 72 69  .  }..  if( pTri
8a10: 67 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 43  gger ){.    /* C
8a20: 6f 64 65 20 41 46 54 45 52 20 74 72 69 67 67 65  ode AFTER trigge
8a30: 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  rs */.    sqlite
8a40: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
8a50: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
8a60: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20  , TK_INSERT, 0, 
8a70: 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c 20 0a  TRIGGER_AFTER, .
8a80: 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 72 65          pTab, re
8a90: 67 44 61 74 61 2d 32 2d 70 54 61 62 2d 3e 6e 43  gData-2-pTab->nC
8aa0: 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64  ol, onError, end
8ab0: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20  OfLoop);.  }..  
8ac0: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
8ad0: 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72 74   the main insert
8ae0: 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66 20 74 68 65  ion loop, if the
8af0: 20 64 61 74 61 20 73 6f 75 72 63 65 0a 20 20 2a   data source.  *
8b00: 2a 20 69 73 20 61 20 53 45 4c 45 43 54 20 73 74  * is a SELECT st
8b10: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
8b20: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
8b30: 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66  veLabel(v, endOf
8b40: 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75 73 65  Loop);.  if( use
8b50: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
8b60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b70: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  p2(v, OP_Next, s
8b80: 72 63 54 61 62 2c 20 61 64 64 72 43 6f 6e 74 29  rcTab, addrCont)
8b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ba0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8bb0: 72 49 6e 73 54 6f 70 29 3b 0a 20 20 20 20 73 71  rInsTop);.    sq
8bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
8bd0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 73 72 63  v, OP_Close, src
8be0: 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Tab);.  }else if
8bf0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
8c00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c10: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
8c20: 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
8c30: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
8c40: 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 54  Here(v, addrInsT
8c50: 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  op);.  }..  if( 
8c60: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
8c70: 20 26 26 20 21 69 73 56 69 65 77 20 29 7b 0a 20   && !isView ){. 
8c80: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20     /* Close all 
8c90: 74 61 62 6c 65 73 20 6f 70 65 6e 65 64 20 2a 2f  tables opened */
8ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8cb0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
8cc0: 73 65 2c 20 62 61 73 65 43 75 72 29 3b 0a 20 20  se, baseCur);.  
8cd0: 20 20 66 6f 72 28 69 64 78 3d 31 2c 20 70 49 64    for(idx=1, pId
8ce0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
8cf0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
8d00: 3e 70 4e 65 78 74 2c 20 69 64 78 2b 2b 29 7b 0a  >pNext, idx++){.
8d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8d20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
8d30: 6f 73 65 2c 20 69 64 78 2b 62 61 73 65 43 75 72  ose, idx+baseCur
8d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 69 6e  );.    }.  }..in
8d50: 73 65 72 74 5f 65 6e 64 3a 0a 20 20 2f 2a 20 55  sert_end:.  /* U
8d60: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
8d70: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
8d80: 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63  by storing the c
8d90: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20  ontent of the.  
8da0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  ** maximum rowid
8db0: 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20   counter values 
8dc0: 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69  recorded while i
8dd0: 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20  nserting into.  
8de0: 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  ** autoincrement
8df0: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
8e00: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
8e10: 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ed==0 && pParse-
8e20: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
8e30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
8e40: 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70  toincrementEnd(p
8e50: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
8e60: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
8e70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
8e80: 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 74 68   inserted. If th
8e90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20  is routine is . 
8ea0: 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63   ** generating c
8eb0: 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61  ode because of a
8ec0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8ed0: 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64  NestedParse(), d
8ee0: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b  o not.  ** invok
8ef0: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
8f00: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
8f10: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53  if( (db->flags&S
8f20: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29  QLITE_CountRows)
8f30: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e 65 73   && !pParse->nes
8f40: 74 65 64 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ted && !pParse->
8f50: 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
8f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8f70: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8f80: 74 52 6f 77 2c 20 72 65 67 52 6f 77 43 6f 75 6e  tRow, regRowCoun
8f90: 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 1);.    sqlit
8fa0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8fb0: 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  (v, 1);.    sqli
8fc0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8fd0: 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 0, COLNAME_
8fe0: 4e 41 4d 45 2c 20 22 72 6f 77 73 20 69 6e 73 65  NAME, "rows inse
8ff0: 72 74 65 64 22 2c 20 53 51 4c 49 54 45 5f 53 54  rted", SQLITE_ST
9000: 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65  ATIC);.  }..inse
9010: 72 74 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  rt_cleanup:.  sq
9020: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
9030: 74 65 28 64 62 2c 20 70 54 61 62 4c 69 73 74 29  te(db, pTabList)
9040: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
9050: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
9060: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
9070: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
9080: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
9090: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
90a0: 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20  db, pColumn);.  
90b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
90c0: 2c 20 61 52 65 67 49 64 78 29 3b 0a 7d 0a 0a 2f  , aRegIdx);.}../
90d0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69 73 56  * Make sure "isV
90e0: 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72 20 6d  iew" and other m
90f0: 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 61 62  acros defined ab
9100: 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ove are undefine
9110: 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d. Otherwise.** 
9120: 74 68 65 6c 79 20 6d 61 79 20 69 6e 74 65 72 66  thely may interf
9130: 65 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c 61  ere with compila
9140: 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66 75  tion of other fu
9150: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  nctions in this 
9160: 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61  file.** (or in a
9170: 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66 20  nother file, if 
9180: 74 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d 65  this file become
9190: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61 6d  s part of the am
91a0: 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f  algamation).  */
91b0: 0a 23 69 66 64 65 66 20 69 73 56 69 65 77 0a 20  .#ifdef isView. 
91c0: 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 65  #undef isView.#e
91d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 70 54 72 69  ndif.#ifdef pTri
91e0: 67 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54 72  gger. #undef pTr
91f0: 69 67 67 65 72 0a 23 65 6e 64 69 66 0a 23 69 66  igger.#endif.#if
9200: 64 65 66 20 74 6d 61 73 6b 0a 20 23 75 6e 64 65  def tmask. #unde
9210: 66 20 74 6d 61 73 6b 0a 23 65 6e 64 69 66 0a 0a  f tmask.#endif..
9220: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9230: 63 6f 64 65 20 74 6f 20 64 6f 20 63 6f 6e 73 74  code to do const
9240: 72 61 69 6e 74 20 63 68 65 63 6b 73 20 70 72 69  raint checks pri
9250: 6f 72 20 74 6f 20 61 6e 20 49 4e 53 45 52 54 20  or to an INSERT 
9260: 6f 72 20 61 6e 20 55 50 44 41 54 45 2e 0a 2a 2a  or an UPDATE..**
9270: 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 69 73  .** The input is
9280: 20 61 20 72 61 6e 67 65 20 6f 66 20 63 6f 6e 73   a range of cons
9290: 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
92a0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
92b0: 0a 2a 2a 20 20 20 20 31 2e 20 20 54 68 65 20 72  .**    1.  The r
92c0: 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  owid of the row 
92d0: 61 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65  after the update
92e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 32 2e 20 20 54  ..**.**    2.  T
92f0: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 66  he data in the f
9300: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  irst column of t
9310: 68 65 20 65 6e 74 72 79 20 61 66 74 65 72 20 74  he entry after t
9320: 68 65 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a  he update..**.**
9330: 20 20 20 20 69 2e 20 20 44 61 74 61 20 66 72 6f      i.  Data fro
9340: 6d 20 6d 69 64 64 6c 65 20 63 6f 6c 75 6d 6e 73  m middle columns
9350: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 2e 20  ....**.**    N. 
9360: 20 54 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   The data in the
9370: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   last column of 
9380: 74 68 65 20 65 6e 74 72 79 20 61 66 74 65 72 20  the entry after 
9390: 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a  the update..**.*
93a0: 2a 20 54 68 65 20 72 65 67 52 6f 77 69 64 20 70  * The regRowid p
93b0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
93c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 67  index of the reg
93d0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
93e0: 20 28 31 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69   (1)..**.** If i
93f0: 73 55 70 64 61 74 65 20 69 73 20 74 72 75 65 20  sUpdate is true 
9400: 61 6e 64 20 72 6f 77 69 64 43 68 6e 67 20 69 73  and rowidChng is
9410: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
9420: 72 6f 77 69 64 43 68 6e 67 20 63 6f 6e 74 61 69  rowidChng contai
9430: 6e 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  ns.** the addres
9440: 73 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20  s of a register 
9450: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72  containing the r
9460: 6f 77 69 64 20 62 65 66 6f 72 65 20 74 68 65 20  owid before the 
9470: 75 70 64 61 74 65 20 74 61 6b 65 73 0a 2a 2a 20  update takes.** 
9480: 70 6c 61 63 65 2e 20 69 73 55 70 64 61 74 65 20  place. isUpdate 
9490: 69 73 20 74 72 75 65 20 66 6f 72 20 55 50 44 41  is true for UPDA
94a0: 54 45 73 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  TEs and false fo
94b0: 72 20 49 4e 53 45 52 54 73 2e 20 49 66 20 69 73  r INSERTs. If is
94c0: 55 70 64 61 74 65 0a 2a 2a 20 69 73 20 66 61 6c  Update.** is fal
94d0: 73 65 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  se, indicating a
94e0: 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  n INSERT stateme
94f0: 6e 74 2c 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 7a  nt, then a non-z
9500: 65 72 6f 20 72 6f 77 69 64 43 68 6e 67 20 0a 2a  ero rowidChng .*
9510: 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  * indicates that
9520: 20 74 68 65 20 72 6f 77 69 64 20 77 61 73 20 65   the rowid was e
9530: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
9540: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
9550: 68 65 0a 2a 2a 20 49 4e 53 45 52 54 20 73 74 61  he.** INSERT sta
9560: 74 65 6d 65 6e 74 2e 20 49 66 20 72 6f 77 69 64  tement. If rowid
9570: 43 68 6e 67 20 69 73 20 66 61 6c 73 65 2c 20 69  Chng is false, i
9580: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 20 74 68  t means that  th
9590: 65 20 72 6f 77 69 64 20 69 73 0a 2a 2a 20 63 6f  e rowid is.** co
95a0: 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63  mputed automatic
95b0: 61 6c 6c 79 20 69 6e 20 61 6e 20 69 6e 73 65 72  ally in an inser
95c0: 74 20 6f 72 20 74 68 61 74 20 74 68 65 20 72 6f  t or that the ro
95d0: 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 74  wid value is not
95e0: 20 0a 2a 2a 20 6d 6f 64 69 66 69 65 64 20 62 79   .** modified by
95f0: 20 61 6e 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a   an update..**.*
9600: 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
9610: 61 74 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  ated by this rou
9620: 74 69 6e 65 20 73 74 6f 72 65 20 6e 65 77 20 69  tine store new i
9630: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 69 6e 74  ndex entries int
9640: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69  o.** registers i
9650: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 52 65  dentified by aRe
9660: 67 49 64 78 5b 5d 2e 20 20 4e 6f 20 69 6e 64 65  gIdx[].  No inde
9670: 78 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74  x entry is creat
9680: 65 64 20 66 6f 72 0a 2a 2a 20 69 6e 64 69 63 65  ed for.** indice
9690: 73 20 77 68 65 72 65 20 61 52 65 67 49 64 78 5b  s where aRegIdx[
96a0: 69 5d 3d 3d 30 2e 20 20 54 68 65 20 6f 72 64 65  i]==0.  The orde
96b0: 72 20 6f 66 20 69 6e 64 69 63 65 73 20 69 6e 20  r of indices in 
96c0: 61 52 65 67 49 64 78 5b 5d 20 69 73 0a 2a 2a 20  aRegIdx[] is.** 
96d0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
96e0: 6f 72 64 65 72 20 6f 66 20 69 6e 64 69 63 65 73  order of indices
96f0: 20 6f 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   on the linked l
9700: 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 0a 2a  ist of indices.*
9710: 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  * attached to th
9720: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
9730: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
9740: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
9750: 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  to check constra
9760: 69 6e 74 73 2e 20 20 4e 4f 54 20 4e 55 4c 4c 2c  ints.  NOT NULL,
9770: 0a 2a 2a 20 43 48 45 43 4b 2c 20 61 6e 64 20 55  .** CHECK, and U
9780: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
9790: 73 20 61 72 65 20 61 6c 6c 20 63 68 65 63 6b 65  s are all checke
97a0: 64 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  d.  If a constra
97b0: 69 6e 74 20 66 61 69 6c 73 2c 0a 2a 2a 20 74 68  int fails,.** th
97c0: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
97d0: 74 65 20 61 63 74 69 6f 6e 20 69 73 20 70 65 72  te action is per
97e0: 66 6f 72 6d 65 64 2e 20 20 54 68 65 72 65 20 61  formed.  There a
97f0: 72 65 20 66 69 76 65 20 70 6f 73 73 69 62 6c 65  re five possible
9800: 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a 20 52 4f 4c  .** actions: ROL
9810: 4c 42 41 43 4b 2c 20 41 42 4f 52 54 2c 20 46 41  LBACK, ABORT, FA
9820: 49 4c 2c 20 52 45 50 4c 41 43 45 2c 20 61 6e 64  IL, REPLACE, and
9830: 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20 20   IGNORE..**.**  
9840: 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
9850: 20 41 63 74 69 6f 6e 20 20 20 20 20 20 20 57 68   Action       Wh
9860: 61 74 20 48 61 70 70 65 6e 73 0a 2a 2a 20 20 2d  at Happens.**  -
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d  ----------   ---
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98b0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e 79 20 20 20  -----.**  any   
98c0: 20 20 20 20 20 20 20 20 20 20 20 52 4f 4c 4c 42             ROLLB
98d0: 41 43 4b 20 20 20 20 20 54 68 65 20 63 75 72 72  ACK     The curr
98e0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
98f0: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  is rolled back a
9900: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
9930: 63 28 29 20 72 65 74 75 72 6e 73 20 69 6d 6d 65  c() returns imme
9940: 64 69 61 74 65 6c 79 20 77 69 74 68 20 61 0a 2a  diately with a.*
9950: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
9980: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9990: 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20  T..**.**  any   
99a0: 20 20 20 20 20 20 20 20 20 20 20 41 42 4f 52 54             ABORT
99b0: 20 20 20 20 20 20 20 20 42 61 63 6b 20 6f 75 74          Back out
99c0: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 74 68   changes from th
99d0: 65 20 63 75 72 72 65 6e 74 20 63 6f 6d 6d 61 6e  e current comman
99e0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 20 20 20 20 6f 6e 6c 79 20 28 64 6f 20 6e 6f 74      only (do not
9a10: 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 20 72   do a complete r
9a20: 6f 6c 6c 62 61 63 6b 29 20 74 68 65 6e 0a 2a 2a  ollback) then.**
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 65 78  cause sqlite3_ex
9a60: 65 63 28 29 20 74 6f 20 72 65 74 75 72 6e 20 69  ec() to return i
9a70: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74               wit
9aa0: 68 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  h SQLITE_CONSTRA
9ab0: 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20  INT..**.**  any 
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 41 49               FAI
9ad0: 4c 20 20 20 20 20 20 20 20 20 53 71 6c 69 74 65  L         Sqlite
9ae0: 5f 65 78 65 63 28 29 20 72 65 74 75 72 6e 73 20  _exec() returns 
9af0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68  immediately with
9b00: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65       return code
9b30: 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   of SQLITE_CONST
9b40: 52 41 49 4e 54 2e 20 20 54 68 65 0a 2a 2a 20 20  RAINT.  The.**  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
9b70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
9b80: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
9b90: 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20 20   any.**         
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 70 72 69 6f 72 20 63 68 61         prior cha
9bc0: 6e 67 65 73 20 61 72 65 20 72 65 74 61 69 6e 65  nges are retaine
9bd0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20  d..**.**  any   
9be0: 20 20 20 20 20 20 20 20 20 20 20 49 47 4e 4f 52             IGNOR
9bf0: 45 20 20 20 20 20 20 20 54 68 65 20 72 65 63 6f  E       The reco
9c00: 72 64 20 6e 75 6d 62 65 72 20 61 6e 64 20 64 61  rd number and da
9c10: 74 61 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f  ta is popped fro
9c20: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  m.**            
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 74 68 65 20 73 74 61 63 6b 20 61 6e      the stack an
9c50: 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6d  d there is an im
9c60: 6d 65 64 69 61 74 65 20 6a 75 6d 70 0a 2a 2a 20  mediate jump.** 
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
9c90: 6f 20 6c 61 62 65 6c 20 69 67 6e 6f 72 65 44 65  o label ignoreDe
9ca0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20 4e  st..**.**  NOT N
9cb0: 55 4c 4c 20 20 20 20 20 20 20 20 20 52 45 50 4c  ULL         REPL
9cc0: 41 43 45 20 20 20 20 20 20 54 68 65 20 4e 55 4c  ACE      The NUL
9cd0: 4c 20 76 61 6c 75 65 20 69 73 20 72 65 70 6c 61  L value is repla
9ce0: 63 65 20 62 79 20 74 68 65 20 64 65 66 61 75 6c  ce by the defaul
9cf0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 76 61 6c 75 65 20 66 6f 72 20 74 68      value for th
9d20: 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  at column.  If t
9d30: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
9d40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20     is NULL, the 
9d70: 61 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61  action is the sa
9d80: 6d 65 20 61 73 20 41 42 4f 52 54 2e 0a 2a 2a 0a  me as ABORT..**.
9d90: 2a 2a 20 20 55 4e 49 51 55 45 20 20 20 20 20 20  **  UNIQUE      
9da0: 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20 20       REPLACE    
9db0: 20 20 54 68 65 20 6f 74 68 65 72 20 72 6f 77 20    The other row 
9dc0: 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
9dd0: 69 74 68 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20  ith the row.**  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
9e00: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69 73 20  ing inserted is 
9e10: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  removed..**.**  
9e20: 43 48 45 43 4b 20 20 20 20 20 20 20 20 20 20 20  CHECK           
9e30: 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 49 6c   REPLACE      Il
9e40: 6c 65 67 61 6c 2e 20 20 54 68 65 20 72 65 73 75  legal.  The resu
9e50: 6c 74 73 20 69 6e 20 61 6e 20 65 78 63 65 70 74  lts in an except
9e60: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63 68  ion..**.** Which
9e70: 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   action to take 
9e80: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
9e90: 20 74 68 65 20 6f 76 65 72 72 69 64 65 45 72 72   the overrideErr
9ea0: 6f 72 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  or parameter..**
9eb0: 20 4f 72 20 69 66 20 6f 76 65 72 72 69 64 65 45   Or if overrideE
9ec0: 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
9ed0: 2c 20 74 68 65 6e 20 74 68 65 20 70 50 61 72 73  , then the pPars
9ee0: 65 2d 3e 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  e->onError param
9ef0: 65 74 65 72 0a 2a 2a 20 69 73 20 75 73 65 64 2e  eter.** is used.
9f00: 20 20 4f 72 20 69 66 20 70 50 61 72 73 65 2d 3e    Or if pParse->
9f10: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
9f20: 75 6c 74 20 74 68 65 6e 20 74 68 65 20 6f 6e 45  ult then the onE
9f30: 72 72 6f 72 20 76 61 6c 75 65 0a 2a 2a 20 66 6f  rror value.** fo
9f40: 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
9f50: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
9f60: 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  The calling rout
9f70: 69 6e 65 20 6d 75 73 74 20 6f 70 65 6e 20 61 20  ine must open a 
9f80: 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
9f90: 72 20 66 6f 72 20 70 54 61 62 20 77 69 74 68 0a  r for pTab with.
9fa0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
9fb0: 20 22 62 61 73 65 43 75 72 22 2e 20 20 41 6c 6c   "baseCur".  All
9fc0: 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
9fd0: 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20   must also have 
9fe0: 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 2f 77 72 69  open.** read/wri
9ff0: 74 65 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  te cursors with 
a000: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 62 61  cursor number ba
a010: 73 65 43 75 72 2b 69 20 66 6f 72 20 74 68 65 20  seCur+i for the 
a020: 69 2d 74 68 20 63 75 72 73 6f 72 2e 0a 2a 2a 20  i-th cursor..** 
a030: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 72 65  Except, if there
a040: 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69   is no possibili
a050: 74 79 20 6f 66 20 61 20 52 45 50 4c 41 43 45 20  ty of a REPLACE 
a060: 61 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 63  action then.** c
a070: 75 72 73 6f 72 73 20 64 6f 20 6e 6f 74 20 6e 65  ursors do not ne
a080: 65 64 20 74 6f 20 62 65 20 6f 70 65 6e 20 66 6f  ed to be open fo
a090: 72 20 69 6e 64 69 63 65 73 20 77 68 65 72 65 20  r indices where 
a0a0: 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 2e 0a 2a  aRegIdx[i]==0..*
a0b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65  /.void sqlite3Ge
a0c0: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
a0d0: 43 68 65 63 6b 73 28 0a 20 20 50 61 72 73 65 20  Checks(.  Parse 
a0e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
a0f0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
a100: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
a110: 70 54 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  pTab,        /* 
a120: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
a130: 68 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65  hich we are inse
a140: 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  rting */.  int b
a150: 61 73 65 43 75 72 2c 20 20 20 20 20 20 20 20 2f  aseCur,        /
a160: 2a 20 49 6e 64 65 78 20 6f 66 20 61 20 72 65 61  * Index of a rea
a170: 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 70  d/write cursor p
a180: 6f 69 6e 74 69 6e 67 20 61 74 20 70 54 61 62 20  ointing at pTab 
a190: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  */.  int regRowi
a1a0: 64 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  d,       /* Inde
a1b0: 78 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 6f  x of the range o
a1c0: 66 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  f input register
a1d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67  s */.  int *aReg
a1e0: 49 64 78 2c 20 20 20 20 20 20 20 2f 2a 20 52 65  Idx,       /* Re
a1f0: 67 69 73 74 65 72 20 75 73 65 64 20 62 79 20 65  gister used by e
a200: 61 63 68 20 69 6e 64 65 78 2e 20 20 30 20 66 6f  ach index.  0 fo
a210: 72 20 75 6e 75 73 65 64 20 69 6e 64 69 63 65 73  r unused indices
a220: 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 77 69 64 43   */.  int rowidC
a230: 68 6e 67 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  hng,      /* Tru
a240: 65 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 6d  e if the rowid m
a250: 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
a260: 68 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  h existing entry
a270: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70 64 61   */.  int isUpda
a280: 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75  te,       /* Tru
a290: 65 20 66 6f 72 20 55 50 44 41 54 45 2c 20 46 61  e for UPDATE, Fa
a2a0: 6c 73 65 20 66 6f 72 20 49 4e 53 45 52 54 20 2a  lse for INSERT *
a2b0: 2f 0a 20 20 69 6e 74 20 6f 76 65 72 72 69 64 65  /.  int override
a2c0: 45 72 72 6f 72 2c 20 20 2f 2a 20 4f 76 65 72 72  Error,  /* Overr
a2d0: 69 64 65 20 6f 6e 45 72 72 6f 72 20 74 6f 20 74  ide onError to t
a2e0: 68 69 73 20 69 66 20 6e 6f 74 20 4f 45 5f 44 65  his if not OE_De
a2f0: 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  fault */.  int i
a300: 67 6e 6f 72 65 44 65 73 74 2c 20 20 20 20 20 2f  gnoreDest,     /
a310: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
a320: 61 62 65 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49 67  abel on an OE_Ig
a330: 6e 6f 72 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  nore resolution 
a340: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4d 61 79 52  */.  int *pbMayR
a350: 65 70 6c 61 63 65 20 20 20 2f 2a 20 4f 55 54 3a  eplace   /* OUT:
a360: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
a370: 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 63  constraint may c
a380: 61 75 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a  ause a replace *
a390: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
a3b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
a3c0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
a3d0: 20 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65      /* VDBE unde
a3e0: 72 20 63 6f 6e 73 74 72 75 74 69 6f 6e 20 2a 2f  r constrution */
a3f0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
a400: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a410: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
a420: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 3b 20 20 20   int onError;   
a430: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
a440: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61   resolution stra
a450: 74 65 67 79 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  tegy */.  int j1
a460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a470: 20 41 64 64 72 65 73 73 73 20 6f 66 20 6a 75 6d   Addresss of jum
a480: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  p instruction */
a490: 0a 20 20 69 6e 74 20 6a 32 20 3d 20 30 2c 20 6a  .  int j2 = 0, j
a4a0: 33 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  3;     /* Addres
a4b0: 73 65 73 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74  ses of jump inst
a4c0: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
a4d0: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
a4e0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
a4f0: 6e 74 61 69 6e 69 6e 67 20 66 69 72 73 74 20 64  ntaining first d
a500: 61 74 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ata column */.  
a510: 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
a520: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75 72      /* Table cur
a530: 73 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  sor number */.  
a540: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
a550: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
a560: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  to one of the in
a570: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73  dices */.  int s
a580: 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 30 3b 20  eenReplace = 0; 
a590: 2f 2a 20 54 72 75 65 20 69 66 20 52 45 50 4c 41  /* True if REPLA
a5a0: 43 45 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  CE is used to re
a5b0: 73 6f 6c 76 65 20 49 4e 54 20 50 4b 20 63 6f 6e  solve INT PK con
a5c0: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  flict */.  int r
a5d0: 65 67 4f 6c 64 52 6f 77 69 64 20 3d 20 28 72 6f  egOldRowid = (ro
a5e0: 77 69 64 43 68 6e 67 20 26 26 20 69 73 55 70 64  widChng && isUpd
a5f0: 61 74 65 29 20 3f 20 72 6f 77 69 64 43 68 6e 67  ate) ? rowidChng
a600: 20 3a 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20   : regRowid;..  
a610: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a620: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
a630: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
a640: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53  assert( pTab->pS
a650: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  elect==0 );  /* 
a660: 54 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e 6f  This table is no
a670: 74 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 6e 43  t a VIEW */.  nC
a680: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol = pTab->nCol;
a690: 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72 65 67  .  regData = reg
a6a0: 52 6f 77 69 64 20 2b 20 31 3b 0a 0a 20 20 2f 2a  Rowid + 1;..  /*
a6b0: 20 54 65 73 74 20 61 6c 6c 20 4e 4f 54 20 4e 55   Test all NOT NU
a6c0: 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  LL constraints..
a6d0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
a6e0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
a6f0: 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69    if( i==pTab->i
a700: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 63 6f  PKey ){.      co
a710: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
a720: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61 62    onError = pTab
a730: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
a740: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  l;.    if( onErr
a750: 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
a760: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a770: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f  overrideError!=O
a780: 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
a790: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65     onError = ove
a7a0: 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20 20  rrideError;.    
a7b0: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f  }else if( onErro
a7c0: 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
a7d0: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
a7e0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
a7f0: 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
a800: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 26 26 20  ==OE_Replace && 
a810: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44  pTab->aCol[i].pD
a820: 66 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  flt==0 ){.      
a830: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
a840: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rt;.    }.    as
a850: 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f  sert( onError==O
a860: 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e  E_Rollback || on
a870: 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
a880: 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46  || onError==OE_F
a890: 61 69 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f  ail.        || o
a8a0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72  nError==OE_Ignor
a8b0: 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  e || onError==OE
a8c0: 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20  _Replace );.    
a8d0: 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20  switch( onError 
a8e0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  ){.      case OE
a8f0: 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 20 20  _Abort:.        
a900: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
a910: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
a920: 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a  ase OE_Rollback:
a930: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46  .      case OE_F
a940: 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 63  ail: {.        c
a950: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20  har *zMsg;.     
a960: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
a970: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a980: 48 61 6c 74 49 66 4e 75 6c 6c 2c 0a 20 20 20 20  HaltIfNull,.    
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
a9b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
a9c0: 20 6f 6e 45 72 72 6f 72 2c 20 72 65 67 44 61 74   onError, regDat
a9d0: 61 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7a 4d  a+i);.        zM
a9e0: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a9f0: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
aa00: 22 25 73 2e 25 73 20 6d 61 79 20 6e 6f 74 20 62  "%s.%s may not b
aa10: 65 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 20 20 20  e NULL",.       
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
aa40: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
aa50: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
aa60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
aa70: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 4d 73  ngeP4(v, -1, zMs
aa80: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
aa90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
aaa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
aab0: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20  e OE_Ignore: {. 
aac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aad0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
aae0: 73 4e 75 6c 6c 2c 20 72 65 67 44 61 74 61 2b 69  sNull, regData+i
aaf0: 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20  , ignoreDest);. 
ab00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab10: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
ab20: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
ab30: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
ab40: 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20  OE_Replace );.  
ab50: 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
ab60: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ab70: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 44  OP_NotNull, regD
ab80: 61 74 61 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  ata+i);.        
ab90: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
aba0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43  pParse, pTab->aC
abb0: 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67  ol[i].pDflt, reg
abc0: 44 61 74 61 2b 69 29 3b 0a 20 20 20 20 20 20 20  Data+i);.       
abd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
abe0: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
abf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ac00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ac10: 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 43 48 45   /* Test all CHE
ac20: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  CK constraints. 
ac30: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
ac40: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
ac50: 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  if( pTab->pCheck
ac60: 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d   && (pParse->db-
ac70: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
ac80: 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30  IgnoreChecks)==0
ac90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6c 6c 4f   ){.    int allO
aca0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
acb0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
acc0: 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 20   pParse->ckBase 
acd0: 3d 20 72 65 67 44 61 74 61 3b 0a 20 20 20 20 73  = regData;.    s
ace0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
acf0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  (pParse, pTab->p
ad00: 43 68 65 63 6b 2c 20 61 6c 6c 4f 6b 2c 20 53 51  Check, allOk, SQ
ad10: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
ad20: 3b 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20  ;.    onError = 
ad30: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f  overrideError!=O
ad40: 45 5f 44 65 66 61 75 6c 74 20 3f 20 6f 76 65 72  E_Default ? over
ad50: 72 69 64 65 45 72 72 6f 72 20 3a 20 4f 45 5f 41  rideError : OE_A
ad60: 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 6f 6e  bort;.    if( on
ad70: 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65  Error==OE_Ignore
ad80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ad90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ada0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72  P_Goto, 0, ignor
adb0: 65 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  eDest);.    }els
adc0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
add0: 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
ade0: 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  Parse, onError, 
adf0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
ae00: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ae10: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f  lveLabel(v, allO
ae20: 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  k);.  }.#endif /
ae30: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
ae40: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
ae50: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
ae60: 65 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  e an INTEGER PRI
ae70: 4d 41 52 59 20 4b 45 59 2c 20 6d 61 6b 65 20 73  MARY KEY, make s
ae80: 75 72 65 20 74 68 65 20 70 72 69 6d 61 72 79 20  ure the primary 
ae90: 6b 65 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  key.  ** of the 
aea0: 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20  new record does 
aeb0: 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65  not previously e
aec0: 78 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 69  xist.  Except, i
aed0: 66 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 61  f this.  ** is a
aee0: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 74 68 65  n UPDATE and the
aef0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
af00: 6e 6f 74 20 63 68 61 6e 67 69 6e 67 2c 20 74 68  not changing, th
af10: 61 74 20 69 73 20 4f 4b 2e 0a 20 20 2a 2f 0a 20  at is OK..  */. 
af20: 20 69 66 28 20 72 6f 77 69 64 43 68 6e 67 20 29   if( rowidChng )
af30: 7b 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20  {.    onError = 
af40: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20  pTab->keyConf;. 
af50: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
af60: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
af70: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
af80: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
af90: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
afa0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
afb0: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e  ault ){.      on
afc0: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
afd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
afe0: 20 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b   if( isUpdate ){
aff0: 0a 20 20 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  .      j2 = sqli
b000: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b010: 20 4f 50 5f 45 71 2c 20 72 65 67 52 6f 77 69 64   OP_Eq, regRowid
b020: 2c 20 30 2c 20 72 6f 77 69 64 43 68 6e 67 29 3b  , 0, rowidChng);
b030: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 33 20 3d 20  .    }.    j3 = 
b040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b050: 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
b060: 73 2c 20 62 61 73 65 43 75 72 2c 20 30 2c 20 72  s, baseCur, 0, r
b070: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 77  egRowid);.    sw
b080: 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b  itch( onError ){
b090: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
b0a0: 7b 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  {.        onErro
b0b0: 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r = OE_Abort;.  
b0c0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
b0d0: 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  ru into the next
b0e0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
b0f0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52  .      case OE_R
b100: 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63  ollback:.      c
b110: 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20  ase OE_Abort:.  
b120: 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c      case OE_Fail
b130: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
b140: 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
b150: 74 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  t(.          pPa
b160: 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 22 50  rse, onError, "P
b170: 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20  RIMARY KEY must 
b180: 62 65 20 75 6e 69 71 75 65 22 2c 20 50 34 5f 53  be unique", P4_S
b190: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
b1a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b1b0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70       case OE_Rep
b1c0: 6c 61 63 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  lace: {.        
b1d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
b1e0: 44 45 4c 45 54 45 20 74 72 69 67 67 65 72 73 20  DELETE triggers 
b1f0: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 61 6e  on this table an
b200: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
b210: 20 72 65 63 75 72 73 69 76 65 2d 74 72 69 67 67   recursive-trigg
b220: 65 72 73 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ers flag is set,
b230: 20 63 61 6c 6c 20 47 65 6e 65 72 61 74 65 52 6f   call GenerateRo
b240: 77 44 65 6c 65 74 65 28 29 20 74 6f 0a 20 20 20  wDelete() to.   
b250: 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 20 74       ** remove t
b260: 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  he conflicting r
b270: 6f 77 20 66 72 6f 6d 20 74 68 65 20 74 68 65 20  ow from the the 
b280: 74 61 62 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c  table. This will
b290: 20 66 69 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   fire.        **
b2a0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 61 6e   the triggers an
b2b0: 64 20 72 65 6d 6f 76 65 20 62 6f 74 68 20 74 68  d remove both th
b2c0: 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  e table and inde
b2d0: 78 20 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73  x b-tree entries
b2e0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
b2f0: 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
b300: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
b310: 6e 6f 20 74 72 69 67 67 65 72 73 20 6f 72 20 74  no triggers or t
b320: 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 72 69  he recursive-tri
b330: 67 67 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  ggers.        **
b340: 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
b350: 2c 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  , but the table 
b360: 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
b370: 69 6e 64 65 78 65 73 2c 20 63 61 6c 6c 20 0a 20  indexes, call . 
b380: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
b390: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
b3a0: 28 29 2e 20 54 68 69 73 20 72 65 6d 6f 76 65 73  (). This removes
b3b0: 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
b3c0: 65 20 65 6e 74 72 69 65 73 20 0a 20 20 20 20 20  e entries .     
b3d0: 20 20 20 2a 2a 20 6f 6e 6c 79 2e 20 54 68 65 20     ** only. The 
b3e0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 65 6e 74  table b-tree ent
b3f0: 72 79 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  ry will be repla
b400: 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 65  ced by the new e
b410: 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ntry .        **
b420: 20 77 68 65 6e 20 69 74 20 69 73 20 69 6e 73 65   when it is inse
b430: 72 74 65 64 2e 20 20 0a 20 20 20 20 20 20 20 20  rted.  .        
b440: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
b450: 20 65 69 74 68 65 72 20 47 65 6e 65 72 61 74 65   either Generate
b460: 52 6f 77 44 65 6c 65 74 65 28 29 20 6f 72 20 47  RowDelete() or G
b470: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
b480: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
b490: 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  d,.        ** al
b4a0: 73 6f 20 69 6e 76 6f 6b 65 20 4d 75 6c 74 69 57  so invoke MultiW
b4b0: 72 69 74 65 28 29 20 74 6f 20 69 6e 64 69 63 61  rite() to indica
b4c0: 74 65 20 74 68 61 74 20 74 68 69 73 20 56 44 42  te that this VDB
b4d0: 45 20 6d 61 79 20 72 65 71 75 69 72 65 0a 20 20  E may require.  
b4e0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
b4f0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 28 69 66 20  nt rollback (if 
b500: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
b510: 20 61 62 6f 72 74 65 64 20 61 66 74 65 72 20 74   aborted after t
b520: 68 65 20 64 65 6c 65 74 65 0a 20 20 20 20 20 20  he delete.      
b530: 20 20 2a 2a 20 74 61 6b 65 73 20 70 6c 61 63 65    ** takes place
b540: 29 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ). Earlier versi
b550: 6f 6e 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74  ons called sqlit
b560: 65 33 4d 75 6c 74 69 57 72 69 74 65 28 29 20 72  e3MultiWrite() r
b570: 65 67 61 72 64 6c 65 73 73 2c 0a 20 20 20 20 20  egardless,.     
b580: 20 20 20 2a 2a 20 62 75 74 20 62 65 69 6e 67 20     ** but being 
b590: 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 68  more selective h
b5a0: 65 72 65 20 61 6c 6c 6f 77 73 20 73 74 61 74 65  ere allows state
b5b0: 6d 65 6e 74 73 20 6c 69 6b 65 3a 0a 20 20 20 20  ments like:.    
b5c0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
b5d0: 2a 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f  *   REPLACE INTO
b5e0: 20 74 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53   t(rowid) VALUES
b5f0: 28 24 6e 65 77 72 6f 77 69 64 29 0a 20 20 20 20  ($newrowid).    
b600: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
b610: 2a 20 74 6f 20 72 75 6e 20 77 69 74 68 6f 75 74  * to run without
b620: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75   a statement jou
b630: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 61 72  rnal if there ar
b640: 65 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  e no indexes on 
b650: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  the.        ** t
b660: 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  able..        */
b670: 0a 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72  .        Trigger
b680: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a   *pTrigger = 0;.
b690: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
b6a0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  se->db->flags&SQ
b6b0: 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
b6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
b6d0: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
b6e0: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50  TriggersExist(pP
b6f0: 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44  arse, pTab, TK_D
b700: 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20  ELETE, 0, 0);.  
b710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b720: 69 66 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20  if( pTrigger || 
b730: 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65  sqlite3FkRequire
b740: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  d(pParse, pTab, 
b750: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
b760: 20 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57     sqlite3MultiW
b770: 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  rite(pParse);.  
b780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
b790: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
b7a0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
b7b0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 62 61  pParse, pTab, ba
b7c0: 73 65 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c  seCur, regRowid,
b7d0: 20 30 2c 20 70 54 72 69 67 67 65 72 2c 20 4f 45   0, pTrigger, OE
b7e0: 5f 52 65 70 6c 61 63 65 0a 20 20 20 20 20 20 20  _Replace.       
b7f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
b800: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 49  lse if( pTab->pI
b810: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
b820: 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72    sqlite3MultiWr
b830: 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ite(pParse);.   
b840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
b850: 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65  nerateRowIndexDe
b860: 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61  lete(pParse, pTa
b870: 62 2c 20 62 61 73 65 43 75 72 2c 20 30 29 3b 0a  b, baseCur, 0);.
b880: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b890: 20 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20    seenReplace = 
b8a0: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
b8b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b8c0: 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
b8d0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b8e0: 28 20 73 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30  ( seenReplace==0
b8f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
b900: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b910: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 67 6e   OP_Goto, 0, ign
b920: 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20  oreDest);.      
b930: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b940: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b950: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b960: 2c 20 6a 33 29 3b 0a 20 20 20 20 69 66 28 20 69  , j3);.    if( i
b970: 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  sUpdate ){.     
b980: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b990: 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20  Here(v, j2);.   
b9a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73   }.  }..  /* Tes
b9b0: 74 20 61 6c 6c 20 55 4e 49 51 55 45 20 63 6f 6e  t all UNIQUE con
b9c0: 73 74 72 61 69 6e 74 73 20 62 79 20 63 72 65 61  straints by crea
b9d0: 74 69 6e 67 20 65 6e 74 72 69 65 73 20 66 6f 72  ting entries for
b9e0: 20 65 61 63 68 20 55 4e 49 51 55 45 0a 20 20 2a   each UNIQUE.  *
b9f0: 2a 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 69  * index and maki
ba00: 6e 67 20 73 75 72 65 20 74 68 61 74 20 64 75 70  ng sure that dup
ba10: 6c 69 63 61 74 65 20 65 6e 74 72 69 65 73 20 64  licate entries d
ba20: 6f 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  o not already ex
ba30: 69 73 74 2e 0a 20 20 2a 2a 20 41 64 64 20 74 68  ist..  ** Add th
ba40: 65 20 6e 65 77 20 72 65 63 6f 72 64 73 20 74 6f  e new records to
ba50: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 73 20   the indices as 
ba60: 77 65 20 67 6f 2e 0a 20 20 2a 2f 0a 20 20 66 6f  we go..  */.  fo
ba70: 72 28 69 43 75 72 3d 30 2c 20 70 49 64 78 3d 70  r(iCur=0, pIdx=p
ba80: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
ba90: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
baa0: 65 78 74 2c 20 69 43 75 72 2b 2b 29 7b 0a 20 20  ext, iCur++){.  
bab0: 20 20 69 6e 74 20 72 65 67 49 64 78 3b 0a 20 20    int regIdx;.  
bac0: 20 20 69 6e 74 20 72 65 67 52 3b 0a 0a 20 20 20    int regR;..   
bad0: 20 69 66 28 20 61 52 65 67 49 64 78 5b 69 43 75   if( aRegIdx[iCu
bae0: 72 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  r]==0 ) continue
baf0: 3b 20 20 2f 2a 20 53 6b 69 70 20 75 6e 75 73 65  ;  /* Skip unuse
bb00: 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 0a 20 20  d indices */..  
bb10: 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6b 65    /* Create a ke
bb20: 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  y for accessing 
bb30: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
bb40: 2a 2f 0a 20 20 20 20 72 65 67 49 64 78 20 3d 20  */.    regIdx = 
bb50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
bb60: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  nge(pParse, pIdx
bb70: 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20  ->nColumn+1);.  
bb80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
bb90: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
bba0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20  {.      int idx 
bbb0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
bbc0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 69  [i];.      if( i
bbd0: 64 78 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  dx==pTab->iPKey 
bbe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bbf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bc00: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 52 6f 77  OP_SCopy, regRow
bc10: 69 64 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20  id, regIdx+i);. 
bc20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bc30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
bc50: 79 2c 20 72 65 67 44 61 74 61 2b 69 64 78 2c 20  y, regData+idx, 
bc60: 72 65 67 49 64 78 2b 69 29 3b 0a 20 20 20 20 20  regIdx+i);.     
bc70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
bc80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bc90: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 52  , OP_SCopy, regR
bca0: 6f 77 69 64 2c 20 72 65 67 49 64 78 2b 69 29 3b  owid, regIdx+i);
bcb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bcc0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
bcd0: 65 52 65 63 6f 72 64 2c 20 72 65 67 49 64 78 2c  eRecord, regIdx,
bce0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31   pIdx->nColumn+1
bcf0: 2c 20 61 52 65 67 49 64 78 5b 69 43 75 72 5d 29  , aRegIdx[iCur])
bd00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
bd10: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
bd20: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
bd30: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
bd40: 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ), 0);.    sqlit
bd50: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
bd60: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
bd70: 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e  , regIdx, pIdx->
bd80: 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20  nColumn+1);..   
bd90: 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61   /* Find out wha
bda0: 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  t action to take
bdb0: 20 69 6e 20 63 61 73 65 20 74 68 65 72 65 20 69   in case there i
bdc0: 73 20 61 6e 20 69 6e 64 65 78 69 6e 67 20 63 6f  s an indexing co
bdd0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 6f 6e  nflict */.    on
bde0: 45 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e  Error = pIdx->on
bdf0: 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f  Error;.    if( o
be00: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
be10: 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ){ .      sqlite
be20: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
be30: 65 28 70 50 61 72 73 65 2c 20 72 65 67 49 64 78  e(pParse, regIdx
be40: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  , pIdx->nColumn+
be50: 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  1);.      contin
be60: 75 65 3b 20 20 2f 2a 20 70 49 64 78 20 69 73 20  ue;  /* pIdx is 
be70: 6e 6f 74 20 61 20 55 4e 49 51 55 45 20 69 6e 64  not a UNIQUE ind
be80: 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ex */.    }.    
be90: 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f  if( overrideErro
bea0: 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r!=OE_Default ){
beb0: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
bec0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a   overrideError;.
bed0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
bee0: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
bef0: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
bf00: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
bf10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 65     }.    if( see
bf20: 6e 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  nReplace ){.    
bf30: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
bf40: 45 5f 49 67 6e 6f 72 65 20 29 20 6f 6e 45 72 72  E_Ignore ) onErr
bf50: 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
bf60: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
bf70: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c  onError==OE_Fail
bf80: 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f   ) onError = OE_
bf90: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
bfa0: 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74   .    /* Check t
bfb0: 6f 20 73 65 65 20 69 66 20 74 68 65 20 6e 65 77  o see if the new
bfc0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c   index entry wil
bfd0: 6c 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  l be unique */. 
bfe0: 20 20 20 72 65 67 52 20 3d 20 73 71 6c 69 74 65     regR = sqlite
bff0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c000: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
c010: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c020: 5f 53 43 6f 70 79 2c 20 72 65 67 4f 6c 64 52 6f  _SCopy, regOldRo
c030: 77 69 64 2c 20 72 65 67 52 29 3b 0a 20 20 20 20  wid, regR);.    
c040: 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
c050: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
c060: 6e 69 71 75 65 2c 20 62 61 73 65 43 75 72 2b 69  nique, baseCur+i
c070: 43 75 72 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20  Cur+1, 0,.      
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 20 20 72 65 67 52 2c 20 53 51 4c 49 54       regR, SQLIT
c0a0: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67  E_INT_TO_PTR(reg
c0b0: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
c0e0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
c0f0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
c100: 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43  regIdx, pIdx->nC
c110: 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20 2f  olumn+1);..    /
c120: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c130: 74 68 61 74 20 65 78 65 63 75 74 65 73 20 69 66  that executes if
c140: 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20 65   the new index e
c150: 6e 74 72 79 20 69 73 20 6e 6f 74 20 75 6e 69 71  ntry is not uniq
c160: 75 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ue */.    assert
c170: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f  ( onError==OE_Ro
c180: 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f  llback || onErro
c190: 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f  r==OE_Abort || o
c1a0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a  nError==OE_Fail.
c1b0: 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72          || onErr
c1c0: 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c  or==OE_Ignore ||
c1d0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
c1e0: 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69 74  lace );.    swit
c1f0: 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ch( onError ){. 
c200: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
c210: 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73  lback:.      cas
c220: 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20  e OE_Abort:.    
c230: 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20    case OE_Fail: 
c240: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
c250: 0a 20 20 20 20 20 20 20 20 53 74 72 41 63 63 75  .        StrAccu
c260: 6d 20 65 72 72 4d 73 67 3b 0a 20 20 20 20 20 20  m errMsg;.      
c270: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
c280: 65 70 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ep;.        char
c290: 20 2a 7a 45 72 72 3b 0a 0a 20 20 20 20 20 20 20   *zErr;..       
c2a0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
c2b0: 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 30 2c  Init(&errMsg, 0,
c2c0: 20 30 2c 20 32 30 30 29 3b 0a 20 20 20 20 20 20   0, 200);.      
c2d0: 20 20 65 72 72 4d 73 67 2e 64 62 20 3d 20 70 50    errMsg.db = pP
c2e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
c2f0: 20 20 7a 53 65 70 20 3d 20 70 49 64 78 2d 3e 6e    zSep = pIdx->n
c300: 43 6f 6c 75 6d 6e 3e 31 20 3f 20 22 63 6f 6c 75  Column>1 ? "colu
c310: 6d 6e 73 20 22 20 3a 20 22 63 6f 6c 75 6d 6e 20  mns " : "column 
c320: 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ";.        for(j
c330: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
c340: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
c350: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20       char *zCol 
c360: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
c370: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
c380: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
c390: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
c3a0: 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
c3b0: 7a 53 65 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20  zSep, -1);.     
c3c0: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
c3d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c3e0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
c3f0: 64 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 2c  d(&errMsg, zCol,
c400: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
c410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
c420: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
c430: 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrMsg,.         
c440: 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
c450: 3e 31 20 3f 20 22 20 61 72 65 20 6e 6f 74 20 75  >1 ? " are not u
c460: 6e 69 71 75 65 22 20 3a 20 22 20 69 73 20 6e 6f  nique" : " is no
c470: 74 20 75 6e 69 71 75 65 22 2c 20 2d 31 29 3b 0a  t unique", -1);.
c480: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
c490: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
c4a0: 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20  nish(&errMsg);. 
c4b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
c4c0: 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
c4d0: 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  rse, onError, zE
c4e0: 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
c4f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 65 72  sqlite3DbFree(er
c500: 72 4d 73 67 2e 64 62 2c 20 7a 45 72 72 29 3b 0a  rMsg.db, zErr);.
c510: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
c530: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20  e OE_Ignore: {. 
c540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
c550: 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b  eenReplace==0 );
c560: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c570: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c580: 5f 47 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65  _Goto, 0, ignore
c590: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Dest);.        b
c5a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c5b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
c5c0: 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a         Trigger *
c5d0: 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  pTrigger = 0;.  
c5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e        assert( on
c5f0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
c600: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
c610: 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70  ite3MultiWrite(p
c620: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
c630: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
c640: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 63  flags&SQLITE_Rec
c650: 54 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20  Triggers ){.    
c660: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
c670: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73   sqlite3Triggers
c680: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
c690: 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30  ab, TK_DELETE, 0
c6a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
c6b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
c6c0: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
c6d0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
c6e0: 61 72 73 65 2c 20 70 54 61 62 2c 20 62 61 73 65  arse, pTab, base
c6f0: 43 75 72 2c 20 72 65 67 52 2c 20 30 2c 20 70 54  Cur, regR, 0, pT
c700: 72 69 67 67 65 72 2c 20 4f 45 5f 52 65 70 6c 61  rigger, OE_Repla
c710: 63 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ce.        );.  
c720: 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61 63        seenReplac
c730: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
c740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c750: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
c760: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
c770: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  3);.    sqlite3R
c780: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
c790: 61 72 73 65 2c 20 72 65 67 52 29 3b 0a 20 20 7d  arse, regR);.  }
c7a0: 0a 20 20 0a 20 20 69 66 28 20 70 62 4d 61 79 52  .  .  if( pbMayR
c7b0: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 2a 70  eplace ){.    *p
c7c0: 62 4d 61 79 52 65 70 6c 61 63 65 20 3d 20 73 65  bMayReplace = se
c7d0: 65 6e 52 65 70 6c 61 63 65 3b 0a 20 20 7d 0a 7d  enReplace;.  }.}
c7e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c7f0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
c800: 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20 74 68  ode to finish th
c810: 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  e INSERT or UPDA
c820: 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  TE operation.** 
c830: 74 68 61 74 20 77 61 73 20 73 74 61 72 74 65 64  that was started
c840: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
c850: 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72   to sqlite3Gener
c860: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
c870: 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65 63  cks..** A consec
c880: 75 74 69 76 65 20 72 61 6e 67 65 20 6f 66 20 72  utive range of r
c890: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
c8a0: 67 20 61 74 20 72 65 67 52 6f 77 69 64 20 63 6f  g at regRowid co
c8b0: 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
c8c0: 77 69 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  wid and the cont
c8d0: 65 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ent to be insert
c8e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  ed..**.** The ar
c8f0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20  guments to this 
c900: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
c910: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
c920: 65 20 66 69 72 73 74 20 73 69 78 0a 2a 2a 20 61  e first six.** a
c930: 72 67 75 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69  rguments to sqli
c940: 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
c950: 72 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a  raintChecks..*/.
c960: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 70  void sqlite3Comp
c970: 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20  leteInsertion(. 
c980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c990: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
c9a0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
c9b0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
c9c0: 20 20 20 20 2f 2a 20 74 68 65 20 74 61 62 6c 65      /* the table
c9d0: 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
c9e0: 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a  re inserting */.
c9f0: 20 20 69 6e 74 20 62 61 73 65 43 75 72 2c 20 20    int baseCur,  
ca00: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
ca10: 66 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63  f a read/write c
ca20: 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61  ursor pointing a
ca30: 74 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  t pTab */.  int 
ca40: 72 65 67 52 6f 77 69 64 2c 20 20 20 20 20 20 20  regRowid,       
ca50: 2f 2a 20 52 61 6e 67 65 20 6f 66 20 63 6f 6e 74  /* Range of cont
ca60: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ent */.  int *aR
ca70: 65 67 49 64 78 2c 20 20 20 20 20 20 20 2f 2a 20  egIdx,       /* 
ca80: 52 65 67 69 73 74 65 72 20 75 73 65 64 20 62 79  Register used by
ca90: 20 65 61 63 68 20 69 6e 64 65 78 2e 20 20 30 20   each index.  0 
caa0: 66 6f 72 20 75 6e 75 73 65 64 20 69 6e 64 69 63  for unused indic
cab0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70  es */.  int isUp
cac0: 64 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  date,       /* T
cad0: 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 2c 20  rue for UPDATE, 
cae0: 46 61 6c 73 65 20 66 6f 72 20 49 4e 53 45 52 54  False for INSERT
caf0: 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
cb00: 42 69 61 73 2c 20 20 20 20 20 2f 2a 20 54 72 75  Bias,     /* Tru
cb10: 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
cb20: 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70  ely to be an app
cb30: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  end */.  int use
cb40: 53 65 65 6b 52 65 73 75 6c 74 20 20 20 2f 2a 20  SeekResult   /* 
cb50: 54 72 75 65 20 74 6f 20 73 65 74 20 74 68 65 20  True to set the 
cb60: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
cb70: 61 67 20 6f 6e 20 4f 50 5f 5b 49 64 78 5d 49 6e  ag on OP_[Idx]In
cb80: 73 65 72 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sert */.){.  int
cb90: 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   i;.  Vdbe *v;. 
cba0: 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20 49 6e 64   int nIdx;.  Ind
cbb0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 75 38 20 70  ex *pIdx;.  u8 p
cbc0: 69 6b 5f 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  ik_flags;.  int 
cbd0: 72 65 67 44 61 74 61 3b 0a 20 20 69 6e 74 20 72  regData;.  int r
cbe0: 65 67 52 65 63 3b 0a 0a 20 20 76 20 3d 20 73 71  egRec;..  v = sq
cbf0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cc00: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
cc10: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
cc20: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
cc30: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74  =0 );  /* This t
cc40: 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49  able is not a VI
cc50: 45 57 20 2a 2f 0a 20 20 66 6f 72 28 6e 49 64 78  EW */.  for(nIdx
cc60: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
cc70: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
cc80: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e  x=pIdx->pNext, n
cc90: 49 64 78 2b 2b 29 7b 7d 0a 20 20 66 6f 72 28 69  Idx++){}.  for(i
cca0: 3d 6e 49 64 78 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nIdx-1; i>=0; i
ccb0: 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65  --){.    if( aRe
ccc0: 67 49 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  gIdx[i]==0 ) con
ccd0: 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
cce0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ccf0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 62 61  OP_IdxInsert, ba
cd00: 73 65 43 75 72 2b 69 2b 31 2c 20 61 52 65 67 49  seCur+i+1, aRegI
cd10: 64 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  dx[i]);.    if( 
cd20: 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20 29 7b  useSeekResult ){
cd30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cd40: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
cd50: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
cd60: 4c 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  LT);.    }.  }. 
cd70: 20 72 65 67 44 61 74 61 20 3d 20 72 65 67 52 6f   regData = regRo
cd80: 77 69 64 20 2b 20 31 3b 0a 20 20 72 65 67 52 65  wid + 1;.  regRe
cd90: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
cda0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
cdb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cdc0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
cdd0: 6f 72 64 2c 20 72 65 67 44 61 74 61 2c 20 70 54  ord, regData, pT
cde0: 61 62 2d 3e 6e 43 6f 6c 2c 20 72 65 67 52 65 63  ab->nCol, regRec
cdf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
ce00: 65 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  eAffinityStr(v, 
ce10: 70 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTab);.  sqlite3
ce20: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
ce30: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
ce40: 72 65 67 44 61 74 61 2c 20 70 54 61 62 2d 3e 6e  regData, pTab->n
ce50: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 72  Col);.  if( pPar
ce60: 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20  se->nested ){.  
ce70: 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 30 3b    pik_flags = 0;
ce80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 69  .  }else{.    pi
ce90: 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47  k_flags = OPFLAG
cea0: 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 70 69  _NCHANGE;.    pi
ceb0: 6b 5f 66 6c 61 67 73 20 7c 3d 20 28 69 73 55 70  k_flags |= (isUp
cec0: 64 61 74 65 3f 4f 50 46 4c 41 47 5f 49 53 55 50  date?OPFLAG_ISUP
ced0: 44 41 54 45 3a 4f 50 46 4c 41 47 5f 4c 41 53 54  DATE:OPFLAG_LAST
cee0: 52 4f 57 49 44 29 3b 0a 20 20 7d 0a 20 20 69 66  ROWID);.  }.  if
cef0: 28 20 61 70 70 65 6e 64 42 69 61 73 20 29 7b 0a  ( appendBias ){.
cf00: 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d      pik_flags |=
cf10: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 3b 0a   OPFLAG_APPEND;.
cf20: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 53 65 65    }.  if( useSee
cf30: 6b 52 65 73 75 6c 74 20 29 7b 0a 20 20 20 20 70  kResult ){.    p
cf40: 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c  ik_flags |= OPFL
cf50: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
cf60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
cf70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cf80: 49 6e 73 65 72 74 2c 20 62 61 73 65 43 75 72 2c  Insert, baseCur,
cf90: 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69   regRec, regRowi
cfa0: 64 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  d);.  if( !pPars
cfb0: 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20  e->nested ){.   
cfc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
cfd0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP4(v, -1, pTab
cfe0: 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54  ->zName, P4_STAT
cff0: 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  IC);.  }.  sqlit
d000: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
d010: 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a  , pik_flags);.}.
d020: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d030: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6f  code that will o
d040: 70 65 6e 20 63 75 72 73 6f 72 73 20 66 6f 72 20  pen cursors for 
d050: 61 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20  a table and for 
d060: 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 6f  all.** indices o
d070: 66 20 74 68 61 74 20 74 61 62 6c 65 2e 20 20 54  f that table.  T
d080: 68 65 20 22 62 61 73 65 43 75 72 22 20 70 61 72  he "baseCur" par
d090: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63 75  ameter is the cu
d0a0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64  rsor number used
d0b0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c  .** for the tabl
d0c0: 65 2e 20 20 49 6e 64 69 63 65 73 20 61 72 65 20  e.  Indices are 
d0d0: 6f 70 65 6e 65 64 20 6f 6e 20 73 75 62 73 65 71  opened on subseq
d0e0: 75 65 6e 74 20 63 75 72 73 6f 72 73 2e 0a 2a 2a  uent cursors..**
d0f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
d100: 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73  umber of indices
d110: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   on the table..*
d120: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
d130: 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73  nTableAndIndices
d140: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d150: 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
d160: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
d170: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
d180: 20 54 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65   Table to be ope
d190: 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  ned */.  int bas
d1a0: 65 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  eCur,     /* Cur
d1b0: 73 6f 72 20 6e 75 6d 62 65 72 20 61 73 73 69 67  sor number assig
d1c0: 6e 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ned to the table
d1d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 20 20 20 20   */.  int op    
d1e0: 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65         /* OP_Ope
d1f0: 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
d200: 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Write */.){.  in
d210: 74 20 69 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  t i;.  int iDb;.
d220: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
d230: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
d240: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
d250: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d260: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
d270: 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
d280: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
d290: 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ema);.  v = sqli
d2a0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d2b0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
d2c0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =0 );.  sqlite3O
d2d0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
d2e0: 20 62 61 73 65 43 75 72 2c 20 69 44 62 2c 20 70   baseCur, iDb, p
d2f0: 54 61 62 2c 20 6f 70 29 3b 0a 20 20 66 6f 72 28  Tab, op);.  for(
d300: 69 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  i=1, pIdx=pTab->
d310: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
d320: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
d330: 69 2b 2b 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  i++){.    KeyInf
d340: 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
d350: 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
d360: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
d370: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
d380: 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
d390: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
d3a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
d3b0: 2c 20 6f 70 2c 20 69 2b 62 61 73 65 43 75 72 2c  , op, i+baseCur,
d3c0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
d3d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d3e0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
d3f0: 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
d400: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 56 64  HANDOFF);.    Vd
d410: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
d420: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
d430: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
d440: 72 73 65 2d 3e 6e 54 61 62 3c 62 61 73 65 43 75  rse->nTab<baseCu
d450: 72 2b 69 20 29 7b 0a 20 20 20 20 70 50 61 72 73  r+i ){.    pPars
d460: 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73 65 43 75  e->nTab = baseCu
d470: 72 2b 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r+i;.  }.  retur
d480: 6e 20 69 2d 31 3b 0a 7d 0a 0a 0a 23 69 66 64 65  n i-1;.}...#ifde
d490: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
d4a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
d4b0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
d4c0: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
d4d0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 2a 2a   whenever the.**
d4e0: 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
d4f0: 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  zation is used. 
d500: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
d510: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 70 75 72  r testing.** pur
d520: 70 6f 73 65 73 20 6f 6e 6c 79 20 2d 20 74 6f 20  poses only - to 
d530: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 72  make sure the tr
d540: 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
d550: 69 6f 6e 20 72 65 61 6c 6c 79 0a 2a 2a 20 69 73  ion really.** is
d560: 20 68 61 70 70 65 6e 69 6e 67 20 77 68 65 6e 20   happening when 
d570: 69 74 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  it is suppose to
d580: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d590: 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a  _xferopt_count;.
d5a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d5b0: 5f 54 45 53 54 20 2a 2f 0a 0a 0a 23 69 66 6e 64  _TEST */...#ifnd
d5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58  ef SQLITE_OMIT_X
d5d0: 46 45 52 5f 4f 50 54 0a 2f 2a 0a 2a 2a 20 43 68  FER_OPT./*.** Ch
d5e0: 65 63 6b 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e  eck to collation
d5f0: 20 6e 61 6d 65 73 20 74 6f 20 73 65 65 20 69 66   names to see if
d600: 20 74 68 65 79 20 61 72 65 20 63 6f 6d 70 61 74   they are compat
d610: 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ible..*/.static 
d620: 69 6e 74 20 78 66 65 72 43 6f 6d 70 61 74 69 62  int xferCompatib
d630: 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 63 6f 6e 73  leCollation(cons
d640: 74 20 63 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73  t char *z1, cons
d650: 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a 20 20 69  t char *z2){.  i
d660: 66 28 20 7a 31 3d 3d 30 20 29 7b 0a 20 20 20 20  f( z1==0 ){.    
d670: 72 65 74 75 72 6e 20 7a 32 3d 3d 30 3b 0a 20 20  return z2==0;.  
d680: 7d 0a 20 20 69 66 28 20 7a 32 3d 3d 30 20 29 7b  }.  if( z2==0 ){
d690: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d6a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
d6b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
d6c0: 32 29 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2)==0;.}.../*.**
d6d0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
d6e0: 20 69 6e 64 65 78 20 70 53 72 63 20 69 73 20 63   index pSrc is c
d6f0: 6f 6d 70 61 74 69 62 6c 65 20 61 73 20 61 20 73  ompatible as a s
d700: 6f 75 72 63 65 20 6f 66 20 64 61 74 61 0a 2a 2a  ource of data.**
d710: 20 66 6f 72 20 69 6e 64 65 78 20 70 44 65 73 74   for index pDest
d720: 20 69 6e 20 61 6e 20 69 6e 73 65 72 74 20 74 72   in an insert tr
d730: 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
d740: 69 6f 6e 2e 20 20 54 68 65 20 72 75 6c 65 73 0a  ion.  The rules.
d750: 2a 2a 20 66 6f 72 20 61 20 63 6f 6d 70 61 74 69  ** for a compati
d760: 62 6c 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a  ble index:.**.**
d770: 20 20 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65      *   The inde
d780: 78 20 69 73 20 6f 76 65 72 20 74 68 65 20 73 61  x is over the sa
d790: 6d 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  me set of column
d7a0: 73 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20  s.**    *   The 
d7b0: 73 61 6d 65 20 44 45 53 43 20 61 6e 64 20 41 53  same DESC and AS
d7c0: 43 20 6d 61 72 6b 69 6e 67 73 20 6f 63 63 75 72  C markings occur
d7d0: 73 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  s on all columns
d7e0: 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73  .**    *   The s
d7f0: 61 6d 65 20 6f 6e 45 72 72 6f 72 20 70 72 6f 63  ame onError proc
d800: 65 73 73 69 6e 67 20 28 4f 45 5f 41 62 6f 72 74  essing (OE_Abort
d810: 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63  , OE_Ignore, etc
d820: 29 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20  ).**    *   The 
d830: 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
d840: 65 71 75 65 6e 63 65 20 6f 6e 20 65 61 63 68 20  equence on each 
d850: 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
d860: 20 69 6e 74 20 78 66 65 72 43 6f 6d 70 61 74 69   int xferCompati
d870: 62 6c 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  bleIndex(Index *
d880: 70 44 65 73 74 2c 20 49 6e 64 65 78 20 2a 70 53  pDest, Index *pS
d890: 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rc){.  int i;.  
d8a0: 61 73 73 65 72 74 28 20 70 44 65 73 74 20 26 26  assert( pDest &&
d8b0: 20 70 53 72 63 20 29 3b 0a 20 20 61 73 73 65 72   pSrc );.  asser
d8c0: 74 28 20 70 44 65 73 74 2d 3e 70 54 61 62 6c 65  t( pDest->pTable
d8d0: 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c 65 20 29  !=pSrc->pTable )
d8e0: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  ;.  if( pDest->n
d8f0: 43 6f 6c 75 6d 6e 21 3d 70 53 72 63 2d 3e 6e 43  Column!=pSrc->nC
d900: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 74  olumn ){.    ret
d910: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
d920: 65 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  erent number of 
d930: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 7d 0a 20  columns */.  }. 
d940: 20 69 66 28 20 70 44 65 73 74 2d 3e 6f 6e 45 72   if( pDest->onEr
d950: 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e 45 72 72  ror!=pSrc->onErr
d960: 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
d970: 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65   0;   /* Differe
d980: 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  nt conflict reso
d990: 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67 69 65  lution strategie
d9a0: 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  s */.  }.  for(i
d9b0: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 43 6f 6c  =0; i<pSrc->nCol
d9c0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
d9d0: 66 28 20 70 53 72 63 2d 3e 61 69 43 6f 6c 75 6d  f( pSrc->aiColum
d9e0: 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61 69 43  n[i]!=pDest->aiC
d9f0: 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  olumn[i] ){.    
da00: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
da10: 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c 75 6d   Different colum
da20: 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ns indexed */.  
da30: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 72 63    }.    if( pSrc
da40: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 21  ->aSortOrder[i]!
da50: 3d 70 44 65 73 74 2d 3e 61 53 6f 72 74 4f 72 64  =pDest->aSortOrd
da60: 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72  er[i] ){.      r
da70: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
da80: 66 66 65 72 65 6e 74 20 73 6f 72 74 20 6f 72 64  fferent sort ord
da90: 65 72 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ers */.    }.   
daa0: 20 69 66 28 20 21 78 66 65 72 43 6f 6d 70 61 74   if( !xferCompat
dab0: 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 70 53  ibleCollation(pS
dac0: 72 63 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 70 44  rc->azColl[i],pD
dad0: 65 73 74 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20  est->azColl[i]) 
dae0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
daf0: 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e  0;   /* Differen
db00: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
db10: 65 6e 63 65 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  ences */.    }. 
db20: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 74   }..  /* If no t
db30: 65 73 74 20 61 62 6f 76 65 20 66 61 69 6c 73 20  est above fails 
db40: 74 68 65 6e 20 74 68 65 20 69 6e 64 69 63 65 73  then the indices
db50: 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   must be compati
db60: 62 6c 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ble */.  return 
db70: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  1;.}../*.** Atte
db80: 6d 70 74 20 74 68 65 20 74 72 61 6e 73 66 65 72  mpt the transfer
db90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
dba0: 20 49 4e 53 45 52 54 73 20 6f 66 20 74 68 65 20   INSERTs of the 
dbb0: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  form.**.**     I
dbc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 31 20  NSERT INTO tab1 
dbd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
dbe0: 62 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  b2;.**.** This o
dbf0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6f  ptimization is o
dc00: 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
dc10: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 74  .**.**    (1)  t
dc20: 61 62 31 20 61 6e 64 20 74 61 62 32 20 68 61 76  ab1 and tab2 hav
dc30: 65 20 69 64 65 6e 74 69 63 61 6c 20 73 63 68 65  e identical sche
dc40: 6d 61 73 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  mas including al
dc50: 6c 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  l the.**        
dc60: 20 73 61 6d 65 20 69 6e 64 69 63 65 73 20 61 6e   same indices an
dc70: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  d constraints.**
dc80: 0a 2a 2a 20 20 20 20 28 32 29 20 20 74 61 62 31  .**    (2)  tab1
dc90: 20 61 6e 64 20 74 61 62 32 20 61 72 65 20 64 69   and tab2 are di
dca0: 66 66 65 72 65 6e 74 20 74 61 62 6c 65 73 0a 2a  fferent tables.*
dcb0: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  *.**    (3)  The
dcc0: 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 74 72  re must be no tr
dcd0: 69 67 67 65 72 73 20 6f 6e 20 74 61 62 31 0a 2a  iggers on tab1.*
dce0: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65  *.**    (4)  The
dcf0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
dd00: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
dd10: 65 6e 74 20 69 73 20 22 2a 22 0a 2a 2a 0a 2a 2a  ent is "*".**.**
dd20: 20 20 20 20 28 35 29 20 20 54 68 65 20 53 45 4c      (5)  The SEL
dd30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68 61  ECT statement ha
dd40: 73 20 6e 6f 20 57 48 45 52 45 2c 20 48 41 56 49  s no WHERE, HAVI
dd50: 4e 47 2c 20 4f 52 44 45 52 20 42 59 2c 20 47 52  NG, ORDER BY, GR
dd60: 4f 55 50 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  OUP BY,.**      
dd70: 20 20 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75     or LIMIT clau
dd80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 36 29  se..**.**    (6)
dd90: 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
dda0: 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70  tement is a simp
ddb0: 6c 65 20 28 6e 6f 74 20 61 20 63 6f 6d 70 6f 75  le (not a compou
ddc0: 6e 64 29 20 73 65 6c 65 63 74 20 74 68 61 74 0a  nd) select that.
ddd0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 74 61  **         conta
dde0: 69 6e 73 20 6f 6e 6c 79 20 74 61 62 32 20 69 6e  ins only tab2 in
ddf0: 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
de00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68  .**.** This meth
de10: 6f 64 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  od for implement
de20: 69 6e 67 20 74 68 65 20 49 4e 53 45 52 54 20 74  ing the INSERT t
de30: 72 61 6e 73 66 65 72 73 20 72 61 77 20 72 65 63  ransfers raw rec
de40: 6f 72 64 73 20 66 72 6f 6d 0a 2a 2a 20 74 61 62  ords from.** tab
de50: 32 20 6f 76 65 72 20 74 6f 20 74 61 62 31 2e 20  2 over to tab1. 
de60: 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65   The columns are
de70: 20 6e 6f 74 20 64 65 63 6f 64 65 64 2e 20 20 52   not decoded.  R
de80: 61 77 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 0a  aw records from.
de90: 2a 2a 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f  ** the indices o
dea0: 66 20 74 61 62 32 20 61 72 65 20 74 72 61 6e 73  f tab2 are trans
deb0: 66 65 72 65 64 20 74 6f 20 74 61 62 31 20 61 73  fered to tab1 as
dec0: 20 77 65 6c 6c 2e 20 20 49 6e 20 73 6f 20 64 6f   well.  In so do
ded0: 69 6e 67 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ing,.** the resu
dee0: 6c 74 69 6e 67 20 74 61 62 31 20 68 61 73 20 6d  lting tab1 has m
def0: 75 63 68 20 6c 65 73 73 20 66 72 61 67 6d 65 6e  uch less fragmen
df00: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  tation..**.** Th
df10: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
df20: 6e 73 20 54 52 55 45 20 69 66 20 74 68 65 20 6f  ns TRUE if the o
df30: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
df40: 74 74 65 6d 70 74 65 64 2e 20 20 49 66 20 61 6e  ttempted.  If an
df50: 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 6f 6e 64  y.** of the cond
df60: 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 66 61 69  itions above fai
df70: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6f 70  l so that the op
df80: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
df90: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 74 74 65  d not.** be atte
dfa0: 6d 70 74 65 64 2c 20 74 68 65 6e 20 74 68 69 73  mpted, then this
dfb0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
dfc0: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
dfd0: 63 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d 69  c int xferOptimi
dfe0: 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  zation(.  Parse 
dff0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
e000: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
e010: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44  t */.  Table *pD
e020: 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
e030: 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  The table we are
e040: 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
e050: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e060: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20  lect,      /* A 
e070: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e080: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64   to use as the d
e090: 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  ata source */.  
e0a0: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
e0b0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
e0c0: 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e  handle constrain
e0d0: 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  t errors */.  in
e0e0: 74 20 69 44 62 44 65 73 74 20 20 20 20 20 20 20  t iDbDest       
e0f0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
e100: 61 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a  ase of pDest */.
e110: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
e120: 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
e130: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73        /* The res
e140: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
e150: 45 4c 45 43 54 20 2a 2f 0a 20 20 54 61 62 6c 65  ELECT */.  Table
e160: 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20   *pSrc;         
e170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e180: 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  he table in the 
e190: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 53  FROM clause of S
e1a0: 45 4c 45 43 54 20 2a 2f 0a 20 20 49 6e 64 65 78  ELECT */.  Index
e1b0: 20 2a 70 53 72 63 49 64 78 2c 20 2a 70 44 65 73   *pSrcIdx, *pDes
e1c0: 74 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 53  tIdx;       /* S
e1d0: 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e  ource and destin
e1e0: 61 74 69 6f 6e 20 69 6e 64 69 63 65 73 20 2a 2f  ation indices */
e1f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
e200: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
e210: 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
e220: 74 20 6f 66 20 70 53 65 6c 65 63 74 2d 3e 70 53  t of pSelect->pS
e230: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  rc */.  int i;  
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e260: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
e270: 74 20 69 44 62 53 72 63 3b 20 20 20 20 20 20 20  t iDbSrc;       
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e290: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
e2a0: 66 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  f pSrc */.  int 
e2b0: 69 53 72 63 2c 20 69 44 65 73 74 3b 20 20 20 20  iSrc, iDest;    
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2d0: 43 75 72 73 6f 72 73 20 66 72 6f 6d 20 73 6f 75  Cursors from sou
e2e0: 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74  rce and destinat
e2f0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
e300: 72 31 2c 20 61 64 64 72 32 3b 20 20 20 20 20 20  r1, addr2;      
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e320: 70 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  p addresses */. 
e330: 20 69 6e 74 20 65 6d 70 74 79 44 65 73 74 54 65   int emptyDestTe
e340: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
e350: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e360: 74 65 73 74 20 66 6f 72 20 65 6d 70 74 79 20 70  test for empty p
e370: 44 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 6d  Dest */.  int em
e380: 70 74 79 53 72 63 54 65 73 74 3b 20 20 20 20 20  ptySrcTest;     
e390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
e3a0: 64 72 65 73 73 20 6f 66 20 74 65 73 74 20 66 6f  dress of test fo
e3b0: 72 20 65 6d 70 74 79 20 70 53 72 63 20 2a 2f 0a  r empty pSrc */.
e3c0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 77     /* The VDBE w
e3f0: 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 2a  e are building *
e400: 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
e410: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
e420: 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
e430: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 6e 20 69  rmation for an i
e440: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
e450: 67 41 75 74 6f 69 6e 63 3b 20 20 20 20 20 20 20  gAutoinc;       
e460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
e470: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 75 73  mory register us
e480: 65 64 20 62 79 20 41 55 54 4f 49 4e 43 20 2a 2f  ed by AUTOINC */
e490: 0a 20 20 69 6e 74 20 64 65 73 74 48 61 73 55 6e  .  int destHasUn
e4a0: 69 71 75 65 49 64 78 20 3d 20 30 3b 20 20 20 20  iqueIdx = 0;    
e4b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
e4c0: 44 65 73 74 20 68 61 73 20 61 20 55 4e 49 51 55  Dest has a UNIQU
e4d0: 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  E index */.  int
e4e0: 20 72 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77   regData, regRow
e4f0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id;           /*
e500: 20 52 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   Registers holdi
e510: 6e 67 20 64 61 74 61 20 61 6e 64 20 72 6f 77 69  ng data and rowi
e520: 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65 6c  d */..  if( pSel
e530: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
e540: 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 75 73  turn 0;   /* Mus
e550: 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  t be of the form
e560: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e    INSERT INTO ..
e570: 2e 20 53 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a  . SELECT ... */.
e580: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
e590: 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
e5a0: 72 73 65 2c 20 70 44 65 73 74 29 20 29 7b 0a 20  rse, pDest) ){. 
e5b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
e5c0: 2a 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20  * tab1 must not 
e5d0: 68 61 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f  have triggers */
e5e0: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
e5f0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
e600: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 44 65 73  TABLE.  if( pDes
e610: 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  t->tabFlags & TF
e620: 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  _Virtual ){.    
e630: 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74  return 0;   /* t
e640: 61 62 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ab1 must not be 
e650: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
e660: 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  */.  }.#endif.  
e670: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
e680: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 6f  Default ){.    o
e690: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
e6a0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 45  t;.  }.  if( onE
e6b0: 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72 74 20 26  rror!=OE_Abort &
e6c0: 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 6f  & onError!=OE_Ro
e6d0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 65  llback ){.    re
e6e0: 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 43 61 6e  turn 0;   /* Can
e6f0: 6e 6f 74 20 64 6f 20 4f 52 20 52 45 50 4c 41 43  not do OR REPLAC
e700: 45 20 6f 72 20 4f 52 20 49 47 4e 4f 52 45 20 6f  E or OR IGNORE o
e710: 72 20 4f 52 20 46 41 49 4c 20 2a 2f 0a 20 20 7d  r OR FAIL */.  }
e720: 0a 20 20 61 73 73 65 72 74 28 70 53 65 6c 65 63  .  assert(pSelec
e730: 74 2d 3e 70 53 72 63 29 3b 20 20 20 2f 2a 20 61  t->pSrc);   /* a
e740: 6c 6c 6f 63 61 74 65 64 20 65 76 65 6e 20 69 66  llocated even if
e750: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 46 52 4f   there is no FRO
e760: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  M clause */.  if
e770: 28 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d  ( pSelect->pSrc-
e780: 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
e790: 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46  return 0;   /* F
e7a0: 52 4f 4d 20 63 6c 61 75 73 65 20 6d 75 73 74 20  ROM clause must 
e7b0: 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
e7c0: 20 74 65 72 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69   term */.  }.  i
e7d0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  f( pSelect->pSrc
e7e0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
e7f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
e800: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
e810: 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   cannot contain 
e820: 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  a subquery */.  
e830: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
e840: 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 72  >pWhere ){.    r
e850: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45  eturn 0;   /* SE
e860: 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76  LECT may not hav
e870: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
e880: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
e890: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20  elect->pOrderBy 
e8a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
e8b0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79     /* SELECT may
e8c0: 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f 52 44   not have an ORD
e8d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
e8e0: 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20    }.  /* Do not 
e8f0: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
e900: 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
e910: 2e 20 20 49 66 20 48 41 56 49 4e 47 20 69 73 20  .  If HAVING is 
e920: 70 72 65 73 65 6e 74 20 62 75 74 0a 20 20 2a 2a  present but.  **
e930: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
e940: 45 52 20 42 59 2c 20 77 65 20 77 69 6c 6c 20 67  ER BY, we will g
e950: 65 74 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  et an error. */.
e960: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
e970: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 72  GroupBy ){.    r
e980: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45  eturn 0;   /* SE
e990: 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76  LECT may not hav
e9a0: 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
e9b0: 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  use */.  }.  if(
e9c0: 20 70 53 65 6c 65 63 74 2d 3e 70 4c 69 6d 69 74   pSelect->pLimit
e9d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
e9e0: 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61  ;   /* SELECT ma
e9f0: 79 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d  y not have a LIM
ea00: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d  IT clause */.  }
ea10: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
ea20: 63 74 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29  ct->pOffset==0 )
ea30: 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 6f  ;  /* Must be so
ea40: 20 69 66 20 70 4c 69 6d 69 74 3d 3d 30 20 2a 2f   if pLimit==0 */
ea50: 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
ea60: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
ea70: 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c  turn 0;   /* SEL
ea80: 45 43 54 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ECT may not be a
ea90: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
eaa0: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  */.  }.  if( pSe
eab0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
eac0: 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
ead0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
eae0: 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
eaf0: 74 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f  t be DISTINCT */
eb00: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
eb10: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
eb20: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
eb30: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  t!=0 );.  if( pE
eb40: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
eb50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
eb60: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
eb70: 73 65 74 20 6d 75 73 74 20 68 61 76 65 20 65 78  set must have ex
eb80: 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e  actly one column
eb90: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
eba0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
ebb0: 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70 45  Expr );.  if( pE
ebc0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
ebd0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ->op!=TK_ALL ){.
ebe0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
ebf0: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
ec00: 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 70  t must be the sp
ec10: 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 22  ecial operator "
ec20: 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  *" */.  }..  /* 
ec30: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65  At this point we
ec40: 20 68 61 76 65 20 65 73 74 61 62 6c 69 73 68 65   have establishe
ec50: 64 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  d that the state
ec60: 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 0a 20  ment is of the. 
ec70: 20 2a 2a 20 63 6f 72 72 65 63 74 20 73 79 6e 74   ** correct synt
ec80: 61 63 74 69 63 20 66 6f 72 6d 20 74 6f 20 70 61  actic form to pa
ec90: 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 69  rticipate in thi
eca0: 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
ecb0: 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20 68 61 76   Now.  ** we hav
ecc0: 65 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 73  e to check the s
ecd0: 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a 2f 0a 20  emantics..  */. 
ece0: 20 70 49 74 65 6d 20 3d 20 70 53 65 6c 65 63 74   pItem = pSelect
ecf0: 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20 70 53 72  ->pSrc->a;.  pSr
ed00: 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  c = sqlite3Locat
ed10: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  eTable(pParse, 0
ed20: 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
ed30: 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
ed40: 29 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30  );.  if( pSrc==0
ed50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ed60: 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  ;   /* FROM clau
ed70: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  se does not cont
ed80: 61 69 6e 20 61 20 72 65 61 6c 20 74 61 62 6c 65  ain a real table
ed90: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
eda0: 72 63 3d 3d 70 44 65 73 74 20 29 7b 0a 20 20 20  rc==pDest ){.   
edb0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
edc0: 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 6d 61  tab1 and tab2 ma
edd0: 79 20 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d  y not be the sam
ede0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23  e table */.  }.#
edf0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee00: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ee10: 20 20 69 66 28 20 70 53 72 63 2d 3e 74 61 62 46    if( pSrc->tabF
ee20: 6c 61 67 73 20 26 20 54 46 5f 56 69 72 74 75 61  lags & TF_Virtua
ee30: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
ee40: 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d 75 73  0;   /* tab2 mus
ee50: 74 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74 75  t not be a virtu
ee60: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a  al table */.  }.
ee70: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 53 72  #endif.  if( pSr
ee80: 63 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  c->pSelect ){.  
ee90: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
eea0: 20 74 61 62 32 20 6d 61 79 20 6e 6f 74 20 62 65   tab2 may not be
eeb0: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 7d 0a 20   a view */.  }. 
eec0: 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 43 6f 6c   if( pDest->nCol
eed0: 21 3d 70 53 72 63 2d 3e 6e 43 6f 6c 20 29 7b 0a  !=pSrc->nCol ){.
eee0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
eef0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
ef00: 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 74 68 65  umns must be the
ef10: 20 73 61 6d 65 20 69 6e 20 74 61 62 31 20 61 6e   same in tab1 an
ef20: 64 20 74 61 62 32 20 2a 2f 0a 20 20 7d 0a 20 20  d tab2 */.  }.  
ef30: 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b 65 79  if( pDest->iPKey
ef40: 21 3d 70 53 72 63 2d 3e 69 50 4b 65 79 20 29 7b  !=pSrc->iPKey ){
ef50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
ef60: 20 2f 2a 20 42 6f 74 68 20 74 61 62 6c 65 73 20   /* Both tables 
ef70: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
ef80: 6d 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  me INTEGER PRIMA
ef90: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 7d 0a 20 20  RY KEY */.  }.  
efa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 65 73 74  for(i=0; i<pDest
efb0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
efc0: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 61 43 6f    if( pDest->aCo
efd0: 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79 21 3d 70  l[i].affinity!=p
efe0: 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66  Src->aCol[i].aff
eff0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 72  inity ){.      r
f000: 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 41  eturn 0;    /* A
f010: 66 66 69 6e 69 74 79 20 6d 75 73 74 20 62 65 20  ffinity must be 
f020: 74 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20  the same on all 
f030: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
f040: 0a 20 20 20 20 69 66 28 20 21 78 66 65 72 43 6f  .    if( !xferCo
f050: 6d 70 61 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f  mpatibleCollatio
f060: 6e 28 70 44 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d  n(pDest->aCol[i]
f070: 2e 7a 43 6f 6c 6c 2c 20 70 53 72 63 2d 3e 61 43  .zColl, pSrc->aC
f080: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 20 29 7b 0a  ol[i].zColl) ){.
f090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
f0a0: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
f0b0: 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
f0c0: 20 74 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c 6c   the same on all
f0d0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
f0e0: 7d 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 2d  }.    if( pDest-
f0f0: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
f100: 20 26 26 20 21 70 53 72 63 2d 3e 61 43 6f 6c 5b   && !pSrc->aCol[
f110: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  i].notNull ){.  
f120: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
f130: 20 2f 2a 20 74 61 62 32 20 6d 75 73 74 20 62 65   /* tab2 must be
f140: 20 4e 4f 54 20 4e 55 4c 4c 20 69 66 20 74 61 62   NOT NULL if tab
f150: 31 20 69 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  1 is */.    }.  
f160: 7d 0a 20 20 66 6f 72 28 70 44 65 73 74 49 64 78  }.  for(pDestIdx
f170: 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20  =pDest->pIndex; 
f180: 70 44 65 73 74 49 64 78 3b 20 70 44 65 73 74 49  pDestIdx; pDestI
f190: 64 78 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e 65  dx=pDestIdx->pNe
f1a0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 44 65  xt){.    if( pDe
f1b0: 73 74 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  stIdx->onError!=
f1c0: 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20  OE_None ){.     
f1d0: 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64   destHasUniqueId
f1e0: 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  x = 1;.    }.   
f1f0: 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70 53 72   for(pSrcIdx=pSr
f200: 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53 72 63 49  c->pIndex; pSrcI
f210: 64 78 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63  dx; pSrcIdx=pSrc
f220: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f230: 20 20 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61     if( xferCompa
f240: 74 69 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74  tibleIndex(pDest
f250: 49 64 78 2c 20 70 53 72 63 49 64 78 29 20 29 20  Idx, pSrcIdx) ) 
f260: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f270: 20 69 66 28 20 70 53 72 63 49 64 78 3d 3d 30 20   if( pSrcIdx==0 
f280: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f290: 30 3b 20 20 20 20 2f 2a 20 70 44 65 73 74 49 64  0;    /* pDestId
f2a0: 78 20 68 61 73 20 6e 6f 20 63 6f 72 72 65 73 70  x has no corresp
f2b0: 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  onding index in 
f2c0: 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  pSrc */.    }.  
f2d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
f2e0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 69 66  _OMIT_CHECK.  if
f2f0: 28 20 70 44 65 73 74 2d 3e 70 43 68 65 63 6b 20  ( pDest->pCheck 
f300: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
f310: 6d 70 61 72 65 28 70 53 72 63 2d 3e 70 43 68 65  mpare(pSrc->pChe
f320: 63 6b 2c 20 70 44 65 73 74 2d 3e 70 43 68 65 63  ck, pDest->pChec
f330: 6b 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  k) ){.    return
f340: 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c 65 73 20   0;   /* Tables 
f350: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 43  have different C
f360: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
f370: 2e 20 20 54 69 63 6b 65 74 20 23 32 32 35 32 20  .  Ticket #2252 
f380: 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  */.  }.#endif.. 
f390: 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
f3a0: 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
f3b0: 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20   either:.  **.  
f3c0: 2a 2a 20 20 20 20 2a 20 20 20 57 65 20 63 61 6e  **    *   We can
f3d0: 20 61 6c 77 61 79 73 20 64 6f 20 74 68 65 20 74   always do the t
f3e0: 72 61 6e 73 66 65 72 20 69 66 20 74 68 65 20 74  ransfer if the t
f3f0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  able contains an
f400: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  .  **        an 
f410: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
f420: 6b 65 79 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  key.  **.  **   
f430: 20 2a 20 20 20 57 65 20 63 61 6e 20 63 6f 6e 64   *   We can cond
f440: 69 74 69 6f 6e 61 6c 6c 79 20 64 6f 20 74 68 65  itionally do the
f450: 20 74 72 61 6e 73 66 65 72 20 69 66 20 74 68 65   transfer if the
f460: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 2a   destination.  *
f470: 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 69  *        table i
f480: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 23 69  s empty..  */.#i
f490: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
f4a0: 0a 20 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  .  sqlite3_xfero
f4b0: 70 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  pt_count++;.#end
f4c0: 69 66 0a 20 20 69 44 62 53 72 63 20 3d 20 73 71  if.  iDbSrc = sq
f4d0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
f4e0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
f4f0: 53 72 63 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Src->pSchema);. 
f500: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
f510: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73  dbe(pParse);.  s
f520: 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
f530: 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
f540: 44 62 53 72 63 29 3b 0a 20 20 69 53 72 63 20 3d  DbSrc);.  iSrc =
f550: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f560: 0a 20 20 69 44 65 73 74 20 3d 20 70 50 61 72 73  .  iDest = pPars
f570: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67  e->nTab++;.  reg
f580: 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 49 6e  Autoinc = autoIn
f590: 63 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 69  cBegin(pParse, i
f5a0: 44 62 44 65 73 74 2c 20 70 44 65 73 74 29 3b 0a  DbDest, pDest);.
f5b0: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
f5c0: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 65 73 74  le(pParse, iDest
f5d0: 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74  , iDbDest, pDest
f5e0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b  , OP_OpenWrite);
f5f0: 0a 20 20 69 66 28 20 28 70 44 65 73 74 2d 3e 69  .  if( (pDest->i
f600: 50 4b 65 79 3c 30 20 26 26 20 70 44 65 73 74 2d  PKey<0 && pDest-
f610: 3e 70 49 6e 64 65 78 21 3d 30 29 20 7c 7c 20 64  >pIndex!=0) || d
f620: 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20  estHasUniqueIdx 
f630: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 61 62  ){.    /* If tab
f640: 6c 65 73 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  les do not have 
f650: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
f660: 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 72 65  RY KEY and there
f670: 0a 20 20 20 20 2a 2a 20 61 72 65 20 69 6e 64 69  .    ** are indi
f680: 63 65 73 20 74 6f 20 62 65 20 63 6f 70 69 65 64  ces to be copied
f690: 20 61 6e 64 20 74 68 65 20 64 65 73 74 69 6e 61   and the destina
f6a0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 65 6d 70 74  tion is not empt
f6b0: 79 2c 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  y,.    ** we hav
f6c0: 65 20 74 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68  e to disallow th
f6d0: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
f6e0: 69 7a 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  ization because 
f6f0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  the.    ** the r
f700: 6f 77 69 64 73 20 6d 69 67 68 74 20 63 68 61 6e  owids might chan
f710: 67 65 20 77 68 69 63 68 20 77 69 6c 6c 20 6d 65  ge which will me
f720: 73 73 20 75 70 20 69 6e 64 65 78 69 6e 67 2e 0a  ss up indexing..
f730: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72      **.    ** Or
f740: 20 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   if the destinat
f750: 69 6f 6e 20 68 61 73 20 61 20 55 4e 49 51 55 45  ion has a UNIQUE
f760: 20 69 6e 64 65 78 20 61 6e 64 20 69 73 20 6e 6f   index and is no
f770: 74 20 65 6d 70 74 79 2c 0a 20 20 20 20 2a 2a 20  t empty,.    ** 
f780: 77 65 20 61 6c 73 6f 20 64 69 73 61 6c 6c 6f 77  we also disallow
f790: 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70   the transfer op
f7a0: 74 69 6d 69 7a 61 74 69 6f 6e 20 62 65 63 61 75  timization becau
f7b0: 73 65 20 77 65 20 63 61 6e 6e 6f 74 0a 20 20 20  se we cannot.   
f7c0: 20 2a 2a 20 69 6e 73 75 72 65 20 74 68 61 74 20   ** insure that 
f7d0: 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  all entries in t
f7e0: 68 65 20 75 6e 69 6f 6e 20 6f 66 20 44 45 53 54  he union of DEST
f7f0: 20 61 6e 64 20 53 52 43 20 77 69 6c 6c 20 62 65   and SRC will be
f800: 0a 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 2e 0a  .    ** unique..
f810: 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 31      */.    addr1
f820: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f830: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
f840: 64 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20  d, iDest, 0);.  
f850: 20 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20    emptyDestTest 
f860: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f870: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f880: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
f890: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f8a0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 65 6c 73  , addr1);.  }els
f8b0: 65 7b 0a 20 20 20 20 65 6d 70 74 79 44 65 73 74  e{.    emptyDest
f8c0: 54 65 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Test = 0;.  }.  
f8d0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
f8e0: 28 70 50 61 72 73 65 2c 20 69 53 72 63 2c 20 69  (pParse, iSrc, i
f8f0: 44 62 53 72 63 2c 20 70 53 72 63 2c 20 4f 50 5f  DbSrc, pSrc, OP_
f900: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 65 6d 70  OpenRead);.  emp
f910: 74 79 53 72 63 54 65 73 74 20 3d 20 73 71 6c 69  tySrcTest = sqli
f920: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f930: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 53 72 63   OP_Rewind, iSrc
f940: 2c 20 30 29 3b 0a 20 20 72 65 67 44 61 74 61 20  , 0);.  regData 
f950: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
f960: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72  Reg(pParse);.  r
f970: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
f980: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
f990: 73 65 29 3b 0a 20 20 69 66 28 20 70 44 65 73 74  se);.  if( pDest
f9a0: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
f9b0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
f9c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f9d0: 50 5f 52 6f 77 69 64 2c 20 69 53 72 63 2c 20 72  P_Rowid, iSrc, r
f9e0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 61 64  egRowid);.    ad
f9f0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
fa00: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  eAddOp3(v, OP_No
fa10: 74 45 78 69 73 74 73 2c 20 69 44 65 73 74 2c 20  tExists, iDest, 
fa20: 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  0, regRowid);.  
fa30: 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
fa40: 73 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20  straint(.       
fa50: 20 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72   pParse, onError
fa60: 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20 6d  , "PRIMARY KEY m
fa70: 75 73 74 20 62 65 20 75 6e 69 71 75 65 22 2c 20  ust be unique", 
fa80: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
fa90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
faa0: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
fab0: 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70 28 70     autoIncStep(p
fac0: 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f 69 6e  Parse, regAutoin
fad0: 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
fae0: 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d  }else if( pDest-
faf0: 3e 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20  >pIndex==0 ){.  
fb00: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
fb10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fb20: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 44 65 73  P_NewRowid, iDes
fb30: 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  t, regRowid);.  
fb40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 31  }else{.    addr1
fb50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fb60: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
fb70: 2c 20 69 53 72 63 2c 20 72 65 67 52 6f 77 69 64  , iSrc, regRowid
fb80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
fb90: 70 44 65 73 74 2d 3e 74 61 62 46 6c 61 67 73 20  pDest->tabFlags 
fba0: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
fbb0: 6e 74 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nt)==0 );.  }.  
fbc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fbd0: 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
fbe0: 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b   iSrc, regData);
fbf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
fc00: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
fc10: 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61 74  t, iDest, regDat
fc20: 61 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  a, regRowid);.  
fc30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fc40: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 4e 43  eP5(v, OPFLAG_NC
fc50: 48 41 4e 47 45 7c 4f 50 46 4c 41 47 5f 4c 41 53  HANGE|OPFLAG_LAS
fc60: 54 52 4f 57 49 44 7c 4f 50 46 4c 41 47 5f 41 50  TROWID|OPFLAG_AP
fc70: 50 45 4e 44 29 3b 0a 20 20 73 71 6c 69 74 65 33  PEND);.  sqlite3
fc80: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
fc90: 2d 31 2c 20 70 44 65 73 74 2d 3e 7a 4e 61 6d 65  -1, pDest->zName
fca0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
fcb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fcc0: 4e 65 78 74 2c 20 69 53 72 63 2c 20 61 64 64 72  Next, iSrc, addr
fcd0: 31 29 3b 0a 20 20 66 6f 72 28 70 44 65 73 74 49  1);.  for(pDestI
fce0: 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65 78  dx=pDest->pIndex
fcf0: 3b 20 70 44 65 73 74 49 64 78 3b 20 70 44 65 73  ; pDestIdx; pDes
fd00: 74 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e 70  tIdx=pDestIdx->p
fd10: 4e 65 78 74 29 7b 0a 20 20 20 20 66 6f 72 28 70  Next){.    for(p
fd20: 53 72 63 49 64 78 3d 70 53 72 63 2d 3e 70 49 6e  SrcIdx=pSrc->pIn
fd30: 64 65 78 3b 20 41 4c 57 41 59 53 28 70 53 72 63  dex; ALWAYS(pSrc
fd40: 49 64 78 29 3b 20 70 53 72 63 49 64 78 3d 70 53  Idx); pSrcIdx=pS
fd50: 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  rcIdx->pNext){. 
fd60: 20 20 20 20 20 69 66 28 20 78 66 65 72 43 6f 6d       if( xferCom
fd70: 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70 44 65  patibleIndex(pDe
fd80: 73 74 49 64 78 2c 20 70 53 72 63 49 64 78 29 20  stIdx, pSrcIdx) 
fd90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
fda0: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 49     assert( pSrcI
fdb0: 64 78 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dx );.    sqlite
fdc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fdd0: 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30  P_Close, iSrc, 0
fde0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fdf0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
fe00: 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b  lose, iDest, 0);
fe10: 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
fe20: 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
fe30: 70 50 61 72 73 65 2c 20 70 53 72 63 49 64 78 29  pParse, pSrcIdx)
fe40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fe50: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
fe60: 65 6e 52 65 61 64 2c 20 69 53 72 63 2c 20 70 53  enRead, iSrc, pS
fe70: 72 63 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  rcIdx->tnum, iDb
fe80: 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
fe90: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
fea0: 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
feb0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
fec0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fed0: 20 22 25 73 22 2c 20 70 53 72 63 49 64 78 2d 3e   "%s", pSrcIdx->
fee0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 70 4b 65  zName));.    pKe
fef0: 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
ff00: 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
ff10: 70 44 65 73 74 49 64 78 29 3b 0a 20 20 20 20 73  pDestIdx);.    s
ff20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ff30: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
ff40: 2c 20 69 44 65 73 74 2c 20 70 44 65 73 74 49 64  , iDest, pDestId
ff50: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 44 65 73 74  x->tnum, iDbDest
ff60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ff70: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
ff80: 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
ff90: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 56 64  HANDOFF);.    Vd
ffa0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ffb0: 73 22 2c 20 70 44 65 73 74 49 64 78 2d 3e 7a 4e  s", pDestIdx->zN
ffc0: 61 6d 65 29 29 3b 0a 20 20 20 20 61 64 64 72 31  ame));.    addr1
ffd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ffe0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
fff0: 64 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20 20  d, iSrc, 0);.   
10000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10010 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
10020 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b   iSrc, regData);
10030 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10040 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
10050 49 6e 73 65 72 74 2c 20 69 44 65 73 74 2c 20 72  Insert, iDest, r
10060 65 67 44 61 74 61 2c 20 31 29 3b 0a 20 20 20 20  egData, 1);.    
10070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10080 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 53  2(v, OP_Next, iS
10090 72 63 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  rc, addr1+1);.  
100a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
100b0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
100c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
100d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d  beJumpHere(v, em
100e0 70 74 79 53 72 63 54 65 73 74 29 3b 0a 20 20 73  ptySrcTest);.  s
100f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
10100 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
10110 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
10120 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
10130 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 29  pParse, regData)
10140 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10150 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
10160 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20 73  e, iSrc, 0);.  s
10170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10180 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44  (v, OP_Close, iD
10190 65 73 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65  est, 0);.  if( e
101a0 6d 70 74 79 44 65 73 74 54 65 73 74 20 29 7b 0a  mptyDestTest ){.
101b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
101c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
101d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
101e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
101f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d 70 74  JumpHere(v, empt
10200 79 44 65 73 74 54 65 73 74 29 3b 0a 20 20 20 20  yDestTest);.    
10210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10220 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
10230 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  Dest, 0);.    re
10240 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
10250 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10260 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
10270 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f  QLITE_OMIT_XFER_
10280 4f 50 54 20 2a 2f 0a                             OPT */.