/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ca18783512323f74aaf4ee74b46ffd75ec80d031:


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 50 34 5f 54 52 41  >zColAff, P4_TRA
0ff0: 4e 53 49 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NSIENT);.}../*.*
1000: 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
1010: 6f 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70  o if the table p
1020: 54 61 62 20 69 6e 20 64 61 74 61 62 61 73 65 20  Tab in database 
1030: 69 44 62 20 6f 72 20 61 6e 79 20 6f 66 20 69 74  iDb or any of it
1040: 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 68 61 76  s indices.** hav
1050: 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 74  e been opened at
1060: 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
1070: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 62  e VDBE program b
1080: 65 67 69 6e 6e 69 6e 67 20 61 74 20 6c 6f 63 61  eginning at loca
1090: 74 69 6f 6e 0a 2a 2a 20 69 53 74 61 72 74 41 64  tion.** iStartAd
10a0: 64 72 20 74 68 72 6f 75 67 68 74 20 74 68 65 20  dr throught the 
10b0: 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72  end of the progr
10c0: 61 6d 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  am.  This is use
10d0: 64 20 74 6f 20 73 65 65 20 69 66 20 0a 2a 2a 20  d to see if .** 
10e0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74  a statement of t
10f0: 68 65 20 66 6f 72 6d 20 20 22 49 4e 53 45 52 54  he form  "INSERT
1100: 20 49 4e 54 4f 20 3c 69 44 62 2c 20 70 54 61 62   INTO <iDb, pTab
1110: 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 63 61  > SELECT ..." ca
1120: 6e 20 0a 2a 2a 20 72 75 6e 20 77 69 74 68 6f 75  n .** run withou
1130: 74 20 75 73 69 6e 67 20 74 65 6d 70 6f 72 61 72  t using temporar
1140: 79 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  y table for the 
1150: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
1160: 45 4c 45 43 54 2e 20 0a 2a 2f 0a 73 74 61 74 69  ELECT. .*/.stati
1170: 63 20 69 6e 74 20 72 65 61 64 73 54 61 62 6c 65  c int readsTable
1180: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
1190: 53 74 61 72 74 41 64 64 72 2c 20 69 6e 74 20 69  StartAddr, int i
11a0: 44 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  Db, Table *pTab)
11b0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
11c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b  lite3GetVdbe(p);
11d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
11e0: 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
11f0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1200: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1210: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1220: 4c 45 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54  LE.  VTable *pVT
1230: 61 62 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  ab = IsVirtual(p
1240: 54 61 62 29 20 3f 20 73 71 6c 69 74 65 33 47 65  Tab) ? sqlite3Ge
1250: 74 56 54 61 62 6c 65 28 70 2d 3e 64 62 2c 20 70  tVTable(p->db, p
1260: 54 61 62 29 20 3a 20 30 3b 0a 23 65 6e 64 69 66  Tab) : 0;.#endif
1270: 0a 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74  ..  for(i=iStart
1280: 41 64 64 72 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  Addr; i<iEnd; i+
1290: 2b 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  +){.    VdbeOp *
12a0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
12b0: 65 47 65 74 4f 70 28 76 2c 20 69 29 3b 0a 20 20  eGetOp(v, i);.  
12c0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30    assert( pOp!=0
12d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   );.    if( pOp-
12e0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e  >opcode==OP_Open
12f0: 52 65 61 64 20 26 26 20 70 4f 70 2d 3e 70 33 3d  Read && pOp->p3=
1300: 3d 69 44 62 20 29 7b 0a 20 20 20 20 20 20 49 6e  =iDb ){.      In
1310: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 20  dex *pIndex;.   
1320: 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 4f     int tnum = pO
1330: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 69 66 28  p->p2;.      if(
1340: 20 74 6e 75 6d 3d 3d 70 54 61 62 2d 3e 74 6e 75   tnum==pTab->tnu
1350: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1360: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1370: 20 20 20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d       for(pIndex=
1380: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
1390: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
13a0: 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
13b0: 20 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 70       if( tnum==p
13c0: 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 29 7b 0a 20  Index->tnum ){. 
13d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
13f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
1400: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1410: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1420: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1430: 3d 4f 50 5f 56 4f 70 65 6e 20 26 26 20 70 4f 70  =OP_VOpen && pOp
1440: 2d 3e 70 34 2e 70 56 74 61 62 3d 3d 70 56 54 61  ->p4.pVtab==pVTa
1450: 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
1460: 74 28 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62  t( pOp->p4.pVtab
1470: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1480: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
1490: 3d 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 20  ==P4_VTAB );.   
14a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
14b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
14c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
14d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14e0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f  _AUTOINCREMENT./
14f0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 6f 72 20 63  *.** Locate or c
1500: 72 65 61 74 65 20 61 6e 20 41 75 74 6f 69 6e 63  reate an Autoinc
1510: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  Info structure a
1520: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1530: 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 77 68 69  able pTab.** whi
1540: 63 68 20 69 73 20 69 6e 20 64 61 74 61 62 61 73  ch is in databas
1550: 65 20 69 44 62 2e 20 20 52 65 74 75 72 6e 20 74  e iDb.  Return t
1560: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
1570: 65 72 20 66 6f 72 20 74 68 65 20 72 65 67 69 73  er for the regis
1580: 74 65 72 0a 2a 2a 20 74 68 61 74 20 68 6f 6c 64  ter.** that hold
1590: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f  s the maximum ro
15a0: 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  wid..**.** There
15b0: 20 69 73 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20   is at most one 
15c0: 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75  AutoincInfo stru
15d0: 63 74 75 72 65 20 70 65 72 20 74 61 62 6c 65 20  cture per table 
15e0: 65 76 65 6e 20 69 66 20 74 68 65 0a 2a 2a 20 73  even if the.** s
15f0: 61 6d 65 20 74 61 62 6c 65 20 69 73 20 61 75 74  ame table is aut
1600: 6f 69 6e 63 72 65 6d 65 6e 74 65 64 20 6d 75 6c  oincremented mul
1610: 74 69 70 6c 65 20 74 69 6d 65 73 20 64 75 65 20  tiple times due 
1620: 74 6f 20 69 6e 73 65 72 74 73 20 77 69 74 68 69  to inserts withi
1630: 6e 0a 2a 2a 20 74 72 69 67 67 65 72 73 2e 20 20  n.** triggers.  
1640: 41 20 6e 65 77 20 41 75 74 6f 69 6e 63 49 6e 66  A new AutoincInf
1650: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
1660: 72 65 61 74 65 64 20 69 66 20 74 68 69 73 20 69  reated if this i
1670: 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 75  s the.** first u
1680: 73 65 20 6f 66 20 74 61 62 6c 65 20 70 54 61 62  se of table pTab
1690: 2e 20 20 4f 6e 20 32 6e 64 20 61 6e 64 20 73 75  .  On 2nd and su
16a0: 62 73 65 71 75 65 6e 74 20 75 73 65 73 2c 20 74  bsequent uses, t
16b0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 41  he original.** A
16c0: 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75 63  utoincInfo struc
16d0: 74 75 72 65 20 69 73 20 75 73 65 64 2e 0a 2a 2a  ture is used..**
16e0: 0a 2a 2a 20 54 68 72 65 65 20 6d 65 6d 6f 72 79  .** Three memory
16f0: 20 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 61   locations are a
1700: 6c 6c 6f 63 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20  llocated:.**.** 
1710: 20 20 28 31 29 20 20 52 65 67 69 73 74 65 72 20    (1)  Register 
1720: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
1730: 20 6f 66 20 74 68 65 20 70 54 61 62 20 74 61 62   of the pTab tab
1740: 6c 65 2e 0a 2a 2a 20 20 20 28 32 29 20 20 52 65  le..**   (2)  Re
1750: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74  gister to hold t
1760: 68 65 20 6d 61 78 69 6d 75 6d 20 52 4f 57 49 44  he maximum ROWID
1770: 20 6f 66 20 70 54 61 62 2e 0a 2a 2a 20 20 20 28   of pTab..**   (
1780: 33 29 20 20 52 65 67 69 73 74 65 72 20 74 6f 20  3)  Register to 
1790: 68 6f 6c 64 20 74 68 65 20 72 6f 77 69 64 20 69  hold the rowid i
17a0: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
17b0: 65 20 6f 66 20 70 54 61 62 0a 2a 2a 0a 2a 2a 20  e of pTab.**.** 
17c0: 54 68 65 20 32 6e 64 20 72 65 67 69 73 74 65 72  The 2nd register
17d0: 20 69 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   is the one that
17e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54   is returned.  T
17f0: 68 61 74 20 69 73 20 61 6c 6c 20 74 68 65 0a 2a  hat is all the.*
1800: 2a 20 69 6e 73 65 72 74 20 72 6f 75 74 69 6e 65  * insert routine
1810: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 61   needs to know a
1820: 62 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bout..*/.static 
1830: 69 6e 74 20 61 75 74 6f 49 6e 63 42 65 67 69 6e  int autoIncBegin
1840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1850: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
1860: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1870: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
1880: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1890: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c  the database hol
18a0: 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a 20 20 54  ding pTab */.  T
18b0: 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
18c0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
18d0: 77 65 20 61 72 65 20 77 72 69 74 69 6e 67 20 74  we are writing t
18e0: 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6d 65  o */.){.  int me
18f0: 6d 49 64 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  mId = 0;      /*
1900: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
1910: 67 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20  g maximum rowid 
1920: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
1930: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
1940: 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
1950: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1960: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1970: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1980: 29 3b 0a 20 20 20 20 41 75 74 6f 69 6e 63 49 6e  );.    AutoincIn
1990: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 0a 20 20 20 20  fo *pInfo;..    
19a0: 70 49 6e 66 6f 20 3d 20 70 54 6f 70 6c 65 76 65  pInfo = pTopleve
19b0: 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20 20 20 77 68  l->pAinc;.    wh
19c0: 69 6c 65 28 20 70 49 6e 66 6f 20 26 26 20 70 49  ile( pInfo && pI
19d0: 6e 66 6f 2d 3e 70 54 61 62 21 3d 70 54 61 62 20  nfo->pTab!=pTab 
19e0: 29 7b 20 70 49 6e 66 6f 20 3d 20 70 49 6e 66 6f  ){ pInfo = pInfo
19f0: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 69  ->pNext; }.    i
1a00: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
1a10: 20 20 20 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c       pInfo = sql
1a20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
1a40: 6f 66 28 2a 70 49 6e 66 6f 29 29 3b 0a 20 20 20  of(*pInfo));.   
1a50: 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
1a60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a70: 20 20 70 49 6e 66 6f 2d 3e 70 4e 65 78 74 20 3d    pInfo->pNext =
1a80: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e   pToplevel->pAin
1a90: 63 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  c;.      pToplev
1aa0: 65 6c 2d 3e 70 41 69 6e 63 20 3d 20 70 49 6e 66  el->pAinc = pInf
1ab0: 6f 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  o;.      pInfo->
1ac0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
1ad0: 20 20 20 70 49 6e 66 6f 2d 3e 69 44 62 20 3d 20     pInfo->iDb = 
1ae0: 69 44 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  iDb;.      pTopl
1af0: 65 76 65 6c 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  evel->nMem++;   
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b10: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
1b20: 6c 64 20 6e 61 6d 65 20 6f 66 20 74 61 62 6c 65  ld name of table
1b30: 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   */.      pInfo-
1b40: 3e 72 65 67 43 74 72 20 3d 20 2b 2b 70 54 6f 70  >regCtr = ++pTop
1b50: 6c 65 76 65 6c 2d 3e 6e 4d 65 6d 3b 20 20 2f 2a  level->nMem;  /*
1b60: 20 4d 61 78 20 72 6f 77 69 64 20 72 65 67 69 73   Max rowid regis
1b70: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 54 6f  ter */.      pTo
1b80: 70 6c 65 76 65 6c 2d 3e 6e 4d 65 6d 2b 2b 3b 20  plevel->nMem++; 
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 2f 2a 20 52 6f 77 69 64 20 69 6e 20 73 71 6c   /* Rowid in sql
1bb0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ite_sequence */.
1bc0: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 49 64 20      }.    memId 
1bd0: 3d 20 70 49 6e 66 6f 2d 3e 72 65 67 43 74 72 3b  = pInfo->regCtr;
1be0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 65  .  }.  return me
1bf0: 6d 49 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  mId;.}../*.** Th
1c00: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
1c10: 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 77  ates code that w
1c20: 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  ill initialize a
1c30: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 67  ll of the.** reg
1c40: 69 73 74 65 72 20 75 73 65 64 20 62 79 20 74 68  ister used by th
1c50: 65 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  e autoincrement 
1c60: 74 72 61 63 6b 65 72 2e 20 20 0a 2a 2f 0a 76 6f  tracker.  .*/.vo
1c70: 69 64 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e  id sqlite3Autoin
1c80: 63 72 65 6d 65 6e 74 42 65 67 69 6e 28 50 61 72  crementBegin(Par
1c90: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 41  se *pParse){.  A
1ca0: 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 3b 20 20  utoincInfo *p;  
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
1cc0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1cd0: 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  n AUTOINCREMENT 
1ce0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1cf0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1d00: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1d10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1d20: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
1d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1d40: 74 61 62 61 73 65 20 6f 6e 6c 79 20 61 75 74 6f  tabase only auto
1d50: 69 6e 63 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  inc table */.  i
1d60: 6e 74 20 6d 65 6d 49 64 3b 20 20 20 20 20 20 20  nt memId;       
1d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1d80: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6d 61  ister holding ma
1d90: 78 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74  x rowid */.  int
1da0: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
1db0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 56 44 42          /* A VDB
1dc0: 45 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 56  E address */.  V
1dd0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1de0: 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 56 44 42  >pVdbe;   /* VDB
1df0: 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
1e00: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  tion */..  /* Th
1e10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
1e20: 76 65 72 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  ver called durin
1e30: 67 20 74 72 69 67 67 65 72 2d 67 65 6e 65 72 61  g trigger-genera
1e40: 74 69 6f 6e 2e 20 20 49 74 20 69 73 0a 20 20 2a  tion.  It is.  *
1e50: 2a 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  * only called fr
1e60: 6f 6d 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  om the top-level
1e70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1e80: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
1e90: 62 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b==0 );.  assert
1ea0: 28 20 70 50 61 72 73 65 3d 3d 73 71 6c 69 74 65  ( pParse==sqlite
1eb0: 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1ec0: 50 61 72 73 65 29 20 29 3b 0a 0a 20 20 61 73 73  Parse) );..  ass
1ed0: 65 72 74 28 20 76 20 29 3b 20 20 20 2f 2a 20 57  ert( v );   /* W
1ee0: 65 20 66 61 69 6c 65 64 20 6c 6f 6e 67 20 61 67  e failed long ag
1ef0: 6f 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  o if this is not
1f00: 20 73 6f 20 2a 2f 0a 20 20 66 6f 72 28 70 20 3d   so */.  for(p =
1f10: 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3b 20   pParse->pAinc; 
1f20: 70 3b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 29  p; p = p->pNext)
1f30: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
1f40: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
1f50: 20 20 6d 65 6d 49 64 20 3d 20 70 2d 3e 72 65 67    memId = p->reg
1f60: 43 74 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Ctr;.    assert(
1f70: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1f80: 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1f90: 44 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  Db->pSchema) );.
1fa0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
1fb0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
1fc0: 70 2d 3e 69 44 62 2c 20 70 44 62 2d 3e 70 53 63  p->iDb, pDb->pSc
1fd0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 2c 20 4f  hema->pSeqTab, O
1fe0: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
1ff0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2000: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2020: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2030: 74 72 69 6e 67 38 2c 20 30 2c 20 6d 65 6d 49 64  tring8, 0, memId
2040: 2d 31 2c 20 30 2c 20 70 2d 3e 70 54 61 62 2d 3e  -1, 0, p->pTab->
2050: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
2060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2070: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 30  (v, OP_Rewind, 0
2080: 2c 20 61 64 64 72 2b 39 29 3b 0a 20 20 20 20 73  , addr+9);.    s
2090: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30  (v, OP_Column, 0
20b0: 2c 20 30 2c 20 6d 65 6d 49 64 29 3b 0a 20 20 20  , 0, memId);.   
20c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20d0: 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 6d 65 6d  p3(v, OP_Ne, mem
20e0: 49 64 2d 31 2c 20 61 64 64 72 2b 37 2c 20 6d 65  Id-1, addr+7, me
20f0: 6d 49 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  mId);.    sqlite
2100: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2110: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
2120: 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  LL);.    sqlite3
2130: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2140: 5f 52 6f 77 69 64 2c 20 30 2c 20 6d 65 6d 49 64  _Rowid, 0, memId
2150: 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2170: 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 31 2c 20 6d  _Column, 0, 1, m
2180: 65 6d 49 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  emId);.    sqlit
2190: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21a0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
21b0: 2b 39 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +9);.    sqlite3
21c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21d0: 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64 72 2b 32  _Next, 0, addr+2
21e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
21f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2200: 6e 74 65 67 65 72 2c 20 30 2c 20 6d 65 6d 49 64  nteger, 0, memId
2210: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2220: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
2230: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  lose);.  }.}../*
2240: 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 6d  .** Update the m
2250: 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 66 6f 72  aximum rowid for
2260: 20 61 6e 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   an autoincremen
2270: 74 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2e 0a 2a  t calculation..*
2280: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2290: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
22a0: 65 64 20 77 68 65 6e 20 74 68 65 20 74 6f 70 20  ed when the top 
22b0: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 68 6f 6c  of the stack hol
22c0: 64 73 20 61 0a 2a 2a 20 6e 65 77 20 72 6f 77 69  ds a.** new rowi
22d0: 64 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 20  d that is about 
22e0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  to be inserted. 
22f0: 20 49 66 20 74 68 61 74 20 6e 65 77 20 72 6f 77   If that new row
2300: 69 64 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20  id is.** larger 
2310: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
2320: 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 6d 65   rowid in the me
2330: 6d 49 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2c  mId memory cell,
2340: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 65 6d   then the.** mem
2350: 6f 72 79 20 63 65 6c 6c 20 69 73 20 75 70 64 61  ory cell is upda
2360: 74 65 64 2e 20 20 54 68 65 20 73 74 61 63 6b 20  ted.  The stack 
2370: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
2380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 75 74  .static void aut
2390: 6f 49 6e 63 53 74 65 70 28 50 61 72 73 65 20 2a  oIncStep(Parse *
23a0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6d 65 6d 49  pParse, int memI
23b0: 64 2c 20 69 6e 74 20 72 65 67 52 6f 77 69 64 29  d, int regRowid)
23c0: 7b 0a 20 20 69 66 28 20 6d 65 6d 49 64 3e 30 20  {.  if( memId>0 
23d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
23e0: 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
23f0: 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 65 6d 4d 61  >pVdbe, OP_MemMa
2400: 78 2c 20 6d 65 6d 49 64 2c 20 72 65 67 52 6f 77  x, memId, regRow
2410: 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
2420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
2430: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
2440: 65 20 6e 65 65 64 65 64 20 74 6f 20 77 72 69 74  e needed to writ
2450: 65 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 0a  e autoincrement.
2460: 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  ** maximum rowid
2470: 20 76 61 6c 75 65 73 20 62 61 63 6b 20 69 6e 74   values back int
2480: 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  o the sqlite_seq
2490: 75 65 6e 63 65 20 72 65 67 69 73 74 65 72 2e 0a  uence register..
24a0: 2a 2a 20 45 76 65 72 79 20 73 74 61 74 65 6d 65  ** Every stateme
24b0: 6e 74 20 74 68 61 74 20 6d 69 67 68 74 20 64 6f  nt that might do
24c0: 20 61 6e 20 49 4e 53 45 52 54 20 69 6e 74 6f 20   an INSERT into 
24d0: 61 6e 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  an autoincrement
24e0: 0a 2a 2a 20 74 61 62 6c 65 20 28 65 69 74 68 65  .** table (eithe
24f0: 72 20 64 69 72 65 63 74 6c 79 20 6f 72 20 74 68  r directly or th
2500: 72 6f 75 67 68 20 74 72 69 67 67 65 72 73 29 20  rough triggers) 
2510: 6e 65 65 64 73 20 74 6f 20 63 61 6c 6c 20 74 68  needs to call th
2520: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6a 75  is.** routine ju
2530: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 22 65  st before the "e
2540: 78 69 74 22 20 63 6f 64 65 2e 0a 2a 2f 0a 76 6f  xit" code..*/.vo
2550: 69 64 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e  id sqlite3Autoin
2560: 63 72 65 6d 65 6e 74 45 6e 64 28 50 61 72 73 65  crementEnd(Parse
2570: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 41 75 74   *pParse){.  Aut
2580: 6f 69 6e 63 49 6e 66 6f 20 2a 70 3b 0a 20 20 56  oincInfo *p;.  V
2590: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25a0: 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65  >pVdbe;.  sqlite
25b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
25c0: 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76  db;..  assert( v
25d0: 20 29 3b 0a 20 20 66 6f 72 28 70 20 3d 20 70 50   );.  for(p = pP
25e0: 61 72 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20  arse->pAinc; p; 
25f0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  p = p->pNext){. 
2600: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
2610: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20  ->aDb[p->iDb];. 
2620: 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 2c 20 6a     int j1, j2, j
2630: 33 2c 20 6a 34 2c 20 6a 35 3b 0a 20 20 20 20 69  3, j4, j5;.    i
2640: 6e 74 20 69 52 65 63 3b 0a 20 20 20 20 69 6e 74  nt iRec;.    int
2650: 20 6d 65 6d 49 64 20 3d 20 70 2d 3e 72 65 67 43   memId = p->regC
2660: 74 72 3b 0a 0a 20 20 20 20 69 52 65 63 20 3d 20  tr;..    iRec = 
2670: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2680: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  g(pParse);.    a
2690: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
26a0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
26b0: 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  , 0, pDb->pSchem
26c0: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
26d0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
26e0: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44  e, 0, p->iDb, pD
26f0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
2700: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  Tab, OP_OpenWrit
2710: 65 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  e);.    j1 = sql
2720: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2730: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 6d 65  , OP_NotNull, me
2740: 6d 49 64 2b 31 29 3b 0a 20 20 20 20 6a 32 20 3d  mId+1);.    j2 =
2750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2760: 70 30 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 29  p0(v, OP_Rewind)
2770: 3b 0a 20 20 20 20 6a 33 20 3d 20 73 71 6c 69 74  ;.    j3 = sqlit
2780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2790: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30 2c  OP_Column, 0, 0,
27a0: 20 69 52 65 63 29 3b 0a 20 20 20 20 6a 34 20 3d   iRec);.    j4 =
27b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27c0: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 6d 65 6d  p3(v, OP_Eq, mem
27d0: 49 64 2d 31 2c 20 30 2c 20 69 52 65 63 29 3b 0a  Id-1, 0, iRec);.
27e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
2800: 2c 20 30 2c 20 6a 33 29 3b 0a 20 20 20 20 73 71  , 0, j3);.    sq
2810: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2820: 65 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 73 71  e(v, j2);.    sq
2830: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2840: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
2850: 30 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a 20 20 20  0, memId+1);.   
2860: 20 6a 35 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j5 = sqlite3Vdb
2870: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
2880: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
2890: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
28a0: 6a 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j4);.    sqlite3
28b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28c0: 5f 52 6f 77 69 64 2c 20 30 2c 20 6d 65 6d 49 64  _Rowid, 0, memId
28d0: 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
28e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
28f0: 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
2900: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2910: 6a 35 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j5);.    sqlite3
2920: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2930: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6d 65 6d  _MakeRecord, mem
2940: 49 64 2d 31 2c 20 32 2c 20 69 52 65 63 29 3b 0a  Id-1, 2, iRec);.
2950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2960: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
2970: 72 74 2c 20 30 2c 20 69 52 65 63 2c 20 6d 65 6d  rt, 0, iRec, mem
2980: 49 64 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  Id+1);.    sqlit
2990: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
29a0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
29b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29c0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
29d0: 6f 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ose);.    sqlite
29e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
29f0: 70 50 61 72 73 65 2c 20 69 52 65 63 29 3b 0a 20  pParse, iRec);. 
2a00: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a   }.}.#else./*.**
2a10: 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   If SQLITE_OMIT_
2a20: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
2a30: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74   defined, then t
2a40: 68 65 20 74 68 72 65 65 20 72 6f 75 74 69 6e 65  he three routine
2a50: 73 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 61  s.** above are a
2a60: 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2f 0a 23 20 64  ll no-ops.*/.# d
2a70: 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 42 65 67  efine autoIncBeg
2a80: 69 6e 28 41 2c 42 2c 43 29 20 28 30 29 0a 23 20  in(A,B,C) (0).# 
2a90: 64 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 53 74  define autoIncSt
2aa0: 65 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66  ep(A,B,C).#endif
2ab0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2ac0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f  AUTOINCREMENT */
2ad0: 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  .../* Forward de
2ae0: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
2af0: 74 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74 69  tic int xferOpti
2b00: 6d 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  mization(.  Pars
2b10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2b20: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
2b30: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
2b40: 70 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f  pDest,         /
2b50: 2a 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61  * The table we a
2b60: 72 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  re inserting int
2b70: 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  o */.  Select *p
2b80: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
2b90: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
2ba0: 6e 74 20 74 6f 20 75 73 65 20 61 73 20 74 68 65  nt to use as the
2bb0: 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a   data source */.
2bc0: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
2be0: 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61  o handle constra
2bf0: 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  int errors */.  
2c00: 69 6e 74 20 69 44 62 44 65 73 74 20 20 20 20 20  int iDbDest     
2c10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2c20: 61 62 61 73 65 20 6f 66 20 70 44 65 73 74 20 2a  abase of pDest *
2c30: 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.);../*.** This
2c40: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2c50: 20 74 6f 20 68 61 6e 64 6c 65 20 53 51 4c 20 6f   to handle SQL o
2c60: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c70: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
2c80: 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42 4c  insert into TABL
2c90: 45 20 28 49 44 4c 49 53 54 29 20 76 61 6c 75 65  E (IDLIST) value
2ca0: 73 28 45 58 50 52 4c 49 53 54 29 0a 2a 2a 20 20  s(EXPRLIST).**  
2cb0: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41    insert into TA
2cc0: 42 4c 45 20 28 49 44 4c 49 53 54 29 20 73 65 6c  BLE (IDLIST) sel
2cd0: 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44  ect.**.** The ID
2ce0: 4c 49 53 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  LIST following t
2cf0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
2d00: 20 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c   always optional
2d10: 2e 20 20 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a  .  If omitted,.*
2d20: 2a 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66  * then a list of
2d30: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72   all columns for
2d40: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 73 75   the table is su
2d50: 62 73 74 69 74 75 74 65 64 2e 20 20 54 68 65 20  bstituted.  The 
2d60: 49 44 4c 49 53 54 0a 2a 2a 20 61 70 70 65 61 72  IDLIST.** appear
2d70: 73 20 69 6e 20 74 68 65 20 70 43 6f 6c 75 6d 6e  s in the pColumn
2d80: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 70 43 6f   parameter.  pCo
2d90: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 20 69 66 20  lumn is NULL if 
2da0: 49 44 4c 49 53 54 20 69 73 20 6f 6d 69 74 74 65  IDLIST is omitte
2db0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69  d..**.** The pLi
2dc0: 73 74 20 70 61 72 61 6d 65 74 65 72 20 68 6f 6c  st parameter hol
2dd0: 64 73 20 45 58 50 52 4c 49 53 54 20 69 6e 20 74  ds EXPRLIST in t
2de0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 6f 66  he first form of
2df0: 20 74 68 65 20 49 4e 53 45 52 54 0a 2a 2a 20 73   the INSERT.** s
2e00: 74 61 74 65 6d 65 6e 74 20 61 62 6f 76 65 2c 20  tatement above, 
2e10: 61 6e 64 20 70 53 65 6c 65 63 74 20 69 73 20 4e  and pSelect is N
2e20: 55 4c 4c 2e 20 20 46 6f 72 20 74 68 65 20 73 65  ULL.  For the se
2e30: 63 6f 6e 64 20 66 6f 72 6d 2c 20 70 4c 69 73 74  cond form, pList
2e40: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 20 61 6e 64 20   is.** NULL and 
2e50: 70 53 65 6c 65 63 74 20 69 73 20 61 20 70 6f 69  pSelect is a poi
2e60: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65 6c 65  nter to the sele
2e70: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ct statement use
2e80: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a  d to generate.**
2e90: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e   data for the in
2ea0: 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sert..**.** The 
2eb0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
2ec0: 6f 6c 6c 6f 77 73 20 6f 6e 65 20 6f 66 20 66 6f  ollows one of fo
2ed0: 75 72 20 74 65 6d 70 6c 61 74 65 73 2e 20 20 46  ur templates.  F
2ee0: 6f 72 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  or a simple.** s
2ef0: 65 6c 65 63 74 20 77 69 74 68 20 64 61 74 61 20  elect with data 
2f00: 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 56 41  coming from a VA
2f10: 4c 55 45 53 20 63 6c 61 75 73 65 2c 20 74 68 65  LUES clause, the
2f20: 20 63 6f 64 65 20 65 78 65 63 75 74 65 73 0a 2a   code executes.*
2f30: 2a 20 6f 6e 63 65 20 73 74 72 61 69 67 68 74 20  * once straight 
2f40: 64 6f 77 6e 20 74 68 72 6f 75 67 68 2e 20 20 50  down through.  P
2f50: 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 6c 6c 6f  seudo-code follo
2f60: 77 73 20 28 77 65 20 63 61 6c 6c 20 74 68 69 73  ws (we call this
2f70: 0a 2a 2a 20 74 68 65 20 22 31 73 74 20 74 65 6d  .** the "1st tem
2f80: 70 6c 61 74 65 22 29 3a 0a 2a 2a 0a 2a 2a 20 20  plate"):.**.**  
2f90: 20 20 20 20 20 20 20 6f 70 65 6e 20 77 72 69 74         open writ
2fa0: 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62  e cursor to <tab
2fb0: 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69  le> and its indi
2fc0: 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  ces.**         p
2fd0: 75 74 73 20 56 41 4c 55 45 53 20 63 6c 61 75 73  uts VALUES claus
2fe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 6e  e expressions on
2ff0: 74 6f 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20  to the stack.** 
3000: 20 20 20 20 20 20 20 20 77 72 69 74 65 20 74 68          write th
3010: 65 20 72 65 73 75 6c 74 69 6e 67 20 72 65 63 6f  e resulting reco
3020: 72 64 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a  rd into <table>.
3030: 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e  **         clean
3040: 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 72  up.**.** The thr
3050: 65 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 6d  ee remaining tem
3060: 70 6c 61 74 65 73 20 61 73 73 75 6d 65 20 74 68  plates assume th
3070: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
3080: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
3090: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c     INSERT INTO <
30a0: 74 61 62 6c 65 3e 20 53 45 4c 45 43 54 20 2e 2e  table> SELECT ..
30b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
30c0: 45 4c 45 43 54 20 63 6c 61 75 73 65 20 69 73 20  ELECT clause is 
30d0: 6f 66 20 74 68 65 20 72 65 73 74 72 69 63 74 65  of the restricte
30e0: 64 20 66 6f 72 6d 20 22 53 45 4c 45 43 54 20 2a  d form "SELECT *
30f0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 32 3e 22 20   FROM <table2>" 
3100: 2d 0a 2a 2a 20 69 6e 20 6f 74 68 65 72 20 77 6f  -.** in other wo
3110: 72 64 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  rds if the SELEC
3120: 54 20 70 75 6c 6c 73 20 61 6c 6c 20 63 6f 6c 75  T pulls all colu
3130: 6d 6e 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  mns from a singl
3140: 65 20 74 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 74  e table.** and t
3150: 68 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45  here is no WHERE
3160: 20 6f 72 20 4c 49 4d 49 54 20 6f 72 20 47 52 4f   or LIMIT or GRO
3170: 55 50 20 42 59 20 6f 72 20 4f 52 44 45 52 20 42  UP BY or ORDER B
3180: 59 20 63 6c 61 75 73 65 73 2c 20 61 6e 64 0a 2a  Y clauses, and.*
3190: 2a 20 69 66 20 3c 74 61 62 6c 65 32 3e 20 61 6e  * if <table2> an
31a0: 64 20 3c 74 61 62 6c 65 31 3e 20 61 72 65 20 64  d <table1> are d
31b0: 69 73 74 69 6e 63 74 20 74 61 62 6c 65 73 20 62  istinct tables b
31c0: 75 74 20 68 61 76 65 20 69 64 65 6e 74 69 63 61  ut have identica
31d0: 6c 0a 2a 2a 20 73 63 68 65 6d 61 73 2c 20 69 6e  l.** schemas, in
31e0: 63 6c 75 64 69 6e 67 20 61 6c 6c 20 74 68 65 20  cluding all the 
31f0: 73 61 6d 65 20 69 6e 64 69 63 65 73 2c 20 74 68  same indices, th
3200: 65 6e 20 61 20 73 70 65 63 69 61 6c 20 6f 70 74  en a special opt
3210: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20  imization.** is 
3220: 69 6e 76 6f 6b 65 64 20 74 68 61 74 20 63 6f 70  invoked that cop
3230: 69 65 73 20 72 61 77 20 72 65 63 6f 72 64 73 20  ies raw records 
3240: 66 72 6f 6d 20 3c 74 61 62 6c 65 32 3e 20 6f 76  from <table2> ov
3250: 65 72 20 74 6f 20 3c 74 61 62 6c 65 31 3e 2e 0a  er to <table1>..
3260: 2a 2a 20 53 65 65 20 74 68 65 20 78 66 65 72 4f  ** See the xferO
3270: 70 74 69 6d 69 7a 61 74 69 6f 6e 28 29 20 66 75  ptimization() fu
3280: 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69  nction for the i
3290: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
32a0: 20 74 68 69 73 0a 2a 2a 20 74 65 6d 70 6c 61 74   this.** templat
32b0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  e.  This is the 
32c0: 32 6e 64 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  2nd template..**
32d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 65 6e  .**         open
32e0: 20 61 20 77 72 69 74 65 20 63 75 72 73 6f 72 20   a write cursor 
32f0: 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20  to <table>.**   
3300: 20 20 20 20 20 20 6f 70 65 6e 20 72 65 61 64 20        open read 
3310: 63 75 72 73 6f 72 20 6f 6e 20 3c 74 61 62 6c 65  cursor on <table
3320: 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 72  2>.**         tr
3330: 61 6e 73 66 65 72 20 61 6c 6c 20 72 65 63 6f 72  ansfer all recor
3340: 64 73 20 69 6e 20 3c 74 61 62 6c 65 32 3e 20 6f  ds in <table2> o
3350: 76 65 72 20 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a  ver to <table>.*
3360: 2a 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20  *         close 
3370: 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20  cursors.**      
3380: 20 20 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78     foreach index
3390: 20 6f 6e 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20   on <table>.**  
33a0: 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20           open a 
33b0: 77 72 69 74 65 20 63 75 72 73 6f 72 20 6f 6e 20  write cursor on 
33c0: 74 68 65 20 3c 74 61 62 6c 65 3e 20 69 6e 64 65  the <table> inde
33d0: 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f  x.**           o
33e0: 70 65 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f  pen a read curso
33f0: 72 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  r on the corresp
3400: 6f 6e 64 69 6e 67 20 3c 74 61 62 6c 65 32 3e 20  onding <table2> 
3410: 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 20  index.**        
3420: 20 20 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20     transfer all 
3430: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
3440: 20 72 65 61 64 20 74 6f 20 74 68 65 20 77 72 69   read to the wri
3450: 74 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20  te cursors.**   
3460: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75          close cu
3470: 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  rsors.**        
3480: 20 65 6e 64 20 66 6f 72 65 61 63 68 0a 2a 2a 0a   end foreach.**.
3490: 2a 2a 20 54 68 65 20 33 72 64 20 74 65 6d 70 6c  ** The 3rd templ
34a0: 61 74 65 20 69 73 20 66 6f 72 20 77 68 65 6e 20  ate is for when 
34b0: 74 68 65 20 73 65 63 6f 6e 64 20 74 65 6d 70 6c  the second templ
34c0: 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ate does not app
34d0: 6c 79 0a 2a 2a 20 61 6e 64 20 74 68 65 20 53 45  ly.** and the SE
34e0: 4c 45 43 54 20 63 6c 61 75 73 65 20 64 6f 65 73  LECT clause does
34f0: 20 6e 6f 74 20 72 65 61 64 20 66 72 6f 6d 20 3c   not read from <
3500: 74 61 62 6c 65 3e 20 61 74 20 61 6e 79 20 74 69  table> at any ti
3510: 6d 65 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72  me..** The gener
3520: 61 74 65 64 20 63 6f 64 65 20 66 6f 6c 6c 6f 77  ated code follow
3530: 73 20 74 68 69 73 20 74 65 6d 70 6c 61 74 65 3a  s this template:
3540: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 45  .**.**         E
3550: 4f 46 20 3c 2d 20 30 0a 2a 2a 20 20 20 20 20 20  OF <- 0.**      
3560: 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20     X <- A.**    
3570: 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20       goto B.**  
3580: 20 20 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72      A: setup for
3590: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
35a0: 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72         loop over
35b0: 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65   the rows in the
35c0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
35d0: 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75 65 73       load values
35e0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
35f0: 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20  R..R+n.**       
3600: 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20      yield X.**  
3610: 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a         end loop.
3620: 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e  **         clean
3630: 75 70 20 61 66 74 65 72 20 74 68 65 20 53 45 4c  up after the SEL
3640: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 45  ECT.**         E
3650: 4f 46 20 3c 2d 20 31 0a 2a 2a 20 20 20 20 20 20  OF <- 1.**      
3660: 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20     yield X.**   
3670: 20 20 20 20 20 20 67 6f 74 6f 20 41 0a 2a 2a 20        goto A.** 
3680: 20 20 20 20 20 42 3a 20 6f 70 65 6e 20 77 72 69       B: open wri
3690: 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61  te cursor to <ta
36a0: 62 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64  ble> and its ind
36b0: 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 43 3a 20  ices.**      C: 
36c0: 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20 20 20  yield X.**      
36d0: 20 20 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 44     if EOF goto D
36e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65  .**         inse
36f0: 72 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65  rt the select re
3700: 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65  sult into <table
3710: 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 2a 2a  > from R..R+n.**
3720: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43 0a           goto C.
3730: 2a 2a 20 20 20 20 20 20 44 3a 20 63 6c 65 61 6e  **      D: clean
3740: 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 34 74 68  up.**.** The 4th
3750: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 75 73 65   template is use
3760: 64 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  d if the insert 
3770: 73 74 61 74 65 6d 65 6e 74 20 74 61 6b 65 73 20  statement takes 
3780: 69 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72  its.** values fr
3790: 6f 6d 20 61 20 53 45 4c 45 43 54 20 62 75 74 20  om a SELECT but 
37a0: 74 68 65 20 64 61 74 61 20 69 73 20 62 65 69 6e  the data is bein
37b0: 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  g inserted into 
37c0: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20  a table.** that 
37d0: 69 73 20 61 6c 73 6f 20 72 65 61 64 20 61 73 20  is also read as 
37e0: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 4c 45  part of the SELE
37f0: 43 54 2e 20 20 49 6e 20 74 68 65 20 74 68 69 72  CT.  In the thir
3800: 64 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61  d form,.** we ha
3810: 76 65 20 74 6f 20 75 73 65 20 61 20 69 6e 74 65  ve to use a inte
3820: 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20 74  rmediate table t
3830: 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
3840: 6c 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65  lts of.** the se
3850: 6c 65 63 74 2e 20 20 54 68 65 20 74 65 6d 70 6c  lect.  The templ
3860: 61 74 65 20 69 73 20 6c 69 6b 65 20 74 68 69 73  ate is like this
3870: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
3880: 45 4f 46 20 3c 2d 20 30 0a 2a 2a 20 20 20 20 20  EOF <- 0.**     
3890: 20 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20      X <- A.**   
38a0: 20 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20        goto B.** 
38b0: 20 20 20 20 20 41 3a 20 73 65 74 75 70 20 66 6f       A: setup fo
38c0: 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  r the SELECT.** 
38d0: 20 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65          loop ove
38e0: 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
38f0: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  the SELECT.**   
3900: 20 20 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c          load val
3910: 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ue into register
3920: 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20   R..R+n.**      
3930: 20 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20       yield X.** 
3940: 20 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70          end loop
3950: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61  .**         clea
3960: 6e 75 70 20 61 66 74 65 72 20 74 68 65 20 53 45  nup after the SE
3970: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
3980: 45 4f 46 20 3c 2d 20 31 0a 2a 2a 20 20 20 20 20  EOF <- 1.**     
3990: 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20      yield X.**  
39a0: 20 20 20 20 20 20 20 68 61 6c 74 2d 65 72 72 6f         halt-erro
39b0: 72 0a 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65  r.**      B: ope
39c0: 6e 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20  n temp table.** 
39d0: 20 20 20 20 20 4c 3a 20 79 69 65 6c 64 20 58 0a       L: yield X.
39e0: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 20 45 4f  **         if EO
39f0: 46 20 67 6f 74 6f 20 4d 0a 2a 2a 20 20 20 20 20  F goto M.**     
3a00: 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20 66      insert row f
3a10: 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20  rom R..R+n into 
3a20: 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20  temp table.**   
3a30: 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a 2a 2a 20        goto L.** 
3a40: 20 20 20 20 20 4d 3a 20 6f 70 65 6e 20 77 72 69       M: open wri
3a50: 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61  te cursor to <ta
3a60: 62 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64  ble> and its ind
3a70: 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ices.**         
3a80: 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62 6c  rewind temp tabl
3a90: 65 0a 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f  e.**      C: loo
3aa0: 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69  p over rows of i
3ab0: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
3ac0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  e.**           t
3ad0: 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73 20 66  ransfer values f
3ae0: 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61 74 65  orm intermediate
3af0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74 61 62   table into <tab
3b00: 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  le>.**         e
3b10: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
3b20: 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f  D: cleanup.*/.vo
3b30: 69 64 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74  id sqlite3Insert
3b40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3b50: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
3b60: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3b70: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
3b80: 73 74 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  st,    /* Name o
3b90: 66 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  f table into whi
3ba0: 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  ch we are insert
3bb0: 69 6e 67 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ing */.  ExprLis
3bc0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f  t *pList,      /
3bd0: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
3be0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
3bf0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
3c00: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20  lect,      /* A 
3c10: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3c20: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64   to use as the d
3c30: 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  ata source */.  
3c40: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c  IdList *pColumn,
3c50: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
3c60: 6e 61 6d 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  names correspond
3c70: 69 6e 67 20 74 6f 20 49 44 4c 49 53 54 2e 20 2a  ing to IDLIST. *
3c80: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
3c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
3ca0: 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74   to handle const
3cb0: 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a  raint errors */.
3cc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3cd0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
3ce0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
3cf0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54  structure */.  T
3d00: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
3d10: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
3d20: 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  e to insert into
3d30: 2e 20 20 61 6b 61 20 54 41 42 4c 45 20 2a 2f 0a  .  aka TABLE */.
3d40: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20    char *zTab;   
3d50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3d60: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
3d70: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
3d80: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 63 6f  nserting */.  co
3d90: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
3da0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3db0: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
3dc0: 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
3dd0: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 69 64  /.  int i, j, id
3de0: 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  x;        /* Loo
3df0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
3e00: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
3e10: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
3e20: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
3e30: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
3e40: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
3e50: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x;          /* F
3e60: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
3e70: 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
3e80: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
3e90: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
3ea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
3eb0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 61 74 61  umns in the data
3ec0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 64 64 65   */.  int nHidde
3ed0: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  n = 0;      /* N
3ee0: 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e 20  umber of hidden 
3ef0: 63 6f 6c 75 6d 6e 73 20 69 66 20 54 41 42 4c 45  columns if TABLE
3f00: 20 69 73 20 76 69 72 74 75 61 6c 20 2a 2f 0a 20   is virtual */. 
3f10: 20 69 6e 74 20 62 61 73 65 43 75 72 20 3d 20 30   int baseCur = 0
3f20: 3b 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 43  ;      /* VDBE C
3f30: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
3f40: 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 6b   pTab */.  int k
3f50: 65 79 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20  eyColumn = -1;  
3f60: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20   /* Column that 
3f70: 69 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  is the INTEGER P
3f80: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
3f90: 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20  int endOfLoop;  
3fa0: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
3fb0: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
3fc0: 65 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70  e insertion loop
3fd0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 54 65 6d   */.  int useTem
3fe0: 70 54 61 62 6c 65 20 3d 20 30 3b 20 2f 2a 20 53  pTable = 0; /* S
3ff0: 74 6f 72 65 20 53 45 4c 45 43 54 20 72 65 73 75  tore SELECT resu
4000: 6c 74 73 20 69 6e 20 69 6e 74 65 72 6d 65 64 69  lts in intermedi
4010: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ate table */.  i
4020: 6e 74 20 73 72 63 54 61 62 20 3d 20 30 3b 20 20  nt srcTab = 0;  
4030: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 63 6f 6d       /* Data com
4040: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 74 65 6d  es from this tem
4050: 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 66  porary cursor if
4060: 20 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 61 64   >=0 */.  int ad
4070: 64 72 49 6e 73 54 6f 70 20 3d 20 30 3b 20 20 20  drInsTop = 0;   
4080: 2f 2a 20 4a 75 6d 70 20 74 6f 20 6c 61 62 65 6c  /* Jump to label
4090: 20 22 44 22 20 2a 2f 0a 20 20 69 6e 74 20 61 64   "D" */.  int ad
40a0: 64 72 43 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  drCont = 0;     
40b0: 2f 2a 20 54 6f 70 20 6f 66 20 69 6e 73 65 72 74  /* Top of insert
40c0: 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 22 43 22   loop. Label "C"
40d0: 20 69 6e 20 74 65 6d 70 6c 61 74 65 73 20 33 20   in templates 3 
40e0: 61 6e 64 20 34 20 2a 2f 0a 20 20 69 6e 74 20 61  and 4 */.  int a
40f0: 64 64 72 53 65 6c 65 63 74 20 3d 20 30 3b 20 20  ddrSelect = 0;  
4100: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 63   /* Address of c
4110: 6f 72 6f 75 74 69 6e 65 20 74 68 61 74 20 69 6d  oroutine that im
4120: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 53 45 4c  plements the SEL
4130: 45 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ECT */.  SelectD
4140: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
4150: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
4160: 72 20 53 45 4c 45 43 54 20 6f 6e 20 72 68 73 20  r SELECT on rhs 
4170: 6f 66 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69  of INSERT */.  i
4180: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4190: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
41a0: 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   database holdin
41b0: 67 20 54 41 42 4c 45 20 2a 2f 0a 20 20 44 62 20  g TABLE */.  Db 
41c0: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
41d0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
41e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
41f0: 62 6c 65 20 62 65 69 6e 67 20 69 6e 73 65 72 74  ble being insert
4200: 65 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74  ed into */.  int
4210: 20 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 30 3b   appendFlag = 0;
4220: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4230: 65 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65  e insert is like
4240: 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65  ly to be an appe
4250: 6e 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69  nd */..  /* Regi
4260: 73 74 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  ster allocations
4270: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 6f   */.  int regFro
4280: 6d 53 65 6c 65 63 74 20 3d 20 30 3b 2f 2a 20 42  mSelect = 0;/* B
4290: 61 73 65 20 72 65 67 69 73 74 65 72 20 66 6f 72  ase register for
42a0: 20 64 61 74 61 20 63 6f 6d 69 6e 67 20 66 72 6f   data coming fro
42b0: 6d 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  m SELECT */.  in
42c0: 74 20 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 30  t regAutoinc = 0
42d0: 3b 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ;   /* Register 
42e0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 41 55 54 4f  holding the AUTO
42f0: 49 4e 43 52 45 4d 45 4e 54 20 63 6f 75 6e 74 65  INCREMENT counte
4300: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  r */.  int regRo
4310: 77 43 6f 75 6e 74 20 3d 20 30 3b 20 20 2f 2a 20  wCount = 0;  /* 
4320: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64  Memory cell used
4330: 20 66 6f 72 20 74 68 65 20 72 6f 77 20 63 6f 75   for the row cou
4340: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
4350: 67 49 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20  gIns;           
4360: 2f 2a 20 42 6c 6f 63 6b 20 6f 66 20 72 65 67 73  /* Block of regs
4370: 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 2b 64   holding rowid+d
4380: 61 74 61 20 62 65 69 6e 67 20 69 6e 73 65 72 74  ata being insert
4390: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ed */.  int regR
43a0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  owid;         /*
43b0: 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
43c0: 6e 67 20 69 6e 73 65 72 74 20 72 6f 77 69 64 20  ng insert rowid 
43d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
43e0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  ;          /* re
43f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 66  gister holding f
4400: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 69  irst column to i
4410: 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72  nsert */.  int r
4420: 65 67 45 6f 66 20 3d 20 30 3b 20 20 20 20 20 20  egEof = 0;      
4430: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 72 65 63   /* Register rec
4440: 6f 72 64 69 6e 67 20 65 6e 64 20 6f 66 20 53 45  ording end of SE
4450: 4c 45 43 54 20 64 61 74 61 20 2a 2f 0a 20 20 69  LECT data */.  i
4460: 6e 74 20 2a 61 52 65 67 49 64 78 20 3d 20 30 3b  nt *aRegIdx = 0;
4470: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 72 65 67 69       /* One regi
4480: 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
4490: 6f 20 65 61 63 68 20 69 6e 64 65 78 20 2a 2f 0a  o each index */.
44a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
44b0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69  OMIT_TRIGGER.  i
44c0: 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20 20 20  nt isView;      
44d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
44e0: 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67  ue if attempting
44f0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
4500: 61 20 76 69 65 77 20 2a 2f 0a 20 20 54 72 69 67  a view */.  Trig
4510: 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 20 20  ger *pTrigger;  
4520: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4530: 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70  of triggers on p
4540: 54 61 62 2c 20 69 66 20 72 65 71 75 69 72 65 64  Tab, if required
4550: 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73 6b 3b   */.  int tmask;
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 72 69    /* Mask of tri
4580: 67 67 65 72 20 74 69 6d 65 73 20 2a 2f 0a 23 65  gger times */.#e
4590: 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
45a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
45b0: 74 28 26 64 65 73 74 2c 20 30 2c 20 73 69 7a 65  t(&dest, 0, size
45c0: 6f 66 28 64 65 73 74 29 29 3b 0a 20 20 69 66 28  of(dest));.  if(
45d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
45e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
45f0: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e  d ){.    goto in
4600: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
4610: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
4620: 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  he table into wh
4630: 69 63 68 20 77 65 20 77 69 6c 6c 20 62 65 20 69  ich we will be i
4640: 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 69 6e 66  nserting new inf
4650: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
4660: 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73   assert( pTabLis
4670: 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  t->nSrc==1 );.  
4680: 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  zTab = pTabList-
4690: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69  >a[0].zName;.  i
46a0: 66 28 20 4e 45 56 45 52 28 7a 54 61 62 3d 3d 30  f( NEVER(zTab==0
46b0: 29 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f  ) ) goto insert_
46c0: 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20  cleanup;.  pTab 
46d0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
46e0: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
46f0: 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  TabList);.  if( 
4700: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67  pTab==0 ){.    g
4710: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
4720: 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  up;.  }.  iDb = 
4730: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
4740: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
4750: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
4760: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
4770: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
4780: 44 62 5b 69 44 62 5d 3b 0a 20 20 7a 44 62 20 3d  Db[iDb];.  zDb =
4790: 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69   pDb->zName;.  i
47a0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
47b0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
47c0: 54 45 5f 49 4e 53 45 52 54 2c 20 70 54 61 62 2d  TE_INSERT, pTab-
47d0: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
47e0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65  ){.    goto inse
47f0: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  rt_cleanup;.  }.
4800: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
4810: 20 69 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   if we have any 
4820: 74 72 69 67 67 65 72 73 20 61 6e 64 20 69 66 20  triggers and if 
4830: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 0a  the table being.
4840: 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e    ** inserted in
4850: 74 6f 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a  to is a view.  *
4860: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
4870: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
4880: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
4890: 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28  e3TriggersExist(
48a0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b  pParse, pTab, TK
48b0: 5f 49 4e 53 45 52 54 2c 20 30 2c 20 26 74 6d 61  _INSERT, 0, &tma
48c0: 73 6b 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20  sk);.  isView = 
48d0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30  pTab->pSelect!=0
48e0: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
48f0: 20 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65   pTrigger 0.# de
4900: 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a 23 20 64  fine tmask 0.# d
4910: 65 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23  efine isView 0.#
4920: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4930: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20  ITE_OMIT_VIEW.# 
4940: 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64  undef isView.# d
4950: 65 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23  efine isView 0.#
4960: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
4970: 28 70 54 72 69 67 67 65 72 20 26 26 20 74 6d 61  (pTrigger && tma
4980: 73 6b 29 20 7c 7c 20 28 70 54 72 69 67 67 65 72  sk) || (pTrigger
4990: 3d 3d 30 20 26 26 20 74 6d 61 73 6b 3d 3d 30 29  ==0 && tmask==0)
49a0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
49b0: 62 20 69 73 20 72 65 61 6c 6c 79 20 61 20 76 69  b is really a vi
49c0: 65 77 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  ew, make sure it
49d0: 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61   has been initia
49e0: 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 56 69 65 77  lized..  ** View
49f0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
4a00: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 70   is a no-op if p
4a10: 54 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69 65  Tab is not a vie
4a20: 77 20 28 6f 72 20 76 69 72 74 75 61 6c 20 0a 20  w (or virtual . 
4a30: 20 2a 2a 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65   ** module table
4a40: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  )..  */.  if( sq
4a50: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
4a60: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
4a70: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  pTab) ){.    got
4a80: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
4a90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75  ;.  }..  /* Ensu
4aa0: 72 65 20 74 68 61 74 3a 0a 20 20 2a 20 20 28 61  re that:.  *  (a
4ab0: 29 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e  ) the table is n
4ac0: 6f 74 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 0a 20  ot read-only, . 
4ad0: 20 2a 20 20 28 62 29 20 74 68 61 74 20 69 66 20   *  (b) that if 
4ae0: 69 74 20 69 73 20 61 20 76 69 65 77 20 74 68 65  it is a view the
4af0: 6e 20 4f 4e 20 49 4e 53 45 52 54 20 74 72 69 67  n ON INSERT trig
4b00: 67 65 72 73 20 65 78 69 73 74 0a 20 20 2a 2f 0a  gers exist.  */.
4b10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
4b20: 65 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20  eadOnly(pParse, 
4b30: 70 54 61 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a  pTab, tmask) ){.
4b40: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
4b50: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
4b60: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 56 44  /* Allocate a VD
4b70: 42 45 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  BE.  */.  v = sq
4b80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
4b90: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
4ba0: 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63   ) goto insert_c
4bb0: 6c 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 70 50  leanup;.  if( pP
4bc0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
4bd0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  ) sqlite3VdbeCou
4be0: 6e 74 43 68 61 6e 67 65 73 28 76 29 3b 0a 20 20  ntChanges(v);.  
4bf0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
4c00: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
4c10: 65 2c 20 70 53 65 6c 65 63 74 20 7c 7c 20 70 54  e, pSelect || pT
4c20: 72 69 67 67 65 72 2c 20 69 44 62 29 3b 0a 0a 23  rigger, iDb);..#
4c30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4c40: 49 54 5f 58 46 45 52 5f 4f 50 54 0a 20 20 2f 2a  IT_XFER_OPT.  /*
4c50: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
4c60: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
4c70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
4c80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61   INSERT INTO <ta
4c90: 62 6c 65 31 3e 20 53 45 4c 45 43 54 20 2a 20 46  ble1> SELECT * F
4ca0: 52 4f 4d 20 3c 74 61 62 6c 65 32 3e 3b 0a 20 20  ROM <table2>;.  
4cb0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 73 70 65  **.  ** Then spe
4cc0: 63 69 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f  cial optimizatio
4cd0: 6e 73 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65  ns can be applie
4ce0: 64 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 20  d that make the 
4cf0: 74 72 61 6e 73 66 65 72 0a 20 20 2a 2a 20 76 65  transfer.  ** ve
4d00: 72 79 20 66 61 73 74 20 61 6e 64 20 77 68 69 63  ry fast and whic
4d10: 68 20 72 65 64 75 63 65 20 66 72 61 67 6d 65 6e  h reduce fragmen
4d20: 74 61 74 69 6f 6e 20 6f 66 20 69 6e 64 69 63 65  tation of indice
4d30: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
4d40: 73 20 69 73 20 74 68 65 20 32 6e 64 20 74 65 6d  s is the 2nd tem
4d50: 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  plate..  */.  if
4d60: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
4d70: 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  xferOptimization
4d80: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
4d90: 53 65 6c 65 63 74 2c 20 6f 6e 45 72 72 6f 72 2c  Select, onError,
4da0: 20 69 44 62 29 20 29 7b 0a 20 20 20 20 61 73 73   iDb) ){.    ass
4db0: 65 72 74 28 20 21 70 54 72 69 67 67 65 72 20 29  ert( !pTrigger )
4dc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
4dd0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 67 6f  ist==0 );.    go
4de0: 74 6f 20 69 6e 73 65 72 74 5f 65 6e 64 3b 0a 20  to insert_end;. 
4df0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
4e00: 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50  ITE_OMIT_XFER_OP
4e10: 54 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  T */..  /* If th
4e20: 69 73 20 69 73 20 61 6e 20 41 55 54 4f 49 4e 43  is is an AUTOINC
4e30: 52 45 4d 45 4e 54 20 74 61 62 6c 65 2c 20 6c 6f  REMENT table, lo
4e40: 6f 6b 20 75 70 20 74 68 65 20 73 65 71 75 65 6e  ok up the sequen
4e50: 63 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ce number in the
4e60: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 73 65 71  .  ** sqlite_seq
4e70: 75 65 6e 63 65 20 74 61 62 6c 65 20 61 6e 64 20  uence table and 
4e80: 73 74 6f 72 65 20 69 74 20 69 6e 20 6d 65 6d 6f  store it in memo
4e90: 72 79 20 63 65 6c 6c 20 72 65 67 41 75 74 6f 69  ry cell regAutoi
4ea0: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 41 75  nc..  */.  regAu
4eb0: 74 6f 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42  toinc = autoIncB
4ec0: 65 67 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62  egin(pParse, iDb
4ed0: 2c 20 70 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 46  , pTab);..  /* F
4ee0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
4ef0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  ny columns of da
4f00: 74 61 20 61 72 65 20 73 75 70 70 6c 69 65 64 2e  ta are supplied.
4f10: 20 20 49 66 20 74 68 65 20 64 61 74 61 0a 20 20    If the data.  
4f20: 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ** is coming fro
4f30: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
4f40: 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65 6e 65 72  ment, then gener
4f50: 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ate a co-routine
4f60: 20 74 68 61 74 0a 20 20 2a 2a 20 70 72 6f 64 75   that.  ** produ
4f70: 63 65 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ces a single row
4f80: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6f   of the SELECT o
4f90: 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
4fa0: 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20 63 6f 2d  n.  The.  ** co-
4fb0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
4fc0: 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20 74 6f 20  ommon header to 
4fd0: 74 68 65 20 33 72 64 20 61 6e 64 20 34 74 68 20  the 3rd and 4th 
4fe0: 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20 2a 2f 0a  templates..  */.
4ff0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
5000: 0a 20 20 20 20 2f 2a 20 44 61 74 61 20 69 73 20  .    /* Data is 
5010: 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 53 45  coming from a SE
5020: 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
5030: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
5040: 74 20 74 68 61 74 20 53 45 4c 45 43 54 0a 20 20  t that SELECT.  
5050: 20 20 2a 2a 20 61 73 20 61 20 63 6f 2d 72 6f 75    ** as a co-rou
5060: 74 69 6e 65 2e 20 20 54 68 65 20 63 6f 64 65 20  tine.  The code 
5070: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74  is common to bot
5080: 68 20 74 68 65 20 33 72 64 20 61 6e 64 20 34 74  h the 3rd and 4t
5090: 68 0a 20 20 20 20 2a 2a 20 74 65 6d 70 6c 61 74  h.    ** templat
50a0: 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es:.    **.    *
50b0: 2a 20 20 20 20 20 20 20 20 20 45 4f 46 20 3c 2d  *         EOF <-
50c0: 20 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   0.    **       
50d0: 20 20 58 20 3c 2d 20 41 0a 20 20 20 20 2a 2a 20    X <- A.    ** 
50e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 42 0a 20          goto B. 
50f0: 20 20 20 2a 2a 20 20 20 20 20 20 41 3a 20 73 65     **      A: se
5100: 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c 45  tup for the SELE
5110: 43 54 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  CT.    **       
5120: 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20    loop over the 
5130: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 53 45  tables in the SE
5140: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 20 20 20 20  LECT.    **     
5150: 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75 65        load value
5160: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 52   into register R
5170: 2e 2e 52 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ..R+n.    **    
5180: 20 20 20 20 20 20 20 79 69 65 6c 64 20 58 0a 20         yield X. 
5190: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 65 6e     **         en
51a0: 64 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20  d loop.    **   
51b0: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 20 61 66        cleanup af
51c0: 74 65 72 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ter the SELECT. 
51d0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 45 4f     **         EO
51e0: 46 20 3c 2d 20 31 0a 20 20 20 20 2a 2a 20 20 20  F <- 1.    **   
51f0: 20 20 20 20 20 20 79 69 65 6c 64 20 58 0a 20 20        yield X.  
5200: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 68 61 6c    **         hal
5210: 74 2d 65 72 72 6f 72 0a 20 20 20 20 2a 2a 0a 20  t-error.    **. 
5220: 20 20 20 2a 2a 20 4f 6e 20 65 61 63 68 20 69 6e     ** On each in
5230: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  vocation of the 
5240: 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 69 74 20 70  co-routine, it p
5250: 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
5260: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
5270: 45 4c 45 43 54 20 72 65 73 75 6c 74 20 69 6e 74  ELECT result int
5280: 6f 20 72 65 67 69 73 74 65 72 73 20 64 65 73 74  o registers dest
5290: 2e 69 4d 65 6d 2e 2e 2e 64 65 73 74 2e 69 4d 65  .iMem...dest.iMe
52a0: 6d 2b 64 65 73 74 2e 6e 4d 65 6d 2d 31 2e 0a 20  m+dest.nMem-1.. 
52b0: 20 20 20 2a 2a 20 28 54 68 65 73 65 20 6f 75 74     ** (These out
52c0: 70 75 74 20 72 65 67 69 73 74 65 72 73 20 61 72  put registers ar
52d0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73  e allocated by s
52e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 29  qlite3Select().)
52f0: 20 20 57 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68    When.    ** th
5300: 65 20 53 45 4c 45 43 54 20 63 6f 6d 70 6c 65 74  e SELECT complet
5310: 65 73 2c 20 69 74 20 73 65 74 73 20 74 68 65 20  es, it sets the 
5320: 45 4f 46 20 66 6c 61 67 20 73 74 6f 72 65 64 20  EOF flag stored 
5330: 69 6e 20 72 65 67 45 6f 66 2e 0a 20 20 20 20 2a  in regEof..    *
5340: 2f 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 6a 31  /.    int rc, j1
5350: 3b 0a 0a 20 20 20 20 72 65 67 45 6f 66 20 3d 20  ;..    regEof = 
5360: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
5370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5380: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
5390: 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 29 3b  ger, 0, regEof);
53a0: 20 20 20 20 20 20 2f 2a 20 45 4f 46 20 3c 2d 20        /* EOF <- 
53b0: 30 20 2a 2f 0a 20 20 20 20 56 64 62 65 43 6f 6d  0 */.    VdbeCom
53c0: 6d 65 6e 74 28 28 76 2c 20 22 53 45 4c 45 43 54  ment((v, "SELECT
53d0: 20 65 6f 66 20 66 6c 61 67 22 29 29 3b 0a 20 20   eof flag"));.  
53e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
53f0: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
5400: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 2b 2b  RT_Coroutine, ++
5410: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
5420: 20 20 20 61 64 64 72 53 65 6c 65 63 74 20 3d 20     addrSelect = 
5430: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5440: 6e 74 41 64 64 72 28 76 29 2b 32 3b 0a 20 20 20  ntAddr(v)+2;.   
5450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5460: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
5470: 2c 20 61 64 64 72 53 65 6c 65 63 74 2d 31 2c 20  , addrSelect-1, 
5480: 64 65 73 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20  dest.iParm);.   
5490: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
54a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
54b0: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 56  to, 0, 0);.    V
54c0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
54d0: 4a 75 6d 70 20 6f 76 65 72 20 53 45 4c 45 43 54  Jump over SELECT
54e0: 20 63 6f 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a   coroutine"));..
54f0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74      /* Resolve t
5500: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
5510: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
5520: 74 65 6d 65 6e 74 20 61 6e 64 20 65 78 65 63 75  tement and execu
5530: 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 63  te it. */.    rc
5540: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
5550: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
5560: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 61 73  , &dest);.    as
5570: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
5580: 72 72 3d 3d 30 20 7c 7c 20 72 63 20 29 3b 0a 20  rr==0 || rc );. 
5590: 20 20 20 69 66 28 20 72 63 20 7c 7c 20 4e 45 56     if( rc || NEV
55a0: 45 52 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 29  ER(pParse->nErr)
55b0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
55c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f  iled ){.      go
55d0: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
55e0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  p;.    }.    sql
55f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5600: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5610: 20 72 65 67 45 6f 66 29 3b 20 20 20 20 20 20 20   regEof);       
5620: 20 20 2f 2a 20 45 4f 46 20 3c 2d 20 31 20 2a 2f    /* EOF <- 1 */
5630: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5640: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
5650: 6c 64 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b  ld, dest.iParm);
5660: 20 20 20 2f 2a 20 79 69 65 6c 64 20 58 20 2a 2f     /* yield X */
5670: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5680: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
5690: 74 2c 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  t, SQLITE_INTERN
56a0: 41 4c 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20  AL, OE_Abort);. 
56b0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
56c0: 76 2c 20 22 45 6e 64 20 6f 66 20 53 45 4c 45 43  v, "End of SELEC
56d0: 54 20 63 6f 72 6f 75 74 69 6e 65 22 29 29 3b 0a  T coroutine"));.
56e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
56f0: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 20  umpHere(v, j1); 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 61 62 65           /* labe
5720: 6c 20 42 3a 20 2a 2f 0a 0a 20 20 20 20 72 65 67  l B: */..    reg
5730: 46 72 6f 6d 53 65 6c 65 63 74 20 3d 20 64 65 73  FromSelect = des
5740: 74 2e 69 4d 65 6d 3b 0a 20 20 20 20 61 73 73 65  t.iMem;.    asse
5750: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  rt( pSelect->pEL
5760: 69 73 74 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 75  ist );.    nColu
5770: 6d 6e 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  mn = pSelect->pE
5780: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
5790: 20 61 73 73 65 72 74 28 20 64 65 73 74 2e 6e 4d   assert( dest.nM
57a0: 65 6d 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a  em==nColumn );..
57b0: 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 54 65      /* Set useTe
57c0: 6d 70 54 61 62 6c 65 20 74 6f 20 54 52 55 45 20  mpTable to TRUE 
57d0: 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
57e0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
57f0: 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 73 68 6f  ement.    ** sho
5800: 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
5810: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20  nto a temporary 
5820: 74 61 62 6c 65 20 28 74 65 6d 70 6c 61 74 65 20  table (template 
5830: 34 29 2e 20 20 53 65 74 20 74 6f 0a 20 20 20 20  4).  Set to.    
5840: 2a 2a 20 46 41 4c 53 45 20 69 66 20 65 61 63 68  ** FALSE if each
5850: 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 53 45 4c  * row of the SEL
5860: 45 43 54 20 63 61 6e 20 62 65 20 77 72 69 74 74  ECT can be writt
5870: 65 6e 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  en directly into
5880: 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 65 73 74  .    ** the dest
5890: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 28 74  ination table (t
58a0: 65 6d 70 6c 61 74 65 20 33 29 2e 0a 20 20 20 20  emplate 3)..    
58b0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 74 65 6d 70  **.    ** A temp
58c0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
58d0: 73 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  sed if the table
58e0: 20 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 69   being updated i
58f0: 73 20 61 6c 73 6f 20 6f 6e 65 0a 20 20 20 20 2a  s also one.    *
5900: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  * of the tables 
5910: 62 65 69 6e 67 20 72 65 61 64 20 62 79 20 74 68  being read by th
5920: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5930: 6e 74 2e 20 20 41 6c 73 6f 20 75 73 65 20 61 20  nt.  Also use a 
5940: 0a 20 20 20 20 2a 2a 20 74 65 6d 70 20 74 61 62  .    ** temp tab
5950: 6c 65 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  le in the case o
5960: 66 20 72 6f 77 20 74 72 69 67 67 65 72 73 2e 0a  f row triggers..
5970: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
5980: 54 72 69 67 67 65 72 20 7c 7c 20 72 65 61 64 73  Trigger || reads
5990: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 61 64  Table(pParse, ad
59a0: 64 72 53 65 6c 65 63 74 2c 20 69 44 62 2c 20 70  drSelect, iDb, p
59b0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 75 73  Tab) ){.      us
59c0: 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 31 3b 0a  eTempTable = 1;.
59d0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
59e0: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
59f0: 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74       /* Invoke t
5a00: 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20  he coroutine to 
5a10: 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
5a20: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 53 45 4c  ion from the SEL
5a30: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ECT.      ** and
5a40: 20 61 64 64 20 69 74 20 74 6f 20 61 20 74 72 61   add it to a tra
5a50: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 72 63  nsient table src
5a60: 54 61 62 2e 20 20 54 68 65 20 63 6f 64 65 20 67  Tab.  The code g
5a70: 65 6e 65 72 61 74 65 64 0a 20 20 20 20 20 20 2a  enerated.      *
5a80: 2a 20 68 65 72 65 20 69 73 20 66 72 6f 6d 20 74  * here is from t
5a90: 68 65 20 34 74 68 20 74 65 6d 70 6c 61 74 65 3a  he 4th template:
5aa0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5ab0: 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20  **      B: open 
5ac0: 74 65 6d 70 20 74 61 62 6c 65 0a 20 20 20 20 20  temp table.     
5ad0: 20 2a 2a 20 20 20 20 20 20 4c 3a 20 79 69 65 6c   **      L: yiel
5ae0: 64 20 58 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  d X.      **    
5af0: 20 20 20 20 20 69 66 20 45 4f 46 20 67 6f 74 6f       if EOF goto
5b00: 20 4d 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20   M.      **     
5b10: 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20 66      insert row f
5b20: 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20  rom R..R+n into 
5b30: 74 65 6d 70 20 74 61 62 6c 65 0a 20 20 20 20 20  temp table.     
5b40: 20 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f   **         goto
5b50: 20 4c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20   L.      **     
5b60: 20 4d 3a 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f   M: ....      */
5b70: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
5b80: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  c;          /* R
5b90: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
5ba0: 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 2a 2f  packed record */
5bb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 54 65  .      int regTe
5bc0: 6d 70 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 52  mpRowid;    /* R
5bd0: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
5be0: 74 65 6d 70 20 74 61 62 6c 65 20 52 4f 57 49 44  temp table ROWID
5bf0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
5c00: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 2f  drTop;         /
5c10: 2a 20 4c 61 62 65 6c 20 22 4c 22 20 2a 2f 0a 20  * Label "L" */. 
5c20: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 66 3b       int addrIf;
5c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
5c40: 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 74 6f 20  ress of jump to 
5c50: 4d 20 2a 2f 0a 0a 20 20 20 20 20 20 73 72 63 54  M */..      srcT
5c60: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
5c70: 62 2b 2b 3b 0a 20 20 20 20 20 20 72 65 67 52 65  b++;.      regRe
5c80: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
5c90: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5ca0: 20 20 20 20 20 72 65 67 54 65 6d 70 52 6f 77 69       regTempRowi
5cb0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
5cc0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5ce0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
5cf0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 72 63 54  nEphemeral, srcT
5d00: 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ab, nColumn);.  
5d10: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
5d20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5d30: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
5d40: 74 2e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  t.iParm);.      
5d50: 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33  addrIf = sqlite3
5d60: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5d70: 5f 49 66 2c 20 72 65 67 45 6f 66 29 3b 0a 20 20  _If, regEof);.  
5d80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5d90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5da0: 52 65 63 6f 72 64 2c 20 72 65 67 46 72 6f 6d 53  Record, regFromS
5db0: 65 6c 65 63 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  elect, nColumn, 
5dc0: 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
5dd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5de0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
5df0: 20 73 72 63 54 61 62 2c 20 72 65 67 54 65 6d 70   srcTab, regTemp
5e00: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
5e10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5e20: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 73 72  v, OP_Insert, sr
5e30: 63 54 61 62 2c 20 72 65 67 52 65 63 2c 20 72 65  cTab, regRec, re
5e40: 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20  gTempRowid);.   
5e50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e60: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
5e70: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
5e80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5e90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
5ea0: 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
5eb0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5ec0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 29 3b  pParse, regRec);
5ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
5ee0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5ef0: 72 73 65 2c 20 72 65 67 54 65 6d 70 52 6f 77 69  rse, regTempRowi
5f00: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  d);.    }.  }els
5f10: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
5f20: 73 20 74 68 65 20 63 61 73 65 20 69 66 20 74 68  s the case if th
5f30: 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 49  e data for the I
5f40: 4e 53 45 52 54 20 69 73 20 63 6f 6d 69 6e 67 20  NSERT is coming 
5f50: 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 0a 20 20  from a VALUES.  
5f60: 20 20 2a 2a 20 63 6c 61 75 73 65 0a 20 20 20 20    ** clause.    
5f70: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
5f80: 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65 6d 73  xt sNC;.    mems
5f90: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
5fa0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
5fb0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
5fc0: 65 3b 0a 20 20 20 20 73 72 63 54 61 62 20 3d 20  e;.    srcTab = 
5fd0: 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
5fe0: 75 73 65 54 65 6d 70 54 61 62 6c 65 3d 3d 30 20  useTempTable==0 
5ff0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  );.    nColumn =
6000: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
6010: 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66  nExpr : 0;.    f
6020: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
6030: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
6040: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
6050: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
6060: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
6070: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
6080: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
6090: 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
60a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
60b0: 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
60c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
60d0: 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 20 6d  he source data m
60e0: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
60f0: 72 0a 20 20 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  r.  ** of column
6100: 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  s to be inserted
6110: 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 2e   into the table.
6120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
6130: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
6140: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
6150: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
6160: 20 20 20 20 20 20 6e 48 69 64 64 65 6e 20 2b 3d        nHidden +=
6170: 20 28 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e   (IsHiddenColumn
6180: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29  (&pTab->aCol[i])
6190: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 1 : 0);.    }
61a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75  .  }.  if( pColu
61b0: 6d 6e 3d 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e  mn==0 && nColumn
61c0: 20 26 26 20 6e 43 6f 6c 75 6d 6e 21 3d 28 70 54   && nColumn!=(pT
61d0: 61 62 2d 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e  ab->nCol-nHidden
61e0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
61f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6200: 20 0a 20 20 20 20 20 20 20 22 74 61 62 6c 65 20   .       "table 
6210: 25 53 20 68 61 73 20 25 64 20 63 6f 6c 75 6d 6e  %S has %d column
6220: 73 20 62 75 74 20 25 64 20 76 61 6c 75 65 73 20  s but %d values 
6230: 77 65 72 65 20 73 75 70 70 6c 69 65 64 22 2c 0a  were supplied",.
6240: 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74 2c         pTabList,
6250: 20 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e   0, pTab->nCol-n
6260: 48 69 64 64 65 6e 2c 20 6e 43 6f 6c 75 6d 6e 29  Hidden, nColumn)
6270: 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  ;.    goto inser
6280: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  t_cleanup;.  }. 
6290: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 21 3d 30 20   if( pColumn!=0 
62a0: 26 26 20 6e 43 6f 6c 75 6d 6e 21 3d 70 43 6f 6c  && nColumn!=pCol
62b0: 75 6d 6e 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20  umn->nId ){.    
62c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
62d0: 70 50 61 72 73 65 2c 20 22 25 64 20 76 61 6c 75  pParse, "%d valu
62e0: 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
62f0: 73 22 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 70 43 6f  s", nColumn, pCo
6300: 6c 75 6d 6e 2d 3e 6e 49 64 29 3b 0a 20 20 20 20  lumn->nId);.    
6310: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
6320: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  nup;.  }..  /* I
6330: 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61  f the INSERT sta
6340: 74 65 6d 65 6e 74 20 69 6e 63 6c 75 64 65 64 20  tement included 
6350: 61 6e 20 49 44 4c 49 53 54 20 74 65 72 6d 2c 20  an IDLIST term, 
6360: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 20  then make sure. 
6370: 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73   ** all elements
6380: 20 6f 66 20 74 68 65 20 49 44 4c 49 53 54 20 72   of the IDLIST r
6390: 65 61 6c 6c 79 20 61 72 65 20 63 6f 6c 75 6d 6e  eally are column
63a0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
63b0: 6e 64 20 0a 20 20 2a 2a 20 72 65 6d 65 6d 62 65  nd .  ** remembe
63c0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  r the column ind
63d0: 69 63 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ices..  **.  ** 
63e0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
63f0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
6400: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61  ARY KEY column a
6410: 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0a 20  nd that column. 
6420: 20 2a 2a 20 69 73 20 6e 61 6d 65 64 20 69 6e 20   ** is named in 
6430: 74 68 65 20 49 44 4c 49 53 54 2c 20 74 68 65 6e  the IDLIST, then
6440: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6b   record in the k
6450: 65 79 43 6f 6c 75 6d 6e 20 76 61 72 69 61 62 6c  eyColumn variabl
6460: 65 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  e.  ** the index
6470: 20 69 6e 74 6f 20 49 44 4c 49 53 54 20 6f 66 20   into IDLIST of 
6480: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
6490: 63 6f 6c 75 6d 6e 2e 20 20 6b 65 79 43 6f 6c 75  column.  keyColu
64a0: 6d 6e 20 69 73 0a 20 20 2a 2a 20 74 68 65 20 69  mn is.  ** the i
64b0: 6e 64 65 78 20 6f 66 20 74 68 65 20 70 72 69 6d  ndex of the prim
64c0: 61 72 79 20 6b 65 79 20 61 73 20 69 74 20 61 70  ary key as it ap
64d0: 70 65 61 72 73 20 69 6e 20 49 44 4c 49 53 54 2c  pears in IDLIST,
64e0: 20 6e 6f 74 20 61 73 0a 20 20 2a 2a 20 69 73 20   not as.  ** is 
64f0: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 6f  appears in the o
6500: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 2e 20 20  riginal table.  
6510: 28 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68  (The index of th
6520: 65 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  e primary.  ** k
6530: 65 79 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ey in the origin
6540: 61 6c 20 74 61 62 6c 65 20 69 73 20 70 54 61 62  al table is pTab
6550: 2d 3e 69 50 4b 65 79 2e 29 0a 20 20 2a 2f 0a 20  ->iPKey.).  */. 
6560: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a   if( pColumn ){.
6570: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6580: 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b  Column->nId; i++
6590: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  ){.      pColumn
65a0: 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 2d 31 3b  ->a[i].idx = -1;
65b0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
65c0: 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e  =0; i<pColumn->n
65d0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; i++){.      
65e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
65f0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
6600: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6610: 53 74 72 49 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d  StrICmp(pColumn-
6620: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
6630: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
6640: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6650: 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e    pColumn->a[i].
6660: 69 64 78 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  idx = j;.       
6670: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
6680: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
6690: 20 20 20 20 20 6b 65 79 43 6f 6c 75 6d 6e 20 3d       keyColumn =
66a0: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   i;.          }.
66b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
66c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
66d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
66e0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
66f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6700: 33 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e  3IsRowid(pColumn
6710: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b  ->a[i].zName) ){
6720: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 43 6f  .          keyCo
6730: 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20  lumn = i;.      
6740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6750: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6760: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6770: 65 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %S has no colu
6780: 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
6790: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
67a0: 4c 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e  List, 0, pColumn
67b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
67c0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
67d0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
67e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
67f0: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
6800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6810: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
6820: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
6830: 6f 20 49 44 4c 49 53 54 20 74 65 72 6d 20 62 75  o IDLIST term bu
6840: 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
6850: 61 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  an integer prima
6860: 72 79 0a 20 20 2a 2a 20 6b 65 79 2c 20 74 68 65  ry.  ** key, the
6870: 20 73 65 74 20 74 68 65 20 6b 65 79 43 6f 6c 75   set the keyColu
6880: 6d 6e 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  mn variable to t
6890: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63  he primary key c
68a0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 20 20 2a 2a  olumn index.  **
68b0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
68c0: 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74 69 6f   table definitio
68d0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  n..  */.  if( pC
68e0: 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43 6f 6c  olumn==0 && nCol
68f0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6b 65 79  umn>0 ){.    key
6900: 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 69  Column = pTab->i
6910: 50 4b 65 79 3b 0a 20 20 7d 0a 20 20 20 20 0a 20  PKey;.  }.    . 
6920: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
6930: 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73  he count of rows
6940: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 0a   to be inserted.
6950: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66    */.  if( db->f
6960: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
6970: 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20 20 72  untRows ){.    r
6980: 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20 2b 2b 70  egRowCount = ++p
6990: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
69a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
69c0: 2c 20 30 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74  , 0, regRowCount
69d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
69e0: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 76 69  this is not a vi
69f0: 65 77 2c 20 6f 70 65 6e 20 74 68 65 20 74 61 62  ew, open the tab
6a00: 6c 65 20 61 6e 64 20 61 6e 64 20 61 6c 6c 20 69  le and and all i
6a10: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndices */.  if( 
6a20: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69  !isView ){.    i
6a30: 6e 74 20 6e 49 64 78 3b 0a 0a 20 20 20 20 62 61  nt nIdx;..    ba
6a40: 73 65 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  seCur = pParse->
6a50: 6e 54 61 62 3b 0a 20 20 20 20 6e 49 64 78 20 3d  nTab;.    nIdx =
6a60: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
6a70: 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72  eAndIndices(pPar
6a80: 73 65 2c 20 70 54 61 62 2c 20 62 61 73 65 43 75  se, pTab, baseCu
6a90: 72 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29  r, OP_OpenWrite)
6aa0: 3b 0a 20 20 20 20 61 52 65 67 49 64 78 20 3d 20  ;.    aRegIdx = 
6ab0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
6ac0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e  aw(db, sizeof(in
6ad0: 74 29 2a 28 6e 49 64 78 2b 31 29 29 3b 0a 20 20  t)*(nIdx+1));.  
6ae0: 20 20 69 66 28 20 61 52 65 67 49 64 78 3d 3d 30    if( aRegIdx==0
6af0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 69   ){.      goto i
6b00: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
6b10: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
6b20: 3b 20 69 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b 0a  ; i<nIdx; i++){.
6b30: 20 20 20 20 20 20 61 52 65 67 49 64 78 5b 69 5d        aRegIdx[i]
6b40: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6b50: 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
6b60: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 74  /* This is the t
6b70: 6f 70 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 69  op of the main i
6b80: 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a 2f  nsertion loop */
6b90: 0a 20 20 69 66 28 20 75 73 65 54 65 6d 70 54 61  .  if( useTempTa
6ba0: 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
6bb0: 69 73 20 62 6c 6f 63 6b 20 63 6f 64 65 73 20 74  is block codes t
6bc0: 68 65 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f  he top of loop o
6bd0: 6e 6c 79 2e 20 20 54 68 65 20 63 6f 6d 70 6c 65  nly.  The comple
6be0: 74 65 20 6c 6f 6f 70 20 69 73 20 74 68 65 0a 20  te loop is the. 
6bf0: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
6c00: 70 73 65 75 64 6f 63 6f 64 65 20 28 74 65 6d 70  pseudocode (temp
6c10: 6c 61 74 65 20 34 29 3a 0a 20 20 20 20 2a 2a 0a  late 4):.    **.
6c20: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72      **         r
6c30: 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62 6c 65  ewind temp table
6c40: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 43 3a 20  .    **      C: 
6c50: 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f  loop over rows o
6c60: 66 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74  f intermediate t
6c70: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  able.    **     
6c80: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 20 76        transfer v
6c90: 61 6c 75 65 73 20 66 6f 72 6d 20 69 6e 74 65 72  alues form inter
6ca0: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20 69 6e  mediate table in
6cb0: 74 6f 20 3c 74 61 62 6c 65 3e 0a 20 20 20 20 2a  to <table>.    *
6cc0: 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c 6f  *         end lo
6cd0: 6f 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 44  op.    **      D
6ce0: 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  : ....    */.   
6cf0: 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 73 71   addrInsTop = sq
6d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6d10: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 72  v, OP_Rewind, sr
6d20: 63 54 61 62 29 3b 0a 20 20 20 20 61 64 64 72 43  cTab);.    addrC
6d30: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
6d40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
6d50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65  .  }else if( pSe
6d60: 6c 65 63 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  lect ){.    /* T
6d70: 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64 65 73 20  his block codes 
6d80: 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20  the top of loop 
6d90: 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 6d 70 6c  only.  The compl
6da0: 65 74 65 20 6c 6f 6f 70 20 69 73 20 74 68 65 0a  ete loop is the.
6db0: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
6dc0: 20 70 73 65 75 64 6f 63 6f 64 65 20 28 74 65 6d   pseudocode (tem
6dd0: 70 6c 61 74 65 20 33 29 3a 0a 20 20 20 20 2a 2a  plate 3):.    **
6de0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 43 3a 20  .    **      C: 
6df0: 79 69 65 6c 64 20 58 0a 20 20 20 20 2a 2a 20 20  yield X.    **  
6e00: 20 20 20 20 20 20 20 69 66 20 45 4f 46 20 67 6f         if EOF go
6e10: 74 6f 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20  to D.    **     
6e20: 20 20 20 20 69 6e 73 65 72 74 20 74 68 65 20 73      insert the s
6e30: 65 6c 65 63 74 20 72 65 73 75 6c 74 20 69 6e 74  elect result int
6e40: 6f 20 3c 74 61 62 6c 65 3e 20 66 72 6f 6d 20 52  o <table> from R
6e50: 2e 2e 52 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20  ..R+n.    **    
6e60: 20 20 20 20 20 67 6f 74 6f 20 43 0a 20 20 20 20       goto C.    
6e70: 2a 2a 20 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20  **      D: .... 
6e80: 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 43 6f     */.    addrCo
6e90: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
6ea0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
6eb0: 6c 64 2c 20 64 65 73 74 2e 69 50 61 72 6d 29 3b  ld, dest.iParm);
6ec0: 0a 20 20 20 20 61 64 64 72 49 6e 73 54 6f 70 20  .    addrInsTop 
6ed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6ee0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
6ef0: 67 45 6f 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  gEof);.  }..  /*
6f00: 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
6f10: 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ers for holding 
6f20: 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
6f30: 20 6e 65 77 20 72 6f 77 2c 0a 20 20 2a 2a 20 74   new row,.  ** t
6f40: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
6f50: 65 20 6e 65 77 20 72 6f 77 2c 20 61 6e 64 20 74  e new row, and t
6f60: 68 65 20 61 73 73 65 6d 62 6c 69 65 64 20 72 6f  he assemblied ro
6f70: 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  w record..  */. 
6f80: 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 49   regRowid = regI
6f90: 6e 73 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ns = pParse->nMe
6fa0: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
6fb0: 4d 65 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f  Mem += pTab->nCo
6fc0: 6c 20 2b 20 31 3b 0a 20 20 69 66 28 20 49 73 56  l + 1;.  if( IsV
6fd0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
6fe0: 20 20 20 20 72 65 67 52 6f 77 69 64 2b 2b 3b 0a      regRowid++;.
6ff0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
7000: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 67 44 61 74  ++;.  }.  regDat
7010: 61 20 3d 20 72 65 67 52 6f 77 69 64 2b 31 3b 0a  a = regRowid+1;.
7020: 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 42 45  .  /* Run the BE
7030: 46 4f 52 45 20 61 6e 64 20 49 4e 53 54 45 41 44  FORE and INSTEAD
7040: 20 4f 46 20 74 72 69 67 67 65 72 73 2c 20 69 66   OF triggers, if
7050: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 0a 20   there are any. 
7060: 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20   */.  endOfLoop 
7070: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
7080: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
7090: 20 74 6d 61 73 6b 20 26 20 54 52 49 47 47 45 52   tmask & TRIGGER
70a0: 5f 42 45 46 4f 52 45 20 29 7b 0a 20 20 20 20 69  _BEFORE ){.    i
70b0: 6e 74 20 72 65 67 43 6f 6c 73 20 3d 20 73 71 6c  nt regCols = sql
70c0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
70d0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
70e0: 43 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  Col+1);..    /* 
70f0: 62 75 69 6c 64 20 74 68 65 20 4e 45 57 2e 2a 20  build the NEW.* 
7100: 72 65 66 65 72 65 6e 63 65 20 72 6f 77 2e 20 20  reference row.  
7110: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65  Note that if the
7120: 72 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  re is an INTEGER
7130: 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  .    ** PRIMARY 
7140: 4b 45 59 20 69 6e 74 6f 20 77 68 69 63 68 20 61  KEY into which a
7150: 20 4e 55 4c 4c 20 69 73 20 62 65 69 6e 67 20 69   NULL is being i
7160: 6e 73 65 72 74 65 64 2c 20 74 68 61 74 20 4e 55  nserted, that NU
7170: 4c 4c 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  LL will be.    *
7180: 2a 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  * translated int
7190: 6f 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  o a unique ID fo
71a0: 72 20 74 68 65 20 72 6f 77 2e 20 20 42 75 74 20  r the row.  But 
71b0: 6f 6e 20 61 20 42 45 46 4f 52 45 20 74 72 69 67  on a BEFORE trig
71c0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 77 65 20 64  ger,.    ** we d
71d0: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 61 74 20  o not know what 
71e0: 74 68 65 20 75 6e 69 71 75 65 20 49 44 20 77 69  the unique ID wi
71f0: 6c 6c 20 62 65 20 28 62 65 63 61 75 73 65 20 74  ll be (because t
7200: 68 65 20 69 6e 73 65 72 74 20 68 61 73 0a 20 20  he insert has.  
7210: 20 20 2a 2a 20 6e 6f 74 20 68 61 70 70 65 6e 65    ** not happene
7220: 64 20 79 65 74 29 20 73 6f 20 77 65 20 73 75 62  d yet) so we sub
7230: 73 74 69 74 75 74 65 20 61 20 72 6f 77 69 64 20  stitute a rowid 
7240: 6f 66 20 2d 31 0a 20 20 20 20 2a 2f 0a 20 20 20  of -1.    */.   
7250: 20 69 66 28 20 6b 65 79 43 6f 6c 75 6d 6e 3c 30   if( keyColumn<0
7260: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7270: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7280: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72  P_Integer, -1, r
7290: 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 65 6c  egCols);.    }el
72a0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31  se{.      int j1
72b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 54  ;.      if( useT
72c0: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
72d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
72e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
72f0: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6b 65 79 43  mn, srcTab, keyC
7300: 6f 6c 75 6d 6e 2c 20 72 65 67 43 6f 6c 73 29 3b  olumn, regCols);
7310: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7330: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  elect==0 );  /* 
7340: 4f 74 68 65 72 77 69 73 65 20 75 73 65 54 65 6d  Otherwise useTem
7350: 70 54 61 62 6c 65 20 69 73 20 74 72 75 65 20 2a  pTable is true *
7360: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
7370: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
7380: 2c 20 70 4c 69 73 74 2d 3e 61 5b 6b 65 79 43 6f  , pList->a[keyCo
7390: 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72 65 67  lumn].pExpr, reg
73a0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cols);.      }. 
73b0: 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
73c0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
73d0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 43 6f  P_NotNull, regCo
73e0: 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ls);.      sqlit
73f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7400: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
7410: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  regCols);.      
7420: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7430: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
7440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7450: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
7460: 49 6e 74 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20  Int, regCols);. 
7470: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6e     }..    /* Can
7480: 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67 65 72  not have trigger
7490: 73 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 74  s on a virtual t
74a0: 61 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65  able. If it were
74b0: 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20 2a   possible,.    *
74c0: 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f 75  * this block wou
74d0: 6c 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f 75  ld have to accou
74e0: 6e 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63 6f  nt for hidden co
74f0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
7500: 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
7510: 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20 20  ual(pTab) );..  
7520: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
7530: 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61 0a  new column data.
7540: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
7550: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
7560: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
7570: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ( pColumn==0 ){.
7580: 20 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a 20          j = i;. 
7590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
75a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
75b0: 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b  Column->nId; j++
75c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
75d0: 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69   pColumn->a[j].i
75e0: 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  dx==i ) break;. 
75f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7600: 0a 20 20 20 20 20 20 69 66 28 20 28 21 75 73 65  .      if( (!use
7610: 54 65 6d 70 54 61 62 6c 65 20 26 26 20 21 70 4c  TempTable && !pL
7620: 69 73 74 29 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e  ist) || (pColumn
7630: 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e   && j>=pColumn->
7640: 6e 49 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nId) ){.        
7650: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
7660: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43  pParse, pTab->aC
7670: 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67  ol[i].pDflt, reg
7680: 43 6f 6c 73 2b 69 2b 31 29 3b 0a 20 20 20 20 20  Cols+i+1);.     
7690: 20 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65   }else if( useTe
76a0: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
76b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
76c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
76d0: 6e 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 72 65  n, srcTab, j, re
76e0: 67 43 6f 6c 73 2b 69 2b 31 29 3b 20 0a 20 20 20  gCols+i+1); .   
76f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7700: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
7710: 74 3d 3d 30 20 29 3b 20 2f 2a 20 4f 74 68 65 72  t==0 ); /* Other
7720: 77 69 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c  wise useTempTabl
7730: 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20  e is true */.   
7740: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7750: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 70 50 61  CodeAndCache(pPa
7760: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  rse, pList->a[j]
7770: 2e 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 2b  .pExpr, regCols+
7780: 69 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  i+1);.      }.  
7790: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
77a0: 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54  his is an INSERT
77b0: 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68 20   on a view with 
77c0: 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e  an INSTEAD OF IN
77d0: 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20 20  SERT trigger,.  
77e0: 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65    ** do not atte
77f0: 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73 69  mpt any conversi
7800: 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65 6d  ons before assem
7810: 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  bling the record
7820: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
7830: 20 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c 65   is a real table
7840: 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65 72  , attempt conver
7850: 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72 65  sions as require
7860: 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  d by the.    ** 
7870: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66 66  table column aff
7880: 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f 0a  inities..    */.
7890: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
78a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
78b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
78c0: 5f 41 66 66 69 6e 69 74 79 2c 20 72 65 67 43 6f  _Affinity, regCo
78d0: 6c 73 2b 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  ls+1, pTab->nCol
78e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
78f0: 54 61 62 6c 65 41 66 66 69 6e 69 74 79 53 74 72  TableAffinityStr
7900: 28 76 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  (v, pTab);.    }
7910: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 42 45  ..    /* Fire BE
7920: 46 4f 52 45 20 6f 72 20 49 4e 53 54 45 41 44 20  FORE or INSTEAD 
7930: 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  OF triggers */. 
7940: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f     sqlite3CodeRo
7950: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
7960: 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 49 4e   pTrigger, TK_IN
7970: 53 45 52 54 2c 20 30 2c 20 54 52 49 47 47 45 52  SERT, 0, TRIGGER
7980: 5f 42 45 46 4f 52 45 2c 20 0a 20 20 20 20 20 20  _BEFORE, .      
7990: 20 20 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2d    pTab, regCols-
79a0: 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20 6f 6e  pTab->nCol-1, on
79b0: 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70  Error, endOfLoop
79c0: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 52  );..    sqlite3R
79d0: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
79e0: 70 50 61 72 73 65 2c 20 72 65 67 43 6f 6c 73 2c  pParse, regCols,
79f0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a   pTab->nCol+1);.
7a00: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 73 68 20 74    }..  /* Push t
7a10: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7a20: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
7a30: 72 79 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ry onto the stac
7a40: 6b 2e 20 20 54 68 65 0a 20 20 2a 2a 20 72 65 63  k.  The.  ** rec
7a50: 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 61 20  ord number is a 
7a60: 72 61 6e 64 6f 6d 6c 79 20 67 65 6e 65 72 61 74  randomly generat
7a70: 65 20 69 6e 74 65 67 65 72 20 63 72 65 61 74 65  e integer create
7a80: 64 20 62 79 20 4e 65 77 52 6f 77 69 64 0a 20 20  d by NewRowid.  
7a90: 2a 2a 20 65 78 63 65 70 74 20 77 68 65 6e 20 74  ** except when t
7aa0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
7ab0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
7ac0: 4b 45 59 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 77  KEY column, in w
7ad0: 68 69 63 68 0a 20 20 2a 2a 20 63 61 73 65 20 74  hich.  ** case t
7ae0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7af0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
7b00: 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20  that column. .  
7b10: 2a 2f 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  */.  if( !isView
7b20: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 56 69   ){.    if( IsVi
7b30: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
7b40: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20       /* The row 
7b50: 74 68 61 74 20 74 68 65 20 56 55 70 64 61 74 65  that the VUpdate
7b60: 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 64 65 6c   opcode will del
7b70: 65 74 65 3a 20 6e 6f 6e 65 20 2a 2f 0a 20 20 20  ete: none */.   
7b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b90: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7ba0: 20 30 2c 20 72 65 67 49 6e 73 29 3b 0a 20 20 20   0, regIns);.   
7bb0: 20 7d 0a 20 20 20 20 69 66 28 20 6b 65 79 43 6f   }.    if( keyCo
7bc0: 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
7bd0: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
7be0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7c00: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
7c10: 54 61 62 2c 20 6b 65 79 43 6f 6c 75 6d 6e 2c 20  Tab, keyColumn, 
7c20: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
7c30: 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65   }else if( pSele
7c40: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
7c50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7c60: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67  v, OP_SCopy, reg
7c70: 46 72 6f 6d 53 65 6c 65 63 74 2b 6b 65 79 43 6f  FromSelect+keyCo
7c80: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29 3b  lumn, regRowid);
7c90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7ca0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
7cb0: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
7cc0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
7cd0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6b 65 79 43  e, pList->a[keyC
7ce0: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72 65  olumn].pExpr, re
7cf0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
7d00: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
7d10: 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a  beGetOp(v, -1);.
7d20: 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
7d30: 59 53 28 70 4f 70 29 20 26 26 20 70 4f 70 2d 3e  YS(pOp) && pOp->
7d40: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 20  opcode==OP_Null 
7d50: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7d60: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
7d70: 20 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 31 3b   appendFlag = 1;
7d80: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
7d90: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 65 77 52  opcode = OP_NewR
7da0: 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
7db0: 70 4f 70 2d 3e 70 31 20 3d 20 62 61 73 65 43 75  pOp->p1 = baseCu
7dc0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
7dd0: 2d 3e 70 32 20 3d 20 72 65 67 52 6f 77 69 64 3b  ->p2 = regRowid;
7de0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
7df0: 70 33 20 3d 20 72 65 67 41 75 74 6f 69 6e 63 3b  p3 = regAutoinc;
7e00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7e10: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   }.      /* If t
7e20: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 65  he PRIMARY KEY e
7e30: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c  xpression is NUL
7e40: 4c 2c 20 74 68 65 6e 20 75 73 65 20 4f 50 5f 4e  L, then use OP_N
7e50: 65 77 52 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  ewRowid.      **
7e60: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 75   to generate a u
7e70: 6e 69 71 75 65 20 70 72 69 6d 61 72 79 20 6b 65  nique primary ke
7e80: 79 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a  y value..      *
7e90: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 61 70 70  /.      if( !app
7ea0: 65 6e 64 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  endFlag ){.     
7eb0: 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 20     int j1;.     
7ec0: 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
7ed0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
7ee0: 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
7ef0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7f00: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 52 6f  P_NotNull, regRo
7f10: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
7f20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f30: 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  3(v, OP_NewRowid
7f40: 2c 20 62 61 73 65 43 75 72 2c 20 72 65 67 52 6f  , baseCur, regRo
7f50: 77 69 64 2c 20 72 65 67 41 75 74 6f 69 6e 63 29  wid, regAutoinc)
7f60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7f70: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7f80: 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 20 20  v, j1);.        
7f90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7fa0: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
7fb0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
7fc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7fd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7fe0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f  OP_IsNull, regRo
7ff0: 77 69 64 2c 20 6a 31 2b 32 29 3b 0a 20 20 20 20  wid, j1+2);.    
8000: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
8020: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
8030: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
8040: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
8050: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
8060: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8070: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8080: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52  OP_Null, 0, regR
8090: 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
80a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
80b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
80c0: 4e 65 77 52 6f 77 69 64 2c 20 62 61 73 65 43 75  NewRowid, baseCu
80d0: 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67  r, regRowid, reg
80e0: 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20  Autoinc);.      
80f0: 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 31 3b 0a  appendFlag = 1;.
8100: 20 20 20 20 7d 0a 20 20 20 20 61 75 74 6f 49 6e      }.    autoIn
8110: 63 53 74 65 70 28 70 50 61 72 73 65 2c 20 72 65  cStep(pParse, re
8120: 67 41 75 74 6f 69 6e 63 2c 20 72 65 67 52 6f 77  gAutoinc, regRow
8130: 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 75 73  id);..    /* Pus
8140: 68 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  h onto the stack
8150: 2c 20 64 61 74 61 20 66 6f 72 20 61 6c 6c 20 63  , data for all c
8160: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65  olumns of the ne
8170: 77 20 65 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69  w entry, beginni
8180: 6e 67 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ng.    ** with t
8190: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e  he first column.
81a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64  .    */.    nHid
81b0: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  den = 0;.    for
81c0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
81d0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
81e0: 69 6e 74 20 69 52 65 67 53 74 6f 72 65 20 3d 20  int iRegStore = 
81f0: 72 65 67 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20  regRowid+1+i;.  
8200: 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d      if( i==pTab-
8210: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
8220: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
8230: 66 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  f the INTEGER PR
8240: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
8250: 20 69 73 20 61 6c 77 61 79 73 20 61 20 4e 55 4c   is always a NUL
8260: 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  L..        ** Wh
8270: 65 6e 65 76 65 72 20 74 68 69 73 20 63 6f 6c 75  enever this colu
8280: 6d 6e 20 69 73 20 72 65 61 64 2c 20 74 68 65 20  mn is read, the 
8290: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 77 69  record number wi
82a0: 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65  ll be substitute
82b0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
82c0: 69 74 73 20 70 6c 61 63 65 2e 20 20 53 6f 20 77  its place.  So w
82d0: 69 6c 6c 20 66 69 6c 6c 20 74 68 69 73 20 63 6f  ill fill this co
82e0: 6c 75 6d 6e 20 77 69 74 68 20 61 20 4e 55 4c 4c  lumn with a NULL
82f0: 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 20 20   to avoid.      
8300: 20 20 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 64    ** taking up d
8310: 61 74 61 20 73 70 61 63 65 20 77 69 74 68 20 69  ata space with i
8320: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
8330: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
8340: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ed. */.        s
8350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8360: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
8370: 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20 20  iRegStore);.    
8380: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8390: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
83a0: 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  pColumn==0 ){.  
83b0: 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
83c0: 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
83d0: 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20  aCol[i]) ){.    
83e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
83f0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b  Virtual(pTab) );
8400: 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  .          j = -
8410: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69  1;.          nHi
8420: 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dden++;.        
8430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8440: 20 6a 20 3d 20 69 20 2d 20 6e 48 69 64 64 65 6e   j = i - nHidden
8450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8470: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c   for(j=0; j<pCol
8480: 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  umn->nId; j++){.
8490: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
84a0: 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d  olumn->a[j].idx=
84b0: 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
84c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
84d0: 20 20 20 20 69 66 28 20 6a 3c 30 20 7c 7c 20 6e      if( j<0 || n
84e0: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28 70 43  Column==0 || (pC
84f0: 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c  olumn && j>=pCol
8500: 75 6d 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20 20 20  umn->nId) ){.   
8510: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8520: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 61  Code(pParse, pTa
8530: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74  b->aCol[i].pDflt
8540: 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20  , iRegStore);.  
8550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 73      }else if( us
8560: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
8570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8580: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8590: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a 2c  lumn, srcTab, j,
85a0: 20 69 52 65 67 53 74 6f 72 65 29 3b 20 0a 20 20   iRegStore); .  
85b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
85c0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
85d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85e0: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
85f0: 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b 6a 2c  regFromSelect+j,
8600: 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20   iRegStore);.   
8610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
8630: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
8640: 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 52 65  >a[j].pExpr, iRe
8650: 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d  gStore);.      }
8660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
8670: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
8680: 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
8690: 73 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 69  s and generate i
86a0: 6e 64 65 78 20 6b 65 79 73 20 61 6e 64 0a 20 20  ndex keys and.  
86b0: 20 20 2a 2a 20 64 6f 20 74 68 65 20 69 6e 73 65    ** do the inse
86c0: 72 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  rtion..    */.#i
86d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
86f0: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
8700: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
8710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
8720: 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
8730: 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
8740: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
8750: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d      sqlite3VtabM
8760: 61 6b 65 57 72 69 74 61 62 6c 65 28 70 50 61 72  akeWritable(pPar
8770: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  se, pTab);.     
8780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8790: 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74 65  p4(v, OP_VUpdate
87a0: 2c 20 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b  , 1, pTab->nCol+
87b0: 32 2c 20 72 65 67 49 6e 73 2c 20 70 56 54 61 62  2, regIns, pVTab
87c0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
87d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
87e0: 6e 67 65 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72  ngeP5(v, onError
87f0: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f  ==OE_Default ? O
8800: 45 5f 41 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f  E_Abort : onErro
8810: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
8820: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
8830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
8840: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
8850: 69 6e 74 20 69 73 52 65 70 6c 61 63 65 3b 20 20  int isReplace;  
8860: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
8870: 20 69 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   if constraints 
8880: 6d 61 79 20 63 61 75 73 65 20 61 20 72 65 70 6c  may cause a repl
8890: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
88a0: 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
88b0: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61  traintChecks(pPa
88c0: 72 73 65 2c 20 70 54 61 62 2c 20 62 61 73 65 43  rse, pTab, baseC
88d0: 75 72 2c 20 72 65 67 49 6e 73 2c 20 61 52 65 67  ur, regIns, aReg
88e0: 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 6b  Idx,.          k
88f0: 65 79 43 6f 6c 75 6d 6e 3e 3d 30 2c 20 30 2c 20  eyColumn>=0, 0, 
8900: 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f  onError, endOfLo
8910: 6f 70 2c 20 26 69 73 52 65 70 6c 61 63 65 0a 20  op, &isReplace. 
8920: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
8930: 6c 69 74 65 33 46 6b 43 68 65 63 6b 28 70 50 61  lite3FkCheck(pPa
8940: 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 72 65  rse, pTab, 0, re
8950: 67 49 6e 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  gIns);.      sql
8960: 69 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65  ite3CompleteInse
8970: 72 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 20  rtion(.         
8980: 20 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 62   pParse, pTab, b
8990: 61 73 65 43 75 72 2c 20 72 65 67 49 6e 73 2c 20  aseCur, regIns, 
89a0: 61 52 65 67 49 64 78 2c 20 30 2c 20 61 70 70 65  aRegIdx, 0, appe
89b0: 6e 64 46 6c 61 67 2c 20 69 73 52 65 70 6c 61 63  ndFlag, isReplac
89c0: 65 3d 3d 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e==0.      );.  
89d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
89e0: 64 61 74 65 20 74 68 65 20 63 6f 75 6e 74 20 6f  date the count o
89f0: 66 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20  f rows that are 
8a00: 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20  inserted.  */.  
8a10: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
8a20: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
8a30: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)!=0 ){.    sql
8a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8a50: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67  , OP_AddImm, reg
8a60: 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20  RowCount, 1);.  
8a70: 7d 0a 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  }..  if( pTrigge
8a80: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 64 65  r ){.    /* Code
8a90: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
8aa0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  */.    sqlite3Co
8ab0: 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61  deRowTrigger(pPa
8ac0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 54  rse, pTrigger, T
8ad0: 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54 52 49  K_INSERT, 0, TRI
8ae0: 47 47 45 52 5f 41 46 54 45 52 2c 20 0a 20 20 20  GGER_AFTER, .   
8af0: 20 20 20 20 20 70 54 61 62 2c 20 72 65 67 44 61       pTab, regDa
8b00: 74 61 2d 32 2d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ta-2-pTab->nCol,
8b10: 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c   onError, endOfL
8b20: 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oop);.  }..  /* 
8b30: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
8b40: 65 20 6d 61 69 6e 20 69 6e 73 65 72 74 69 6f 6e  e main insertion
8b50: 20 6c 6f 6f 70 2c 20 69 66 20 74 68 65 20 64 61   loop, if the da
8b60: 74 61 20 73 6f 75 72 63 65 0a 20 20 2a 2a 20 69  ta source.  ** i
8b70: 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
8b80: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
8b90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8ba0: 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f  abel(v, endOfLoo
8bb0: 70 29 3b 0a 20 20 69 66 28 20 75 73 65 54 65 6d  p);.  if( useTem
8bc0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
8bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8be0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 72 63 54  v, OP_Next, srcT
8bf0: 61 62 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  ab, addrCont);. 
8c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
8c10: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
8c20: 73 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  sTop);.    sqlit
8c30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8c40: 4f 50 5f 43 6c 6f 73 65 2c 20 73 72 63 54 61 62  OP_Close, srcTab
8c50: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
8c60: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
8c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8c80: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
8c90: 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 73 71  ddrCont);.    sq
8ca0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8cb0: 65 28 76 2c 20 61 64 64 72 49 6e 73 54 6f 70 29  e(v, addrInsTop)
8cc0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 49 73  ;.  }..  if( !Is
8cd0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
8ce0: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
8cf0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62  /* Close all tab
8d00: 6c 65 73 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  les opened */.  
8d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8d20: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
8d30: 20 62 61 73 65 43 75 72 29 3b 0a 20 20 20 20 66   baseCur);.    f
8d40: 6f 72 28 69 64 78 3d 31 2c 20 70 49 64 78 3d 70  or(idx=1, pIdx=p
8d50: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
8d60: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
8d70: 65 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20  ext, idx++){.   
8d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8d90: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
8da0: 2c 20 69 64 78 2b 62 61 73 65 43 75 72 29 3b 0a  , idx+baseCur);.
8db0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 69 6e 73 65 72      }.  }..inser
8dc0: 74 5f 65 6e 64 3a 0a 20 20 2f 2a 20 55 70 64 61  t_end:.  /* Upda
8dd0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  te the sqlite_se
8de0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20  quence table by 
8df0: 73 74 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74  storing the cont
8e00: 65 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ent of the.  ** 
8e10: 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f  maximum rowid co
8e20: 75 6e 74 65 72 20 76 61 6c 75 65 73 20 72 65 63  unter values rec
8e30: 6f 72 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65  orded while inse
8e40: 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20  rting into.  ** 
8e50: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61  autoincrement ta
8e60: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
8e70: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
8e80: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54  =0 && pParse->pT
8e90: 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a  riggerTab==0 ){.
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69      sqlite3Autoi
8eb0: 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72  ncrementEnd(pPar
8ec0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  se);.  }..  /*. 
8ed0: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
8ee0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8ef0: 73 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  serted. If this 
8f00: 72 6f 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a  routine is .  **
8f10: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
8f20: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 63 61   because of a ca
8f30: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73  ll to sqlite3Nes
8f40: 74 65 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e  tedParse(), do n
8f50: 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74  ot.  ** invoke t
8f60: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
8f70: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
8f80: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
8f90: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26  TE_CountRows) &&
8fa0: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
8fb0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72   && !pParse->pTr
8fc0: 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
8fd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8fe0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
8ff0: 77 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20  w, regRowCount, 
9000: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
9010: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
9020: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
9030: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
9040: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
9050: 45 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65  E, "rows inserte
9060: 64 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  d", SQLITE_STATI
9070: 43 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f  C);.  }..insert_
9080: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
9090: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
90a0: 64 62 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20  db, pTabList);. 
90b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
90c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
90d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
90e0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
90f0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
9100: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
9110: 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c   pColumn);.  sql
9120: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
9130: 52 65 67 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d  RegIdx);.}../* M
9140: 61 6b 65 20 73 75 72 65 20 22 69 73 56 69 65 77  ake sure "isView
9150: 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72  " and other macr
9160: 6f 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  os defined above
9170: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
9180: 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65  Otherwise.** the
9190: 6c 79 20 6d 61 79 20 69 6e 74 65 72 66 65 72 65  ly may interfere
91a0: 20 77 69 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f   with compilatio
91b0: 6e 20 6f 66 20 6f 74 68 65 72 20 66 75 6e 63 74  n of other funct
91c0: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ions in this fil
91d0: 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74  e.** (or in anot
91e0: 68 65 72 20 66 69 6c 65 2c 20 69 66 20 74 68 69  her file, if thi
91f0: 73 20 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 70  s file becomes p
9200: 61 72 74 20 6f 66 20 74 68 65 20 61 6d 61 6c 67  art of the amalg
9210: 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69  amation).  */.#i
9220: 66 64 65 66 20 69 73 56 69 65 77 0a 20 23 75 6e  fdef isView. #un
9230: 64 65 66 20 69 73 56 69 65 77 0a 23 65 6e 64 69  def isView.#endi
9240: 66 0a 23 69 66 64 65 66 20 70 54 72 69 67 67 65  f.#ifdef pTrigge
9250: 72 0a 20 23 75 6e 64 65 66 20 70 54 72 69 67 67  r. #undef pTrigg
9260: 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  er.#endif.#ifdef
9270: 20 74 6d 61 73 6b 0a 20 23 75 6e 64 65 66 20 74   tmask. #undef t
9280: 6d 61 73 6b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  mask.#endif.../*
9290: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
92a0: 65 20 74 6f 20 64 6f 20 63 6f 6e 73 74 72 61 69  e to do constrai
92b0: 6e 74 20 63 68 65 63 6b 73 20 70 72 69 6f 72 20  nt checks prior 
92c0: 74 6f 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  to an INSERT or 
92d0: 61 6e 20 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a  an UPDATE..**.**
92e0: 20 54 68 65 20 69 6e 70 75 74 20 69 73 20 61 20   The input is a 
92f0: 72 61 6e 67 65 20 6f 66 20 63 6f 6e 73 65 63 75  range of consecu
9300: 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
9310: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
9320: 20 20 20 20 31 2e 20 20 54 68 65 20 72 6f 77 69      1.  The rowi
9330: 64 20 6f 66 20 74 68 65 20 72 6f 77 20 61 66 74  d of the row aft
9340: 65 72 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a  er the update..*
9350: 2a 0a 2a 2a 20 20 20 20 32 2e 20 20 54 68 65 20  *.**    2.  The 
9360: 64 61 74 61 20 69 6e 20 74 68 65 20 66 69 72 73  data in the firs
9370: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
9380: 65 6e 74 72 79 20 61 66 74 65 72 20 74 68 65 20  entry after the 
9390: 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  update..**.**   
93a0: 20 69 2e 20 20 44 61 74 61 20 66 72 6f 6d 20 6d   i.  Data from m
93b0: 69 64 64 6c 65 20 63 6f 6c 75 6d 6e 73 2e 2e 2e  iddle columns...
93c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 2e 20 20 54 68  .**.**    N.  Th
93d0: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 6c 61  e data in the la
93e0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
93f0: 20 65 6e 74 72 79 20 61 66 74 65 72 20 74 68 65   entry after the
9400: 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54   update..**.** T
9410: 68 65 20 72 65 67 52 6f 77 69 64 20 70 61 72 61  he regRowid para
9420: 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 64  meter is the ind
9430: 65 78 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  ex of the regist
9440: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 28 31  er containing (1
9450: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 73 55 70  )..**.** If isUp
9460: 64 61 74 65 20 69 73 20 74 72 75 65 20 61 6e 64  date is true and
9470: 20 72 6f 77 69 64 43 68 6e 67 20 69 73 20 6e 6f   rowidChng is no
9480: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 6f 77  n-zero, then row
9490: 69 64 43 68 6e 67 20 63 6f 6e 74 61 69 6e 73 0a  idChng contains.
94a0: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
94b0: 66 20 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e  f a register con
94c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69  taining the rowi
94d0: 64 20 62 65 66 6f 72 65 20 74 68 65 20 75 70 64  d before the upd
94e0: 61 74 65 20 74 61 6b 65 73 0a 2a 2a 20 70 6c 61  ate takes.** pla
94f0: 63 65 2e 20 69 73 55 70 64 61 74 65 20 69 73 20  ce. isUpdate is 
9500: 74 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 73  true for UPDATEs
9510: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 49   and false for I
9520: 4e 53 45 52 54 73 2e 20 49 66 20 69 73 55 70 64  NSERTs. If isUpd
9530: 61 74 65 0a 2a 2a 20 69 73 20 66 61 6c 73 65 2c  ate.** is false,
9540: 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 49   indicating an I
9550: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
9560: 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 7a 65 72 6f   then a non-zero
9570: 20 72 6f 77 69 64 43 68 6e 67 20 0a 2a 2a 20 69   rowidChng .** i
9580: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
9590: 65 20 72 6f 77 69 64 20 77 61 73 20 65 78 70 6c  e rowid was expl
95a0: 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
95b0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
95c0: 2a 2a 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ** INSERT statem
95d0: 65 6e 74 2e 20 49 66 20 72 6f 77 69 64 43 68 6e  ent. If rowidChn
95e0: 67 20 69 73 20 66 61 6c 73 65 2c 20 69 74 20 6d  g is false, it m
95f0: 65 61 6e 73 20 74 68 61 74 20 20 74 68 65 20 72  eans that  the r
9600: 6f 77 69 64 20 69 73 0a 2a 2a 20 63 6f 6d 70 75  owid is.** compu
9610: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
9620: 79 20 69 6e 20 61 6e 20 69 6e 73 65 72 74 20 6f  y in an insert o
9630: 72 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  r that the rowid
9640: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 0a 2a   value is not .*
9650: 2a 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e  * modified by an
9660: 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54   update..**.** T
9670: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
9680: 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
9690: 65 20 73 74 6f 72 65 20 6e 65 77 20 69 6e 64 65  e store new inde
96a0: 78 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 0a 2a  x entries into.*
96b0: 2a 20 72 65 67 69 73 74 65 72 73 20 69 64 65 6e  * registers iden
96c0: 74 69 66 69 65 64 20 62 79 20 61 52 65 67 49 64  tified by aRegId
96d0: 78 5b 5d 2e 20 20 4e 6f 20 69 6e 64 65 78 20 65  x[].  No index e
96e0: 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
96f0: 66 6f 72 0a 2a 2a 20 69 6e 64 69 63 65 73 20 77  for.** indices w
9700: 68 65 72 65 20 61 52 65 67 49 64 78 5b 69 5d 3d  here aRegIdx[i]=
9710: 3d 30 2e 20 20 54 68 65 20 6f 72 64 65 72 20 6f  =0.  The order o
9720: 66 20 69 6e 64 69 63 65 73 20 69 6e 20 61 52 65  f indices in aRe
9730: 67 49 64 78 5b 5d 20 69 73 0a 2a 2a 20 74 68 65  gIdx[] is.** the
9740: 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 64   same as the ord
9750: 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 6f 6e  er of indices on
9760: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9770: 20 6f 66 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61   of indices.** a
9780: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
9790: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  able..**.** This
97a0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 67 65   routine also ge
97b0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
97c0: 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
97d0: 73 2e 20 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 2a 2a  s.  NOT NULL,.**
97e0: 20 43 48 45 43 4b 2c 20 61 6e 64 20 55 4e 49 51   CHECK, and UNIQ
97f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  UE constraints a
9800: 72 65 20 61 6c 6c 20 63 68 65 63 6b 65 64 2e 20  re all checked. 
9810: 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
9820: 20 66 61 69 6c 73 2c 0a 2a 2a 20 74 68 65 6e 20   fails,.** then 
9830: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
9840: 61 63 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  action is perfor
9850: 6d 65 64 2e 20 20 54 68 65 72 65 20 61 72 65 20  med.  There are 
9860: 66 69 76 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  five possible.**
9870: 20 61 63 74 69 6f 6e 73 3a 20 52 4f 4c 4c 42 41   actions: ROLLBA
9880: 43 4b 2c 20 41 42 4f 52 54 2c 20 46 41 49 4c 2c  CK, ABORT, FAIL,
9890: 20 52 45 50 4c 41 43 45 2c 20 61 6e 64 20 49 47   REPLACE, and IG
98a0: 4e 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20 20 43 6f 6e  NORE..**.**  Con
98b0: 73 74 72 61 69 6e 74 20 74 79 70 65 20 20 41 63  straint type  Ac
98c0: 74 69 6f 6e 20 20 20 20 20 20 20 57 68 61 74 20  tion       What 
98d0: 48 61 70 70 65 6e 73 0a 2a 2a 20 20 2d 2d 2d 2d  Happens.**  ----
98e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
98f0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d  -------   ------
9900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9920: 2d 2d 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20  --.**  any      
9930: 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b          ROLLBACK
9940: 20 20 20 20 20 54 68 65 20 63 75 72 72 65 6e 74       The current
9950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9960: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a  rolled back and.
9970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29    sqlite3_exec()
99a0: 20 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69 61   returns immedia
99b0: 74 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20 20  tely with a.**  
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
99e0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
99f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a  ITE_CONSTRAINT..
9a00: 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20  **.**  any      
9a10: 20 20 20 20 20 20 20 20 41 42 4f 52 54 20 20 20          ABORT   
9a20: 20 20 20 20 20 42 61 63 6b 20 6f 75 74 20 63 68       Back out ch
9a30: 61 6e 67 65 73 20 66 72 6f 6d 20 74 68 65 20 63  anges from the c
9a40: 75 72 72 65 6e 74 20 63 6f 6d 6d 61 6e 64 0a 2a  urrent command.*
9a50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 6f 6e 6c 79 20 28 64 6f 20 6e 6f 74 20 64 6f   only (do not do
9a80: 20 61 20 63 6f 6d 70 6c 65 74 65 20 72 6f 6c 6c   a complete roll
9a90: 62 61 63 6b 29 20 74 68 65 6e 0a 2a 2a 20 20 20  back) then.**   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 75               cau
9ac0: 73 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  se sqlite3_exec(
9ad0: 29 20 74 6f 20 72 65 74 75 72 6e 20 69 6d 6d 65  ) to return imme
9ae0: 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20 53            with S
9b10: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9b20: 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20  ..**.**  any    
9b30: 20 20 20 20 20 20 20 20 20 20 46 41 49 4c 20 20            FAIL  
9b40: 20 20 20 20 20 20 20 53 71 6c 69 74 65 5f 65 78         Sqlite_ex
9b50: 65 63 28 29 20 72 65 74 75 72 6e 73 20 69 6d 6d  ec() returns imm
9b60: 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 61 0a  ediately with a.
9b70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66    return code of
9ba0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9bb0: 4e 54 2e 20 20 54 68 65 0a 2a 2a 20 20 20 20 20  NT.  The.**     
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
9be0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f  action is not ro
9bf0: 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 61 6e  lled back and an
9c00: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 20 20 70 72 69 6f 72 20 63 68 61 6e 67 65      prior change
9c30: 73 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a  s are retained..
9c40: 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20  **.**  any      
9c50: 20 20 20 20 20 20 20 20 49 47 4e 4f 52 45 20 20          IGNORE  
9c60: 20 20 20 20 20 54 68 65 20 72 65 63 6f 72 64 20       The record 
9c70: 6e 75 6d 62 65 72 20 61 6e 64 20 64 61 74 61 20  number and data 
9c80: 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 2a  is popped from.*
9c90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 74 68 65 20 73 74 61 63 6b 20 61 6e 64 20 74   the stack and t
9cc0: 68 65 72 65 20 69 73 20 61 6e 20 69 6d 6d 65 64  here is an immed
9cd0: 69 61 74 65 20 6a 75 6d 70 0a 2a 2a 20 20 20 20  iate jump.**    
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 6c              to l
9d00: 61 62 65 6c 20 69 67 6e 6f 72 65 44 65 73 74 2e  abel ignoreDest.
9d10: 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20 4e 55 4c 4c  .**.**  NOT NULL
9d20: 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43 45           REPLACE
9d30: 20 20 20 20 20 20 54 68 65 20 4e 55 4c 4c 20 76        The NULL v
9d40: 61 6c 75 65 20 69 73 20 72 65 70 6c 61 63 65 20  alue is replace 
9d50: 62 79 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  by the default.*
9d60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
9d90: 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 20  column.  If the 
9da0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a  default value.**
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 61 63 74  is NULL, the act
9de0: 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20  ion is the same 
9df0: 61 73 20 41 42 4f 52 54 2e 0a 2a 2a 0a 2a 2a 20  as ABORT..**.** 
9e00: 20 55 4e 49 51 55 45 20 20 20 20 20 20 20 20 20   UNIQUE         
9e10: 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 54    REPLACE      T
9e20: 68 65 20 6f 74 68 65 72 20 72 6f 77 20 74 68 61  he other row tha
9e30: 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
9e40: 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20   the row.**     
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 20 20 20 20 20 20 20 62 65 69 6e 67             being
9e70: 20 69 6e 73 65 72 74 65 64 20 69 73 20 72 65 6d   inserted is rem
9e80: 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 43 48 45  oved..**.**  CHE
9e90: 43 4b 20 20 20 20 20 20 20 20 20 20 20 20 52 45  CK            RE
9ea0: 50 4c 41 43 45 20 20 20 20 20 20 49 6c 6c 65 67  PLACE      Illeg
9eb0: 61 6c 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  al.  The results
9ec0: 20 69 6e 20 61 6e 20 65 78 63 65 70 74 69 6f 6e   in an exception
9ed0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63 68 20 61 63  ..**.** Which ac
9ee0: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 73 20  tion to take is 
9ef0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9f00: 65 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 20  e overrideError 
9f10: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 4f 72  parameter..** Or
9f20: 20 69 66 20 6f 76 65 72 72 69 64 65 45 72 72 6f   if overrideErro
9f30: 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 2c 20 74  r==OE_Default, t
9f40: 68 65 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e  hen the pParse->
9f50: 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  onError paramete
9f60: 72 0a 2a 2a 20 69 73 20 75 73 65 64 2e 20 20 4f  r.** is used.  O
9f70: 72 20 69 66 20 70 50 61 72 73 65 2d 3e 6f 6e 45  r if pParse->onE
9f80: 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
9f90: 20 74 68 65 6e 20 74 68 65 20 6f 6e 45 72 72 6f   then the onErro
9fa0: 72 20 76 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 74  r value.** for t
9fb0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
9fc0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
9fd0: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
9fe0: 20 6d 75 73 74 20 6f 70 65 6e 20 61 20 72 65 61   must open a rea
9ff0: 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 66  d/write cursor f
a000: 6f 72 20 70 54 61 62 20 77 69 74 68 0a 2a 2a 20  or pTab with.** 
a010: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 22 62  cursor number "b
a020: 61 73 65 43 75 72 22 2e 20 20 41 6c 6c 20 69 6e  aseCur".  All in
a030: 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 6d 75  dices of pTab mu
a040: 73 74 20 61 6c 73 6f 20 68 61 76 65 20 6f 70 65  st also have ope
a050: 6e 0a 2a 2a 20 72 65 61 64 2f 77 72 69 74 65 20  n.** read/write 
a060: 63 75 72 73 6f 72 73 20 77 69 74 68 20 63 75 72  cursors with cur
a070: 73 6f 72 20 6e 75 6d 62 65 72 20 62 61 73 65 43  sor number baseC
a080: 75 72 2b 69 20 66 6f 72 20 74 68 65 20 69 2d 74  ur+i for the i-t
a090: 68 20 63 75 72 73 6f 72 2e 0a 2a 2a 20 45 78 63  h cursor..** Exc
a0a0: 65 70 74 2c 20 69 66 20 74 68 65 72 65 20 69 73  ept, if there is
a0b0: 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20   no possibility 
a0c0: 6f 66 20 61 20 52 45 50 4c 41 43 45 20 61 63 74  of a REPLACE act
a0d0: 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 63 75 72 73  ion then.** curs
a0e0: 6f 72 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  ors do not need 
a0f0: 74 6f 20 62 65 20 6f 70 65 6e 20 66 6f 72 20 69  to be open for i
a100: 6e 64 69 63 65 73 20 77 68 65 72 65 20 61 52 65  ndices where aRe
a110: 67 49 64 78 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 76  gIdx[i]==0..*/.v
a120: 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72  oid sqlite3Gener
a130: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
a140: 63 6b 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  cks(.  Parse *pP
a150: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
a160: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
a170: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
a180: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  b,        /* the
a190: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
a1a0: 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  h we are inserti
a1b0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ng */.  int base
a1c0: 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 49  Cur,        /* I
a1d0: 6e 64 65 78 20 6f 66 20 61 20 72 65 61 64 2f 77  ndex of a read/w
a1e0: 72 69 74 65 20 63 75 72 73 6f 72 20 70 6f 69 6e  rite cursor poin
a1f0: 74 69 6e 67 20 61 74 20 70 54 61 62 20 2a 2f 0a  ting at pTab */.
a200: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 2c 20    int regRowid, 
a210: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
a220: 66 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 69  f the range of i
a230: 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20 2a  nput registers *
a240: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
a250: 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ,       /* Regis
a260: 74 65 72 20 75 73 65 64 20 62 79 20 65 61 63 68  ter used by each
a270: 20 69 6e 64 65 78 2e 20 20 30 20 66 6f 72 20 75   index.  0 for u
a280: 6e 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  nused indices */
a290: 0a 20 20 69 6e 74 20 72 6f 77 69 64 43 68 6e 67  .  int rowidChng
a2a0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
a2b0: 66 20 74 68 65 20 72 6f 77 69 64 20 6d 69 67 68  f the rowid migh
a2c0: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 65  t collide with e
a2d0: 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 2a 2f  xisting entry */
a2e0: 0a 20 20 69 6e 74 20 69 73 55 70 64 61 74 65 2c  .  int isUpdate,
a2f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
a300: 6f 72 20 55 50 44 41 54 45 2c 20 46 61 6c 73 65  or UPDATE, False
a310: 20 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20   for INSERT */. 
a320: 20 69 6e 74 20 6f 76 65 72 72 69 64 65 45 72 72   int overrideErr
a330: 6f 72 2c 20 20 2f 2a 20 4f 76 65 72 72 69 64 65  or,  /* Override
a340: 20 6f 6e 45 72 72 6f 72 20 74 6f 20 74 68 69 73   onError to this
a350: 20 69 66 20 6e 6f 74 20 4f 45 5f 44 65 66 61 75   if not OE_Defau
a360: 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f  lt */.  int igno
a370: 72 65 44 65 73 74 2c 20 20 20 20 20 2f 2a 20 4a  reDest,     /* J
a380: 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
a390: 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49 67 6e 6f 72  l on an OE_Ignor
a3a0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 2a 2f 0a  e resolution */.
a3b0: 20 20 69 6e 74 20 2a 70 62 4d 61 79 52 65 70 6c    int *pbMayRepl
a3c0: 61 63 65 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65  ace   /* OUT: Se
a3d0: 74 20 74 6f 20 74 72 75 65 20 69 66 20 63 6f 6e  t to true if con
a3e0: 73 74 72 61 69 6e 74 20 6d 61 79 20 63 61 75 73  straint may caus
a3f0: 65 20 61 20 72 65 70 6c 61 63 65 20 2a 2f 0a 29  e a replace */.)
a400: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
a410: 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
a420: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 56 64 62  counter */.  Vdb
a430: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
a440: 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72 20 63   /* VDBE under c
a450: 6f 6e 73 74 72 75 74 69 6f 6e 20 2a 2f 0a 20 20  onstrution */.  
a460: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
a470: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a480: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
a490: 74 20 6f 6e 45 72 72 6f 72 3b 20 20 20 20 20 20  t onError;      
a4a0: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
a4b0: 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67  solution strateg
a4c0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  y */.  int j1;  
a4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
a4e0: 64 72 65 73 73 73 20 6f 66 20 6a 75 6d 70 20 69  dresss of jump i
a4f0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
a500: 69 6e 74 20 6a 32 20 3d 20 30 2c 20 6a 33 3b 20  int j2 = 0, j3; 
a510: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
a520: 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   of jump instruc
a530: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
a540: 65 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f  egData;        /
a550: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
a560: 69 6e 69 6e 67 20 66 69 72 73 74 20 64 61 74 61  ining first data
a570: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
a580: 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
a590: 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72   /* Table cursor
a5a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 49 6e 64   number */.  Ind
a5b0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
a5c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
a5d0: 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 69 63  one of the indic
a5e0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  es */.  int seen
a5f0: 52 65 70 6c 61 63 65 20 3d 20 30 3b 20 2f 2a 20  Replace = 0; /* 
a600: 54 72 75 65 20 69 66 20 52 45 50 4c 41 43 45 20  True if REPLACE 
a610: 69 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  is used to resol
a620: 76 65 20 49 4e 54 20 50 4b 20 63 6f 6e 66 6c 69  ve INT PK confli
a630: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ct */.  int regO
a640: 6c 64 52 6f 77 69 64 20 3d 20 28 72 6f 77 69 64  ldRowid = (rowid
a650: 43 68 6e 67 20 26 26 20 69 73 55 70 64 61 74 65  Chng && isUpdate
a660: 29 20 3f 20 72 6f 77 69 64 43 68 6e 67 20 3a 20  ) ? rowidChng : 
a670: 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 76 20 3d  regRowid;..  v =
a680: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a690: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
a6a0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
a6b0: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
a6c0: 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69  ct==0 );  /* Thi
a6d0: 73 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  s table is not a
a6e0: 20 56 49 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20   VIEW */.  nCol 
a6f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
a700: 72 65 67 44 61 74 61 20 3d 20 72 65 67 52 6f 77  regData = regRow
a710: 69 64 20 2b 20 31 3b 0a 0a 20 20 2f 2a 20 54 65  id + 1;..  /* Te
a720: 73 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20  st all NOT NULL 
a730: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 2a  constraints..  *
a740: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
a750: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
a760: 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( i==pTab->iPKe
a770: 79 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  y ){.      conti
a780: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  nue;.    }.    o
a790: 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 61  nError = pTab->a
a7a0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[i].notNull;.
a7b0: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
a7c0: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
a7d0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 76 65  nue;.    if( ove
a7e0: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
a7f0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
a800: 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69  onError = overri
a810: 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  deError;.    }el
a820: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
a830: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
a840: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
a850: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
a860: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
a870: 45 5f 52 65 70 6c 61 63 65 20 26 26 20 70 54 61  E_Replace && pTa
a880: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74  b->aCol[i].pDflt
a890: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ==0 ){.      onE
a8a0: 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  rror = OE_Abort;
a8b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
a8c0: 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  t( onError==OE_R
a8d0: 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72  ollback || onErr
a8e0: 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20  or==OE_Abort || 
a8f0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c  onError==OE_Fail
a900: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72  .        || onEr
a910: 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c  ror==OE_Ignore |
a920: 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  | onError==OE_Re
a930: 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69  place );.    swi
a940: 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a  tch( onError ){.
a950: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62        case OE_Ab
a960: 6f 72 74 3a 0a 20 20 20 20 20 20 20 20 73 71 6c  ort:.        sql
a970: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
a980: 72 73 65 29 3b 0a 20 20 20 20 20 20 63 61 73 65  rse);.      case
a990: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20   OE_Rollback:.  
a9a0: 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c      case OE_Fail
a9b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  : {.        char
a9c0: 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 20 20   *zMsg;.        
a9d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a9e0: 33 28 76 2c 20 4f 50 5f 48 61 6c 74 49 66 4e 75  3(v, OP_HaltIfNu
a9f0: 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll,.            
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 4f 4e        SQLITE_CON
aa20: 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72  STRAINT, onError
aa30: 2c 20 72 65 67 44 61 74 61 2b 69 29 3b 0a 20 20  , regData+i);.  
aa40: 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
aa50: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
aa60: 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 20 6d  se->db, "%s.%s m
aa70: 61 79 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 22 2c  ay not be NULL",
aa80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
aaa0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  Tab->zName, pTab
aab0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
aac0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
aad0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
aae0: 20 2d 31 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59   -1, zMsg, P4_DY
aaf0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
ab00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ab10: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e       case OE_Ign
ab20: 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ore: {.        s
ab30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ab40: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
ab50: 65 67 44 61 74 61 2b 69 2c 20 69 67 6e 6f 72 65  egData+i, ignore
ab60: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Dest);.        b
ab70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ab80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
ab90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
aba0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
abb0: 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6a 31  ce );.        j1
abc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
abd0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
abe0: 6c 6c 2c 20 72 65 67 44 61 74 61 2b 69 29 3b 0a  ll, regData+i);.
abf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ac00: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ac10: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44  pTab->aCol[i].pD
ac20: 66 6c 74 2c 20 72 65 67 44 61 74 61 2b 69 29 3b  flt, regData+i);
ac30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ac50: 6a 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  j1);.        bre
ac60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ac70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  }.  }..  /* Test
ac80: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
ac90: 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66 6e  raints.  */.#ifn
aca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
acb0: 43 48 45 43 4b 0a 20 20 69 66 28 20 70 54 61 62  CHECK.  if( pTab
acc0: 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 70 50 61  ->pCheck && (pPa
acd0: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
ace0: 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68   SQLITE_IgnoreCh
acf0: 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ecks)==0 ){.    
ad00: 69 6e 74 20 61 6c 6c 4f 6b 20 3d 20 73 71 6c 69  int allOk = sqli
ad10: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ad20: 28 76 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  (v);.    pParse-
ad30: 3e 63 6b 42 61 73 65 20 3d 20 72 65 67 44 61 74  >ckBase = regDat
ad40: 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  a;.    sqlite3Ex
ad50: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
ad60: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 61   pTab->pCheck, a
ad70: 6c 6c 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  llOk, SQLITE_JUM
ad80: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 6f 6e  PIFNULL);.    on
ad90: 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65  Error = override
ada0: 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c  Error!=OE_Defaul
adb0: 74 20 3f 20 6f 76 65 72 72 69 64 65 45 72 72 6f  t ? overrideErro
adc0: 72 20 3a 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r : OE_Abort;.  
add0: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
ade0: 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
adf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae00: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
ae10: 30 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a  0, ignoreDest);.
ae20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ae30: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
ae40: 5f 52 65 70 6c 61 63 65 20 29 20 6f 6e 45 72 72  _Replace ) onErr
ae50: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 20 2f  or = OE_Abort; /
ae60: 2a 20 49 4d 50 3a 20 52 2d 31 35 35 36 39 2d 36  * IMP: R-15569-6
ae70: 33 36 32 35 20 2a 2f 0a 20 20 20 20 20 20 73 71  3625 */.      sq
ae80: 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
ae90: 69 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45 72  int(pParse, onEr
aea0: 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ror, 0, 0);.    
aeb0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
aec0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
aed0: 20 61 6c 6c 4f 6b 29 3b 0a 20 20 7d 0a 23 65 6e   allOk);.  }.#en
aee0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
aef0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
af00: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 77  K) */..  /* If w
af10: 65 20 68 61 76 65 20 61 6e 20 49 4e 54 45 47 45  e have an INTEGE
af20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6d  R PRIMARY KEY, m
af30: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 72 69  ake sure the pri
af40: 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 66  mary key.  ** of
af50: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
af60: 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75  does not previou
af70: 73 6c 79 20 65 78 69 73 74 2e 20 20 45 78 63 65  sly exist.  Exce
af80: 70 74 2c 20 69 66 20 74 68 69 73 0a 20 20 2a 2a  pt, if this.  **
af90: 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 61 6e   is an UPDATE an
afa0: 64 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  d the primary ke
afb0: 79 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 69 6e  y is not changin
afc0: 67 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 0a 20  g, that is OK.. 
afd0: 20 2a 2f 0a 20 20 69 66 28 20 72 6f 77 69 64 43   */.  if( rowidC
afe0: 68 6e 67 20 29 7b 0a 20 20 20 20 6f 6e 45 72 72  hng ){.    onErr
aff0: 6f 72 20 3d 20 70 54 61 62 2d 3e 6b 65 79 43 6f  or = pTab->keyCo
b000: 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f 76 65 72  nf;.    if( over
b010: 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65  rideError!=OE_De
b020: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f  fault ){.      o
b030: 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64  nError = overrid
b040: 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  eError;.    }els
b050: 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f  e if( onError==O
b060: 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
b070: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f     onError = OE_
b080: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
b090: 20 0a 20 20 20 20 69 66 28 20 69 73 55 70 64 61   .    if( isUpda
b0a0: 74 65 20 29 7b 0a 20 20 20 20 20 20 6a 32 20 3d  te ){.      j2 =
b0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0c0: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
b0d0: 52 6f 77 69 64 2c 20 30 2c 20 72 6f 77 69 64 43  Rowid, 0, rowidC
b0e0: 68 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hng);.    }.    
b0f0: 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
b100: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
b110: 45 78 69 73 74 73 2c 20 62 61 73 65 43 75 72 2c  Exists, baseCur,
b120: 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   0, regRowid);. 
b130: 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72     switch( onErr
b140: 6f 72 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61  or ){.      defa
b150: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 6f  ult: {.        o
b160: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
b170: 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  t;.        /* Fa
b180: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
b190: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
b1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
b1b0: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20   OE_Rollback:.  
b1c0: 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
b1d0: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  t:.      case OE
b1e0: 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20  _Fail: {.       
b1f0: 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
b200: 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20  traint(.        
b210: 20 20 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f    pParse, onErro
b220: 72 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20  r, "PRIMARY KEY 
b230: 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 22 2c  must be unique",
b240: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
b250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b260: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
b270: 45 5f 52 65 70 6c 61 63 65 3a 20 7b 0a 20 20 20  E_Replace: {.   
b280: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
b290: 20 61 72 65 20 44 45 4c 45 54 45 20 74 72 69 67   are DELETE trig
b2a0: 67 65 72 73 20 6f 6e 20 74 68 69 73 20 74 61 62  gers on this tab
b2b0: 6c 65 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20  le and the.     
b2c0: 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 2d     ** recursive-
b2d0: 74 72 69 67 67 65 72 73 20 66 6c 61 67 20 69 73  triggers flag is
b2e0: 20 73 65 74 2c 20 63 61 6c 6c 20 47 65 6e 65 72   set, call Gener
b2f0: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 29 20 74  ateRowDelete() t
b300: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d  o.        ** rem
b310: 6f 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  ove the conflict
b320: 69 6e 67 20 72 6f 77 20 66 72 6f 6d 20 74 68 65  ing row from the
b330: 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 69 73   the table. This
b340: 20 77 69 6c 6c 20 66 69 72 65 0a 20 20 20 20 20   will fire.     
b350: 20 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65     ** the trigge
b360: 72 73 20 61 6e 64 20 72 65 6d 6f 76 65 20 62 6f  rs and remove bo
b370: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  th the table and
b380: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e   index b-tree en
b390: 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
b3a0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  *.        ** Oth
b3b0: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
b3c0: 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73   are no triggers
b3d0: 20 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76   or the recursiv
b3e0: 65 2d 74 72 69 67 67 65 72 73 0a 20 20 20 20 20  e-triggers.     
b3f0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 6e 6f     ** flag is no
b400: 74 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 74  t set, but the t
b410: 61 62 6c 65 20 68 61 73 20 6f 6e 65 20 6f 72 20  able has one or 
b420: 6d 6f 72 65 20 69 6e 64 65 78 65 73 2c 20 63 61  more indexes, ca
b430: 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 47  ll .        ** G
b440: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
b450: 65 6c 65 74 65 28 29 2e 20 54 68 69 73 20 72 65  elete(). This re
b460: 6d 6f 76 65 73 20 74 68 65 20 69 6e 64 65 78 20  moves the index 
b470: 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73 20 0a  b-tree entries .
b480: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 2e          ** only.
b490: 20 54 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65   The table b-tre
b4a0: 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
b4b0: 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
b4c0: 6e 65 77 20 65 6e 74 72 79 20 0a 20 20 20 20 20  new entry .     
b4d0: 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 69 73     ** when it is
b4e0: 20 69 6e 73 65 72 74 65 64 2e 20 20 0a 20 20 20   inserted.  .   
b4f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
b500: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 47 65 6e  ** If either Gen
b510: 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 29  erateRowDelete()
b520: 20 6f 72 20 47 65 6e 65 72 61 74 65 52 6f 77 49   or GenerateRowI
b530: 6e 64 65 78 44 65 6c 65 74 65 28 29 20 69 73 20  ndexDelete() is 
b540: 63 61 6c 6c 65 64 2c 0a 20 20 20 20 20 20 20 20  called,.        
b550: 2a 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 20 4d  ** also invoke M
b560: 75 6c 74 69 57 72 69 74 65 28 29 20 74 6f 20 69  ultiWrite() to i
b570: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 69  ndicate that thi
b580: 73 20 56 44 42 45 20 6d 61 79 20 72 65 71 75 69  s VDBE may requi
b590: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  re.        ** st
b5a0: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
b5b0: 20 28 69 66 20 74 68 65 20 73 74 61 74 65 6d 65   (if the stateme
b5c0: 6e 74 20 69 73 20 61 62 6f 72 74 65 64 20 61 66  nt is aborted af
b5d0: 74 65 72 20 74 68 65 20 64 65 6c 65 74 65 0a 20  ter the delete. 
b5e0: 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 73 20         ** takes 
b5f0: 70 6c 61 63 65 29 2e 20 45 61 72 6c 69 65 72 20  place). Earlier 
b600: 76 65 72 73 69 6f 6e 73 20 63 61 6c 6c 65 64 20  versions called 
b610: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
b620: 65 28 29 20 72 65 67 61 72 64 6c 65 73 73 2c 0a  e() regardless,.
b630: 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 62          ** but b
b640: 65 69 6e 67 20 6d 6f 72 65 20 73 65 6c 65 63 74  eing more select
b650: 69 76 65 20 68 65 72 65 20 61 6c 6c 6f 77 73 20  ive here allows 
b660: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 3a  statements like:
b670: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
b680: 20 20 20 20 2a 2a 20 20 20 52 45 50 4c 41 43 45      **   REPLACE
b690: 20 49 4e 54 4f 20 74 28 72 6f 77 69 64 29 20 56   INTO t(rowid) V
b6a0: 41 4c 55 45 53 28 24 6e 65 77 72 6f 77 69 64 29  ALUES($newrowid)
b6b0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
b6c0: 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 77 69      ** to run wi
b6d0: 74 68 6f 75 74 20 61 20 73 74 61 74 65 6d 65 6e  thout a statemen
b6e0: 74 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  t journal if the
b6f0: 72 65 20 61 72 65 20 6e 6f 20 69 6e 64 65 78 65  re are no indexe
b700: 73 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s on the.       
b710: 20 2a 2a 20 74 61 62 6c 65 2e 0a 20 20 20 20 20   ** table..     
b720: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 72     */.        Tr
b730: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
b740: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
b750: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
b760: 67 73 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69  gs&SQLITE_RecTri
b770: 67 67 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20  ggers ){.       
b780: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71     pTrigger = sq
b790: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
b7a0: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  st(pParse, pTab,
b7b0: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30   TK_DELETE, 0, 0
b7c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b7d0: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
b7e0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 46 6b 52 65  r || sqlite3FkRe
b7f0: 71 75 69 72 65 64 28 70 50 61 72 73 65 2c 20 70  quired(pParse, p
b800: 54 61 62 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  Tab, 0, 0) ){.  
b810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
b820: 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65  ultiWrite(pParse
b830: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b840: 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44  ite3GenerateRowD
b850: 65 6c 65 74 65 28 0a 20 20 20 20 20 20 20 20 20  elete(.         
b860: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61       pParse, pTa
b870: 62 2c 20 62 61 73 65 43 75 72 2c 20 72 65 67 52  b, baseCur, regR
b880: 6f 77 69 64 2c 20 30 2c 20 70 54 72 69 67 67 65  owid, 0, pTrigge
b890: 72 2c 20 4f 45 5f 52 65 70 6c 61 63 65 0a 20 20  r, OE_Replace.  
b8a0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
b8b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
b8c0: 62 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  b->pIndex ){.   
b8d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75         sqlite3Mu
b8e0: 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29  ltiWrite(pParse)
b8f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b900: 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e  te3GenerateRowIn
b910: 64 65 78 44 65 6c 65 74 65 28 70 50 61 72 73 65  dexDelete(pParse
b920: 2c 20 70 54 61 62 2c 20 62 61 73 65 43 75 72 2c  , pTab, baseCur,
b930: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
b940: 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61         seenRepla
b950: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
b960: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b970: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e       case OE_Ign
b980: 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ore: {.        a
b990: 73 73 65 72 74 28 20 73 65 65 6e 52 65 70 6c 61  ssert( seenRepla
b9a0: 63 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ce==0 );.       
b9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b9c0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
b9d0: 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20  , ignoreDest);. 
b9e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ba00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ba10: 65 72 65 28 76 2c 20 6a 33 29 3b 0a 20 20 20 20  ere(v, j3);.    
ba20: 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a  if( isUpdate ){.
ba30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba40: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
ba50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ba60: 2a 20 54 65 73 74 20 61 6c 6c 20 55 4e 49 51 55  * Test all UNIQU
ba70: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 79  E constraints by
ba80: 20 63 72 65 61 74 69 6e 67 20 65 6e 74 72 69 65   creating entrie
ba90: 73 20 66 6f 72 20 65 61 63 68 20 55 4e 49 51 55  s for each UNIQU
baa0: 45 0a 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64  E.  ** index and
bab0: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 61   making sure tha
bac0: 74 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72  t duplicate entr
bad0: 69 65 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61  ies do not alrea
bae0: 64 79 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 41  dy exist..  ** A
baf0: 64 64 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  dd the new recor
bb00: 64 73 20 74 6f 20 74 68 65 20 69 6e 64 69 63 65  ds to the indice
bb10: 73 20 61 73 20 77 65 20 67 6f 2e 0a 20 20 2a 2f  s as we go..  */
bb20: 0a 20 20 66 6f 72 28 69 43 75 72 3d 30 2c 20 70  .  for(iCur=0, p
bb30: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
bb40: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
bb50: 78 2d 3e 70 4e 65 78 74 2c 20 69 43 75 72 2b 2b  x->pNext, iCur++
bb60: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 49 64  ){.    int regId
bb70: 78 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 52 3b  x;.    int regR;
bb80: 0a 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64  ..    if( aRegId
bb90: 78 5b 69 43 75 72 5d 3d 3d 30 20 29 20 63 6f 6e  x[iCur]==0 ) con
bba0: 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20  tinue;  /* Skip 
bbb0: 75 6e 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a  unused indices *
bbc0: 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  /..    /* Create
bbd0: 20 61 20 6b 65 79 20 66 6f 72 20 61 63 63 65 73   a key for acces
bbe0: 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 65  sing the index e
bbf0: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 72 65 67 49  ntry */.    regI
bc00: 64 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  dx = sqlite3GetT
bc10: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
bc20: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31   pIdx->nColumn+1
bc30: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
bc40: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
bc50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
bc60: 20 69 64 78 20 3d 20 70 49 64 78 2d 3e 61 69 43   idx = pIdx->aiC
bc70: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
bc80: 69 66 28 20 69 64 78 3d 3d 70 54 61 62 2d 3e 69  if( idx==pTab->i
bc90: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
bca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bcb0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
bcc0: 65 67 52 6f 77 69 64 2c 20 72 65 67 49 64 78 2b  egRowid, regIdx+
bcd0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i);.      }else{
bce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bcf0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bd00: 5f 53 43 6f 70 79 2c 20 72 65 67 44 61 74 61 2b  _SCopy, regData+
bd10: 69 64 78 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a  idx, regIdx+i);.
bd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bd30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd40: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
bd50: 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 49 64   regRowid, regId
bd60: 78 2b 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x+i);.    sqlite
bd70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bd80: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
bd90: 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  gIdx, pIdx->nCol
bda0: 75 6d 6e 2b 31 2c 20 61 52 65 67 49 64 78 5b 69  umn+1, aRegIdx[i
bdb0: 43 75 72 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Cur]);.    sqlit
bdc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
bdd0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 49 6e 64  , -1, sqlite3Ind
bde0: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
bdf0: 20 70 49 64 78 29 2c 20 50 34 5f 54 52 41 4e 53   pIdx), P4_TRANS
be00: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
be10: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
be20: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
be30: 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e  , regIdx, pIdx->
be40: 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20  nColumn+1);..   
be50: 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61   /* Find out wha
be60: 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  t action to take
be70: 20 69 6e 20 63 61 73 65 20 74 68 65 72 65 20 69   in case there i
be80: 73 20 61 6e 20 69 6e 64 65 78 69 6e 67 20 63 6f  s an indexing co
be90: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 6f 6e  nflict */.    on
bea0: 45 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e  Error = pIdx->on
beb0: 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f  Error;.    if( o
bec0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
bed0: 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ){ .      sqlite
bee0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
bef0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 49 64 78  e(pParse, regIdx
bf00: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b  , pIdx->nColumn+
bf10: 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  1);.      contin
bf20: 75 65 3b 20 20 2f 2a 20 70 49 64 78 20 69 73 20  ue;  /* pIdx is 
bf30: 6e 6f 74 20 61 20 55 4e 49 51 55 45 20 69 6e 64  not a UNIQUE ind
bf40: 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ex */.    }.    
bf50: 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f  if( overrideErro
bf60: 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r!=OE_Default ){
bf70: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
bf80: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a   overrideError;.
bf90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
bfa0: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
bfb0: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
bfc0: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
bfd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 65 65     }.    if( see
bfe0: 6e 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  nReplace ){.    
bff0: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
c000: 45 5f 49 67 6e 6f 72 65 20 29 20 6f 6e 45 72 72  E_Ignore ) onErr
c010: 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
c020: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
c030: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c  onError==OE_Fail
c040: 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f   ) onError = OE_
c050: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
c060: 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74   .    /* Check t
c070: 6f 20 73 65 65 20 69 66 20 74 68 65 20 6e 65 77  o see if the new
c080: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c   index entry wil
c090: 6c 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  l be unique */. 
c0a0: 20 20 20 72 65 67 52 20 3d 20 73 71 6c 69 74 65     regR = sqlite
c0b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c0c0: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
c0d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c0e0: 5f 53 43 6f 70 79 2c 20 72 65 67 4f 6c 64 52 6f  _SCopy, regOldRo
c0f0: 77 69 64 2c 20 72 65 67 52 29 3b 0a 20 20 20 20  wid, regR);.    
c100: 6a 33 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j3 = sqlite3Vdbe
c110: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
c120: 6e 69 71 75 65 2c 20 62 61 73 65 43 75 72 2b 69  nique, baseCur+i
c130: 43 75 72 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20  Cur+1, 0,.      
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 72 65 67 52 2c 20 53 51 4c 49 54       regR, SQLIT
c160: 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 72 65 67  E_INT_TO_PTR(reg
c170: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
c1a0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
c1b0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
c1c0: 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43  regIdx, pIdx->nC
c1d0: 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20 2f  olumn+1);..    /
c1e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c1f0: 74 68 61 74 20 65 78 65 63 75 74 65 73 20 69 66  that executes if
c200: 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20 65   the new index e
c210: 6e 74 72 79 20 69 73 20 6e 6f 74 20 75 6e 69 71  ntry is not uniq
c220: 75 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ue */.    assert
c230: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f  ( onError==OE_Ro
c240: 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f  llback || onErro
c250: 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f  r==OE_Abort || o
c260: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a  nError==OE_Fail.
c270: 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72          || onErr
c280: 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c  or==OE_Ignore ||
c290: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
c2a0: 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69 74  lace );.    swit
c2b0: 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ch( onError ){. 
c2c0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
c2d0: 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73  lback:.      cas
c2e0: 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20  e OE_Abort:.    
c2f0: 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20    case OE_Fail: 
c300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
c310: 0a 20 20 20 20 20 20 20 20 53 74 72 41 63 63 75  .        StrAccu
c320: 6d 20 65 72 72 4d 73 67 3b 0a 20 20 20 20 20 20  m errMsg;.      
c330: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
c340: 65 70 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ep;.        char
c350: 20 2a 7a 45 72 72 3b 0a 0a 20 20 20 20 20 20 20   *zErr;..       
c360: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
c370: 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 30 2c  Init(&errMsg, 0,
c380: 20 30 2c 20 32 30 30 29 3b 0a 20 20 20 20 20 20   0, 200);.      
c390: 20 20 65 72 72 4d 73 67 2e 64 62 20 3d 20 70 50    errMsg.db = pP
c3a0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
c3b0: 20 20 7a 53 65 70 20 3d 20 70 49 64 78 2d 3e 6e    zSep = pIdx->n
c3c0: 43 6f 6c 75 6d 6e 3e 31 20 3f 20 22 63 6f 6c 75  Column>1 ? "colu
c3d0: 6d 6e 73 20 22 20 3a 20 22 63 6f 6c 75 6d 6e 20  mns " : "column 
c3e0: 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ";.        for(j
c3f0: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
c400: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
c410: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20       char *zCol 
c420: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
c430: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
c440: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
c450: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
c460: 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
c470: 7a 53 65 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20  zSep, -1);.     
c480: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c 20 22       zSep = ", "
c490: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
c4a0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
c4b0: 64 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 2c  d(&errMsg, zCol,
c4c0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
c4d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
c4e0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
c4f0: 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20  rrMsg,.         
c500: 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
c510: 3e 31 20 3f 20 22 20 61 72 65 20 6e 6f 74 20 75  >1 ? " are not u
c520: 6e 69 71 75 65 22 20 3a 20 22 20 69 73 20 6e 6f  nique" : " is no
c530: 74 20 75 6e 69 71 75 65 22 2c 20 2d 31 29 3b 0a  t unique", -1);.
c540: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
c550: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
c560: 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20  nish(&errMsg);. 
c570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
c580: 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
c590: 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  rse, onError, zE
c5a0: 72 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rr, 0);.        
c5b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 65 72  sqlite3DbFree(er
c5c0: 72 4d 73 67 2e 64 62 2c 20 7a 45 72 72 29 3b 0a  rMsg.db, zErr);.
c5d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
c5f0: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20  e OE_Ignore: {. 
c600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
c610: 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b  eenReplace==0 );
c620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c630: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c640: 5f 47 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65  _Goto, 0, ignore
c650: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Dest);.        b
c660: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c670: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
c680: 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a         Trigger *
c690: 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20  pTrigger = 0;.  
c6a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e        assert( on
c6b0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
c6c0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
c6d0: 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70  ite3MultiWrite(p
c6e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
c6f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
c700: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 63  flags&SQLITE_Rec
c710: 54 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20  Triggers ){.    
c720: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
c730: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73   sqlite3Triggers
c740: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
c750: 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30  ab, TK_DELETE, 0
c760: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
c770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
c780: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
c790: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
c7a0: 61 72 73 65 2c 20 70 54 61 62 2c 20 62 61 73 65  arse, pTab, base
c7b0: 43 75 72 2c 20 72 65 67 52 2c 20 30 2c 20 70 54  Cur, regR, 0, pT
c7c0: 72 69 67 67 65 72 2c 20 4f 45 5f 52 65 70 6c 61  rigger, OE_Repla
c7d0: 63 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ce.        );.  
c7e0: 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61 63        seenReplac
c7f0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
c800: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c810: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
c820: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
c830: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  3);.    sqlite3R
c840: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
c850: 61 72 73 65 2c 20 72 65 67 52 29 3b 0a 20 20 7d  arse, regR);.  }
c860: 0a 20 20 0a 20 20 69 66 28 20 70 62 4d 61 79 52  .  .  if( pbMayR
c870: 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 2a 70  eplace ){.    *p
c880: 62 4d 61 79 52 65 70 6c 61 63 65 20 3d 20 73 65  bMayReplace = se
c890: 65 6e 52 65 70 6c 61 63 65 3b 0a 20 20 7d 0a 7d  enReplace;.  }.}
c8a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c8b0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
c8c0: 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20 74 68  ode to finish th
c8d0: 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  e INSERT or UPDA
c8e0: 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  TE operation.** 
c8f0: 74 68 61 74 20 77 61 73 20 73 74 61 72 74 65 64  that was started
c900: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
c910: 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72   to sqlite3Gener
c920: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
c930: 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65 63  cks..** A consec
c940: 75 74 69 76 65 20 72 61 6e 67 65 20 6f 66 20 72  utive range of r
c950: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
c960: 67 20 61 74 20 72 65 67 52 6f 77 69 64 20 63 6f  g at regRowid co
c970: 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
c980: 77 69 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  wid and the cont
c990: 65 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ent to be insert
c9a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  ed..**.** The ar
c9b0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20  guments to this 
c9c0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
c9d0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
c9e0: 65 20 66 69 72 73 74 20 73 69 78 0a 2a 2a 20 61  e first six.** a
c9f0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69  rguments to sqli
ca00: 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
ca10: 72 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a  raintChecks..*/.
ca20: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 70  void sqlite3Comp
ca30: 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20  leteInsertion(. 
ca40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ca50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
ca60: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
ca70: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
ca80: 20 20 20 20 2f 2a 20 74 68 65 20 74 61 62 6c 65      /* the table
ca90: 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
caa0: 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a  re inserting */.
cab0: 20 20 69 6e 74 20 62 61 73 65 43 75 72 2c 20 20    int baseCur,  
cac0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
cad0: 66 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63  f a read/write c
cae0: 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61  ursor pointing a
caf0: 74 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  t pTab */.  int 
cb00: 72 65 67 52 6f 77 69 64 2c 20 20 20 20 20 20 20  regRowid,       
cb10: 2f 2a 20 52 61 6e 67 65 20 6f 66 20 63 6f 6e 74  /* Range of cont
cb20: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ent */.  int *aR
cb30: 65 67 49 64 78 2c 20 20 20 20 20 20 20 2f 2a 20  egIdx,       /* 
cb40: 52 65 67 69 73 74 65 72 20 75 73 65 64 20 62 79  Register used by
cb50: 20 65 61 63 68 20 69 6e 64 65 78 2e 20 20 30 20   each index.  0 
cb60: 66 6f 72 20 75 6e 75 73 65 64 20 69 6e 64 69 63  for unused indic
cb70: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70  es */.  int isUp
cb80: 64 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  date,       /* T
cb90: 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 2c 20  rue for UPDATE, 
cba0: 46 61 6c 73 65 20 66 6f 72 20 49 4e 53 45 52 54  False for INSERT
cbb0: 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64   */.  int append
cbc0: 42 69 61 73 2c 20 20 20 20 20 2f 2a 20 54 72 75  Bias,     /* Tru
cbd0: 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
cbe0: 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70  ely to be an app
cbf0: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  end */.  int use
cc00: 53 65 65 6b 52 65 73 75 6c 74 20 20 20 2f 2a 20  SeekResult   /* 
cc10: 54 72 75 65 20 74 6f 20 73 65 74 20 74 68 65 20  True to set the 
cc20: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
cc30: 61 67 20 6f 6e 20 4f 50 5f 5b 49 64 78 5d 49 6e  ag on OP_[Idx]In
cc40: 73 65 72 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sert */.){.  int
cc50: 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   i;.  Vdbe *v;. 
cc60: 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20 49 6e 64   int nIdx;.  Ind
cc70: 65 78 20 2a 70 49 64 78 3b 0a 20 20 75 38 20 70  ex *pIdx;.  u8 p
cc80: 69 6b 5f 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  ik_flags;.  int 
cc90: 72 65 67 44 61 74 61 3b 0a 20 20 69 6e 74 20 72  regData;.  int r
cca0: 65 67 52 65 63 3b 0a 0a 20 20 76 20 3d 20 73 71  egRec;..  v = sq
ccb0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ccc0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
ccd0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
cce0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
ccf0: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74  =0 );  /* This t
cd00: 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49  able is not a VI
cd10: 45 57 20 2a 2f 0a 20 20 66 6f 72 28 6e 49 64 78  EW */.  for(nIdx
cd20: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
cd30: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
cd40: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 6e  x=pIdx->pNext, n
cd50: 49 64 78 2b 2b 29 7b 7d 0a 20 20 66 6f 72 28 69  Idx++){}.  for(i
cd60: 3d 6e 49 64 78 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nIdx-1; i>=0; i
cd70: 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65  --){.    if( aRe
cd80: 67 49 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  gIdx[i]==0 ) con
cd90: 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
cda0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cdb0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 62 61  OP_IdxInsert, ba
cdc0: 73 65 43 75 72 2b 69 2b 31 2c 20 61 52 65 67 49  seCur+i+1, aRegI
cdd0: 64 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  dx[i]);.    if( 
cde0: 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20 29 7b  useSeekResult ){
cdf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ce00: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
ce10: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
ce20: 4c 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  LT);.    }.  }. 
ce30: 20 72 65 67 44 61 74 61 20 3d 20 72 65 67 52 6f   regData = regRo
ce40: 77 69 64 20 2b 20 31 3b 0a 20 20 72 65 67 52 65  wid + 1;.  regRe
ce50: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
ce60: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
ce70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce80: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
ce90: 6f 72 64 2c 20 72 65 67 44 61 74 61 2c 20 70 54  ord, regData, pT
cea0: 61 62 2d 3e 6e 43 6f 6c 2c 20 72 65 67 52 65 63  ab->nCol, regRec
ceb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
cec0: 65 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20  eAffinityStr(v, 
ced0: 70 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTab);.  sqlite3
cee0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
cef0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
cf00: 72 65 67 44 61 74 61 2c 20 70 54 61 62 2d 3e 6e  regData, pTab->n
cf10: 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 72  Col);.  if( pPar
cf20: 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20  se->nested ){.  
cf30: 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 30 3b    pik_flags = 0;
cf40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 69  .  }else{.    pi
cf50: 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47  k_flags = OPFLAG
cf60: 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 70 69  _NCHANGE;.    pi
cf70: 6b 5f 66 6c 61 67 73 20 7c 3d 20 28 69 73 55 70  k_flags |= (isUp
cf80: 64 61 74 65 3f 4f 50 46 4c 41 47 5f 49 53 55 50  date?OPFLAG_ISUP
cf90: 44 41 54 45 3a 4f 50 46 4c 41 47 5f 4c 41 53 54  DATE:OPFLAG_LAST
cfa0: 52 4f 57 49 44 29 3b 0a 20 20 7d 0a 20 20 69 66  ROWID);.  }.  if
cfb0: 28 20 61 70 70 65 6e 64 42 69 61 73 20 29 7b 0a  ( appendBias ){.
cfc0: 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d      pik_flags |=
cfd0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 3b 0a   OPFLAG_APPEND;.
cfe0: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 53 65 65    }.  if( useSee
cff0: 6b 52 65 73 75 6c 74 20 29 7b 0a 20 20 20 20 70  kResult ){.    p
d000: 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c  ik_flags |= OPFL
d010: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
d020: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
d030: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d040: 49 6e 73 65 72 74 2c 20 62 61 73 65 43 75 72 2c  Insert, baseCur,
d050: 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77 69   regRec, regRowi
d060: 64 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  d);.  if( !pPars
d070: 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20  e->nested ){.   
d080: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d090: 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62  geP4(v, -1, pTab
d0a0: 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e  ->zName, P4_TRAN
d0b0: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 73 71  SIENT);.  }.  sq
d0c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d0d0: 35 28 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b  5(v, pik_flags);
d0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
d0f0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
d100: 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 66  l open cursors f
d110: 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 66  or a table and f
d120: 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
d130: 73 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e  s of that table.
d140: 20 20 54 68 65 20 22 62 61 73 65 43 75 72 22 20    The "baseCur" 
d150: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
d160: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75   cursor number u
d170: 73 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74  sed.** for the t
d180: 61 62 6c 65 2e 20 20 49 6e 64 69 63 65 73 20 61  able.  Indices a
d190: 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 73 75 62  re opened on sub
d1a0: 73 65 71 75 65 6e 74 20 63 75 72 73 6f 72 73 2e  sequent cursors.
d1b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
d1c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69  e number of indi
d1d0: 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ces on the table
d1e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d1f0: 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69  OpenTableAndIndi
d200: 63 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ces(.  Parse *pP
d210: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
d220: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
d230: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
d240: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
d250: 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
d260: 62 61 73 65 43 75 72 2c 20 20 20 20 20 2f 2a 20  baseCur,     /* 
d270: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 73  Cursor number as
d280: 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 74 61  signed to the ta
d290: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 20  ble */.  int op 
d2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f            /* OP_
d2b0: 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
d2c0: 70 65 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20  penWrite */.){. 
d2d0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 44   int i;.  int iD
d2e0: 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
d2f0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
d300: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
d310: 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
d320: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
d330: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
d340: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
d350: 53 63 68 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73  Schema);.  v = s
d360: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d370: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
d380: 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
d390: 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
d3a0: 73 65 2c 20 62 61 73 65 43 75 72 2c 20 69 44 62  se, baseCur, iDb
d3b0: 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20 66  , pTab, op);.  f
d3c0: 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61  or(i=1, pIdx=pTa
d3d0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d3e0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d3f0: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 4b 65 79  t, i++){.    Key
d400: 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c  Info *pKey = sql
d410: 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
d420: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
d430: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
d440: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
d450: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
d460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d470: 34 28 76 2c 20 6f 70 2c 20 69 2b 62 61 73 65 43  4(v, op, i+baseC
d480: 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ur, pIdx->tnum, 
d490: 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
d4a0: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
d4b0: 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
d4c0: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
d4d0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d4e0: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
d4f0: 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  me));.  }.  if( 
d500: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3c 62 61 73  pParse->nTab<bas
d510: 65 43 75 72 2b 69 20 29 7b 0a 20 20 20 20 70 50  eCur+i ){.    pP
d520: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 62 61 73  arse->nTab = bas
d530: 65 43 75 72 2b 69 3b 0a 20 20 7d 0a 20 20 72 65  eCur+i;.  }.  re
d540: 74 75 72 6e 20 69 2d 31 3b 0a 7d 0a 0a 0a 23 69  turn i-1;.}...#i
d550: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d560: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
d570: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
d580: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
d590: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
d5a0: 0a 2a 2a 20 74 72 61 6e 73 66 65 72 20 6f 70 74  .** transfer opt
d5b0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
d5c0: 64 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  d.  This is used
d5d0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
d5e0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20 2d 20  purposes only - 
d5f0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
d600: 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
d610: 7a 61 74 69 6f 6e 20 72 65 61 6c 6c 79 0a 2a 2a  zation really.**
d620: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 68   is happening wh
d630: 65 6e 20 69 74 20 69 73 20 73 75 70 70 6f 73 65  en it is suppose
d640: 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   to..*/.int sqli
d650: 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
d660: 74 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  t;.#endif /* SQL
d670: 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 23 69  ITE_TEST */...#i
d680: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d690: 54 5f 58 46 45 52 5f 4f 50 54 0a 2f 2a 0a 2a 2a  T_XFER_OPT./*.**
d6a0: 20 43 68 65 63 6b 20 74 6f 20 63 6f 6c 6c 61 74   Check to collat
d6b0: 69 6f 6e 20 6e 61 6d 65 73 20 74 6f 20 73 65 65  ion names to see
d6c0: 20 69 66 20 74 68 65 79 20 61 72 65 20 63 6f 6d   if they are com
d6d0: 70 61 74 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  patible..*/.stat
d6e0: 69 63 20 69 6e 74 20 78 66 65 72 43 6f 6d 70 61  ic int xferCompa
d6f0: 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 63  tibleCollation(c
d700: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 63  onst char *z1, c
d710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29 7b 0a  onst char *z2){.
d720: 20 20 69 66 28 20 7a 31 3d 3d 30 20 29 7b 0a 20    if( z1==0 ){. 
d730: 20 20 20 72 65 74 75 72 6e 20 7a 32 3d 3d 30 3b     return z2==0;
d740: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 32 3d 3d 30  .  }.  if( z2==0
d750: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
d770: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
d780: 2c 20 7a 32 29 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a  , z2)==0;.}.../*
d790: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
d7a0: 20 69 66 20 69 6e 64 65 78 20 70 53 72 63 20 69   if index pSrc i
d7b0: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 61 73 20  s compatible as 
d7c0: 61 20 73 6f 75 72 63 65 20 6f 66 20 64 61 74 61  a source of data
d7d0: 0a 2a 2a 20 66 6f 72 20 69 6e 64 65 78 20 70 44  .** for index pD
d7e0: 65 73 74 20 69 6e 20 61 6e 20 69 6e 73 65 72 74  est in an insert
d7f0: 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
d800: 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 72 75 6c  zation.  The rul
d810: 65 73 0a 2a 2a 20 66 6f 72 20 61 20 63 6f 6d 70  es.** for a comp
d820: 61 74 69 62 6c 65 20 69 6e 64 65 78 3a 0a 2a 2a  atible index:.**
d830: 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 69  .**    *   The i
d840: 6e 64 65 78 20 69 73 20 6f 76 65 72 20 74 68 65  ndex is over the
d850: 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63 6f 6c   same set of col
d860: 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20 20 20 54  umns.**    *   T
d870: 68 65 20 73 61 6d 65 20 44 45 53 43 20 61 6e 64  he same DESC and
d880: 20 41 53 43 20 6d 61 72 6b 69 6e 67 73 20 6f 63   ASC markings oc
d890: 63 75 72 73 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75  curs on all colu
d8a0: 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68  mns.**    *   Th
d8b0: 65 20 73 61 6d 65 20 6f 6e 45 72 72 6f 72 20 70  e same onError p
d8c0: 72 6f 63 65 73 73 69 6e 67 20 28 4f 45 5f 41 62  rocessing (OE_Ab
d8d0: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
d8e0: 65 74 63 29 0a 2a 2a 20 20 20 20 2a 20 20 20 54  etc).**    *   T
d8f0: 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e  he same collatin
d900: 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 65 61  g sequence on ea
d910: 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  ch column.*/.sta
d920: 74 69 63 20 69 6e 74 20 78 66 65 72 43 6f 6d 70  tic int xferComp
d930: 61 74 69 62 6c 65 49 6e 64 65 78 28 49 6e 64 65  atibleIndex(Inde
d940: 78 20 2a 70 44 65 73 74 2c 20 49 6e 64 65 78 20  x *pDest, Index 
d950: 2a 70 53 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b  *pSrc){.  int i;
d960: 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
d970: 20 26 26 20 70 53 72 63 20 29 3b 0a 20 20 61 73   && pSrc );.  as
d980: 73 65 72 74 28 20 70 44 65 73 74 2d 3e 70 54 61  sert( pDest->pTa
d990: 62 6c 65 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c  ble!=pSrc->pTabl
d9a0: 65 20 29 3b 0a 20 20 69 66 28 20 70 44 65 73 74  e );.  if( pDest
d9b0: 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 53 72 63 2d  ->nColumn!=pSrc-
d9c0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
d9d0: 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44  return 0;   /* D
d9e0: 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20  ifferent number 
d9f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
da00: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6f  }.  if( pDest->o
da10: 6e 45 72 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e  nError!=pSrc->on
da20: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Error ){.    ret
da30: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
da40: 65 72 65 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72  erent conflict r
da50: 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65  esolution strate
da60: 67 69 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  gies */.  }.  fo
da70: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
da80: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
da90: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 69 43 6f    if( pSrc->aiCo
daa0: 6c 75 6d 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e  lumn[i]!=pDest->
dab0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20  aiColumn[i] ){. 
dac0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
dad0: 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f   /* Different co
dae0: 6c 75 6d 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f  lumns indexed */
daf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
db00: 53 72 63 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Src->aSortOrder[
db10: 69 5d 21 3d 70 44 65 73 74 2d 3e 61 53 6f 72 74  i]!=pDest->aSort
db20: 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
db30: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
db40: 20 44 69 66 66 65 72 65 6e 74 20 73 6f 72 74 20   Different sort 
db50: 6f 72 64 65 72 73 20 2a 2f 0a 20 20 20 20 7d 0a  orders */.    }.
db60: 20 20 20 20 69 66 28 20 21 78 66 65 72 43 6f 6d      if( !xferCom
db70: 70 61 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e  patibleCollation
db80: 28 70 53 72 63 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  (pSrc->azColl[i]
db90: 2c 70 44 65 73 74 2d 3e 61 7a 43 6f 6c 6c 5b 69  ,pDest->azColl[i
dba0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ]) ){.      retu
dbb0: 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
dbc0: 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
dbd0: 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20 20 20 20  equences */.    
dbe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
dbf0: 6f 20 74 65 73 74 20 61 62 6f 76 65 20 66 61 69  o test above fai
dc00: 6c 73 20 74 68 65 6e 20 74 68 65 20 69 6e 64 69  ls then the indi
dc10: 63 65 73 20 6d 75 73 74 20 62 65 20 63 6f 6d 70  ces must be comp
dc20: 61 74 69 62 6c 65 20 2a 2f 0a 20 20 72 65 74 75  atible */.  retu
dc30: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 1;.}../*.** A
dc40: 74 74 65 6d 70 74 20 74 68 65 20 74 72 61 6e 73  ttempt the trans
dc50: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
dc60: 20 6f 6e 20 49 4e 53 45 52 54 73 20 6f 66 20 74   on INSERTs of t
dc70: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
dc80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61    INSERT INTO ta
dc90: 62 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  b1 SELECT * FROM
dca0: 20 74 61 62 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 69   tab2;.**.** Thi
dcb0: 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
dcc0: 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64  s only attempted
dcd0: 20 69 66 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29   if.**.**    (1)
dce0: 20 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20    tab1 and tab2 
dcf0: 68 61 76 65 20 69 64 65 6e 74 69 63 61 6c 20 73  have identical s
dd00: 63 68 65 6d 61 73 20 69 6e 63 6c 75 64 69 6e 67  chemas including
dd10: 20 61 6c 6c 20 74 68 65 0a 2a 2a 20 20 20 20 20   all the.**     
dd20: 20 20 20 20 73 61 6d 65 20 69 6e 64 69 63 65 73      same indices
dd30: 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   and constraints
dd40: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 74  .**.**    (2)  t
dd50: 61 62 31 20 61 6e 64 20 74 61 62 32 20 61 72 65  ab1 and tab2 are
dd60: 20 64 69 66 66 65 72 65 6e 74 20 74 61 62 6c 65   different table
dd70: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  s.**.**    (3)  
dd80: 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
dd90: 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62   triggers on tab
dda0: 31 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  1.**.**    (4)  
ddb0: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
ddc0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
ddd0: 74 65 6d 65 6e 74 20 69 73 20 22 2a 22 0a 2a 2a  tement is "*".**
dde0: 0a 2a 2a 20 20 20 20 28 35 29 20 20 54 68 65 20  .**    (5)  The 
ddf0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
de00: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 2c 20 48   has no WHERE, H
de10: 41 56 49 4e 47 2c 20 4f 52 44 45 52 20 42 59 2c  AVING, ORDER BY,
de20: 20 47 52 4f 55 50 20 42 59 2c 0a 2a 2a 20 20 20   GROUP BY,.**   
de30: 20 20 20 20 20 20 6f 72 20 4c 49 4d 49 54 20 63        or LIMIT c
de40: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
de50: 28 36 29 20 20 54 68 65 20 53 45 4c 45 43 54 20  (6)  The SELECT 
de60: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
de70: 69 6d 70 6c 65 20 28 6e 6f 74 20 61 20 63 6f 6d  imple (not a com
de80: 70 6f 75 6e 64 29 20 73 65 6c 65 63 74 20 74 68  pound) select th
de90: 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  at.**         co
dea0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 74 61 62 32  ntains only tab2
deb0: 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
dec0: 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  use.**.** This m
ded0: 65 74 68 6f 64 20 66 6f 72 20 69 6d 70 6c 65 6d  ethod for implem
dee0: 65 6e 74 69 6e 67 20 74 68 65 20 49 4e 53 45 52  enting the INSER
def0: 54 20 74 72 61 6e 73 66 65 72 73 20 72 61 77 20  T transfers raw 
df00: 72 65 63 6f 72 64 73 20 66 72 6f 6d 0a 2a 2a 20  records from.** 
df10: 74 61 62 32 20 6f 76 65 72 20 74 6f 20 74 61 62  tab2 over to tab
df20: 31 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20  1.  The columns 
df30: 61 72 65 20 6e 6f 74 20 64 65 63 6f 64 65 64 2e  are not decoded.
df40: 20 20 52 61 77 20 72 65 63 6f 72 64 73 20 66 72    Raw records fr
df50: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 69 63 65  om.** the indice
df60: 73 20 6f 66 20 74 61 62 32 20 61 72 65 20 74 72  s of tab2 are tr
df70: 61 6e 73 66 65 72 65 64 20 74 6f 20 74 61 62 31  ansfered to tab1
df80: 20 61 73 20 77 65 6c 6c 2e 20 20 49 6e 20 73 6f   as well.  In so
df90: 20 64 6f 69 6e 67 2c 0a 2a 2a 20 74 68 65 20 72   doing,.** the r
dfa0: 65 73 75 6c 74 69 6e 67 20 74 61 62 31 20 68 61  esulting tab1 ha
dfb0: 73 20 6d 75 63 68 20 6c 65 73 73 20 66 72 61 67  s much less frag
dfc0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  mentation..**.**
dfd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
dfe0: 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 74 68  turns TRUE if th
dff0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
e000: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 49 66  s attempted.  If
e010: 20 61 6e 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63   any.** of the c
e020: 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
e030: 66 61 69 6c 20 73 6f 20 74 68 61 74 20 74 68 65  fail so that the
e040: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68   optimization sh
e050: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
e060: 74 74 65 6d 70 74 65 64 2c 20 74 68 65 6e 20 74  ttempted, then t
e070: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
e080: 72 6e 73 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  rns FALSE..*/.st
e090: 61 74 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74  atic int xferOpt
e0a0: 69 6d 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72  imization(.  Par
e0b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e0c0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
e0d0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
e0e0: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 20 20 20  *pDest,         
e0f0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 65 20  /* The table we 
e100: 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  are inserting in
e110: 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  to */.  Select *
e120: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
e130: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
e140: 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20 74 68  ent to use as th
e150: 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f  e data source */
e160: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
e170: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
e180: 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72  to handle constr
e190: 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  aint errors */. 
e1a0: 20 69 6e 74 20 69 44 62 44 65 73 74 20 20 20 20   int iDbDest    
e1b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
e1c0: 74 61 62 61 73 65 20 6f 66 20 70 44 65 73 74 20  tabase of pDest 
e1d0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
e1e0: 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20   *pEList;       
e1f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e200: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
e210: 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 54 61  e SELECT */.  Ta
e220: 62 6c 65 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ble *pSrc;      
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e240: 2a 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 74  * The table in t
e250: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
e260: 66 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 49 6e  f SELECT */.  In
e270: 64 65 78 20 2a 70 53 72 63 49 64 78 2c 20 2a 70  dex *pSrcIdx, *p
e280: 44 65 73 74 49 64 78 3b 20 20 20 20 20 20 20 2f  DestIdx;       /
e290: 2a 20 53 6f 75 72 63 65 20 61 6e 64 20 64 65 73  * Source and des
e2a0: 74 69 6e 61 74 69 6f 6e 20 69 6e 64 69 63 65 73  tination indices
e2b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
e2c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
e2d0: 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65  ;      /* An ele
e2e0: 6d 65 6e 74 20 6f 66 20 70 53 65 6c 65 63 74 2d  ment of pSelect-
e2f0: 3e 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69  >pSrc */.  int i
e300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e320: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
e330: 20 69 6e 74 20 69 44 62 53 72 63 3b 20 20 20 20   int iDbSrc;    
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
e360: 65 20 6f 66 20 70 53 72 63 20 2a 2f 0a 20 20 69  e of pSrc */.  i
e370: 6e 74 20 69 53 72 63 2c 20 69 44 65 73 74 3b 20  nt iSrc, iDest; 
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 2f 2a 20 43 75 72 73 6f 72 73 20 66 72 6f 6d 20  /* Cursors from 
e3a0: 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69  source and desti
e3b0: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nation */.  int 
e3c0: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 20 20 20  addr1, addr2;   
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e3e0: 4c 6f 6f 70 20 61 64 64 72 65 73 73 65 73 20 2a  Loop addresses *
e3f0: 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 44 65 73  /.  int emptyDes
e400: 74 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  tTest;          
e410: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e420: 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70 74  of test for empt
e430: 79 20 70 44 65 73 74 20 2a 2f 0a 20 20 69 6e 74  y pDest */.  int
e440: 20 65 6d 70 74 79 53 72 63 54 65 73 74 3b 20 20   emptySrcTest;  
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e460: 20 41 64 64 72 65 73 73 20 6f 66 20 74 65 73 74   Address of test
e470: 20 66 6f 72 20 65 6d 70 74 79 20 70 53 72 63 20   for empty pSrc 
e480: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
e4b0: 45 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e  E we are buildin
e4c0: 67 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  g */.  KeyInfo *
e4d0: 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
e4e0: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
e4f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
e500: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  n index */.  int
e510: 20 72 65 67 41 75 74 6f 69 6e 63 3b 20 20 20 20   regAutoinc;    
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e530: 20 4d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   Memory register
e540: 20 75 73 65 64 20 62 79 20 41 55 54 4f 49 4e 43   used by AUTOINC
e550: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 48 61   */.  int destHa
e560: 73 55 6e 69 71 75 65 49 64 78 20 3d 20 30 3b 20  sUniqueIdx = 0; 
e570: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
e580: 66 20 70 44 65 73 74 20 68 61 73 20 61 20 55 4e  f pDest has a UN
e590: 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20  IQUE index */.  
e5a0: 69 6e 74 20 72 65 67 44 61 74 61 2c 20 72 65 67  int regData, reg
e5b0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
e5c0: 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 68 6f   /* Registers ho
e5d0: 6c 64 69 6e 67 20 64 61 74 61 20 61 6e 64 20 72  lding data and r
e5e0: 6f 77 69 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70  owid */..  if( p
e5f0: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
e600: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
e610: 4d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66  Must be of the f
e620: 6f 72 6d 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  orm  INSERT INTO
e630: 20 2e 2e 2e 20 53 45 4c 45 43 54 20 2e 2e 2e 20   ... SELECT ... 
e640: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  */.  }.  if( sql
e650: 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
e660: 70 50 61 72 73 65 2c 20 70 44 65 73 74 29 20 29  pParse, pDest) )
e670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
e680: 20 20 2f 2a 20 74 61 62 31 20 6d 75 73 74 20 6e    /* tab1 must n
e690: 6f 74 20 68 61 76 65 20 74 72 69 67 67 65 72 73  ot have triggers
e6a0: 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20   */.  }.#ifndef 
e6b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e6c0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
e6d0: 44 65 73 74 2d 3e 74 61 62 46 6c 61 67 73 20 26  Dest->tabFlags &
e6e0: 20 54 46 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20   TF_Virtual ){. 
e6f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
e700: 2a 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20  * tab1 must not 
e710: 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
e720: 6c 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66  le */.  }.#endif
e730: 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  .  if( onError==
e740: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
e750: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41    onError = OE_A
e760: 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  bort;.  }.  if( 
e770: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72  onError!=OE_Abor
e780: 74 20 26 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  t && onError!=OE
e790: 5f 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Rollback ){.   
e7a0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
e7b0: 43 61 6e 6e 6f 74 20 64 6f 20 4f 52 20 52 45 50  Cannot do OR REP
e7c0: 4c 41 43 45 20 6f 72 20 4f 52 20 49 47 4e 4f 52  LACE or OR IGNOR
e7d0: 45 20 6f 72 20 4f 52 20 46 41 49 4c 20 2a 2f 0a  E or OR FAIL */.
e7e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 53 65    }.  assert(pSe
e7f0: 6c 65 63 74 2d 3e 70 53 72 63 29 3b 20 20 20 2f  lect->pSrc);   /
e800: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 65 76 65 6e  * allocated even
e810: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
e820: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
e830: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53   if( pSelect->pS
e840: 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
e850: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
e860: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6d 75  * FROM clause mu
e870: 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
e880: 6f 6e 65 20 74 65 72 6d 20 2a 2f 0a 20 20 7d 0a  one term */.  }.
e890: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
e8a0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
e8b0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
e8c0: 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  0;   /* FROM cla
e8d0: 75 73 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61  use cannot conta
e8e0: 69 6e 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  in a subquery */
e8f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
e900: 63 74 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ct->pWhere ){.  
e910: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
e920: 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20   SELECT may not 
e930: 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
e940: 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  use */.  }.  if(
e950: 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
e960: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
e970: 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20   0;   /* SELECT 
e980: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  may not have an 
e990: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e9a0: 2a 2f 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e  */.  }.  /* Do n
e9b0: 6f 74 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  ot need to test 
e9c0: 66 6f 72 20 61 20 48 41 56 49 4e 47 20 63 6c 61  for a HAVING cla
e9d0: 75 73 65 2e 20 20 49 66 20 48 41 56 49 4e 47 20  use.  If HAVING 
e9e0: 69 73 20 70 72 65 73 65 6e 74 20 62 75 74 0a 20  is present but. 
e9f0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20   ** there is no 
ea00: 4f 52 44 45 52 20 42 59 2c 20 77 65 20 77 69 6c  ORDER BY, we wil
ea10: 6c 20 67 65 74 20 61 6e 20 65 72 72 6f 72 2e 20  l get an error. 
ea20: 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
ea30: 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
ea40: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
ea50: 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20   SELECT may not 
ea60: 68 61 76 65 20 61 20 47 52 4f 55 50 20 42 59 20  have a GROUP BY 
ea70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20  clause */.  }.  
ea80: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4c 69  if( pSelect->pLi
ea90: 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
eaa0: 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
eab0: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
eac0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
ead0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53    }.  assert( pS
eae0: 65 6c 65 63 74 2d 3e 70 4f 66 66 73 65 74 3d 3d  elect->pOffset==
eaf0: 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  0 );  /* Must be
eb00: 20 73 6f 20 69 66 20 70 4c 69 6d 69 74 3d 3d 30   so if pLimit==0
eb10: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
eb20: 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
eb30: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
eb40: 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62  SELECT may not b
eb50: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
eb60: 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ry */.  }.  if( 
eb70: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
eb80: 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
eb90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
eba0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79     /* SELECT may
ebb0: 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54   not be DISTINCT
ebc0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74   */.  }.  pEList
ebd0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
ebe0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  st;.  assert( pE
ebf0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  List!=0 );.  if(
ec00: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
ec10: 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
ec20: 30 3b 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  0;   /* The resu
ec30: 6c 74 20 73 65 74 20 6d 75 73 74 20 68 61 76 65  lt set must have
ec40: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6c   exactly one col
ec50: 75 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  umn */.  }.  ass
ec60: 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30  ert( pEList->a[0
ec70: 5d 2e 70 45 78 70 72 20 29 3b 0a 20 20 69 66 28  ].pExpr );.  if(
ec80: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ec90: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20  xpr->op!=TK_ALL 
eca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ecb0: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
ecc0: 20 73 65 74 20 6d 75 73 74 20 62 65 20 74 68 65   set must be the
ecd0: 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f   special operato
ece0: 72 20 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20  r "*" */.  }..  
ecf0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
ed00: 20 77 65 20 68 61 76 65 20 65 73 74 61 62 6c 69   we have establi
ed10: 73 68 65 64 20 74 68 61 74 20 74 68 65 20 73 74  shed that the st
ed20: 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
ed30: 65 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 73  e.  ** correct s
ed40: 79 6e 74 61 63 74 69 63 20 66 6f 72 6d 20 74 6f  yntactic form to
ed50: 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
ed60: 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
ed70: 6e 2e 20 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20  n.  Now.  ** we 
ed80: 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68  have to check th
ed90: 65 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a  e semantics..  *
eda0: 2f 0a 20 20 70 49 74 65 6d 20 3d 20 70 53 65 6c  /.  pItem = pSel
edb0: 65 63 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20  ect->pSrc->a;.  
edc0: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pSrc = sqlite3Lo
edd0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
ede0: 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  , 0, pItem->zNam
edf0: 65 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  e, pItem->zDatab
ee00: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 53 72 63  ase);.  if( pSrc
ee10: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ee20: 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63  n 0;   /* FROM c
ee30: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
ee40: 6f 6e 74 61 69 6e 20 61 20 72 65 61 6c 20 74 61  ontain a real ta
ee50: 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ble */.  }.  if(
ee60: 20 70 53 72 63 3d 3d 70 44 65 73 74 20 29 7b 0a   pSrc==pDest ){.
ee70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
ee80: 2f 2a 20 74 61 62 31 20 61 6e 64 20 74 61 62 32  /* tab1 and tab2
ee90: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
eea0: 73 61 6d 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  same table */.  
eeb0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
eec0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
eed0: 4c 45 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 74  LE.  if( pSrc->t
eee0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69 72  abFlags & TF_Vir
eef0: 74 75 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  tual ){.    retu
ef00: 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20  rn 0;   /* tab2 
ef10: 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 76 69  must not be a vi
ef20: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
ef30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
ef40: 70 53 72 63 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pSrc->pSelect ){
ef50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
ef60: 20 2f 2a 20 74 61 62 32 20 6d 61 79 20 6e 6f 74   /* tab2 may not
ef70: 20 62 65 20 61 20 76 69 65 77 20 2a 2f 0a 20 20   be a view */.  
ef80: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  }.  if( pDest->n
ef90: 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e 43 6f 6c 20  Col!=pSrc->nCol 
efa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
efb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
efc0: 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
efd0: 74 68 65 20 73 61 6d 65 20 69 6e 20 74 61 62 31  the same in tab1
efe0: 20 61 6e 64 20 74 61 62 32 20 2a 2f 0a 20 20 7d   and tab2 */.  }
eff0: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50  .  if( pDest->iP
f000: 4b 65 79 21 3d 70 53 72 63 2d 3e 69 50 4b 65 79  Key!=pSrc->iPKey
f010: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
f020: 3b 20 20 20 2f 2a 20 42 6f 74 68 20 74 61 62 6c  ;   /* Both tabl
f030: 65 73 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  es must have the
f040: 20 73 61 6d 65 20 49 4e 54 45 47 45 52 20 50 52   same INTEGER PR
f050: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 7d  IMARY KEY */.  }
f060: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
f070: 65 73 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  est->nCol; i++){
f080: 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e  .    if( pDest->
f090: 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79  aCol[i].affinity
f0a0: 21 3d 70 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 2e  !=pSrc->aCol[i].
f0b0: 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
f0c0: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
f0d0: 2a 20 41 66 66 69 6e 69 74 79 20 6d 75 73 74 20  * Affinity must 
f0e0: 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20 61  be the same on a
f0f0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ll columns */.  
f100: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 78 66 65    }.    if( !xfe
f110: 72 43 6f 6d 70 61 74 69 62 6c 65 43 6f 6c 6c 61  rCompatibleColla
f120: 74 69 6f 6e 28 70 44 65 73 74 2d 3e 61 43 6f 6c  tion(pDest->aCol
f130: 5b 69 5d 2e 7a 43 6f 6c 6c 2c 20 70 53 72 63 2d  [i].zColl, pSrc-
f140: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 20  >aCol[i].zColl) 
f150: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f160: 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  0;    /* Collati
f170: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  ng sequence must
f180: 20 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20   be the same on 
f190: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  all columns */. 
f1a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65     }.    if( pDe
f1b0: 73 74 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e  st->aCol[i].notN
f1c0: 75 6c 6c 20 26 26 20 21 70 53 72 63 2d 3e 61 43  ull && !pSrc->aC
f1d0: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  ol[i].notNull ){
f1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
f1f0: 20 20 20 20 2f 2a 20 74 61 62 32 20 6d 75 73 74      /* tab2 must
f200: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 20 69 66 20   be NOT NULL if 
f210: 74 61 62 31 20 69 73 20 2a 2f 0a 20 20 20 20 7d  tab1 is */.    }
f220: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44 65 73 74  .  }.  for(pDest
f230: 49 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65  Idx=pDest->pInde
f240: 78 3b 20 70 44 65 73 74 49 64 78 3b 20 70 44 65  x; pDestIdx; pDe
f250: 73 74 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e  stIdx=pDestIdx->
f260: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
f270: 70 44 65 73 74 49 64 78 2d 3e 6f 6e 45 72 72 6f  pDestIdx->onErro
f280: 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
f290: 20 20 20 20 64 65 73 74 48 61 73 55 6e 69 71 75      destHasUniqu
f2a0: 65 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eIdx = 1;.    }.
f2b0: 20 20 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d      for(pSrcIdx=
f2c0: 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53  pSrc->pIndex; pS
f2d0: 72 63 49 64 78 3b 20 70 53 72 63 49 64 78 3d 70  rcIdx; pSrcIdx=p
f2e0: 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  SrcIdx->pNext){.
f2f0: 20 20 20 20 20 20 69 66 28 20 78 66 65 72 43 6f        if( xferCo
f300: 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70 44  mpatibleIndex(pD
f310: 65 73 74 49 64 78 2c 20 70 53 72 63 49 64 78 29  estIdx, pSrcIdx)
f320: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
f330: 20 20 20 20 69 66 28 20 70 53 72 63 49 64 78 3d      if( pSrcIdx=
f340: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f350: 72 6e 20 30 3b 20 20 20 20 2f 2a 20 70 44 65 73  rn 0;    /* pDes
f360: 74 49 64 78 20 68 61 73 20 6e 6f 20 63 6f 72 72  tIdx has no corr
f370: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20  esponding index 
f380: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d  in pSrc */.    }
f390: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
f3a0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
f3b0: 20 69 66 28 20 70 44 65 73 74 2d 3e 70 43 68 65   if( pDest->pChe
f3c0: 63 6b 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ck && sqlite3Exp
f3d0: 72 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e 70  rCompare(pSrc->p
f3e0: 43 68 65 63 6b 2c 20 70 44 65 73 74 2d 3e 70 43  Check, pDest->pC
f3f0: 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 72 65 74  heck) ){.    ret
f400: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c  urn 0;   /* Tabl
f410: 65 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  es have differen
f420: 74 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  t CHECK constrai
f430: 6e 74 73 2e 20 20 54 69 63 6b 65 74 20 23 32 32  nts.  Ticket #22
f440: 35 32 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66  52 */.  }.#endif
f450: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f460: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f470: 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74  .  /* Disallow t
f480: 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
f490: 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20  mization if the 
f4a0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
f4b0: 65 20 63 6f 6e 73 74 61 69 6e 73 0a 20 20 2a 2a  e constains.  **
f4c0: 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
f4d0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 54   constraints.  T
f4e0: 68 69 73 20 69 73 20 6d 6f 72 65 20 72 65 73 74  his is more rest
f4f0: 72 69 63 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rictive than nec
f500: 65 73 73 61 72 79 2e 0a 20 20 2a 2a 20 42 75 74  essary..  ** But
f510: 20 74 68 65 20 6d 61 69 6e 20 62 65 6e 65 66 69   the main benefi
f520: 63 69 61 72 79 20 6f 66 20 74 68 65 20 74 72 61  ciary of the tra
f530: 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
f540: 6f 6e 20 69 73 20 74 68 65 20 56 41 43 55 55 4d  on is the VACUUM
f550: 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20   .  ** command, 
f560: 61 6e 64 20 74 68 65 20 56 41 43 55 55 4d 20 63  and the VACUUM c
f570: 6f 6d 6d 61 6e 64 20 64 69 73 61 62 6c 65 73 20  ommand disables 
f580: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
f590: 74 72 61 69 6e 74 73 2e 20 20 53 6f 0a 20 20 2a  traints.  So.  *
f5a0: 2a 20 74 68 65 20 65 78 74 72 61 20 63 6f 6d 70  * the extra comp
f5b0: 6c 69 63 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65  lication to make
f5c0: 20 74 68 69 73 20 72 75 6c 65 20 6c 65 73 73 20   this rule less 
f5d0: 72 65 73 74 72 69 63 74 69 76 65 20 69 73 20 70  restrictive is p
f5e0: 72 6f 62 61 62 6c 79 0a 20 20 2a 2a 20 6e 6f 74  robably.  ** not
f5f0: 20 77 6f 72 74 68 20 74 68 65 20 65 66 66 6f 72   worth the effor
f600: 74 2e 20 20 54 69 63 6b 65 74 20 5b 36 32 38 34  t.  Ticket [6284
f610: 64 66 38 39 64 65 62 64 66 61 36 31 64 62 38 30  df89debdfa61db80
f620: 37 33 65 30 36 32 39 30 38 61 66 30 63 39 62 36  73e062908af0c9b6
f630: 31 31 38 65 5d 0a 20 20 2a 2f 0a 20 20 69 66 28  118e].  */.  if(
f640: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
f650: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 6f 72  ags & SQLITE_For
f660: 65 69 67 6e 4b 65 79 73 29 21 3d 30 20 26 26 20  eignKeys)!=0 && 
f670: 70 44 65 73 74 2d 3e 70 46 4b 65 79 21 3d 30 20  pDest->pFKey!=0 
f680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f690: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
f6a0: 28 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  ( (pParse->db->f
f6b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
f6c0: 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20  untRows)!=0 ){. 
f6d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f6e0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
f6f0: 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
f700: 61 6e 73 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a  ans either:.  **
f710: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 20 57 65 20  .  **    *   We 
f720: 63 61 6e 20 61 6c 77 61 79 73 20 64 6f 20 74 68  can always do th
f730: 65 20 74 72 61 6e 73 66 65 72 20 69 66 20 74 68  e transfer if th
f740: 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
f750: 20 61 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   an.  **        
f760: 61 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  an integer prima
f770: 72 79 20 6b 65 79 0a 20 20 2a 2a 0a 20 20 2a 2a  ry key.  **.  **
f780: 20 20 20 20 2a 20 20 20 57 65 20 63 61 6e 20 63      *   We can c
f790: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 64 6f 20  onditionally do 
f7a0: 74 68 65 20 74 72 61 6e 73 66 65 72 20 69 66 20  the transfer if 
f7b0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
f7c0: 20 20 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c    **        tabl
f7d0: 65 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  e is empty..  */
f7e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f7f0: 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 78 66  EST.  sqlite3_xf
f800: 65 72 6f 70 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  eropt_count++;.#
f810: 65 6e 64 69 66 0a 20 20 69 44 62 53 72 63 20 3d  endif.  iDbSrc =
f820: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f830: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f840: 2c 20 70 53 72 63 2d 3e 70 53 63 68 65 6d 61 29  , pSrc->pSchema)
f850: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
f860: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f870: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
f880: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
f890: 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 69 53 72  , iDbSrc);.  iSr
f8a0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  c = pParse->nTab
f8b0: 2b 2b 3b 0a 20 20 69 44 65 73 74 20 3d 20 70 50  ++;.  iDest = pP
f8c0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f8d0: 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 61 75 74  regAutoinc = aut
f8e0: 6f 49 6e 63 42 65 67 69 6e 28 70 50 61 72 73 65  oIncBegin(pParse
f8f0: 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74  , iDbDest, pDest
f900: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  );.  sqlite3Open
f910: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
f920: 65 73 74 2c 20 69 44 62 44 65 73 74 2c 20 70 44  est, iDbDest, pD
f930: 65 73 74 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  est, OP_OpenWrit
f940: 65 29 3b 0a 20 20 69 66 28 20 28 70 44 65 73 74  e);.  if( (pDest
f950: 2d 3e 69 50 4b 65 79 3c 30 20 26 26 20 70 44 65  ->iPKey<0 && pDe
f960: 73 74 2d 3e 70 49 6e 64 65 78 21 3d 30 29 20 7c  st->pIndex!=0) |
f970: 7c 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49  | destHasUniqueI
f980: 64 78 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  dx ){.    /* If 
f990: 74 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 68 61  tables do not ha
f9a0: 76 65 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ve an INTEGER PR
f9b0: 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68  IMARY KEY and th
f9c0: 65 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 69  ere.    ** are i
f9d0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 6f 70  ndices to be cop
f9e0: 69 65 64 20 61 6e 64 20 74 68 65 20 64 65 73 74  ied and the dest
f9f0: 69 6e 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 65  ination is not e
fa00: 6d 70 74 79 2c 0a 20 20 20 20 2a 2a 20 77 65 20  mpty,.    ** we 
fa10: 68 61 76 65 20 74 6f 20 64 69 73 61 6c 6c 6f 77  have to disallow
fa20: 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70   the transfer op
fa30: 74 69 6d 69 7a 61 74 69 6f 6e 20 62 65 63 61 75  timization becau
fa40: 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  se the.    ** th
fa50: 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 63  e rowids might c
fa60: 68 61 6e 67 65 20 77 68 69 63 68 20 77 69 6c 6c  hange which will
fa70: 20 6d 65 73 73 20 75 70 20 69 6e 64 65 78 69 6e   mess up indexin
fa80: 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
fa90: 20 4f 72 20 69 66 20 74 68 65 20 64 65 73 74 69   Or if the desti
faa0: 6e 61 74 69 6f 6e 20 68 61 73 20 61 20 55 4e 49  nation has a UNI
fab0: 51 55 45 20 69 6e 64 65 78 20 61 6e 64 20 69 73  QUE index and is
fac0: 20 6e 6f 74 20 65 6d 70 74 79 2c 0a 20 20 20 20   not empty,.    
fad0: 2a 2a 20 77 65 20 61 6c 73 6f 20 64 69 73 61 6c  ** we also disal
fae0: 6c 6f 77 20 74 68 65 20 74 72 61 6e 73 66 65 72  low the transfer
faf0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62 65   optimization be
fb00: 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 0a  cause we cannot.
fb10: 20 20 20 20 2a 2a 20 69 6e 73 75 72 65 20 74 68      ** insure th
fb20: 61 74 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  at all entries i
fb30: 6e 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 44  n the union of D
fb40: 45 53 54 20 61 6e 64 20 53 52 43 20 77 69 6c 6c  EST and SRC will
fb50: 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 69 71 75   be.    ** uniqu
fb60: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64  e..    */.    ad
fb70: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
fb80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
fb90: 77 69 6e 64 2c 20 69 44 65 73 74 2c 20 30 29 3b  wind, iDest, 0);
fba0: 0a 20 20 20 20 65 6d 70 74 79 44 65 73 74 54 65  .    emptyDestTe
fbb0: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
fbc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
fbd0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  o, 0, 0);.    sq
fbe0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fbf0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d  e(v, addr1);.  }
fc00: 65 6c 73 65 7b 0a 20 20 20 20 65 6d 70 74 79 44  else{.    emptyD
fc10: 65 73 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 7d  estTest = 0;.  }
fc20: 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
fc30: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53 72 63  ble(pParse, iSrc
fc40: 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63 2c 20  , iDbSrc, pSrc, 
fc50: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
fc60: 65 6d 70 74 79 53 72 63 54 65 73 74 20 3d 20 73  emptySrcTest = s
fc70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fc80: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
fc90: 53 72 63 2c 20 30 29 3b 0a 20 20 72 65 67 44 61  Src, 0);.  regDa
fca0: 74 61 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ta = sqlite3GetT
fcb0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
fcc0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
fcd0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
fce0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 44  Parse);.  if( pD
fcf0: 65 73 74 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  est->iPKey>=0 ){
fd00: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
fd10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fd20: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63  , OP_Rowid, iSrc
fd30: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
fd40: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
fd50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fd60: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 65 73  _NotExists, iDes
fd70: 74 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  t, 0, regRowid);
fd80: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74  .    sqlite3Halt
fd90: 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 20 20  Constraint(.    
fda0: 20 20 20 20 70 50 61 72 73 65 2c 20 6f 6e 45 72      pParse, onEr
fdb0: 72 6f 72 2c 20 22 50 52 49 4d 41 52 59 20 4b 45  ror, "PRIMARY KE
fdc0: 59 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  Y must be unique
fdd0: 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
fde0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fdf0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
fe00: 3b 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65  ;.    autoIncSte
fe10: 70 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74  p(pParse, regAut
fe20: 6f 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  oinc, regRowid);
fe30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
fe40: 73 74 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 7b  st->pIndex==0 ){
fe50: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
fe60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fe70: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
fe80: 44 65 73 74 2c 20 72 65 67 52 6f 77 69 64 29 3b  Dest, regRowid);
fe90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
fea0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
feb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
fec0: 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52 6f  wid, iSrc, regRo
fed0: 77 69 64 29 3b 0a 20 20 20 20 61 73 73 65 72 74  wid);.    assert
fee0: 28 20 28 70 44 65 73 74 2d 3e 74 61 62 46 6c 61  ( (pDest->tabFla
fef0: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
ff00: 65 6d 65 6e 74 29 3d 3d 30 20 29 3b 0a 20 20 7d  ement)==0 );.  }
ff10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ff20: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
ff30: 74 61 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74  ta, iSrc, regDat
ff40: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  a);.  sqlite3Vdb
ff50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ff60: 73 65 72 74 2c 20 69 44 65 73 74 2c 20 72 65 67  sert, iDest, reg
ff70: 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64 29 3b  Data, regRowid);
ff80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
ff90: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
ffa0: 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47 5f  _NCHANGE|OPFLAG_
ffb0: 4c 41 53 54 52 4f 57 49 44 7c 4f 50 46 4c 41 47  LASTROWID|OPFLAG
ffc0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 73 71 6c 69  _APPEND);.  sqli
ffd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
ffe0: 76 2c 20 2d 31 2c 20 70 44 65 73 74 2d 3e 7a 4e  v, -1, pDest->zN
fff0: 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ame, 0);.  sqlit
10000 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10010 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63 2c 20 61  OP_Next, iSrc, a
10020 64 64 72 31 29 3b 0a 20 20 66 6f 72 28 70 44 65  ddr1);.  for(pDe
10030 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e  stIdx=pDest->pIn
10040 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b 20 70  dex; pDestIdx; p
10050 44 65 73 74 49 64 78 3d 70 44 65 73 74 49 64 78  DestIdx=pDestIdx
10060 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 66 6f  ->pNext){.    fo
10070 72 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e  r(pSrcIdx=pSrc->
10080 70 49 6e 64 65 78 3b 20 41 4c 57 41 59 53 28 70  pIndex; ALWAYS(p
10090 53 72 63 49 64 78 29 3b 20 70 53 72 63 49 64 78  SrcIdx); pSrcIdx
100a0 3d 70 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29  =pSrcIdx->pNext)
100b0 7b 0a 20 20 20 20 20 20 69 66 28 20 78 66 65 72  {.      if( xfer
100c0 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28  CompatibleIndex(
100d0 70 44 65 73 74 49 64 78 2c 20 70 53 72 63 49 64  pDestIdx, pSrcId
100e0 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  x) ) break;.    
100f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  }.    assert( pS
10100 72 63 49 64 78 20 29 3b 0a 20 20 20 20 73 71 6c  rcIdx );.    sql
10110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10120 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63  , OP_Close, iSrc
10130 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10140 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10150 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20  P_Close, iDest, 
10160 30 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  0);.    pKey = s
10170 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
10180 66 6f 28 70 50 61 72 73 65 2c 20 70 53 72 63 49  fo(pParse, pSrcI
10190 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dx);.    sqlite3
101a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
101b0 5f 4f 70 65 6e 52 65 61 64 2c 20 69 53 72 63 2c  _OpenRead, iSrc,
101c0 20 70 53 72 63 49 64 78 2d 3e 74 6e 75 6d 2c 20   pSrcIdx->tnum, 
101d0 69 44 62 53 72 63 2c 0a 20 20 20 20 20 20 20 20  iDbSrc,.        
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
101f0 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
10200 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
10210 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10220 28 76 2c 20 22 25 73 22 2c 20 70 53 72 63 49 64  (v, "%s", pSrcId
10230 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
10240 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
10250 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
10260 65 2c 20 70 44 65 73 74 49 64 78 29 3b 0a 20 20  e, pDestIdx);.  
10270 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10280 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
10290 69 74 65 2c 20 69 44 65 73 74 2c 20 70 44 65 73  ite, iDest, pDes
102a0 74 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 44  tIdx->tnum, iDbD
102b0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
102c0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
102d0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
102e0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
102f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10300 20 22 25 73 22 2c 20 70 44 65 73 74 49 64 78 2d   "%s", pDestIdx-
10310 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 61 64  >zName));.    ad
10320 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
10330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
10340 77 69 6e 64 2c 20 69 53 72 63 2c 20 30 29 3b 0a  wind, iSrc, 0);.
10350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10360 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
10370 65 79 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74  ey, iSrc, regDat
10380 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  a);.    sqlite3V
10390 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
103a0 49 64 78 49 6e 73 65 72 74 2c 20 69 44 65 73 74  IdxInsert, iDest
103b0 2c 20 72 65 67 44 61 74 61 2c 20 31 29 3b 0a 20  , regData, 1);. 
103c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
103d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
103e0 20 69 53 72 63 2c 20 61 64 64 72 31 2b 31 29 3b   iSrc, addr1+1);
103f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10400 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10410 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
10420 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10430 20 65 6d 70 74 79 53 72 63 54 65 73 74 29 3b 0a   emptySrcTest);.
10440 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
10450 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
10460 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  regRowid);.  sql
10470 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10480 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  eg(pParse, regDa
10490 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ta);.  sqlite3Vd
104a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
104b0 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a  lose, iSrc, 0);.
104c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
104d0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
104e0 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 69 66   iDest, 0);.  if
104f0 28 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20  ( emptyDestTest 
10500 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10510 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48  beAddOp2(v, OP_H
10520 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
10530 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
10540 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 65  dbeJumpHere(v, e
10550 6d 70 74 79 44 65 73 74 54 65 73 74 29 3b 0a 20  mptyDestTest);. 
10560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10570 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
10580 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 20  , iDest, 0);.   
10590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
105a0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
105b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
105c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46  * SQLITE_OMIT_XF
105d0 45 52 5f 4f 50 54 20 2a 2f 0a                    ER_OPT */.