/ Hex Artifact Content
Login

Artifact a4995747c062256582a90b4f87f716e11b067050:


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 69 66 28 20 6f 6e 45  e{.      if( onE
add0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
ade0: 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f   ) onError = OE_
adf0: 41 62 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a 20 52  Abort; /* IMP: R
ae00: 2d 31 35 35 36 39 2d 36 33 36 32 35 20 2a 2f 0a  -15569-63625 */.
ae10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
ae20: 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
ae30: 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20  se, onError, 0, 
ae40: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
ae50: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
ae60: 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b  Label(v, allOk);
ae70: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
ae80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ae90: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
aea0: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
aeb0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
aec0: 59 20 4b 45 59 2c 20 6d 61 6b 65 20 73 75 72 65  Y KEY, make sure
aed0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
aee0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 65 77  .  ** of the new
aef0: 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e 6f 74   record does not
af00: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
af10: 74 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  t.  Except, if t
af20: 68 69 73 0a 20 20 2a 2a 20 69 73 20 61 6e 20 55  his.  ** is an U
af30: 50 44 41 54 45 20 61 6e 64 20 74 68 65 20 70 72  PDATE and the pr
af40: 69 6d 61 72 79 20 6b 65 79 20 69 73 20 6e 6f 74  imary key is not
af50: 20 63 68 61 6e 67 69 6e 67 2c 20 74 68 61 74 20   changing, that 
af60: 69 73 20 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  is OK..  */.  if
af70: 28 20 72 6f 77 69 64 43 68 6e 67 20 29 7b 0a 20  ( rowidChng ){. 
af80: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61     onError = pTa
af90: 62 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20 20 20 20  b->keyConf;.    
afa0: 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f  if( overrideErro
afb0: 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r!=OE_Default ){
afc0: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
afd0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a   overrideError;.
afe0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
aff0: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
b000: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
b010: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
b020: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69 66     }.    .    if
b030: 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20  ( isUpdate ){.  
b040: 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
b050: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b060: 5f 45 71 2c 20 72 65 67 52 6f 77 69 64 2c 20 30  _Eq, regRowid, 0
b070: 2c 20 72 6f 77 69 64 43 68 6e 67 29 3b 0a 20 20  , rowidChng);.  
b080: 20 20 7d 0a 20 20 20 20 6a 33 20 3d 20 73 71 6c    }.    j3 = sql
b090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b0a0: 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
b0b0: 62 61 73 65 43 75 72 2c 20 30 2c 20 72 65 67 52  baseCur, 0, regR
b0c0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 77 69 74 63  owid);.    switc
b0d0: 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  h( onError ){.  
b0e0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b0f0: 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d         onError =
b100: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20   OE_Abort;.     
b110: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
b120: 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  into the next ca
b130: 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  se */.      }.  
b140: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c      case OE_Roll
b150: 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65  back:.      case
b160: 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20   OE_Abort:.     
b170: 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b   case OE_Fail: {
b180: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b190: 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
b1a0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
b1b0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 22 50 52 49 4d  , onError, "PRIM
b1c0: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
b1d0: 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
b1e0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  IC);.        bre
b1f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
b200: 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63    case OE_Replac
b210: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e: {.        /* 
b220: 49 66 20 74 68 65 72 65 20 61 72 65 20 44 45 4c  If there are DEL
b230: 45 54 45 20 74 72 69 67 67 65 72 73 20 6f 6e 20  ETE triggers on 
b240: 74 68 69 73 20 74 61 62 6c 65 20 61 6e 64 20 74  this table and t
b250: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  he.        ** re
b260: 63 75 72 73 69 76 65 2d 74 72 69 67 67 65 72 73  cursive-triggers
b270: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 63 61   flag is set, ca
b280: 6c 6c 20 47 65 6e 65 72 61 74 65 52 6f 77 44 65  ll GenerateRowDe
b290: 6c 65 74 65 28 29 20 74 6f 0a 20 20 20 20 20 20  lete() to.      
b2a0: 20 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20    ** remove the 
b2b0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20  conflicting row 
b2c0: 66 72 6f 6d 20 74 68 65 20 74 68 65 20 74 61 62  from the the tab
b2d0: 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 66 69  le. This will fi
b2e0: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
b2f0: 65 20 74 72 69 67 67 65 72 73 20 61 6e 64 20 72  e triggers and r
b300: 65 6d 6f 76 65 20 62 6f 74 68 20 74 68 65 20 74  emove both the t
b310: 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 62  able and index b
b320: 2d 74 72 65 65 20 65 6e 74 72 69 65 73 2e 0a 20  -tree entries.. 
b330: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
b340: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
b350: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
b360: 74 72 69 67 67 65 72 73 20 6f 72 20 74 68 65 20  triggers or the 
b370: 72 65 63 75 72 73 69 76 65 2d 74 72 69 67 67 65  recursive-trigge
b380: 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6c  rs.        ** fl
b390: 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 62  ag is not set, b
b3a0: 75 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  ut the table has
b3b0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64   one or more ind
b3c0: 65 78 65 73 2c 20 63 61 6c 6c 20 0a 20 20 20 20  exes, call .    
b3d0: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 52      ** GenerateR
b3e0: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 29 2e  owIndexDelete().
b3f0: 20 54 68 69 73 20 72 65 6d 6f 76 65 73 20 74 68   This removes th
b400: 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65  e index b-tree e
b410: 6e 74 72 69 65 73 20 0a 20 20 20 20 20 20 20 20  ntries .        
b420: 2a 2a 20 6f 6e 6c 79 2e 20 54 68 65 20 74 61 62  ** only. The tab
b430: 6c 65 20 62 2d 74 72 65 65 20 65 6e 74 72 79 20  le b-tree entry 
b440: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
b450: 20 62 79 20 74 68 65 20 6e 65 77 20 65 6e 74 72   by the new entr
b460: 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  y .        ** wh
b470: 65 6e 20 69 74 20 69 73 20 69 6e 73 65 72 74 65  en it is inserte
b480: 64 2e 20 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  d.  .        **.
b490: 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 65 69          ** If ei
b4a0: 74 68 65 72 20 47 65 6e 65 72 61 74 65 52 6f 77  ther GenerateRow
b4b0: 44 65 6c 65 74 65 28 29 20 6f 72 20 47 65 6e 65  Delete() or Gene
b4c0: 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65  rateRowIndexDele
b4d0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a  te() is called,.
b4e0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20          ** also 
b4f0: 69 6e 76 6f 6b 65 20 4d 75 6c 74 69 57 72 69 74  invoke MultiWrit
b500: 65 28 29 20 74 6f 20 69 6e 64 69 63 61 74 65 20  e() to indicate 
b510: 74 68 61 74 20 74 68 69 73 20 56 44 42 45 20 6d  that this VDBE m
b520: 61 79 20 72 65 71 75 69 72 65 0a 20 20 20 20 20  ay require.     
b530: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
b540: 72 6f 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65  rollback (if the
b550: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 62   statement is ab
b560: 6f 72 74 65 64 20 61 66 74 65 72 20 74 68 65 20  orted after the 
b570: 64 65 6c 65 74 65 0a 20 20 20 20 20 20 20 20 2a  delete.        *
b580: 2a 20 74 61 6b 65 73 20 70 6c 61 63 65 29 2e 20  * takes place). 
b590: 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
b5a0: 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65 33 4d   called sqlite3M
b5b0: 75 6c 74 69 57 72 69 74 65 28 29 20 72 65 67 61  ultiWrite() rega
b5c0: 72 64 6c 65 73 73 2c 0a 20 20 20 20 20 20 20 20  rdless,.        
b5d0: 2a 2a 20 62 75 74 20 62 65 69 6e 67 20 6d 6f 72  ** but being mor
b5e0: 65 20 73 65 6c 65 63 74 69 76 65 20 68 65 72 65  e selective here
b5f0: 20 61 6c 6c 6f 77 73 20 73 74 61 74 65 6d 65 6e   allows statemen
b600: 74 73 20 6c 69 6b 65 3a 0a 20 20 20 20 20 20 20  ts like:.       
b610: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
b620: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 28   REPLACE INTO t(
b630: 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28 24 6e  rowid) VALUES($n
b640: 65 77 72 6f 77 69 64 29 0a 20 20 20 20 20 20 20  ewrowid).       
b650: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
b660: 6f 20 72 75 6e 20 77 69 74 68 6f 75 74 20 61 20  o run without a 
b670: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b680: 6c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  l if there are n
b690: 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65  o indexes on the
b6a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
b6b0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
b6c0: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70        Trigger *p
b6d0: 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20  Trigger = 0;.   
b6e0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
b6f0: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
b700: 45 5f 52 65 63 54 72 69 67 67 65 72 73 20 29 7b  E_RecTriggers ){
b710: 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
b720: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
b730: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
b740: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45  e, pTab, TK_DELE
b750: 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 0, 0);.     
b760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b770: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71 6c   pTrigger || sql
b780: 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 70  ite3FkRequired(p
b790: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
b7a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
b7b0: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
b7c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
b7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
b7e0: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20  rateRowDelete(. 
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
b800: 72 73 65 2c 20 70 54 61 62 2c 20 62 61 73 65 43  rse, pTab, baseC
b810: 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 2c  ur, regRowid, 0,
b820: 20 70 54 72 69 67 67 65 72 2c 20 4f 45 5f 52 65   pTrigger, OE_Re
b830: 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20  place.          
b840: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b850: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
b860: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  x ){.          s
b870: 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
b880: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
b890: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
b8a0: 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74  ateRowIndexDelet
b8b0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
b8c0: 62 61 73 65 43 75 72 2c 20 30 29 3b 0a 20 20 20  baseCur, 0);.   
b8d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
b8e0: 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a  eenReplace = 1;.
b8f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
b910: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20  e OE_Ignore: {. 
b920: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
b930: 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b  eenReplace==0 );
b940: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b950: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b960: 5f 47 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65  _Goto, 0, ignore
b970: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Dest);.        b
b980: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b990: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b9a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
b9b0: 33 29 3b 0a 20 20 20 20 69 66 28 20 69 73 55 70  3);.    if( isUp
b9c0: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  date ){.      sq
b9d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b9e0: 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 7d 0a  e(v, j2);.    }.
b9f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61    }..  /* Test a
ba00: 6c 6c 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ll UNIQUE constr
ba10: 61 69 6e 74 73 20 62 79 20 63 72 65 61 74 69 6e  aints by creatin
ba20: 67 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  g entries for ea
ba30: 63 68 20 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69  ch UNIQUE.  ** i
ba40: 6e 64 65 78 20 61 6e 64 20 6d 61 6b 69 6e 67 20  ndex and making 
ba50: 73 75 72 65 20 74 68 61 74 20 64 75 70 6c 69 63  sure that duplic
ba60: 61 74 65 20 65 6e 74 72 69 65 73 20 64 6f 20 6e  ate entries do n
ba70: 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
ba80: 2e 0a 20 20 2a 2a 20 41 64 64 20 74 68 65 20 6e  ..  ** Add the n
ba90: 65 77 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ew records to th
baa0: 65 20 69 6e 64 69 63 65 73 20 61 73 20 77 65 20  e indices as we 
bab0: 67 6f 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  go..  */.  for(i
bac0: 43 75 72 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  Cur=0, pIdx=pTab
bad0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
bae0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
baf0: 2c 20 69 43 75 72 2b 2b 29 7b 0a 20 20 20 20 69  , iCur++){.    i
bb00: 6e 74 20 72 65 67 49 64 78 3b 0a 20 20 20 20 69  nt regIdx;.    i
bb10: 6e 74 20 72 65 67 52 3b 0a 0a 20 20 20 20 69 66  nt regR;..    if
bb20: 28 20 61 52 65 67 49 64 78 5b 69 43 75 72 5d 3d  ( aRegIdx[iCur]=
bb30: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
bb40: 2f 2a 20 53 6b 69 70 20 75 6e 75 73 65 64 20 69  /* Skip unused i
bb50: 6e 64 69 63 65 73 20 2a 2f 0a 0a 20 20 20 20 2f  ndices */..    /
bb60: 2a 20 43 72 65 61 74 65 20 61 20 6b 65 79 20 66  * Create a key f
bb70: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  or accessing the
bb80: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
bb90: 20 20 20 20 72 65 67 49 64 78 20 3d 20 73 71 6c      regIdx = sql
bba0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
bbb0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6e  (pParse, pIdx->n
bbc0: 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 66  Column+1);.    f
bbd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
bbe0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
bbf0: 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
bc00: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
bc10: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d  ;.      if( idx=
bc20: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
bc30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bc40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bc50: 53 43 6f 70 79 2c 20 72 65 67 52 6f 77 69 64 2c  SCopy, regRowid,
bc60: 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20 20 20   regIdx+i);.    
bc70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bc80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bc90: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
bca0: 72 65 67 44 61 74 61 2b 69 64 78 2c 20 72 65 67  regData+idx, reg
bcb0: 49 64 78 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a  Idx+i);.      }.
bcc0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bcd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bce0: 50 5f 53 43 6f 70 79 2c 20 72 65 67 52 6f 77 69  P_SCopy, regRowi
bcf0: 64 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20  d, regIdx+i);.  
bd00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd10: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
bd20: 63 6f 72 64 2c 20 72 65 67 49 64 78 2c 20 70 49  cord, regIdx, pI
bd30: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 61  dx->nColumn+1, a
bd40: 52 65 67 49 64 78 5b 69 43 75 72 5d 29 3b 0a 20  RegIdx[iCur]);. 
bd50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
bd60: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 73 71  angeP4(v, -1, sq
bd70: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
bd80: 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 2c 20  tyStr(v, pIdx), 
bd90: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
bda0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
bdb0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
bdc0: 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f  egIdx, pIdx->nCo
bdd0: 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  lumn+1);..    /*
bde0: 20 46 69 6e 64 20 6f 75 74 20 77 68 61 74 20 61   Find out what a
bdf0: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e  ction to take in
be00: 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61   case there is a
be10: 6e 20 69 6e 64 65 78 69 6e 67 20 63 6f 6e 66 6c  n indexing confl
be20: 69 63 74 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72  ict */.    onErr
be30: 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72  or = pIdx->onErr
be40: 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72  or;.    if( onEr
be50: 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 20  ror==OE_None ){ 
be60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
be70: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
be80: 50 61 72 73 65 2c 20 72 65 67 49 64 78 2c 20 70  Parse, regIdx, p
be90: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b  Idx->nColumn+1);
bea0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
beb0: 20 20 2f 2a 20 70 49 64 78 20 69 73 20 6e 6f 74    /* pIdx is not
bec0: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20   a UNIQUE index 
bed0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
bee0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d   overrideError!=
bef0: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
bf00: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
bf10: 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20  errideError;.   
bf20: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72   }else if( onErr
bf30: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
bf40: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
bf50: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
bf60: 7d 0a 20 20 20 20 69 66 28 20 73 65 65 6e 52 65  }.    if( seenRe
bf70: 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69  place ){.      i
bf80: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49  f( onError==OE_I
bf90: 67 6e 6f 72 65 20 29 20 6f 6e 45 72 72 6f 72 20  gnore ) onError 
bfa0: 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
bfb0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 6f 6e 45      else if( onE
bfc0: 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 20 29 20  rror==OE_Fail ) 
bfd0: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
bfe0: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  rt;.    }.    . 
bff0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
c000: 65 65 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e  ee if the new in
c010: 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  dex entry will b
c020: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20  e unique */.    
c030: 72 65 67 52 20 3d 20 73 71 6c 69 74 65 33 47 65  regR = sqlite3Ge
c040: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
c050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c060: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
c070: 6f 70 79 2c 20 72 65 67 4f 6c 64 52 6f 77 69 64  opy, regOldRowid
c080: 2c 20 72 65 67 52 29 3b 0a 20 20 20 20 6a 33 20  , regR);.    j3 
c090: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c0a0: 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  Op4(v, OP_IsUniq
c0b0: 75 65 2c 20 62 61 73 65 43 75 72 2b 69 43 75 72  ue, baseCur+iCur
c0c0: 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +1, 0,.         
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 72 65 67 52 2c 20 53 51 4c 49 54 45 5f 49    regR, SQLITE_I
c0f0: 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67 49 64 78  NT_TO_PTR(regIdx
c100: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
c120: 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c  _INT32);.    sql
c130: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
c140: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
c150: 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  Idx, pIdx->nColu
c160: 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  mn+1);..    /* G
c170: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c180: 74 20 65 78 65 63 75 74 65 73 20 69 66 20 74 68  t executes if th
c190: 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72  e new index entr
c1a0: 79 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  y is not unique 
c1b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  */.    assert( o
c1c0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62  nError==OE_Rollb
c1d0: 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d  ack || onError==
c1e0: 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72  OE_Abort || onEr
c1f0: 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ror==OE_Fail.   
c200: 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d       || onError=
c210: 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e  =OE_Ignore || on
c220: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
c230: 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  e );.    switch(
c240: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
c250: 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61    case OE_Rollba
c260: 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ck:.      case O
c270: 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63  E_Abort:.      c
c280: 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20  ase OE_Fail: {. 
c290: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
c2a0: 20 20 20 20 20 20 53 74 72 41 63 63 75 6d 20 65        StrAccum e
c2b0: 72 72 4d 73 67 3b 0a 20 20 20 20 20 20 20 20 63  rrMsg;.        c
c2c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
c2d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
c2e0: 45 72 72 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  Err;..        sq
c2f0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
c300: 74 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c  t(&errMsg, 0, 0,
c310: 20 32 30 30 29 3b 0a 20 20 20 20 20 20 20 20 65   200);.        e
c320: 72 72 4d 73 67 2e 64 62 20 3d 20 70 50 61 72 73  rrMsg.db = pPars
c330: 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 7a  e->db;.        z
c340: 53 65 70 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Sep = pIdx->nCol
c350: 75 6d 6e 3e 31 20 3f 20 22 63 6f 6c 75 6d 6e 73  umn>1 ? "columns
c360: 20 22 20 3a 20 22 63 6f 6c 75 6d 6e 20 22 3b 0a   " : "column ";.
c370: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
c380: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
c390: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
c3a0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
c3b0: 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
c3c0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
c3d0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  me;.          sq
c3e0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
c3f0: 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 7a 53 65  end(&errMsg, zSe
c400: 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  p, -1);.        
c410: 20 20 7a 53 65 70 20 3d 20 22 2c 20 22 3b 0a 20    zSep = ", ";. 
c420: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c430: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
c440: 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 2c 20 2d 31  errMsg, zCol, -1
c450: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c460: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
c470: 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
c480: 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
c490: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 31 20  pIdx->nColumn>1 
c4a0: 3f 20 22 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  ? " are not uniq
c4b0: 75 65 22 20 3a 20 22 20 69 73 20 6e 6f 74 20 75  ue" : " is not u
c4c0: 6e 69 71 75 65 22 2c 20 2d 31 29 3b 0a 20 20 20  nique", -1);.   
c4d0: 20 20 20 20 20 7a 45 72 72 20 3d 20 73 71 6c 69       zErr = sqli
c4e0: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
c4f0: 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 20 20  h(&errMsg);.    
c500: 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43      sqlite3HaltC
c510: 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
c520: 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c  , onError, zErr,
c530: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
c540: 69 74 65 33 44 62 46 72 65 65 28 65 72 72 4d 73  ite3DbFree(errMs
c550: 67 2e 64 62 2c 20 7a 45 72 72 29 3b 0a 20 20 20  g.db, zErr);.   
c560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c570: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
c580: 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20  E_Ignore: {.    
c590: 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
c5a0: 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b 0a 20 20  Replace==0 );.  
c5b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
c5d0: 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73  to, 0, ignoreDes
c5e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
c5f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
c600: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c610: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
c620: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  igger = 0;.     
c630: 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72     assert( onErr
c640: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
c650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c660: 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72  3MultiWrite(pPar
c670: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
c680: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
c690: 67 73 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69  gs&SQLITE_RecTri
c6a0: 67 67 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20  ggers ){.       
c6b0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71     pTrigger = sq
c6c0: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
c6d0: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  st(pParse, pTab,
c6e0: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30   TK_DELETE, 0, 0
c6f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c700: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
c710: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 0a 20  rateRowDelete(. 
c720: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
c730: 65 2c 20 70 54 61 62 2c 20 62 61 73 65 43 75 72  e, pTab, baseCur
c740: 2c 20 72 65 67 52 2c 20 30 2c 20 70 54 72 69 67  , regR, 0, pTrig
c750: 67 65 72 2c 20 4f 45 5f 52 65 70 6c 61 63 65 0a  ger, OE_Replace.
c760: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
c770: 20 20 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d     seenReplace =
c780: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
c790: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c7b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 33 29 3b  JumpHere(v, j3);
c7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
c7d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
c7e0: 65 2c 20 72 65 67 52 29 3b 0a 20 20 7d 0a 20 20  e, regR);.  }.  
c7f0: 0a 20 20 69 66 28 20 70 62 4d 61 79 52 65 70 6c  .  if( pbMayRepl
c800: 61 63 65 20 29 7b 0a 20 20 20 20 2a 70 62 4d 61  ace ){.    *pbMa
c810: 79 52 65 70 6c 61 63 65 20 3d 20 73 65 65 6e 52  yReplace = seenR
c820: 65 70 6c 61 63 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eplace;.  }.}../
c830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c840: 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
c850: 20 74 6f 20 66 69 6e 69 73 68 20 74 68 65 20 49   to finish the I
c860: 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
c870: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 74 68 61  operation.** tha
c880: 74 20 77 61 73 20 73 74 61 72 74 65 64 20 62 79  t was started by
c890: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
c8a0: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
c8b0: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
c8c0: 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65 63 75 74 69  ..** A consecuti
c8d0: 76 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  ve range of regi
c8e0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
c8f0: 74 20 72 65 67 52 6f 77 69 64 20 63 6f 6e 74 61  t regRowid conta
c900: 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64  ins the.** rowid
c910: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
c920: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
c930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  .**.** The argum
c940: 65 6e 74 73 20 74 6f 20 74 68 69 73 20 72 6f 75  ents to this rou
c950: 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 74  tine should be t
c960: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66  he same as the f
c970: 69 72 73 74 20 73 69 78 0a 2a 2a 20 61 72 67 75  irst six.** argu
c980: 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33  ments to sqlite3
c990: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
c9a0: 6e 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a 76 6f 69  ntChecks..*/.voi
c9b0: 64 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74  d sqlite3Complet
c9c0: 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20 50 61  eInsertion(.  Pa
c9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c9e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
c9f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
ca00: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
ca10: 20 2f 2a 20 74 68 65 20 74 61 62 6c 65 20 69 6e   /* the table in
ca20: 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
ca30: 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69  inserting */.  i
ca40: 6e 74 20 62 61 73 65 43 75 72 2c 20 20 20 20 20  nt baseCur,     
ca50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61     /* Index of a
ca60: 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   read/write curs
ca70: 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 70  or pointing at p
ca80: 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Tab */.  int reg
ca90: 52 6f 77 69 64 2c 20 20 20 20 20 20 20 2f 2a 20  Rowid,       /* 
caa0: 52 61 6e 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74  Range of content
cab0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49   */.  int *aRegI
cac0: 64 78 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  dx,       /* Reg
cad0: 69 73 74 65 72 20 75 73 65 64 20 62 79 20 65 61  ister used by ea
cae0: 63 68 20 69 6e 64 65 78 2e 20 20 30 20 66 6f 72  ch index.  0 for
caf0: 20 75 6e 75 73 65 64 20 69 6e 64 69 63 65 73 20   unused indices 
cb00: 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70 64 61 74  */.  int isUpdat
cb10: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e,       /* True
cb20: 20 66 6f 72 20 55 50 44 41 54 45 2c 20 46 61 6c   for UPDATE, Fal
cb30: 73 65 20 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f  se for INSERT */
cb40: 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61  .  int appendBia
cb50: 73 2c 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  s,     /* True i
cb60: 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79  f this is likely
cb70: 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64   to be an append
cb80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 53 65 65   */.  int useSee
cb90: 6b 52 65 73 75 6c 74 20 20 20 2f 2a 20 54 72 75  kResult   /* Tru
cba0: 65 20 74 6f 20 73 65 74 20 74 68 65 20 55 53 45  e to set the USE
cbb0: 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20  SEEKRESULT flag 
cbc0: 6f 6e 20 4f 50 5f 5b 49 64 78 5d 49 6e 73 65 72  on OP_[Idx]Inser
cbd0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
cbe0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
cbf0: 74 20 6e 49 64 78 3b 0a 20 20 49 6e 64 65 78 20  t nIdx;.  Index 
cc00: 2a 70 49 64 78 3b 0a 20 20 75 38 20 70 69 6b 5f  *pIdx;.  u8 pik_
cc10: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 65 67  flags;.  int reg
cc20: 44 61 74 61 3b 0a 20 20 69 6e 74 20 72 65 67 52  Data;.  int regR
cc30: 65 63 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  ec;..  v = sqlit
cc40: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
cc50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
cc60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
cc70: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
cc80: 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c  );  /* This tabl
cc90: 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20  e is not a VIEW 
cca0: 2a 2f 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c  */.  for(nIdx=0,
ccb0: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
ccc0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ccd0: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78  Idx->pNext, nIdx
cce0: 2b 2b 29 7b 7d 0a 20 20 66 6f 72 28 69 3d 6e 49  ++){}.  for(i=nI
ccf0: 64 78 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  dx-1; i>=0; i--)
cd00: 7b 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64  {.    if( aRegId
cd10: 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  x[i]==0 ) contin
cd20: 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
cd30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cd40: 49 64 78 49 6e 73 65 72 74 2c 20 62 61 73 65 43  IdxInsert, baseC
cd50: 75 72 2b 69 2b 31 2c 20 61 52 65 67 49 64 78 5b  ur+i+1, aRegIdx[
cd60: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65  i]);.    if( use
cd70: 53 65 65 6b 52 65 73 75 6c 74 20 29 7b 0a 20 20  SeekResult ){.  
cd80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
cd90: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
cda0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
cdb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
cdc0: 67 44 61 74 61 20 3d 20 72 65 67 52 6f 77 69 64  gData = regRowid
cdd0: 20 2b 20 31 3b 0a 20 20 72 65 67 52 65 63 20 3d   + 1;.  regRec =
cde0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
cdf0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
ce00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ce10: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
ce20: 2c 20 72 65 67 44 61 74 61 2c 20 70 54 61 62 2d  , regData, pTab-
ce30: 3e 6e 43 6f 6c 2c 20 72 65 67 52 65 63 29 3b 0a  >nCol, regRec);.
ce40: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66    sqlite3TableAf
ce50: 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 54 61  finityStr(v, pTa
ce60: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  b);.  sqlite3Exp
ce70: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
ce80: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
ce90: 44 61 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Data, pTab->nCol
cea0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
ceb0: 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 70  >nested ){.    p
cec0: 69 6b 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  ik_flags = 0;.  
ced0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 69 6b 5f 66  }else{.    pik_f
cee0: 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43  lags = OPFLAG_NC
cef0: 48 41 4e 47 45 3b 0a 20 20 20 20 70 69 6b 5f 66  HANGE;.    pik_f
cf00: 6c 61 67 73 20 7c 3d 20 28 69 73 55 70 64 61 74  lags |= (isUpdat
cf10: 65 3f 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  e?OPFLAG_ISUPDAT
cf20: 45 3a 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57  E:OPFLAG_LASTROW
cf30: 49 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ID);.  }.  if( a
cf40: 70 70 65 6e 64 42 69 61 73 20 29 7b 0a 20 20 20  ppendBias ){.   
cf50: 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50   pik_flags |= OP
cf60: 46 4c 41 47 5f 41 50 50 45 4e 44 3b 0a 20 20 7d  FLAG_APPEND;.  }
cf70: 0a 20 20 69 66 28 20 75 73 65 53 65 65 6b 52 65  .  if( useSeekRe
cf80: 73 75 6c 74 20 29 7b 0a 20 20 20 20 70 69 6b 5f  sult ){.    pik_
cf90: 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f  flags |= OPFLAG_
cfa0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20  USESEEKRESULT;. 
cfb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
cfc0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
cfd0: 65 72 74 2c 20 62 61 73 65 43 75 72 2c 20 72 65  ert, baseCur, re
cfe0: 67 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRec, regRowid);
cff0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
d000: 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 73 71  nested ){.    sq
d010: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d020: 34 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  4(v, -1, pTab->z
d030: 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29  Name, P4_STATIC)
d040: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
d050: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
d060: 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a  ik_flags);.}../*
d070: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d080: 65 20 74 68 61 74 20 77 69 6c 6c 20 6f 70 65 6e  e that will open
d090: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 20 74   cursors for a t
d0a0: 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c  able and for all
d0b0: 0a 2a 2a 20 69 6e 64 69 63 65 73 20 6f 66 20 74  .** indices of t
d0c0: 68 61 74 20 74 61 62 6c 65 2e 20 20 54 68 65 20  hat table.  The 
d0d0: 22 62 61 73 65 43 75 72 22 20 70 61 72 61 6d 65  "baseCur" parame
d0e0: 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
d0f0: 72 20 6e 75 6d 62 65 72 20 75 73 65 64 0a 2a 2a  r number used.**
d100: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
d110: 20 49 6e 64 69 63 65 73 20 61 72 65 20 6f 70 65   Indices are ope
d120: 6e 65 64 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ned on subsequen
d130: 74 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  t cursors..**.**
d140: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d150: 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 6f 6e  er of indices on
d160: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   the table..*/.i
d170: 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  nt sqlite3OpenTa
d180: 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a 20  bleAndIndices(. 
d190: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d1a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d1b0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
d1c0: 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61  *pTab,     /* Ta
d1d0: 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ble to be opened
d1e0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 43 75   */.  int baseCu
d1f0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
d200: 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64   number assigned
d210: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
d220: 0a 20 20 69 6e 74 20 6f 70 20 20 20 20 20 20 20  .  int op       
d230: 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65 6e 52 65      /* OP_OpenRe
d240: 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69  ad or OP_OpenWri
d250: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
d260: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 49  ;.  int iDb;.  I
d270: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 56 64  ndex *pIdx;.  Vd
d280: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 49 73  be *v;..  if( Is
d290: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
d2a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 44 62 20  return 0;.  iDb 
d2b0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
d2c0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
d2d0: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
d2e0: 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  );.  v = sqlite3
d2f0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d300: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
d310: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  );.  sqlite3Open
d320: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 62 61  Table(pParse, ba
d330: 73 65 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62  seCur, iDb, pTab
d340: 2c 20 6f 70 29 3b 0a 20 20 66 6f 72 28 69 3d 31  , op);.  for(i=1
d350: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
d360: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
d370: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
d380: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
d390: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
d3a0: 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
d3b0: 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 61 73  e, pIdx);.    as
d3c0: 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
d3d0: 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
d3e0: 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
d3f0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f  3VdbeAddOp4(v, o
d400: 70 2c 20 69 2b 62 61 73 65 43 75 72 2c 20 70 49  p, i+baseCur, pI
d410: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a 20  dx->tnum, iDb,. 
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
d440: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
d450: 44 4f 46 46 29 3b 0a 20 20 20 20 56 64 62 65 43  DOFF);.    VdbeC
d460: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
d470: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
d480: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
d490: 2d 3e 6e 54 61 62 3c 62 61 73 65 43 75 72 2b 69  ->nTab<baseCur+i
d4a0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
d4b0: 6e 54 61 62 20 3d 20 62 61 73 65 43 75 72 2b 69  nTab = baseCur+i
d4c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
d4d0: 2d 31 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  -1;.}...#ifdef S
d4e0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
d4f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
d500: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
d510: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
d520: 65 6e 65 76 65 72 20 74 68 65 0a 2a 2a 20 74 72  enever the.** tr
d530: 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
d540: 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68  ion is used.  Th
d550: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
d560: 65 73 74 69 6e 67 0a 2a 2a 20 70 75 72 70 6f 73  esting.** purpos
d570: 65 73 20 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b  es only - to mak
d580: 65 20 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  e sure the trans
d590: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
d5a0: 20 72 65 61 6c 6c 79 0a 2a 2a 20 69 73 20 68 61   really.** is ha
d5b0: 70 70 65 6e 69 6e 67 20 77 68 65 6e 20 69 74 20  ppening when it 
d5c0: 69 73 20 73 75 70 70 6f 73 65 20 74 6f 2e 0a 2a  is suppose to..*
d5d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66  /.int sqlite3_xf
d5e0: 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e  eropt_count;.#en
d5f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
d600: 53 54 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ST */...#ifndef 
d610: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52  SQLITE_OMIT_XFER
d620: 5f 4f 50 54 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _OPT./*.** Check
d630: 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 61   to collation na
d640: 6d 65 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  mes to see if th
d650: 65 79 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c  ey are compatibl
d660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d670: 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 43   xferCompatibleC
d680: 6f 6c 6c 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63  ollation(const c
d690: 68 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63  har *z1, const c
d6a0: 68 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20  har *z2){.  if( 
d6b0: 7a 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  z1==0 ){.    ret
d6c0: 75 72 6e 20 7a 32 3d 3d 30 3b 0a 20 20 7d 0a 20  urn z2==0;.  }. 
d6d0: 20 69 66 28 20 7a 32 3d 3d 30 20 29 7b 0a 20 20   if( z2==0 ){.  
d6e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d6f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d700: 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 3d  StrICmp(z1, z2)=
d710: 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  =0;.}.../*.** Ch
d720: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 6e  eck to see if in
d730: 64 65 78 20 70 53 72 63 20 69 73 20 63 6f 6d 70  dex pSrc is comp
d740: 61 74 69 62 6c 65 20 61 73 20 61 20 73 6f 75 72  atible as a sour
d750: 63 65 20 6f 66 20 64 61 74 61 0a 2a 2a 20 66 6f  ce of data.** fo
d760: 72 20 69 6e 64 65 78 20 70 44 65 73 74 20 69 6e  r index pDest in
d770: 20 61 6e 20 69 6e 73 65 72 74 20 74 72 61 6e 73   an insert trans
d780: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
d790: 2e 20 20 54 68 65 20 72 75 6c 65 73 0a 2a 2a 20  .  The rules.** 
d7a0: 66 6f 72 20 61 20 63 6f 6d 70 61 74 69 62 6c 65  for a compatible
d7b0: 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20   index:.**.**   
d7c0: 20 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20 69   *   The index i
d7d0: 73 20 6f 76 65 72 20 74 68 65 20 73 61 6d 65 20  s over the same 
d7e0: 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  set of columns.*
d7f0: 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d  *    *   The sam
d800: 65 20 44 45 53 43 20 61 6e 64 20 41 53 43 20 6d  e DESC and ASC m
d810: 61 72 6b 69 6e 67 73 20 6f 63 63 75 72 73 20 6f  arkings occurs o
d820: 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  n all columns.**
d830: 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65      *   The same
d840: 20 6f 6e 45 72 72 6f 72 20 70 72 6f 63 65 73 73   onError process
d850: 69 6e 67 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f  ing (OE_Abort, O
d860: 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 0a 2a  E_Ignore, etc).*
d870: 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d  *    *   The sam
d880: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
d890: 65 6e 63 65 20 6f 6e 20 65 61 63 68 20 63 6f 6c  ence on each col
d8a0: 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
d8b0: 74 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65  t xferCompatible
d8c0: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 44 65  Index(Index *pDe
d8d0: 73 74 2c 20 49 6e 64 65 78 20 2a 70 53 72 63 29  st, Index *pSrc)
d8e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
d8f0: 65 72 74 28 20 70 44 65 73 74 20 26 26 20 70 53  ert( pDest && pS
d900: 72 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rc );.  assert( 
d910: 70 44 65 73 74 2d 3e 70 54 61 62 6c 65 21 3d 70  pDest->pTable!=p
d920: 53 72 63 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20  Src->pTable );. 
d930: 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 43 6f 6c   if( pDest->nCol
d940: 75 6d 6e 21 3d 70 53 72 63 2d 3e 6e 43 6f 6c 75  umn!=pSrc->nColu
d950: 6d 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mn ){.    return
d960: 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65   0;   /* Differe
d970: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  nt number of col
d980: 75 6d 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  umns */.  }.  if
d990: 28 20 70 44 65 73 74 2d 3e 6f 6e 45 72 72 6f 72  ( pDest->onError
d9a0: 21 3d 70 53 72 63 2d 3e 6f 6e 45 72 72 6f 72 20  !=pSrc->onError 
d9b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d9c0: 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20     /* Different 
d9d0: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
d9e0: 69 6f 6e 20 73 74 72 61 74 65 67 69 65 73 20 2a  ion strategies *
d9f0: 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  /.  }.  for(i=0;
da00: 20 69 3c 70 53 72 63 2d 3e 6e 43 6f 6c 75 6d 6e   i<pSrc->nColumn
da10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
da20: 70 53 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pSrc->aiColumn[i
da30: 5d 21 3d 70 44 65 73 74 2d 3e 61 69 43 6f 6c 75  ]!=pDest->aiColu
da40: 6d 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72  mn[i] ){.      r
da50: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
da60: 66 66 65 72 65 6e 74 20 63 6f 6c 75 6d 6e 73 20  fferent columns 
da70: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 20 20 7d  indexed */.    }
da80: 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
da90: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 21 3d 70 44  SortOrder[i]!=pD
daa0: 65 73 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  est->aSortOrder[
dab0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  i] ){.      retu
dac0: 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
dad0: 72 65 6e 74 20 73 6f 72 74 20 6f 72 64 65 72 73  rent sort orders
dae0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
daf0: 28 20 21 78 66 65 72 43 6f 6d 70 61 74 69 62 6c  ( !xferCompatibl
db00: 65 43 6f 6c 6c 61 74 69 6f 6e 28 70 53 72 63 2d  eCollation(pSrc-
db10: 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 70 44 65 73 74  >azColl[i],pDest
db20: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a  ->azColl[i]) ){.
db30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
db40: 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63    /* Different c
db50: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
db60: 65 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  es */.    }.  }.
db70: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 74 65 73 74  .  /* If no test
db80: 20 61 62 6f 76 65 20 66 61 69 6c 73 20 74 68 65   above fails the
db90: 6e 20 74 68 65 20 69 6e 64 69 63 65 73 20 6d 75  n the indices mu
dba0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
dbb0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
dbc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
dbd0: 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70   the transfer op
dbe0: 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 49 4e  timization on IN
dbf0: 53 45 52 54 73 20 6f 66 20 74 68 65 20 66 6f 72  SERTs of the for
dc00: 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45  m.**.**     INSE
dc10: 52 54 20 49 4e 54 4f 20 74 61 62 31 20 53 45 4c  RT INTO tab1 SEL
dc20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 32 3b  ECT * FROM tab2;
dc30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69  .**.** This opti
dc40: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  mization is only
dc50: 20 61 74 74 65 6d 70 74 65 64 20 69 66 0a 2a 2a   attempted if.**
dc60: 0a 2a 2a 20 20 20 20 28 31 29 20 20 74 61 62 31  .**    (1)  tab1
dc70: 20 61 6e 64 20 74 61 62 32 20 68 61 76 65 20 69   and tab2 have i
dc80: 64 65 6e 74 69 63 61 6c 20 73 63 68 65 6d 61 73  dentical schemas
dc90: 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 74   including all t
dca0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 61  he.**         sa
dcb0: 6d 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 63  me indices and c
dcc0: 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 0a 2a 2a  onstraints.**.**
dcd0: 20 20 20 20 28 32 29 20 20 74 61 62 31 20 61 6e      (2)  tab1 an
dce0: 64 20 74 61 62 32 20 61 72 65 20 64 69 66 66 65  d tab2 are diffe
dcf0: 72 65 6e 74 20 74 61 62 6c 65 73 0a 2a 2a 0a 2a  rent tables.**.*
dd00: 2a 20 20 20 20 28 33 29 20 20 54 68 65 72 65 20  *    (3)  There 
dd10: 6d 75 73 74 20 62 65 20 6e 6f 20 74 72 69 67 67  must be no trigg
dd20: 65 72 73 20 6f 6e 20 74 61 62 31 0a 2a 2a 0a 2a  ers on tab1.**.*
dd30: 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 72 65  *    (4)  The re
dd40: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
dd50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
dd60: 20 69 73 20 22 2a 22 0a 2a 2a 0a 2a 2a 20 20 20   is "*".**.**   
dd70: 20 28 35 29 20 20 54 68 65 20 53 45 4c 45 43 54   (5)  The SELECT
dd80: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 6e   statement has n
dd90: 6f 20 57 48 45 52 45 2c 20 48 41 56 49 4e 47 2c  o WHERE, HAVING,
dda0: 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50   ORDER BY, GROUP
ddb0: 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20   BY,.**         
ddc0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e  or LIMIT clause.
ddd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 36 29 20 20 54  .**.**    (6)  T
dde0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ddf0: 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ent is a simple 
de00: 28 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 29  (not a compound)
de10: 20 73 65 6c 65 63 74 20 74 68 61 74 0a 2a 2a 20   select that.** 
de20: 20 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73          contains
de30: 20 6f 6e 6c 79 20 74 61 62 32 20 69 6e 20 69 74   only tab2 in it
de40: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  s FROM clause.**
de50: 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20  .** This method 
de60: 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
de70: 20 74 68 65 20 49 4e 53 45 52 54 20 74 72 61 6e   the INSERT tran
de80: 73 66 65 72 73 20 72 61 77 20 72 65 63 6f 72 64  sfers raw record
de90: 73 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 32 20 6f  s from.** tab2 o
dea0: 76 65 72 20 74 6f 20 74 61 62 31 2e 20 20 54 68  ver to tab1.  Th
deb0: 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  e columns are no
dec0: 74 20 64 65 63 6f 64 65 64 2e 20 20 52 61 77 20  t decoded.  Raw 
ded0: 72 65 63 6f 72 64 73 20 66 72 6f 6d 0a 2a 2a 20  records from.** 
dee0: 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66 20 74  the indices of t
def0: 61 62 32 20 61 72 65 20 74 72 61 6e 73 66 65 72  ab2 are transfer
df00: 65 64 20 74 6f 20 74 61 62 31 20 61 73 20 77 65  ed to tab1 as we
df10: 6c 6c 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67  ll.  In so doing
df20: 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 69  ,.** the resulti
df30: 6e 67 20 74 61 62 31 20 68 61 73 20 6d 75 63 68  ng tab1 has much
df40: 20 6c 65 73 73 20 66 72 61 67 6d 65 6e 74 61 74   less fragmentat
df50: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
df60: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
df70: 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69  TRUE if the opti
df80: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 74 74 65  mization is atte
df90: 6d 70 74 65 64 2e 20 20 49 66 20 61 6e 79 0a 2a  mpted.  If any.*
dfa0: 2a 20 6f 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * of the conditi
dfb0: 6f 6e 73 20 61 62 6f 76 65 20 66 61 69 6c 20 73  ons above fail s
dfc0: 6f 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  o that the optim
dfd0: 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  ization should n
dfe0: 6f 74 0a 2a 2a 20 62 65 20 61 74 74 65 6d 70 74  ot.** be attempt
dff0: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ed, then this ro
e000: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 46 41  utine returns FA
e010: 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LSE..*/.static i
e020: 6e 74 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74  nt xferOptimizat
e030: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
e040: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
e050: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
e060: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44 65 73 74  /.  Table *pDest
e070: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
e080: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 69 6e   table we are in
e090: 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a  serting into */.
e0a0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
e0b0: 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53 45 4c  t,      /* A SEL
e0c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
e0d0: 20 75 73 65 20 61 73 20 74 68 65 20 64 61 74 61   use as the data
e0e0: 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74   source */.  int
e0f0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
e100: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e     /* How to han
e110: 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  dle constraint e
e120: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  rrors */.  int i
e130: 44 62 44 65 73 74 20 20 20 20 20 20 20 20 20 20  DbDest          
e140: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
e150: 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a 29 7b 0a   of pDest */.){.
e160: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
e170: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
e180: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
e190: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
e1a0: 43 54 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  CT */.  Table *p
e1b0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
e1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e1d0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
e1e0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 53 45 4c 45  M clause of SELE
e1f0: 43 54 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  CT */.  Index *p
e200: 53 72 63 49 64 78 2c 20 2a 70 44 65 73 74 49 64  SrcIdx, *pDestId
e210: 78 3b 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  x;       /* Sour
e220: 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
e230: 6f 6e 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  on indices */.  
e240: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
e250: 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20  tem *pItem;     
e260: 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
e270: 66 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20  f pSelect->pSrc 
e280: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e2b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
e2c0: 44 62 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  DbSrc;          
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e2e0: 68 65 20 64 61 74 61 62 61 73 65 20 6f 66 20 70  he database of p
e2f0: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72  Src */.  int iSr
e300: 63 2c 20 69 44 65 73 74 3b 20 20 20 20 20 20 20  c, iDest;       
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
e320: 73 6f 72 73 20 66 72 6f 6d 20 73 6f 75 72 63 65  sors from source
e330: 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e   and destination
e340: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 2c   */.  int addr1,
e350: 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20   addr2;         
e360: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 61         /* Loop a
e370: 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
e380: 74 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 3b  t emptyDestTest;
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3a0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 65 73  * Address of tes
e3b0: 74 20 66 6f 72 20 65 6d 70 74 79 20 70 44 65 73  t for empty pDes
e3c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79  t */.  int empty
e3d0: 53 72 63 54 65 73 74 3b 20 20 20 20 20 20 20 20  SrcTest;        
e3e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
e3f0: 73 73 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65  ss of test for e
e400: 6d 70 74 79 20 70 53 72 63 20 2a 2f 0a 20 20 56  mpty pSrc */.  V
e410: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 2f 2a 20 54 68 65 20 56 44 42 45 20 77 65 20 61  /* The VDBE we a
e440: 72 65 20 62 75 69 6c 64 69 6e 67 20 2a 2f 0a 20  re building */. 
e450: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61    /* Key informa
e480: 74 69 6f 6e 20 66 6f 72 20 61 6e 20 69 6e 64 65  tion for an inde
e490: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75  x */.  int regAu
e4a0: 74 6f 69 6e 63 3b 20 20 20 20 20 20 20 20 20 20  toinc;          
e4b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
e4c0: 79 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20  y register used 
e4d0: 62 79 20 41 55 54 4f 49 4e 43 20 2a 2f 0a 20 20  by AUTOINC */.  
e4e0: 69 6e 74 20 64 65 73 74 48 61 73 55 6e 69 71 75  int destHasUniqu
e4f0: 65 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  eIdx = 0;       
e500: 20 2f 2a 20 54 72 75 65 20 69 66 20 70 44 65 73   /* True if pDes
e510: 74 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 69  t has a UNIQUE i
e520: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
e530: 67 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64 3b  gData, regRowid;
e540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e550: 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20  gisters holding 
e560: 64 61 74 61 20 61 6e 64 20 72 6f 77 69 64 20 2a  data and rowid *
e570: 2f 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  /..  if( pSelect
e580: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
e590: 6e 20 30 3b 20 20 20 2f 2a 20 4d 75 73 74 20 62  n 0;   /* Must b
e5a0: 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 20 49  e of the form  I
e5b0: 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53  NSERT INTO ... S
e5c0: 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a 20 20 7d  ELECT ... */.  }
e5d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 72  .  if( sqlite3Tr
e5e0: 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65  iggerList(pParse
e5f0: 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  , pDest) ){.    
e600: 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74  return 0;   /* t
e610: 61 62 31 20 6d 75 73 74 20 6e 6f 74 20 68 61 76  ab1 must not hav
e620: 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  e triggers */.  
e630: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
e640: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e650: 4c 45 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  LE.  if( pDest->
e660: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69  tabFlags & TF_Vi
e670: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  rtual ){.    ret
e680: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31  urn 0;   /* tab1
e690: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 76   must not be a v
e6a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
e6b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
e6c0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
e6d0: 61 75 6c 74 20 29 7b 0a 20 20 20 20 6f 6e 45 72  ault ){.    onEr
e6e0: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
e6f0: 20 20 7d 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f    }.  if( onErro
e700: 72 21 3d 4f 45 5f 41 62 6f 72 74 20 26 26 20 6f  r!=OE_Abort && o
e710: 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 6f 6c 6c 62  nError!=OE_Rollb
e720: 61 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ack ){.    retur
e730: 6e 20 30 3b 20 20 20 2f 2a 20 43 61 6e 6e 6f 74  n 0;   /* Cannot
e740: 20 64 6f 20 4f 52 20 52 45 50 4c 41 43 45 20 6f   do OR REPLACE o
e750: 72 20 4f 52 20 49 47 4e 4f 52 45 20 6f 72 20 4f  r OR IGNORE or O
e760: 52 20 46 41 49 4c 20 2a 2f 0a 20 20 7d 0a 20 20  R FAIL */.  }.  
e770: 61 73 73 65 72 74 28 70 53 65 6c 65 63 74 2d 3e  assert(pSelect->
e780: 70 53 72 63 29 3b 20 20 20 2f 2a 20 61 6c 6c 6f  pSrc);   /* allo
e790: 63 61 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  cated even if th
e7a0: 65 72 65 20 69 73 20 6e 6f 20 46 52 4f 4d 20 63  ere is no FROM c
e7b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
e7c0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 6e 53  Select->pSrc->nS
e7d0: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  rc!=1 ){.    ret
e7e0: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d  urn 0;   /* FROM
e7f0: 20 63 6c 61 75 73 65 20 6d 75 73 74 20 68 61 76   clause must hav
e800: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 74 65  e exactly one te
e810: 72 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  rm */.  }.  if( 
e820: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61  pSelect->pSrc->a
e830: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20  [0].pSelect ){. 
e840: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
e850: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 61  * FROM clause ca
e860: 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73  nnot contain a s
e870: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
e880: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 57   if( pSelect->pW
e890: 68 65 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75  here ){.    retu
e8a0: 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
e8b0: 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
e8c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
e8d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
e8e0: 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ct->pOrderBy ){.
e8f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
e900: 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
e910: 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
e920: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d  BY clause */.  }
e930: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6e 65 65  .  /* Do not nee
e940: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 61 20  d to test for a 
e950: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
e960: 49 66 20 48 41 56 49 4e 47 20 69 73 20 70 72 65  If HAVING is pre
e970: 73 65 6e 74 20 62 75 74 0a 20 20 2a 2a 20 74 68  sent but.  ** th
e980: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
e990: 42 59 2c 20 77 65 20 77 69 6c 6c 20 67 65 74 20  BY, we will get 
e9a0: 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69  an error. */.  i
e9b0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f  f( pSelect->pGro
e9c0: 75 70 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  upBy ){.    retu
e9d0: 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
e9e0: 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
e9f0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ea00: 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
ea10: 65 6c 65 63 74 2d 3e 70 4c 69 6d 69 74 20 29 7b  elect->pLimit ){
ea20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
ea30: 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e   /* SELECT may n
ea40: 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
ea50: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20  clause */.  }.  
ea60: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
ea70: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
ea80: 2f 2a 20 4d 75 73 74 20 62 65 20 73 6f 20 69 66  /* Must be so if
ea90: 20 70 4c 69 6d 69 74 3d 3d 30 20 2a 2f 0a 20 20   pLimit==0 */.  
eaa0: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  if( pSelect->pPr
eab0: 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
eac0: 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
ead0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
eae0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 2a 2f 0a  mpound query */.
eaf0: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
eb00: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
eb10: 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
eb20: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
eb30: 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62  SELECT may not b
eb40: 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  e DISTINCT */.  
eb50: 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
eb60: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
eb70: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
eb80: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  0 );.  if( pELis
eb90: 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
eba0: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
ebb0: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
ebc0: 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
ebd0: 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2a 2f  ly one column */
ebe0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
ebf0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
ec00: 72 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  r );.  if( pELis
ec10: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
ec20: 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p!=TK_ALL ){.   
ec30: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
ec40: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
ec50: 75 73 74 20 62 65 20 74 68 65 20 73 70 65 63 69  ust be the speci
ec60: 61 6c 20 6f 70 65 72 61 74 6f 72 20 22 2a 22 20  al operator "*" 
ec70: 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  */.  }..  /* At 
ec80: 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 68 61  this point we ha
ec90: 76 65 20 65 73 74 61 62 6c 69 73 68 65 64 20 74  ve established t
eca0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
ecb0: 74 20 69 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  t is of the.  **
ecc0: 20 63 6f 72 72 65 63 74 20 73 79 6e 74 61 63 74   correct syntact
ecd0: 69 63 20 66 6f 72 6d 20 74 6f 20 70 61 72 74 69  ic form to parti
ece0: 63 69 70 61 74 65 20 69 6e 20 74 68 69 73 20 6f  cipate in this o
ecf0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f  ptimization.  No
ed00: 77 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74  w.  ** we have t
ed10: 6f 20 63 68 65 63 6b 20 74 68 65 20 73 65 6d 61  o check the sema
ed20: 6e 74 69 63 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ntics..  */.  pI
ed30: 74 65 6d 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  tem = pSelect->p
ed40: 53 72 63 2d 3e 61 3b 0a 20 20 70 53 72 63 20 3d  Src->a;.  pSrc =
ed50: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
ed60: 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ble(pParse, 0, p
ed70: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 49 74  Item->zName, pIt
ed80: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
ed90: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
eda0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
edb0: 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
edc0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
edd0: 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   a real table */
ede0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 3d  .  }.  if( pSrc=
edf0: 3d 70 44 65 73 74 20 29 7b 0a 20 20 20 20 72 65  =pDest ){.    re
ee00: 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62  turn 0;   /* tab
ee10: 31 20 61 6e 64 20 74 61 62 32 20 6d 61 79 20 6e  1 and tab2 may n
ee20: 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 74  ot be the same t
ee30: 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e  able */.  }.#ifn
ee40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ee50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
ee60: 66 28 20 70 53 72 63 2d 3e 74 61 62 46 6c 61 67  f( pSrc->tabFlag
ee70: 73 20 26 20 54 46 5f 56 69 72 74 75 61 6c 20 29  s & TF_Virtual )
ee80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
ee90: 20 20 2f 2a 20 74 61 62 32 20 6d 75 73 74 20 6e    /* tab2 must n
eea0: 6f 74 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  ot be a virtual 
eeb0: 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e  table */.  }.#en
eec0: 64 69 66 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  dif.  if( pSrc->
eed0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72  pSelect ){.    r
eee0: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61  eturn 0;   /* ta
eef0: 62 32 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  b2 may not be a 
ef00: 76 69 65 77 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  view */.  }.  if
ef10: 28 20 70 44 65 73 74 2d 3e 6e 43 6f 6c 21 3d 70  ( pDest->nCol!=p
ef20: 53 72 63 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Src->nCol ){.   
ef30: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
ef40: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
ef50: 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
ef60: 6d 65 20 69 6e 20 74 61 62 31 20 61 6e 64 20 74  me in tab1 and t
ef70: 61 62 32 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ab2 */.  }.  if(
ef80: 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 21 3d 70   pDest->iPKey!=p
ef90: 53 72 63 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Src->iPKey ){.  
efa0: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
efb0: 20 42 6f 74 68 20 74 61 62 6c 65 73 20 6d 75 73   Both tables mus
efc0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
efd0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
efe0: 4b 45 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72  KEY */.  }.  for
eff0: 28 69 3d 30 3b 20 69 3c 70 44 65 73 74 2d 3e 6e  (i=0; i<pDest->n
f000: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
f010: 66 28 20 70 44 65 73 74 2d 3e 61 43 6f 6c 5b 69  f( pDest->aCol[i
f020: 5d 2e 61 66 66 69 6e 69 74 79 21 3d 70 53 72 63  ].affinity!=pSrc
f030: 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69  ->aCol[i].affini
f040: 74 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ty ){.      retu
f050: 72 6e 20 30 3b 20 20 20 20 2f 2a 20 41 66 66 69  rn 0;    /* Affi
f060: 6e 69 74 79 20 6d 75 73 74 20 62 65 20 74 68 65  nity must be the
f070: 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c   same on all col
f080: 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
f090: 20 20 69 66 28 20 21 78 66 65 72 43 6f 6d 70 61    if( !xferCompa
f0a0: 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 70  tibleCollation(p
f0b0: 44 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  Dest->aCol[i].zC
f0c0: 6f 6c 6c 2c 20 70 53 72 63 2d 3e 61 43 6f 6c 5b  oll, pSrc->aCol[
f0d0: 69 5d 2e 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  i].zColl) ){.   
f0e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
f0f0: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
f100: 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 74 68  uence must be th
f110: 65 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f  e same on all co
f120: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  lumns */.    }. 
f130: 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 61 43     if( pDest->aC
f140: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 26 26  ol[i].notNull &&
f150: 20 21 70 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 2e   !pSrc->aCol[i].
f160: 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  notNull ){.     
f170: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
f180: 20 74 61 62 32 20 6d 75 73 74 20 62 65 20 4e 4f   tab2 must be NO
f190: 54 20 4e 55 4c 4c 20 69 66 20 74 61 62 31 20 69  T NULL if tab1 i
f1a0: 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
f1b0: 20 66 6f 72 28 70 44 65 73 74 49 64 78 3d 70 44   for(pDestIdx=pD
f1c0: 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65  est->pIndex; pDe
f1d0: 73 74 49 64 78 3b 20 70 44 65 73 74 49 64 78 3d  stIdx; pDestIdx=
f1e0: 70 44 65 73 74 49 64 78 2d 3e 70 4e 65 78 74 29  pDestIdx->pNext)
f1f0: 7b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 49  {.    if( pDestI
f200: 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
f210: 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 64 65  None ){.      de
f220: 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 3d  stHasUniqueIdx =
f230: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   1;.    }.    fo
f240: 72 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e  r(pSrcIdx=pSrc->
f250: 70 49 6e 64 65 78 3b 20 70 53 72 63 49 64 78 3b  pIndex; pSrcIdx;
f260: 20 70 53 72 63 49 64 78 3d 70 53 72 63 49 64 78   pSrcIdx=pSrcIdx
f270: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f280: 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74 69 62  if( xferCompatib
f290: 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49 64 78  leIndex(pDestIdx
f2a0: 2c 20 70 53 72 63 49 64 78 29 20 29 20 62 72 65  , pSrcIdx) ) bre
f2b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
f2c0: 28 20 70 53 72 63 49 64 78 3d 3d 30 20 29 7b 0a  ( pSrcIdx==0 ){.
f2d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
f2e0: 20 20 20 2f 2a 20 70 44 65 73 74 49 64 78 20 68     /* pDestIdx h
f2f0: 61 73 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64  as no correspond
f300: 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 70 53 72  ing index in pSr
f310: 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  c */.    }.  }.#
f320: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f330: 49 54 5f 43 48 45 43 4b 0a 20 20 69 66 28 20 70  IT_CHECK.  if( p
f340: 44 65 73 74 2d 3e 70 43 68 65 63 6b 20 26 26 20  Dest->pCheck && 
f350: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
f360: 72 65 28 70 53 72 63 2d 3e 70 43 68 65 63 6b 2c  re(pSrc->pCheck,
f370: 20 70 44 65 73 74 2d 3e 70 43 68 65 63 6b 29 20   pDest->pCheck) 
f380: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f390: 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 68 61 76     /* Tables hav
f3a0: 65 20 64 69 66 66 65 72 65 6e 74 20 43 48 45 43  e different CHEC
f3b0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  K constraints.  
f3c0: 54 69 63 6b 65 74 20 23 32 32 35 32 20 2a 2f 0a  Ticket #2252 */.
f3d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
f3e0: 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
f3f0: 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 65 69  far, it means ei
f400: 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ther:.  **.  ** 
f410: 20 20 20 2a 20 20 20 57 65 20 63 61 6e 20 61 6c     *   We can al
f420: 77 61 79 73 20 64 6f 20 74 68 65 20 74 72 61 6e  ways do the tran
f430: 73 66 65 72 20 69 66 20 74 68 65 20 74 61 62 6c  sfer if the tabl
f440: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 20 20  e contains an.  
f450: 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 69 6e 74  **        an int
f460: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
f470: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
f480: 20 20 57 65 20 63 61 6e 20 63 6f 6e 64 69 74 69    We can conditi
f490: 6f 6e 61 6c 6c 79 20 64 6f 20 74 68 65 20 74 72  onally do the tr
f4a0: 61 6e 73 66 65 72 20 69 66 20 74 68 65 20 64 65  ansfer if the de
f4b0: 73 74 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a 20 20  stination.  **  
f4c0: 20 20 20 20 20 20 74 61 62 6c 65 20 69 73 20 65        table is e
f4d0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  mpty..  */.#ifde
f4e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
f4f0: 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
f500: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
f510: 20 20 69 44 62 53 72 63 20 3d 20 73 71 6c 69 74    iDbSrc = sqlit
f520: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f530: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 72 63  pParse->db, pSrc
f540: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76 20  ->pSchema);.  v 
f550: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f560: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
f570: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
f580: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 53  ema(pParse, iDbS
f590: 72 63 29 3b 0a 20 20 69 53 72 63 20 3d 20 70 50  rc);.  iSrc = pP
f5a0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f5b0: 69 44 65 73 74 20 3d 20 70 50 61 72 73 65 2d 3e  iDest = pParse->
f5c0: 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67 41 75 74  nTab++;.  regAut
f5d0: 6f 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42 65  oinc = autoIncBe
f5e0: 67 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62 44  gin(pParse, iDbD
f5f0: 65 73 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 73  est, pDest);.  s
f600: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
f610: 70 50 61 72 73 65 2c 20 69 44 65 73 74 2c 20 69  pParse, iDest, i
f620: 44 62 44 65 73 74 2c 20 70 44 65 73 74 2c 20 4f  DbDest, pDest, O
f630: 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20  P_OpenWrite);.  
f640: 69 66 28 20 28 70 44 65 73 74 2d 3e 69 50 4b 65  if( (pDest->iPKe
f650: 79 3c 30 20 26 26 20 70 44 65 73 74 2d 3e 70 49  y<0 && pDest->pI
f660: 6e 64 65 78 21 3d 30 29 20 7c 7c 20 64 65 73 74  ndex!=0) || dest
f670: 48 61 73 55 6e 69 71 75 65 49 64 78 20 29 7b 0a  HasUniqueIdx ){.
f680: 20 20 20 20 2f 2a 20 49 66 20 74 61 62 6c 65 73      /* If tables
f690: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 6e 20   do not have an 
f6a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
f6b0: 4b 45 59 20 61 6e 64 20 74 68 65 72 65 0a 20 20  KEY and there.  
f6c0: 20 20 2a 2a 20 61 72 65 20 69 6e 64 69 63 65 73    ** are indices
f6d0: 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20 61 6e   to be copied an
f6e0: 64 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  d the destinatio
f6f0: 6e 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 0a  n is not empty,.
f700: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
f710: 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68 65 20 74  o disallow the t
f720: 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61  ransfer optimiza
f730: 74 69 6f 6e 20 62 65 63 61 75 73 65 20 74 68 65  tion because the
f740: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 69  .    ** the rowi
f750: 64 73 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ds might change 
f760: 77 68 69 63 68 20 77 69 6c 6c 20 6d 65 73 73 20  which will mess 
f770: 75 70 20 69 6e 64 65 78 69 6e 67 2e 0a 20 20 20  up indexing..   
f780: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 20 69 66   **.    ** Or if
f790: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
f7a0: 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 69 6e   has a UNIQUE in
f7b0: 64 65 78 20 61 6e 64 20 69 73 20 6e 6f 74 20 65  dex and is not e
f7c0: 6d 70 74 79 2c 0a 20 20 20 20 2a 2a 20 77 65 20  mpty,.    ** we 
f7d0: 61 6c 73 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68  also disallow th
f7e0: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
f7f0: 69 7a 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  ization because 
f800: 77 65 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a  we cannot.    **
f810: 20 69 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   insure that all
f820: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
f830: 75 6e 69 6f 6e 20 6f 66 20 44 45 53 54 20 61 6e  union of DEST an
f840: 64 20 53 52 43 20 77 69 6c 6c 20 62 65 0a 20 20  d SRC will be.  
f850: 20 20 2a 2a 20 75 6e 69 71 75 65 2e 0a 20 20 20    ** unique..   
f860: 20 2a 2f 0a 20 20 20 20 61 64 64 72 31 20 3d 20   */.    addr1 = 
f870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f880: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f890: 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20 65  iDest, 0);.    e
f8a0: 6d 70 74 79 44 65 73 74 54 65 73 74 20 3d 20 73  mptyDestTest = s
f8b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f8c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f8d0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
f8e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f8f0: 64 64 72 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ddr1);.  }else{.
f900: 20 20 20 20 65 6d 70 74 79 44 65 73 74 54 65 73      emptyDestTes
f910: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
f920: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
f930: 61 72 73 65 2c 20 69 53 72 63 2c 20 69 44 62 53  arse, iSrc, iDbS
f940: 72 63 2c 20 70 53 72 63 2c 20 4f 50 5f 4f 70 65  rc, pSrc, OP_Ope
f950: 6e 52 65 61 64 29 3b 0a 20 20 65 6d 70 74 79 53  nRead);.  emptyS
f960: 72 63 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  rcTest = sqlite3
f970: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f980: 5f 52 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30  _Rewind, iSrc, 0
f990: 29 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20 73  );.  regData = s
f9a0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
f9b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52  (pParse);.  regR
f9c0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
f9d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f9e0: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ;.  if( pDest->i
f9f0: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 61  PKey>=0 ){.    a
fa00: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
fa10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
fa20: 6f 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52  owid, iSrc, regR
fa30: 6f 77 69 64 29 3b 0a 20 20 20 20 61 64 64 72 32  owid);.    addr2
fa40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fa50: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
fa60: 69 73 74 73 2c 20 69 44 65 73 74 2c 20 30 2c 20  ists, iDest, 0, 
fa70: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  regRowid);.    s
fa80: 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
fa90: 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70 50  aint(.        pP
faa0: 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 22  arse, onError, "
fab0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74  PRIMARY KEY must
fac0: 20 62 65 20 75 6e 69 71 75 65 22 2c 20 50 34 5f   be unique", P4_
fad0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
fae0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
faf0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
fb00: 61 75 74 6f 49 6e 63 53 74 65 70 28 70 50 61 72  autoIncStep(pPar
fb10: 73 65 2c 20 72 65 67 41 75 74 6f 69 6e 63 2c 20  se, regAutoinc, 
fb20: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  regRowid);.  }el
fb30: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 70 49  se if( pDest->pI
fb40: 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ndex==0 ){.    a
fb50: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
fb60: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
fb70: 65 77 52 6f 77 69 64 2c 20 69 44 65 73 74 2c 20  ewRowid, iDest, 
fb80: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  regRowid);.  }el
fb90: 73 65 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  se{.    addr1 = 
fba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fbb0: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
fbc0: 53 72 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Src, regRowid);.
fbd0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 44 65      assert( (pDe
fbe0: 73 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  st->tabFlags & T
fbf0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
fc00: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ==0 );.  }.  sql
fc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fc20: 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 53  , OP_RowData, iS
fc30: 72 63 2c 20 72 65 67 44 61 74 61 29 3b 0a 20 20  rc, regData);.  
fc40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc50: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
fc60: 69 44 65 73 74 2c 20 72 65 67 44 61 74 61 2c 20  iDest, regData, 
fc70: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  regRowid);.  sql
fc80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
fc90: 28 76 2c 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  (v, OPFLAG_NCHAN
fca0: 47 45 7c 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f  GE|OPFLAG_LASTRO
fcb0: 57 49 44 7c 4f 50 46 4c 41 47 5f 41 50 50 45 4e  WID|OPFLAG_APPEN
fcc0: 44 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  D);.  sqlite3Vdb
fcd0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
fce0: 20 70 44 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 30   pDest->zName, 0
fcf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
fd00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
fd10: 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31 29 3b  t, iSrc, addr1);
fd20: 0a 20 20 66 6f 72 28 70 44 65 73 74 49 64 78 3d  .  for(pDestIdx=
fd30: 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70  pDest->pIndex; p
fd40: 44 65 73 74 49 64 78 3b 20 70 44 65 73 74 49 64  DestIdx; pDestId
fd50: 78 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e 65 78  x=pDestIdx->pNex
fd60: 74 29 7b 0a 20 20 20 20 66 6f 72 28 70 53 72 63  t){.    for(pSrc
fd70: 49 64 78 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  Idx=pSrc->pIndex
fd80: 3b 20 41 4c 57 41 59 53 28 70 53 72 63 49 64 78  ; ALWAYS(pSrcIdx
fd90: 29 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63 49  ); pSrcIdx=pSrcI
fda0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
fdb0: 20 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74    if( xferCompat
fdc0: 69 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49  ibleIndex(pDestI
fdd0: 64 78 2c 20 70 53 72 63 49 64 78 29 20 29 20 62  dx, pSrcIdx) ) b
fde0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fdf0: 61 73 73 65 72 74 28 20 70 53 72 63 49 64 78 20  assert( pSrcIdx 
fe00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fe10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
fe20: 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a  lose, iSrc, 0);.
fe30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
fe50: 65 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20  e, iDest, 0);.  
fe60: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
fe70: 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
fe80: 72 73 65 2c 20 70 53 72 63 49 64 78 29 3b 0a 20  rse, pSrcIdx);. 
fe90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fea0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
feb0: 65 61 64 2c 20 69 53 72 63 2c 20 70 53 72 63 49  ead, iSrc, pSrcI
fec0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 53 72 63  dx->tnum, iDbSrc
fed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fee0: 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
fef0: 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
ff00: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 56 64  HANDOFF);.    Vd
ff10: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
ff20: 73 22 2c 20 70 53 72 63 49 64 78 2d 3e 7a 4e 61  s", pSrcIdx->zNa
ff30: 6d 65 29 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d  me));.    pKey =
ff40: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79   sqlite3IndexKey
ff50: 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 44 65  info(pParse, pDe
ff60: 73 74 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  stIdx);.    sqli
ff70: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ff80: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
ff90: 44 65 73 74 2c 20 70 44 65 73 74 49 64 78 2d 3e  Dest, pDestIdx->
ffa0: 74 6e 75 6d 2c 20 69 44 62 44 65 73 74 2c 0a 20  tnum, iDbDest,. 
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
ffd0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
ffe0: 44 4f 46 46 29 3b 0a 20 20 20 20 56 64 62 65 43  DOFF);.    VdbeC
fff0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
10000 20 70 44 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65   pDestIdx->zName
10010 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  ));.    addr1 = 
10020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10030 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10040 69 53 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  iSrc, 0);.    sq
10050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10060 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 53  v, OP_RowKey, iS
10070 72 63 2c 20 72 65 67 44 61 74 61 29 3b 0a 20 20  rc, regData);.  
10080 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10090 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op3(v, OP_IdxIns
100a0 65 72 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44  ert, iDest, regD
100b0 61 74 61 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ata, 1);.    sql
100c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
100d0 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63 2c  , OP_Next, iSrc,
100e0 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 20 20 73   addr1+1);.    s
100f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10100 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
10110 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  }.  sqlite3VdbeJ
10120 75 6d 70 48 65 72 65 28 76 2c 20 65 6d 70 74 79  umpHere(v, empty
10130 53 72 63 54 65 73 74 29 3b 0a 20 20 73 71 6c 69  SrcTest);.  sqli
10140 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10150 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
10160 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  id);.  sqlite3Re
10170 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
10180 72 73 65 2c 20 72 65 67 44 61 74 61 29 3b 0a 20  rse, regData);. 
10190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
101a0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
101b0 69 53 72 63 2c 20 30 29 3b 0a 20 20 73 71 6c 69  iSrc, 0);.  sqli
101c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
101d0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74   OP_Close, iDest
101e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 6d 70 74  , 0);.  if( empt
101f0 79 44 65 73 74 54 65 73 74 20 29 7b 0a 20 20 20  yDestTest ){.   
10200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10210 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p2(v, OP_Halt, S
10220 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
10230 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10240 70 48 65 72 65 28 76 2c 20 65 6d 70 74 79 44 65  pHere(v, emptyDe
10250 73 74 54 65 73 74 29 3b 0a 20 20 20 20 73 71 6c  stTest);.    sql
10260 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10270 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73  , OP_Close, iDes
10280 74 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  t, 0);.    retur
10290 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
102a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
102b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
102c0 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54  TE_OMIT_XFER_OPT
102d0 20 2a 2f 0a                                       */.