/ Hex Artifact Content
Login

Artifact e1d20ae8979e25519c2670233718676bedcfedc9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 49 4e 53 45 52 54 20 73   handle INSERT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
0210: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 0a 2a  ode that will .*
0220: 2a 0a 2a 2a 20 20 20 28 31 29 20 61 63 71 75 69  *.**   (1) acqui
0230: 72 65 20 61 20 6c 6f 63 6b 20 66 6f 72 20 74 61  re a lock for ta
0240: 62 6c 65 20 70 54 61 62 20 74 68 65 6e 0a 2a 2a  ble pTab then.**
0250: 20 20 20 28 32 29 20 6f 70 65 6e 20 70 54 61 62     (2) open pTab
0260: 20 61 73 20 63 75 72 73 6f 72 20 69 43 75 72 2e   as cursor iCur.
0270: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 20 69  .**.** If pTab i
0280: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
0290: 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 74  D table, then it
02a0: 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
02b0: 4b 45 59 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72  KEY index.** for
02c0: 20 74 68 61 74 20 74 61 62 6c 65 20 74 68 61 74   that table that
02d0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 6f 70 65   is actually ope
02e0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
02f0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 0a 20  ite3OpenTable(. 
0300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0310: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
0320: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
0330: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
0340: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
0350: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
0360: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
0370: 20 69 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   iDb,        /* 
0380: 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
0390: 65 78 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44  ex in sqlite3.aD
03a0: 62 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  b[] */.  Table *
03b0: 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
03c0: 74 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e  table to be open
03d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  ed */.  int opco
03e0: 64 65 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70  de      /* OP_Op
03f0: 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
0400: 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20 56  nWrite */.){.  V
0410: 64 62 65 20 2a 76 3b 0a 20 20 61 73 73 65 72 74  dbe *v;.  assert
0420: 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
0430: 62 29 20 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  b) );.  v = sqli
0440: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0450: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  e);.  assert( op
0460: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
0470: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
0480: 5f 4f 70 65 6e 52 65 61 64 20 29 3b 0a 20 20 73  _OpenRead );.  s
0490: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
04a0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
04b0: 62 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20  b->tnum, .      
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70               (op
04d0: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
04e0: 74 65 29 3f 31 3a 30 2c 20 70 54 61 62 2d 3e 7a  te)?1:0, pTab->z
04f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 48 61 73  Name);.  if( Has
0500: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
0510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0520: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 63 6f 64  dOp4Int(v, opcod
0530: 65 2c 20 69 43 75 72 2c 20 70 54 61 62 2d 3e 74  e, iCur, pTab->t
0540: 6e 75 6d 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  num, iDb, pTab->
0550: 6e 43 6f 6c 29 3b 0a 20 20 20 20 56 64 62 65 43  nCol);.    VdbeC
0560: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
0570: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
0580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
0590: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
05a0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
05b0: 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65  (pTab);.    asse
05c0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
05d0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 74    assert( pPk->t
05e0: 6e 75 6d 3d 3d 70 54 61 62 2d 3e 74 6e 75 6d 20  num==pTab->tnum 
05f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
0600: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 63 6f  beAddOp3(v, opco
0610: 64 65 2c 20 69 43 75 72 2c 20 70 50 6b 2d 3e 74  de, iCur, pPk->t
0620: 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
0630: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
0640: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
0650: 50 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  Pk);.    VdbeCom
0660: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
0670: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
0680: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
0690: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
06a0: 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
06b0: 74 79 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  ty string associ
06c0: 61 74 65 64 20 77 69 74 68 20 69 6e 64 65 78 0a  ated with index.
06d0: 2a 2a 20 70 49 64 78 2e 20 41 20 63 6f 6c 75 6d  ** pIdx. A colum
06e0: 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
06f0: 67 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61 63  g has one charac
0700: 74 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ter for each col
0710: 75 6d 6e 20 69 6e 20 0a 2a 2a 20 74 68 65 20 74  umn in .** the t
0720: 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20  able, according 
0730: 74 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  to the affinity 
0740: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 3a 0a 2a  of the column:.*
0750: 2a 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72 20  *.**  Character 
0760: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66 69       Column affi
0770: 6e 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d  nity.**  -------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 41 27 20  -------.**  'A' 
07a0: 20 20 20 20 20 20 20 20 20 20 20 42 4c 4f 42 0a             BLOB.
07b0: 2a 2a 20 20 27 42 27 20 20 20 20 20 20 20 20 20  **  'B'         
07c0: 20 20 20 54 45 58 54 0a 2a 2a 20 20 27 43 27 20     TEXT.**  'C' 
07d0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45 52             NUMER
07e0: 49 43 0a 2a 2a 20 20 27 44 27 20 20 20 20 20 20  IC.**  'D'      
07f0: 20 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a 2a        INTEGER.**
0800: 20 20 27 46 27 20 20 20 20 20 20 20 20 20 20 20    'F'           
0810: 20 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 41 6e 20 65   REAL.**.** An e
0820: 78 74 72 61 20 27 44 27 20 69 73 20 61 70 70 65  xtra 'D' is appe
0830: 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20  nded to the end 
0840: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  of the string to
0850: 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 72 6f   cover the.** ro
0860: 77 69 64 20 74 68 61 74 20 61 70 70 65 61 72 73  wid that appears
0870: 20 61 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   as the last col
0880: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 69 6e 64  umn in every ind
0890: 65 78 2e 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  ex..**.** Memory
08a0: 20 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20   for the buffer 
08b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
08c0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 61 66 66 69  olumn index affi
08d0: 6e 69 74 79 20 73 74 72 69 6e 67 0a 2a 2a 20 69  nity string.** i
08e0: 73 20 6d 61 6e 61 67 65 64 20 61 6c 6f 6e 67 20  s managed along 
08f0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0900: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
0910: 74 75 72 65 2e 20 49 74 20 77 69 6c 6c 20 62 65  ture. It will be
0920: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65  .** released whe
0930: 6e 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  n sqlite3DeleteI
0940: 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64  ndex() is called
0950: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
0960: 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  *sqlite3IndexAff
0970: 69 6e 69 74 79 53 74 72 28 73 71 6c 69 74 65 33  inityStr(sqlite3
0980: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
0990: 78 29 7b 0a 20 20 69 66 28 20 21 70 49 64 78 2d  x){.  if( !pIdx-
09a0: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
09b0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  /* The first tim
09c0: 65 20 61 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  e a column affin
09d0: 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 61  ity string for a
09e0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
09f0: 78 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  x is.    ** requ
0a00: 69 72 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ired, it is allo
0a10: 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
0a20: 74 65 64 20 68 65 72 65 2e 20 49 74 20 69 73 20  ted here. It is 
0a30: 74 68 65 6e 20 73 74 6f 72 65 64 20 61 73 0a 20  then stored as. 
0a40: 20 20 20 2a 2a 20 61 20 6d 65 6d 62 65 72 20 6f     ** a member o
0a50: 66 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  f the Index stru
0a60: 63 74 75 72 65 20 66 6f 72 20 73 75 62 73 65 71  cture for subseq
0a70: 75 65 6e 74 20 75 73 65 2e 0a 20 20 20 20 2a 2a  uent use..    **
0a80: 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75  .    ** The colu
0a90: 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
0aa0: 6e 67 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  ng will eventual
0ab0: 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 62 79  ly be deleted by
0ac0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 44 65  .    ** sqliteDe
0ad0: 6c 65 74 65 49 6e 64 65 78 28 29 20 77 68 65 6e  leteIndex() when
0ae0: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
0af0: 74 75 72 65 20 69 74 73 65 6c 66 20 69 73 20 63  ture itself is c
0b00: 6c 65 61 6e 65 64 0a 20 20 20 20 2a 2a 20 75 70  leaned.    ** up
0b10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
0b20: 20 6e 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   n;.    Table *p
0b30: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
0b40: 6c 65 3b 0a 20 20 20 20 70 49 64 78 2d 3e 7a 43  le;.    pIdx->zC
0b50: 6f 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a 29  olAff = (char *)
0b60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
0b70: 61 77 28 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  aw(0, pIdx->nCol
0b80: 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  umn+1);.    if( 
0b90: 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29  !pIdx->zColAff )
0ba0: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  {.      db->mall
0bb0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
0bc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0bd0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b    }.    for(n=0;
0be0: 20 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   n<pIdx->nColumn
0bf0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31  ; n++){.      i1
0c00: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
0c10: 6c 75 6d 6e 5b 6e 5d 3b 0a 20 20 20 20 20 20 69  lumn[n];.      i
0c20: 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
0c30: 20 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66     pIdx->zColAff
0c40: 5b 6e 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  [n] = pTab->aCol
0c50: 5b 78 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [x].affinity;.  
0c60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d      }else if( x=
0c70: 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  =XN_ROWID ){.   
0c80: 20 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41       pIdx->zColA
0c90: 66 66 5b 6e 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[n] = SQLITE_A
0ca0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
0cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
0cc0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20   char aff;.     
0cd0: 20 20 20 61 73 73 65 72 74 28 20 78 3d 3d 58 4e     assert( x==XN
0ce0: 5f 45 58 50 52 20 29 3b 0a 20 20 20 20 20 20 20  _EXPR );.       
0cf0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
0d00: 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
0d10: 20 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69        aff = sqli
0d20: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
0d30: 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pIdx->aColExpr->
0d40: 61 5b 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[n].pExpr);.   
0d50: 20 20 20 20 20 69 66 28 20 61 66 66 3d 3d 30 20       if( aff==0 
0d60: 29 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  ) aff = SQLITE_A
0d70: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20  FF_BLOB;.       
0d80: 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e   pIdx->zColAff[n
0d90: 5d 20 3d 20 61 66 66 3b 0a 20 20 20 20 20 20 7d  ] = aff;.      }
0da0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d  .    }.    pIdx-
0db0: 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d 20 30 3b  >zColAff[n] = 0;
0dc0: 0a 20 20 7d 0a 20 0a 20 20 72 65 74 75 72 6e 20  .  }. .  return 
0dd0: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 3b 0a 7d  pIdx->zColAff;.}
0de0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
0df0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
0e00: 69 6e 67 20 66 6f 72 20 74 61 62 6c 65 20 70 54  ing for table pT
0e10: 61 62 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ab, if it has no
0e20: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  t already been.*
0e30: 2a 20 63 6f 6d 70 75 74 65 64 2e 20 20 41 73 20  * computed.  As 
0e40: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
0e50: 20 6f 6d 69 74 20 74 72 61 69 6c 69 6e 67 20 53   omit trailing S
0e60: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 61  QLITE_AFF_BLOB a
0e70: 66 66 69 6e 69 74 69 65 73 2e 0a 2a 2a 0a 2a 2a  ffinities..**.**
0e80: 20 49 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   If the affinity
0e90: 20 65 78 69 73 74 73 20 28 69 66 20 69 74 20 69   exists (if it i
0ea0: 73 20 6e 6f 20 65 6e 74 69 72 65 6c 79 20 53 51  s no entirely SQ
0eb0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 76 61  LITE_AFF_BLOB va
0ec0: 6c 75 65 73 29 20 61 6e 64 0a 2a 2a 20 69 66 20  lues) and.** if 
0ed0: 69 52 65 67 3e 30 20 74 68 65 6e 20 63 6f 64 65  iReg>0 then code
0ee0: 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   an OP_Affinity 
0ef0: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  opcode that will
0f00: 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
0f10: 69 65 73 0a 2a 2a 20 66 6f 72 20 72 65 67 69 73  ies.** for regis
0f20: 74 65 72 20 69 52 65 67 20 61 6e 64 20 66 6f 6c  ter iReg and fol
0f30: 6c 6f 77 69 6e 67 2e 20 20 4f 72 20 69 66 20 61  lowing.  Or if a
0f40: 66 66 69 6e 69 74 69 65 73 20 65 78 69 73 74 73  ffinities exists
0f50: 20 61 6e 64 20 69 52 65 67 3d 3d 30 2c 0a 2a 2a   and iReg==0,.**
0f60: 20 74 68 65 6e 20 6a 75 73 74 20 73 65 74 20 74   then just set t
0f70: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66  he P4 operand of
0f80: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 70   the previous op
0f90: 63 6f 64 65 20 28 77 68 69 63 68 20 73 68 6f 75  code (which shou
0fa0: 6c 64 20 20 62 65 0a 2a 2a 20 61 6e 20 4f 50 5f  ld  be.** an OP_
0fb0: 4d 61 6b 65 52 65 63 6f 72 64 29 20 74 6f 20 74  MakeRecord) to t
0fc0: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
0fd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6c 75  ng..**.** A colu
0fe0: 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
0ff0: 6e 67 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61  ng has one chara
1000: 63 74 65 72 20 70 65 72 20 63 6f 6c 75 6d 6e 3a  cter per column:
1010: 0a 2a 2a 0a 2a 2a 20 20 43 68 61 72 61 63 74 65  .**.**  Characte
1020: 72 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66  r      Column af
1030: 66 69 6e 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d  finity.**  -----
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 41  ---------.**  'A
1060: 27 20 20 20 20 20 20 20 20 20 20 20 20 42 4c 4f  '            BLO
1070: 42 0a 2a 2a 20 20 27 42 27 20 20 20 20 20 20 20  B.**  'B'       
1080: 20 20 20 20 20 54 45 58 54 0a 2a 2a 20 20 27 43       TEXT.**  'C
1090: 27 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4d  '            NUM
10a0: 45 52 49 43 0a 2a 2a 20 20 27 44 27 20 20 20 20  ERIC.**  'D'    
10b0: 20 20 20 20 20 20 20 20 49 4e 54 45 47 45 52 0a          INTEGER.
10c0: 2a 2a 20 20 27 45 27 20 20 20 20 20 20 20 20 20  **  'E'         
10d0: 20 20 20 52 45 41 4c 0a 2a 2f 0a 76 6f 69 64 20     REAL.*/.void 
10e0: 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
10f0: 6e 69 74 79 28 56 64 62 65 20 2a 76 2c 20 54 61  nity(Vdbe *v, Ta
1100: 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
1110: 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Reg){.  int i;. 
1120: 20 63 68 61 72 20 2a 7a 43 6f 6c 41 66 66 20 3d   char *zColAff =
1130: 20 70 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 3b 0a   pTab->zColAff;.
1140: 20 20 69 66 28 20 7a 43 6f 6c 41 66 66 3d 3d 30    if( zColAff==0
1150: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
1160: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62  *db = sqlite3Vdb
1170: 65 44 62 28 76 29 3b 0a 20 20 20 20 7a 43 6f 6c  eDb(v);.    zCol
1180: 41 66 66 20 3d 20 28 63 68 61 72 20 2a 29 73 71  Aff = (char *)sq
1190: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11a0: 28 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  (0, pTab->nCol+1
11b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
11c0: 41 66 66 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  Aff ){.      db-
11d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
11e0: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  1;.      return;
11f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
1200: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
1210: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  l; i++){.      z
1220: 43 6f 6c 41 66 66 5b 69 5d 20 3d 20 70 54 61 62  ColAff[i] = pTab
1230: 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69  ->aCol[i].affini
1240: 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  ty;.    }.    do
1250: 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 41 66 66 5b  {.      zColAff[
1260: 69 2d 2d 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 77  i--] = 0;.    }w
1270: 68 69 6c 65 28 20 69 3e 3d 30 20 26 26 20 7a 43  hile( i>=0 && zC
1280: 6f 6c 41 66 66 5b 69 5d 3d 3d 53 51 4c 49 54 45  olAff[i]==SQLITE
1290: 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20  _AFF_BLOB );.   
12a0: 20 70 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 20 3d   pTab->zColAff =
12b0: 20 7a 43 6f 6c 41 66 66 3b 0a 20 20 7d 0a 20 20   zColAff;.  }.  
12c0: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
12d0: 6e 33 30 28 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  n30(zColAff);.  
12e0: 69 66 28 20 69 20 29 7b 0a 20 20 20 20 69 66 28  if( i ){.    if(
12f0: 20 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 73   iReg ){.      s
1300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1310: 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
1320: 20 69 52 65 67 2c 20 69 2c 20 30 2c 20 7a 43 6f   iReg, i, 0, zCo
1330: 6c 41 66 66 2c 20 69 29 3b 0a 20 20 20 20 7d 65  lAff, i);.    }e
1340: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1350: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
1360: 2c 20 2d 31 2c 20 7a 43 6f 6c 41 66 66 2c 20 69  , -1, zColAff, i
1370: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1380: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e  /*.** Return non
1390: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 74 61 62  -zero if the tab
13a0: 6c 65 20 70 54 61 62 20 69 6e 20 64 61 74 61 62  le pTab in datab
13b0: 61 73 65 20 69 44 62 20 6f 72 20 61 6e 79 20 6f  ase iDb or any o
13c0: 66 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a  f its indices.**
13d0: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
13e0: 64 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69  d at any point i
13f0: 6e 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  n the VDBE progr
1400: 61 6d 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  am. This is used
1410: 20 74 6f 20 73 65 65 20 69 66 20 0a 2a 2a 20 61   to see if .** a
1420: 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68   statement of th
1430: 65 20 66 6f 72 6d 20 20 22 49 4e 53 45 52 54 20  e form  "INSERT 
1440: 49 4e 54 4f 20 3c 69 44 62 2c 20 70 54 61 62 3e  INTO <iDb, pTab>
1450: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 63 61 6e   SELECT ..." can
1460: 20 0a 2a 2a 20 72 75 6e 20 77 69 74 68 6f 75 74   .** run without
1470: 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
1480: 72 79 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65  ry table for the
1490: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
14a0: 53 45 4c 45 43 54 2e 20 0a 2a 2f 0a 73 74 61 74  SELECT. .*/.stat
14b0: 69 63 20 69 6e 74 20 72 65 61 64 73 54 61 62 6c  ic int readsTabl
14c0: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
14d0: 69 44 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  iDb, Table *pTab
14e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
14f0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
1500: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1510: 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
1520: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1530: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1540: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1550: 42 4c 45 0a 20 20 56 54 61 62 6c 65 20 2a 70 56  BLE.  VTable *pV
1560: 54 61 62 20 3d 20 49 73 56 69 72 74 75 61 6c 28  Tab = IsVirtual(
1570: 70 54 61 62 29 20 3f 20 73 71 6c 69 74 65 33 47  pTab) ? sqlite3G
1580: 65 74 56 54 61 62 6c 65 28 70 2d 3e 64 62 2c 20  etVTable(p->db, 
1590: 70 54 61 62 29 20 3a 20 30 3b 0a 23 65 6e 64 69  pTab) : 0;.#endi
15a0: 66 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  f..  for(i=1; i<
15b0: 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iEnd; i++){.    
15c0: 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71  VdbeOp *pOp = sq
15d0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
15e0: 2c 20 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , i);.    assert
15f0: 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20  ( pOp!=0 );.    
1600: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1610: 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 26 26 20  =OP_OpenRead && 
1620: 70 4f 70 2d 3e 70 33 3d 3d 69 44 62 20 29 7b 0a  pOp->p3==iDb ){.
1630: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e        Index *pIn
1640: 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  dex;.      int t
1650: 6e 75 6d 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  num = pOp->p2;. 
1660: 20 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 70       if( tnum==p
1670: 54 61 62 2d 3e 74 6e 75 6d 20 29 7b 0a 20 20 20  Tab->tnum ){.   
1680: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
16a0: 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
16b0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
16c0: 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
16d0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
16e0: 20 74 6e 75 6d 3d 3d 70 49 6e 64 65 78 2d 3e 74   tnum==pIndex->t
16f0: 6e 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  num ){.         
1700: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1710: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1720: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1730: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1740: 42 4c 45 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  BLE.    if( pOp-
1750: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 4f 70 65  >opcode==OP_VOpe
1760: 6e 20 26 26 20 70 4f 70 2d 3e 70 34 2e 70 56 74  n && pOp->p4.pVt
1770: 61 62 3d 3d 70 56 54 61 62 20 29 7b 0a 20 20 20  ab==pVTab ){.   
1780: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
1790: 70 34 2e 70 56 74 61 62 21 3d 30 20 29 3b 0a 20  p4.pVtab!=0 );. 
17a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
17b0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41  ->p4type==P4_VTA
17c0: 42 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  B );.      retur
17d0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  n 1;.    }.#endi
17e0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  f.  }.  return 0
17f0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1800: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
1810: 52 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 4c 6f 63  REMENT./*.** Loc
1820: 61 74 65 20 6f 72 20 63 72 65 61 74 65 20 61 6e  ate or create an
1830: 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72   AutoincInfo str
1840: 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1850: 64 20 77 69 74 68 20 74 61 62 6c 65 20 70 54 61  d with table pTa
1860: 62 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 69 6e  b.** which is in
1870: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
1880: 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1890: 74 65 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ter number for t
18a0: 68 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 74  he register.** t
18b0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6d 61  hat holds the ma
18c0: 78 69 6d 75 6d 20 72 6f 77 69 64 2e 0a 2a 2a 0a  ximum rowid..**.
18d0: 2a 2a 20 54 68 65 72 65 20 69 73 20 61 74 20 6d  ** There is at m
18e0: 6f 73 74 20 6f 6e 65 20 41 75 74 6f 69 6e 63 49  ost one AutoincI
18f0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 65  nfo structure pe
1900: 72 20 74 61 62 6c 65 20 65 76 65 6e 20 69 66 20  r table even if 
1910: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74 61 62 6c  the.** same tabl
1920: 65 20 69 73 20 61 75 74 6f 69 6e 63 72 65 6d 65  e is autoincreme
1930: 6e 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  nted multiple ti
1940: 6d 65 73 20 64 75 65 20 74 6f 20 69 6e 73 65 72  mes due to inser
1950: 74 73 20 77 69 74 68 69 6e 0a 2a 2a 20 74 72 69  ts within.** tri
1960: 67 67 65 72 73 2e 20 20 41 20 6e 65 77 20 41 75  ggers.  A new Au
1970: 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75 63 74  toincInfo struct
1980: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69  ure is created i
1990: 66 20 74 68 69 73 20 69 73 20 74 68 65 0a 2a 2a  f this is the.**
19a0: 20 66 69 72 73 74 20 75 73 65 20 6f 66 20 74 61   first use of ta
19b0: 62 6c 65 20 70 54 61 62 2e 20 20 4f 6e 20 32 6e  ble pTab.  On 2n
19c0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
19d0: 20 75 73 65 73 2c 20 74 68 65 20 6f 72 69 67 69   uses, the origi
19e0: 6e 61 6c 0a 2a 2a 20 41 75 74 6f 69 6e 63 49 6e  nal.** AutoincIn
19f0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
1a00: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 65  used..**.** Thre
1a10: 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
1a20: 6e 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ns are allocated
1a30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 52  :.**.**   (1)  R
1a40: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
1a50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1a60: 70 54 61 62 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  pTab table..**  
1a70: 20 28 32 29 20 20 52 65 67 69 73 74 65 72 20 74   (2)  Register t
1a80: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 78 69 6d  o hold the maxim
1a90: 75 6d 20 52 4f 57 49 44 20 6f 66 20 70 54 61 62  um ROWID of pTab
1aa0: 2e 0a 2a 2a 20 20 20 28 33 29 20 20 52 65 67 69  ..**   (3)  Regi
1ab0: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ster to hold the
1ac0: 20 72 6f 77 69 64 20 69 6e 20 73 71 6c 69 74 65   rowid in sqlite
1ad0: 5f 73 65 71 75 65 6e 63 65 20 6f 66 20 70 54 61  _sequence of pTa
1ae0: 62 0a 2a 2a 0a 2a 2a 20 54 68 65 20 32 6e 64 20  b.**.** The 2nd 
1af0: 72 65 67 69 73 74 65 72 20 69 73 20 74 68 65 20  register is the 
1b00: 6f 6e 65 20 74 68 61 74 20 69 73 20 72 65 74 75  one that is retu
1b10: 72 6e 65 64 2e 20 20 54 68 61 74 20 69 73 20 61  rned.  That is a
1b20: 6c 6c 20 74 68 65 0a 2a 2a 20 69 6e 73 65 72 74  ll the.** insert
1b30: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
1b40: 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 2e 0a 2a 2f  o know about..*/
1b50: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1b60: 49 6e 63 42 65 67 69 6e 28 0a 20 20 50 61 72 73  IncBegin(.  Pars
1b70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b90: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bb0: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
1bc0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 70 54 61  base holding pTa
1bd0: 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
1be0: 61 62 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ab         /* Th
1bf0: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 77  e table we are w
1c00: 72 69 74 69 6e 67 20 74 6f 20 2a 2f 0a 29 7b 0a  riting to */.){.
1c10: 20 20 69 6e 74 20 6d 65 6d 49 64 20 3d 20 30 3b    int memId = 0;
1c20: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1c30: 72 20 68 6f 6c 64 69 6e 67 20 6d 61 78 69 6d 75  r holding maximu
1c40: 6d 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 66 28  m rowid */.  if(
1c50: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
1c60: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
1c70: 6e 74 20 29 7b 0a 20 20 20 20 50 61 72 73 65 20  nt ){.    Parse 
1c80: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1c90: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1ca0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 41  l(pParse);.    A
1cb0: 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 49 6e 66  utoincInfo *pInf
1cc0: 6f 3b 0a 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20  o;..    pInfo = 
1cd0: 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63  pToplevel->pAinc
1ce0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e  ;.    while( pIn
1cf0: 66 6f 20 26 26 20 70 49 6e 66 6f 2d 3e 70 54 61  fo && pInfo->pTa
1d00: 62 21 3d 70 54 61 62 20 29 7b 20 70 49 6e 66 6f  b!=pTab ){ pInfo
1d10: 20 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65 78 74 3b   = pInfo->pNext;
1d20: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f   }.    if( pInfo
1d30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
1d40: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
1d50: 6c 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e  llocRaw(pParse->
1d60: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  db, sizeof(*pInf
1d70: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
1d80: 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
1d90: 20 30 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   0;.      pInfo-
1da0: 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70 6c 65 76  >pNext = pToplev
1db0: 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20 20 20 20  el->pAinc;.     
1dc0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e   pToplevel->pAin
1dd0: 63 20 3d 20 70 49 6e 66 6f 3b 0a 20 20 20 20 20  c = pInfo;.     
1de0: 20 70 49 6e 66 6f 2d 3e 70 54 61 62 20 3d 20 70   pInfo->pTab = p
1df0: 54 61 62 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  Tab;.      pInfo
1e00: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
1e10: 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d     pToplevel->nM
1e20: 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  em++;           
1e30: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1e40: 65 72 20 74 6f 20 68 6f 6c 64 20 6e 61 6d 65 20  er to hold name 
1e50: 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  of table */.    
1e60: 20 20 70 49 6e 66 6f 2d 3e 72 65 67 43 74 72 20    pInfo->regCtr 
1e70: 3d 20 2b 2b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e  = ++pToplevel->n
1e80: 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78 20 72 6f 77  Mem;  /* Max row
1e90: 69 64 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  id register */. 
1ea0: 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1eb0: 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20  nMem++;         
1ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
1ed0: 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  d in sqlite_sequ
1ee0: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ence */.    }.  
1ef0: 20 20 6d 65 6d 49 64 20 3d 20 70 49 6e 66 6f 2d    memId = pInfo-
1f00: 3e 72 65 67 43 74 72 3b 0a 20 20 7d 0a 20 20 72  >regCtr;.  }.  r
1f10: 65 74 75 72 6e 20 6d 65 6d 49 64 3b 0a 7d 0a 0a  eturn memId;.}..
1f20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f30: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
1f40: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74  e that will init
1f50: 69 61 6c 69 7a 65 20 61 6c 6c 20 6f 66 20 74 68  ialize all of th
1f60: 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 75 73  e.** register us
1f70: 65 64 20 62 79 20 74 68 65 20 61 75 74 6f 69 6e  ed by the autoin
1f80: 63 72 65 6d 65 6e 74 20 74 72 61 63 6b 65 72 2e  crement tracker.
1f90: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
1fa0: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
1fb0: 65 67 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  egin(Parse *pPar
1fc0: 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63 49 6e  se){.  AutoincIn
1fd0: 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  fo *p;          
1fe0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1ff0: 20 61 62 6f 75 74 20 61 6e 20 41 55 54 4f 49 4e   about an AUTOIN
2000: 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 73 71 6c  CREMENT */.  sql
2010: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
2020: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
2030: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2040: 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  on */.  Db *pDb;
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
2070: 6e 6c 79 20 61 75 74 6f 69 6e 63 20 74 61 62 6c  nly autoinc tabl
2080: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 49 64  e */.  int memId
2090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
20b0: 6c 64 69 6e 67 20 6d 61 78 20 72 6f 77 69 64 20  lding max rowid 
20c0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20  */.  int addr;  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 2f 2a 20 41 20 56 44 42 45 20 61 64 64 72 65 73  /* A VDBE addres
20f0: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
2100: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
2110: 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72 20    /* VDBE under 
2120: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
2130: 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2140: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
2150: 65 64 20 64 75 72 69 6e 67 20 74 72 69 67 67 65  ed during trigge
2160: 72 2d 67 65 6e 65 72 61 74 69 6f 6e 2e 20 20 49  r-generation.  I
2170: 74 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79 20 63  t is.  ** only c
2180: 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 74  alled from the t
2190: 6f 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20 20 61 73  op-level */.  as
21a0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 54  sert( pParse->pT
21b0: 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29 3b 0a  riggerTab==0 );.
21c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21d0: 33 49 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  3IsToplevel(pPar
21e0: 73 65 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  se) );..  assert
21f0: 28 20 76 20 29 3b 20 20 20 2f 2a 20 57 65 20 66  ( v );   /* We f
2200: 61 69 6c 65 64 20 6c 6f 6e 67 20 61 67 6f 20 69  ailed long ago i
2210: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  f this is not so
2220: 20 2a 2f 0a 20 20 66 6f 72 28 70 20 3d 20 70 50   */.  for(p = pP
2230: 61 72 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20  arse->pAinc; p; 
2240: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  p = p->pNext){. 
2250: 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44     pDb = &db->aD
2260: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 6d  b[p->iDb];.    m
2270: 65 6d 49 64 20 3d 20 70 2d 3e 72 65 67 43 74 72  emId = p->regCtr
2280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
2290: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
22a0: 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 44 62 2d  Held(db, 0, pDb-
22b0: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
22c0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
22d0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  e(pParse, 0, p->
22e0: 69 44 62 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  iDb, pDb->pSchem
22f0: 61 2d 3e 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f  a->pSeqTab, OP_O
2300: 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 73 71  penRead);.    sq
2310: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2320: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 6d  v, OP_Null, 0, m
2330: 65 6d 49 64 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a  emId, memId+1);.
2340: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
2350: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2360: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
2370: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
2380: 76 2c 20 6d 65 6d 49 64 2d 31 2c 20 70 2d 3e 70  v, memId-1, p->p
2390: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
23a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23b0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
23c0: 20 30 2c 20 61 64 64 72 2b 39 29 3b 20 56 64 62   0, addr+9); Vdb
23d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
23e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2400: 2c 20 30 2c 20 30 2c 20 6d 65 6d 49 64 29 3b 0a  , 0, 0, memId);.
2410: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2420: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp3(v, OP_Ne, 
2430: 6d 65 6d 49 64 2d 31 2c 20 61 64 64 72 2b 37 2c  memId-1, addr+7,
2440: 20 6d 65 6d 49 64 29 3b 20 56 64 62 65 43 6f 76   memId); VdbeCov
2450: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
2460: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2470: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  5(v, SQLITE_JUMP
2480: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c  IFNULL);.    sql
2490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24a0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 6d  , OP_Rowid, 0, m
24b0: 65 6d 49 64 2b 31 29 3b 0a 20 20 20 20 73 71 6c  emId+1);.    sql
24c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
24d0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20  , OP_Column, 0, 
24e0: 31 2c 20 6d 65 6d 49 64 29 3b 0a 20 20 20 20 73  1, memId);.    s
24f0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2500: 2c 20 61 64 64 72 2b 39 29 3b 0a 20 20 20 20 73  , addr+9);.    s
2510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2520: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20  (v, OP_Next, 0, 
2530: 61 64 64 72 2b 32 29 3b 20 56 64 62 65 43 6f 76  addr+2); VdbeCov
2540: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
2550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2560: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2570: 2c 20 6d 65 6d 49 64 29 3b 0a 20 20 20 20 73 71  , memId);.    sq
2580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
2590: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
25a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
25b0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f  e the maximum ro
25c0: 77 69 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 69  wid for an autoi
25d0: 6e 63 72 65 6d 65 6e 74 20 63 61 6c 63 75 6c 61  ncrement calcula
25e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
25f0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2600: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
2610: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
2620: 61 63 6b 20 68 6f 6c 64 73 20 61 0a 2a 2a 20 6e  ack holds a.** n
2630: 65 77 20 72 6f 77 69 64 20 74 68 61 74 20 69 73  ew rowid that is
2640: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 69 6e 73   about to be ins
2650: 65 72 74 65 64 2e 20 20 49 66 20 74 68 61 74 20  erted.  If that 
2660: 6e 65 77 20 72 6f 77 69 64 20 69 73 0a 2a 2a 20  new rowid is.** 
2670: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2680: 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 69 6e  maximum rowid in
2690: 20 74 68 65 20 6d 65 6d 49 64 20 6d 65 6d 6f 72   the memId memor
26a0: 79 20 63 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  y cell, then the
26b0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  .** memory cell 
26c0: 69 73 20 75 70 64 61 74 65 64 2e 20 20 54 68 65  is updated.  The
26d0: 20 73 74 61 63 6b 20 69 73 20 75 6e 63 68 61 6e   stack is unchan
26e0: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ged..*/.static v
26f0: 6f 69 64 20 61 75 74 6f 49 6e 63 53 74 65 70 28  oid autoIncStep(
2700: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
2710: 6e 74 20 6d 65 6d 49 64 2c 20 69 6e 74 20 72 65  nt memId, int re
2720: 67 52 6f 77 69 64 29 7b 0a 20 20 69 66 28 20 6d  gRowid){.  if( m
2730: 65 6d 49 64 3e 30 20 29 7b 0a 20 20 20 20 73 71  emId>0 ){.    sq
2740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2750: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
2760: 50 5f 4d 65 6d 4d 61 78 2c 20 6d 65 6d 49 64 2c  P_MemMax, memId,
2770: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a   regRowid);.  }.
2780: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2790: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
27a0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
27b0: 74 6f 20 77 72 69 74 65 20 61 75 74 6f 69 6e 63  to write autoinc
27c0: 72 65 6d 65 6e 74 0a 2a 2a 20 6d 61 78 69 6d 75  rement.** maximu
27d0: 6d 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 62  m rowid values b
27e0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 71 6c  ack into the sql
27f0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 72 65 67  ite_sequence reg
2800: 69 73 74 65 72 2e 0a 2a 2a 20 45 76 65 72 79 20  ister..** Every 
2810: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6d  statement that m
2820: 69 67 68 74 20 64 6f 20 61 6e 20 49 4e 53 45 52  ight do an INSER
2830: 54 20 69 6e 74 6f 20 61 6e 20 61 75 74 6f 69 6e  T into an autoin
2840: 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 61 62 6c 65  crement.** table
2850: 20 28 65 69 74 68 65 72 20 64 69 72 65 63 74 6c   (either directl
2860: 79 20 6f 72 20 74 68 72 6f 75 67 68 20 74 72 69  y or through tri
2870: 67 67 65 72 73 29 20 6e 65 65 64 73 20 74 6f 20  ggers) needs to 
2880: 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
2890: 74 69 6e 65 20 6a 75 73 74 20 62 65 66 6f 72 65  tine just before
28a0: 20 74 68 65 20 22 65 78 69 74 22 20 63 6f 64 65   the "exit" code
28b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28c0: 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e  3AutoincrementEn
28d0: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  d(Parse *pParse)
28e0: 7b 0a 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20  {.  AutoincInfo 
28f0: 2a 70 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  *p;.  Vdbe *v = 
2900: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2910: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2920: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73  Parse->db;..  as
2930: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 66 6f 72  sert( v );.  for
2940: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 41 69  (p = pParse->pAi
2950: 6e 63 3b 20 70 3b 20 70 20 3d 20 70 2d 3e 70 4e  nc; p; p = p->pN
2960: 65 78 74 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  ext){.    Db *pD
2970: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  b = &db->aDb[p->
2980: 69 44 62 5d 3b 0a 20 20 20 20 69 6e 74 20 61 64  iDb];.    int ad
2990: 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 69 52 65  dr1;.    int iRe
29a0: 63 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 49 64  c;.    int memId
29b0: 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b 0a 0a 20   = p->regCtr;.. 
29c0: 20 20 20 69 52 65 63 20 3d 20 73 71 6c 69 74 65     iRec = sqlite
29d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
29e0: 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
29f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2a00: 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
2a10: 44 62 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  Db->pSchema) );.
2a20: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
2a30: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
2a40: 70 2d 3e 69 44 62 2c 20 70 44 62 2d 3e 70 53 63  p->iDb, pDb->pSc
2a50: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 2c 20 4f  hema->pSeqTab, O
2a60: 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20  P_OpenWrite);.  
2a70: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
2a80: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2a90: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 6d 65 6d 49 64  P_NotNull, memId
2aa0: 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
2ab0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
2ac0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ad0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 6d  P_NewRowid, 0, m
2ae0: 65 6d 49 64 2b 31 29 3b 0a 20 20 20 20 73 71 6c  emId+1);.    sql
2af0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2b00: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
2b10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b20: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
2b30: 72 64 2c 20 6d 65 6d 49 64 2d 31 2c 20 32 2c 20  rd, memId-1, 2, 
2b40: 69 52 65 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  iRec);.    sqlit
2b50: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b60: 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 69 52  OP_Insert, 0, iR
2b70: 65 63 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a 20 20  ec, memId+1);.  
2b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2b90: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2ba0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
2bb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
2bc0: 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 20  , OP_Close);.   
2bd0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2be0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
2bf0: 52 65 63 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  Rec);.  }.}.#els
2c00: 65 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  e./*.** If SQLIT
2c10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
2c20: 4d 45 4e 54 20 69 73 20 64 65 66 69 6e 65 64 2c  MENT is defined,
2c30: 20 74 68 65 6e 20 74 68 65 20 74 68 72 65 65 20   then the three 
2c40: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 62 6f 76  routines.** abov
2c50: 65 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  e are all no-ops
2c60: 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 61 75 74  .*/.# define aut
2c70: 6f 49 6e 63 42 65 67 69 6e 28 41 2c 42 2c 43 29  oIncBegin(A,B,C)
2c80: 20 28 30 29 0a 23 20 64 65 66 69 6e 65 20 61 75   (0).# define au
2c90: 74 6f 49 6e 63 53 74 65 70 28 41 2c 42 2c 43 29  toIncStep(A,B,C)
2ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cb0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
2cc0: 4d 45 4e 54 20 2a 2f 0a 0a 0a 2f 2a 20 46 6f 72  MENT */.../* For
2cd0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
2ce0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 78   */.static int x
2cf0: 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  ferOptimization(
2d00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2d10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
2d20: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2d30: 54 61 62 6c 65 20 2a 70 44 65 73 74 2c 20 20 20  Table *pDest,   
2d40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2d50: 6c 65 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  le we are insert
2d60: 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65  ing into */.  Se
2d70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
2d80: 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20      /* A SELECT 
2d90: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 73 65  statement to use
2da0: 20 61 73 20 74 68 65 20 64 61 74 61 20 73 6f 75   as the data sou
2db0: 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  rce */.  int onE
2dc0: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
2dd0: 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20  * How to handle 
2de0: 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72  constraint error
2df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 44 65  s */.  int iDbDe
2e00: 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st           /* 
2e10: 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 66 20  The database of 
2e20: 70 44 65 73 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  pDest */.);../*.
2e30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2e40: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e  is called to han
2e50: 64 6c 65 20 53 51 4c 20 6f 66 20 74 68 65 20 66  dle SQL of the f
2e60: 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
2e70: 2a 2a 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74 20  **.**    insert 
2e80: 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c 49  into TABLE (IDLI
2e90: 53 54 29 20 76 61 6c 75 65 73 28 45 58 50 52 4c  ST) values(EXPRL
2ea0: 49 53 54 29 2c 28 45 58 50 52 4c 49 53 54 29 2c  IST),(EXPRLIST),
2eb0: 2e 2e 2e 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74  ....**    insert
2ec0: 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c   into TABLE (IDL
2ed0: 49 53 54 29 20 73 65 6c 65 63 74 0a 2a 2a 20 20  IST) select.**  
2ee0: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41    insert into TA
2ef0: 42 4c 45 20 28 49 44 4c 49 53 54 29 20 64 65 66  BLE (IDLIST) def
2f00: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 0a 2a  ault values.**.*
2f10: 2a 20 54 68 65 20 49 44 4c 49 53 54 20 66 6f 6c  * The IDLIST fol
2f20: 6c 6f 77 69 6e 67 20 74 68 65 20 74 61 62 6c 65  lowing the table
2f30: 20 6e 61 6d 65 20 69 73 20 61 6c 77 61 79 73 20   name is always 
2f40: 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 6f 6d  optional.  If om
2f50: 69 74 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 61  itted,.** then a
2f60: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 28 6e 6f   list of all (no
2f70: 6e 2d 68 69 64 64 65 6e 29 20 63 6f 6c 75 6d 6e  n-hidden) column
2f80: 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  s for the table 
2f90: 69 73 20 73 75 62 73 74 69 74 75 74 65 64 2e 0a  is substituted..
2fa0: 2a 2a 20 54 68 65 20 49 44 4c 49 53 54 20 61 70  ** The IDLIST ap
2fb0: 70 65 61 72 73 20 69 6e 20 74 68 65 20 70 43 6f  pears in the pCo
2fc0: 6c 75 6d 6e 20 70 61 72 61 6d 65 74 65 72 2e 20  lumn parameter. 
2fd0: 20 70 43 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c   pColumn is NULL
2fe0: 20 69 66 20 49 44 4c 49 53 54 0a 2a 2a 20 69 73   if IDLIST.** is
2ff0: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   omitted..**.** 
3000: 46 6f 72 20 74 68 65 20 70 53 65 6c 65 63 74 20  For the pSelect 
3010: 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20  parameter holds 
3020: 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
3030: 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68   inserted for th
3040: 65 0a 2a 2a 20 66 69 72 73 74 20 74 77 6f 20 66  e.** first two f
3050: 6f 72 6d 73 20 73 68 6f 77 6e 20 61 62 6f 76 65  orms shown above
3060: 2e 20 20 41 20 56 41 4c 55 45 53 20 63 6c 61 75  .  A VALUES clau
3070: 73 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  se is really jus
3080: 74 20 73 68 6f 72 74 2d 68 61 6e 64 0a 2a 2a 20  t short-hand.** 
3090: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
30a0: 74 65 6d 65 6e 74 20 74 68 61 74 20 6f 6d 69 74  tement that omit
30b0: 73 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  s the FROM claus
30c0: 65 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67  e and everything
30d0: 20 65 6c 73 65 0a 2a 2a 20 74 68 61 74 20 66 6f   else.** that fo
30e0: 6c 6c 6f 77 73 2e 20 20 49 66 20 74 68 65 20 70  llows.  If the p
30f0: 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74 65 72  Select parameter
3100: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d   is NULL, that m
3110: 65 61 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  eans that the.**
3120: 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20   DEFAULT VALUES 
3130: 66 6f 72 6d 20 6f 66 20 74 68 65 20 49 4e 53 45  form of the INSE
3140: 52 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  RT statement is 
3150: 69 6e 74 65 6e 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  intended..**.** 
3160: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
3170: 65 64 20 66 6f 6c 6c 6f 77 73 20 6f 6e 65 20 6f  ed follows one o
3180: 66 20 66 6f 75 72 20 74 65 6d 70 6c 61 74 65 73  f four templates
3190: 2e 20 20 46 6f 72 20 61 20 73 69 6d 70 6c 65 0a  .  For a simple.
31a0: 2a 2a 20 69 6e 73 65 72 74 20 77 69 74 68 20 64  ** insert with d
31b0: 61 74 61 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  ata coming from 
31c0: 61 20 73 69 6e 67 6c 65 2d 72 6f 77 20 56 41 4c  a single-row VAL
31d0: 55 45 53 20 63 6c 61 75 73 65 2c 20 74 68 65 20  UES clause, the 
31e0: 63 6f 64 65 20 65 78 65 63 75 74 65 73 0a 2a 2a  code executes.**
31f0: 20 6f 6e 63 65 20 73 74 72 61 69 67 68 74 20 64   once straight d
3200: 6f 77 6e 20 74 68 72 6f 75 67 68 2e 20 20 50 73  own through.  Ps
3210: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 6c 6c 6f 77  eudo-code follow
3220: 73 20 28 77 65 20 63 61 6c 6c 20 74 68 69 73 0a  s (we call this.
3230: 2a 2a 20 74 68 65 20 22 31 73 74 20 74 65 6d 70  ** the "1st temp
3240: 6c 61 74 65 22 29 3a 0a 2a 2a 0a 2a 2a 20 20 20  late"):.**.**   
3250: 20 20 20 20 20 20 6f 70 65 6e 20 77 72 69 74 65        open write
3260: 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c   cursor to <tabl
3270: 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63  e> and its indic
3280: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 75  es.**         pu
3290: 74 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20  t VALUES clause 
32a0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f  expressions into
32b0: 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
32c0: 20 20 20 20 20 20 77 72 69 74 65 20 74 68 65 20        write the 
32d0: 72 65 73 75 6c 74 69 6e 67 20 72 65 63 6f 72 64  resulting record
32e0: 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a   into <table>.**
32f0: 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
3300: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 65  .**.** The three
3310: 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 6d 70 6c   remaining templ
3320: 61 74 65 73 20 61 73 73 75 6d 65 20 74 68 65 20  ates assume the 
3330: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
3340: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
3350: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61   INSERT INTO <ta
3360: 62 6c 65 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 0a  ble> SELECT ....
3370: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  **.** If the SEL
3380: 45 43 54 20 63 6c 61 75 73 65 20 69 73 20 6f 66  ECT clause is of
3390: 20 74 68 65 20 72 65 73 74 72 69 63 74 65 64 20   the restricted 
33a0: 66 6f 72 6d 20 22 53 45 4c 45 43 54 20 2a 20 46  form "SELECT * F
33b0: 52 4f 4d 20 3c 74 61 62 6c 65 32 3e 22 20 2d 0a  ROM <table2>" -.
33c0: 2a 2a 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** in other word
33d0: 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
33e0: 70 75 6c 6c 73 20 61 6c 6c 20 63 6f 6c 75 6d 6e  pulls all column
33f0: 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  s from a single 
3400: 74 61 62 6c 65 0a 2a 2a 20 61 6e 64 20 74 68 65  table.** and the
3410: 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f  re is no WHERE o
3420: 72 20 4c 49 4d 49 54 20 6f 72 20 47 52 4f 55 50  r LIMIT or GROUP
3430: 20 42 59 20 6f 72 20 4f 52 44 45 52 20 42 59 20   BY or ORDER BY 
3440: 63 6c 61 75 73 65 73 2c 20 61 6e 64 0a 2a 2a 20  clauses, and.** 
3450: 69 66 20 3c 74 61 62 6c 65 32 3e 20 61 6e 64 20  if <table2> and 
3460: 3c 74 61 62 6c 65 31 3e 20 61 72 65 20 64 69 73  <table1> are dis
3470: 74 69 6e 63 74 20 74 61 62 6c 65 73 20 62 75 74  tinct tables but
3480: 20 68 61 76 65 20 69 64 65 6e 74 69 63 61 6c 0a   have identical.
3490: 2a 2a 20 73 63 68 65 6d 61 73 2c 20 69 6e 63 6c  ** schemas, incl
34a0: 75 64 69 6e 67 20 61 6c 6c 20 74 68 65 20 73 61  uding all the sa
34b0: 6d 65 20 69 6e 64 69 63 65 73 2c 20 74 68 65 6e  me indices, then
34c0: 20 61 20 73 70 65 63 69 61 6c 20 6f 70 74 69 6d   a special optim
34d0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 69 6e  ization.** is in
34e0: 76 6f 6b 65 64 20 74 68 61 74 20 63 6f 70 69 65  voked that copie
34f0: 73 20 72 61 77 20 72 65 63 6f 72 64 73 20 66 72  s raw records fr
3500: 6f 6d 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72  om <table2> over
3510: 20 74 6f 20 3c 74 61 62 6c 65 31 3e 2e 0a 2a 2a   to <table1>..**
3520: 20 53 65 65 20 74 68 65 20 78 66 65 72 4f 70 74   See the xferOpt
3530: 69 6d 69 7a 61 74 69 6f 6e 28 29 20 66 75 6e 63  imization() func
3540: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 69 6d 70  tion for the imp
3550: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3560: 68 69 73 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 2e  his.** template.
3570: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 32 6e    This is the 2n
3580: 64 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a  d template..**.*
3590: 2a 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61  *         open a
35a0: 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f   write cursor to
35b0: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20   <table>.**     
35c0: 20 20 20 20 6f 70 65 6e 20 72 65 61 64 20 63 75      open read cu
35d0: 72 73 6f 72 20 6f 6e 20 3c 74 61 62 6c 65 32 3e  rsor on <table2>
35e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 72 61 6e  .**         tran
35f0: 73 66 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73  sfer all records
3600: 20 69 6e 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65   in <table2> ove
3610: 72 20 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20  r to <table>.** 
3620: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75          close cu
3630: 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  rsors.**        
3640: 20 66 6f 72 65 61 63 68 20 69 6e 64 65 78 20 6f   foreach index o
3650: 6e 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20  n <table>.**    
3660: 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20 77 72         open a wr
3670: 69 74 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  ite cursor on th
3680: 65 20 3c 74 61 62 6c 65 3e 20 69 6e 64 65 78 0a  e <table> index.
3690: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f 70 65  **           ope
36a0: 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 20  n a read cursor 
36b0: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
36c0: 64 69 6e 67 20 3c 74 61 62 6c 65 32 3e 20 69 6e  ding <table2> in
36d0: 64 65 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  dex.**          
36e0: 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 65   transfer all re
36f0: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 72  cords from the r
3700: 65 61 64 20 74 6f 20 74 68 65 20 77 72 69 74 65  ead to the write
3710: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20   cursors.**     
3720: 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73        close curs
3730: 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ors.**         e
3740: 6e 64 20 66 6f 72 65 61 63 68 0a 2a 2a 0a 2a 2a  nd foreach.**.**
3750: 20 54 68 65 20 33 72 64 20 74 65 6d 70 6c 61 74   The 3rd templat
3760: 65 20 69 73 20 66 6f 72 20 77 68 65 6e 20 74 68  e is for when th
3770: 65 20 73 65 63 6f 6e 64 20 74 65 6d 70 6c 61 74  e second templat
3780: 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79  e does not apply
3790: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 53 45 4c 45  .** and the SELE
37a0: 43 54 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  CT clause does n
37b0: 6f 74 20 72 65 61 64 20 66 72 6f 6d 20 3c 74 61  ot read from <ta
37c0: 62 6c 65 3e 20 61 74 20 61 6e 79 20 74 69 6d 65  ble> at any time
37d0: 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74  ..** The generat
37e0: 65 64 20 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20  ed code follows 
37f0: 74 68 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a  this template:.*
3800: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c  *.**         X <
3810: 2d 20 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67  - A.**         g
3820: 6f 74 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a  oto B.**      A:
3830: 20 73 65 74 75 70 20 66 6f 72 20 74 68 65 20 53   setup for the S
3840: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
3850: 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 72   loop over the r
3860: 6f 77 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ows in the SELEC
3870: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c  T.**           l
3880: 6f 61 64 20 76 61 6c 75 65 73 20 69 6e 74 6f 20  oad values into 
3890: 72 65 67 69 73 74 65 72 73 20 52 2e 2e 52 2b 6e  registers R..R+n
38a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 79 69  .**           yi
38b0: 65 6c 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20  eld X.**        
38c0: 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20   end loop.**    
38d0: 20 20 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74       cleanup aft
38e0: 65 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  er the SELECT.**
38f0: 20 20 20 20 20 20 20 20 20 65 6e 64 2d 63 6f 72           end-cor
3900: 6f 75 74 69 6e 65 20 58 0a 2a 2a 20 20 20 20 20  outine X.**     
3910: 20 42 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63   B: open write c
3920: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3930: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
3940: 0a 2a 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c  .**      C: yiel
3950: 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f  d X, at EOF goto
3960: 20 44 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e   D.**         in
3970: 73 65 72 74 20 74 68 65 20 73 65 6c 65 63 74 20  sert the select 
3980: 72 65 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62  result into <tab
3990: 6c 65 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a  le> from R..R+n.
39a0: 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  **         goto 
39b0: 43 0a 2a 2a 20 20 20 20 20 20 44 3a 20 63 6c 65  C.**      D: cle
39c0: 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 34  anup.**.** The 4
39d0: 74 68 20 74 65 6d 70 6c 61 74 65 20 69 73 20 75  th template is u
39e0: 73 65 64 20 69 66 20 74 68 65 20 69 6e 73 65 72  sed if the inser
39f0: 74 20 73 74 61 74 65 6d 65 6e 74 20 74 61 6b 65  t statement take
3a00: 73 20 69 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20  s its.** values 
3a10: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 62 75  from a SELECT bu
3a20: 74 20 74 68 65 20 64 61 74 61 20 69 73 20 62 65  t the data is be
3a30: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74  ing inserted int
3a40: 6f 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61  o a table.** tha
3a50: 74 20 69 73 20 61 6c 73 6f 20 72 65 61 64 20 61  t is also read a
3a60: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 45  s part of the SE
3a70: 4c 45 43 54 2e 20 20 49 6e 20 74 68 65 20 74 68  LECT.  In the th
3a80: 69 72 64 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20  ird form,.** we 
3a90: 68 61 76 65 20 74 6f 20 75 73 65 20 61 6e 20 69  have to use an i
3aa0: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
3ab0: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72  e to store the r
3ac0: 65 73 75 6c 74 73 20 6f 66 0a 2a 2a 20 74 68 65  esults of.** the
3ad0: 20 73 65 6c 65 63 74 2e 20 20 54 68 65 20 74 65   select.  The te
3ae0: 6d 70 6c 61 74 65 20 69 73 20 6c 69 6b 65 20 74  mplate is like t
3af0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
3b00: 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20     X <- A.**    
3b10: 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20       goto B.**  
3b20: 20 20 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72      A: setup for
3b30: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3b40: 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72         loop over
3b50: 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74   the tables in t
3b60: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
3b70: 20 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75         load valu
3b80: 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
3b90: 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20  R..R+n.**       
3ba0: 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20      yield X.**  
3bb0: 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a         end loop.
3bc0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e  **         clean
3bd0: 75 70 20 61 66 74 65 72 20 74 68 65 20 53 45 4c  up after the SEL
3be0: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ECT.**         e
3bf0: 6e 64 20 63 6f 2d 72 6f 75 74 69 6e 65 20 52 0a  nd co-routine R.
3c00: 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20  **      B: open 
3c10: 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20  temp table.**   
3c20: 20 20 20 4c 3a 20 79 69 65 6c 64 20 58 2c 20 61     L: yield X, a
3c30: 74 20 45 4f 46 20 67 6f 74 6f 20 4d 0a 2a 2a 20  t EOF goto M.** 
3c40: 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20 72          insert r
3c50: 6f 77 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69  ow from R..R+n i
3c60: 6e 74 6f 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a  nto temp table.*
3c70: 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c  *         goto L
3c80: 0a 2a 2a 20 20 20 20 20 20 4d 3a 20 6f 70 65 6e  .**      M: open
3c90: 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f   write cursor to
3ca0: 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73   <table> and its
3cb0: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20   indices.**     
3cc0: 20 20 20 20 72 65 77 69 6e 64 20 74 65 6d 70 20      rewind temp 
3cd0: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 43 3a  table.**      C:
3ce0: 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20   loop over rows 
3cf0: 6f 66 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  of intermediate 
3d00: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
3d10: 20 20 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75     transfer valu
3d20: 65 73 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64  es form intermed
3d30: 69 61 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20  iate table into 
3d40: 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20  <table>.**      
3d50: 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20     end loop.**  
3d60: 20 20 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a      D: cleanup.*
3d70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e  /.void sqlite3In
3d80: 73 65 72 74 28 0a 20 20 50 61 72 73 65 20 2a 70  sert(.  Parse *p
3d90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
3da0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
3db0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
3dc0: 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20 4e 61  abList,    /* Na
3dd0: 6d 65 20 6f 66 20 74 61 62 6c 65 20 69 6e 74 6f  me of table into
3de0: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e   which we are in
3df0: 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c  serting */.  Sel
3e00: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
3e10: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
3e20: 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20  tatement to use 
3e30: 61 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  as the data sour
3e40: 63 65 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  ce */.  IdList *
3e50: 70 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  pColumn,      /*
3e60: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 6f   Column names co
3e70: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 49  rresponding to I
3e80: 44 4c 49 53 54 2e 20 2a 2f 0a 20 20 69 6e 74 20  DLIST. */.  int 
3e90: 6f 6e 45 72 72 6f 72 20 20 20 20 20 20 20 20 20  onError         
3ea0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64    /* How to hand
3eb0: 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72  le constraint er
3ec0: 72 6f 72 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  rors */.){.  sql
3ed0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
3ee0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
3ef0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
3f00: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
3f10: 61 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab;          /* 
3f20: 54 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 73  The table to ins
3f30: 65 72 74 20 69 6e 74 6f 2e 20 20 61 6b 61 20 54  ert into.  aka T
3f40: 41 42 4c 45 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ABLE */.  char *
3f50: 7a 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  zTab;           
3f60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3f70: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
3f80: 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67  we are inserting
3f90: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3fa0: 20 2a 7a 44 62 3b 20 20 20 20 20 20 2f 2a 20 4e   *zDb;      /* N
3fb0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
3fc0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 69 73  ase holding this
3fd0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
3fe0: 69 2c 20 6a 2c 20 69 64 78 3b 20 20 20 20 20 20  i, j, idx;      
3ff0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4000: 72 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  rs */.  Vdbe *v;
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4020: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
4030: 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
4040: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 49 6e   machine */.  In
4050: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
4060: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
4070: 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20  ng over indices 
4080: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
4090: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
40a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
40b0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
40c0: 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
40d0: 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 20 20  t nHidden = 0;  
40e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40f0: 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20   hidden columns 
4100: 69 66 20 54 41 42 4c 45 20 69 73 20 76 69 72 74  if TABLE is virt
4110: 75 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ual */.  int iDa
4120: 74 61 43 75 72 20 3d 20 30 3b 20 20 20 20 20 2f  taCur = 0;     /
4130: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 74 68  * VDBE cursor th
4140: 61 74 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64  at is the main d
4150: 61 74 61 20 72 65 70 6f 73 69 74 6f 72 79 20 2a  ata repository *
4160: 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
4170: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 46 69 72  = 0;      /* Fir
4180: 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  st index cursor 
4190: 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 43 6f 6c 75  */.  int ipkColu
41a0: 6d 6e 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 43 6f  mn = -1;   /* Co
41b0: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 74 68 65  lumn that is the
41c0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
41d0: 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20 65 6e   KEY */.  int en
41e0: 64 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  dOfLoop;        
41f0: 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
4200: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 73 65   end of the inse
4210: 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20  rtion loop */.  
4220: 69 6e 74 20 73 72 63 54 61 62 20 3d 20 30 3b 20  int srcTab = 0; 
4230: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 63 6f        /* Data co
4240: 6d 65 73 20 66 72 6f 6d 20 74 68 69 73 20 74 65  mes from this te
4250: 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69  mporary cursor i
4260: 66 20 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 61  f >=0 */.  int a
4270: 64 64 72 49 6e 73 54 6f 70 20 3d 20 30 3b 20 20  ddrInsTop = 0;  
4280: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 6c 61 62 65   /* Jump to labe
4290: 6c 20 22 44 22 20 2a 2f 0a 20 20 69 6e 74 20 61  l "D" */.  int a
42a0: 64 64 72 43 6f 6e 74 20 3d 20 30 3b 20 20 20 20  ddrCont = 0;    
42b0: 20 2f 2a 20 54 6f 70 20 6f 66 20 69 6e 73 65 72   /* Top of inser
42c0: 74 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 22 43  t loop. Label "C
42d0: 22 20 69 6e 20 74 65 6d 70 6c 61 74 65 73 20 33  " in templates 3
42e0: 20 61 6e 64 20 34 20 2a 2f 0a 20 20 53 65 6c 65   and 4 */.  Sele
42f0: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
4300: 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
4310: 20 66 6f 72 20 53 45 4c 45 43 54 20 6f 6e 20 72   for SELECT on r
4320: 68 73 20 6f 66 20 49 4e 53 45 52 54 20 2a 2f 0a  hs of INSERT */.
4330: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
4340: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
4350: 20 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c   of database hol
4360: 64 69 6e 67 20 54 41 42 4c 45 20 2a 2f 0a 20 20  ding TABLE */.  
4370: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
4380: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4390: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
43a0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 73   table being ins
43b0: 65 72 74 65 64 20 69 6e 74 6f 20 2a 2f 0a 20 20  erted into */.  
43c0: 75 38 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  u8 useTempTable 
43d0: 3d 20 30 3b 20 20 2f 2a 20 53 74 6f 72 65 20 53  = 0;  /* Store S
43e0: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 69 6e  ELECT results in
43f0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61   intermediate ta
4400: 62 6c 65 20 2a 2f 0a 20 20 75 38 20 61 70 70 65  ble */.  u8 appe
4410: 6e 64 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 2f  ndFlag = 0;    /
4420: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 69 6e  * True if the in
4430: 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74  sert is likely t
4440: 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 20 2a  o be an append *
4450: 2f 0a 20 20 75 38 20 77 69 74 68 6f 75 74 52 6f  /.  u8 withoutRo
4460: 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 30 20 66  wid;      /* 0 f
4470: 6f 72 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 2e  or normal table.
4480: 20 20 31 20 66 6f 72 20 57 49 54 48 4f 55 54 20    1 for WITHOUT 
4490: 52 4f 57 49 44 20 74 61 62 6c 65 20 2a 2f 0a 20  ROWID table */. 
44a0: 20 75 38 20 62 49 64 4c 69 73 74 49 6e 4f 72 64   u8 bIdListInOrd
44b0: 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  er;    /* True i
44c0: 66 20 49 44 4c 49 53 54 20 69 73 20 69 6e 20 74  f IDLIST is in t
44d0: 61 62 6c 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  able order */.  
44e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
44f0: 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
4500: 20 56 41 4c 55 45 53 28 29 20 74 6f 20 62 65 20   VALUES() to be 
4510: 69 6e 73 65 72 74 65 64 20 20 2a 2f 0a 0a 20 20  inserted  */..  
4520: 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 6f  /* Register allo
4530: 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  cations */.  int
4540: 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 20 3d   regFromSelect =
4550: 20 30 3b 2f 2a 20 42 61 73 65 20 72 65 67 69 73   0;/* Base regis
4560: 74 65 72 20 66 6f 72 20 64 61 74 61 20 63 6f 6d  ter for data com
4570: 69 6e 67 20 66 72 6f 6d 20 53 45 4c 45 43 54 20  ing from SELECT 
4580: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75 74 6f  */.  int regAuto
4590: 69 6e 63 20 3d 20 30 3b 20 20 20 2f 2a 20 52 65  inc = 0;   /* Re
45a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
45b0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
45c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
45d0: 74 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20  t regRowCount = 
45e0: 30 3b 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65  0;  /* Memory ce
45f0: 6c 6c 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ll used for the 
4600: 72 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  row counter */. 
4610: 20 69 6e 74 20 72 65 67 49 6e 73 3b 20 20 20 20   int regIns;    
4620: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
4630: 6f 66 20 72 65 67 73 20 68 6f 6c 64 69 6e 67 20  of regs holding 
4640: 72 6f 77 69 64 2b 64 61 74 61 20 62 65 69 6e 67  rowid+data being
4650: 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
4660: 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20  nt regRowid;    
4670: 20 20 20 20 20 2f 2a 20 72 65 67 69 73 74 65 72       /* register
4680: 73 20 68 6f 6c 64 69 6e 67 20 69 6e 73 65 72 74  s holding insert
4690: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20   rowid */.  int 
46a0: 72 65 67 44 61 74 61 3b 20 20 20 20 20 20 20 20  regData;        
46b0: 20 20 2f 2a 20 72 65 67 69 73 74 65 72 20 68 6f    /* register ho
46c0: 6c 64 69 6e 67 20 66 69 72 73 74 20 63 6f 6c 75  lding first colu
46d0: 6d 6e 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a  mn to insert */.
46e0: 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 20 3d    int *aRegIdx =
46f0: 20 30 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 20 72   0;     /* One r
4700: 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
4710: 64 20 74 6f 20 65 61 63 68 20 69 6e 64 65 78 20  d to each index 
4720: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
4730: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
4740: 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20    int isView;   
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 54 72 75 65 20 69 66 20 61 74 74 65 6d 70 74   True if attempt
4770: 69 6e 67 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ing to insert in
4780: 74 6f 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 54  to a view */.  T
4790: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
47a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ;          /* Li
47b0: 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f  st of triggers o
47c0: 6e 20 70 54 61 62 2c 20 69 66 20 72 65 71 75 69  n pTab, if requi
47d0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61  red */.  int tma
47e0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
47f0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
4800: 74 72 69 67 67 65 72 20 74 69 6d 65 73 20 2a 2f  trigger times */
4810: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
4820: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65  pParse->db;.  me
4830: 6d 73 65 74 28 26 64 65 73 74 2c 20 30 2c 20 73  mset(&dest, 0, s
4840: 69 7a 65 6f 66 28 64 65 73 74 29 29 3b 0a 20 20  izeof(dest));.  
4850: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
4860: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
4870: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
4880: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
4890: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
48a0: 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
48b0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
48c0: 20 73 69 6d 70 6c 65 20 56 41 4c 55 45 53 28 29   simple VALUES()
48d0: 20 6c 69 73 74 20 77 69 74 68 20 61 0a 20 20 2a   list with a.  *
48e0: 2a 20 73 69 6e 67 6c 65 20 72 6f 77 20 28 74 68  * single row (th
48f0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 29 20 74  e common case) t
4900: 68 65 6e 20 6b 65 65 70 20 74 68 61 74 20 6f 6e  hen keep that on
4910: 65 20 72 6f 77 20 6f 66 20 76 61 6c 75 65 73 0a  e row of values.
4920: 20 20 2a 2a 20 61 6e 64 20 64 69 73 63 61 72 64    ** and discard
4930: 20 74 68 65 20 6f 74 68 65 72 20 28 75 6e 75 73   the other (unus
4940: 65 64 29 20 70 61 72 74 73 20 6f 66 20 74 68 65  ed) parts of the
4950: 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a   pSelect object.
4960: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65    */.  if( pSele
4970: 63 74 20 26 26 20 28 70 53 65 6c 65 63 74 2d 3e  ct && (pSelect->
4980: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
4990: 6c 75 65 73 29 21 3d 30 20 26 26 20 70 53 65 6c  lues)!=0 && pSel
49a0: 65 63 74 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ect->pPrior==0 )
49b0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 53  {.    pList = pS
49c0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
49d0: 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69     pSelect->pELi
49e0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  st = 0;.    sqli
49f0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
4a00: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
4a10: 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20    pSelect = 0;. 
4a20: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
4a30: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
4a40: 68 69 63 68 20 77 65 20 77 69 6c 6c 20 62 65 20  hich we will be 
4a50: 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 69 6e  inserting new in
4a60: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
4a70: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
4a80: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
4a90: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
4aa0: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[0].zName;.  
4ab0: 69 66 28 20 4e 45 56 45 52 28 7a 54 61 62 3d 3d  if( NEVER(zTab==
4ac0: 30 29 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74  0) ) goto insert
4ad0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62  _cleanup;.  pTab
4ae0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
4af0: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
4b00: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28  pTabList);.  if(
4b10: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
4b20: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
4b30: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  nup;.  }.  iDb =
4b40: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
4b50: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
4b60: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
4b70: 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
4b80: 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
4b90: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 7a 44 62 20  aDb[iDb];.  zDb 
4ba0: 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
4bb0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
4bc0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
4bd0: 49 54 45 5f 49 4e 53 45 52 54 2c 20 70 54 61 62  ITE_INSERT, pTab
4be0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
4bf0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   ){.    goto ins
4c00: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ert_cleanup;.  }
4c10: 0a 20 20 77 69 74 68 6f 75 74 52 6f 77 69 64 20  .  withoutRowid 
4c20: 3d 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  = !HasRowid(pTab
4c30: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
4c40: 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20 61  out if we have a
4c50: 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64 20  ny triggers and 
4c60: 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  if the table bei
4c70: 6e 67 0a 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  ng.  ** inserted
4c80: 20 69 6e 74 6f 20 69 73 20 61 20 76 69 65 77 0a   into is a view.
4c90: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
4ca0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
4cb0: 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
4cc0: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
4cd0: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  st(pParse, pTab,
4ce0: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 26   TK_INSERT, 0, &
4cf0: 74 6d 61 73 6b 29 3b 0a 20 20 69 73 56 69 65 77  tmask);.  isView
4d00: 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74   = pTab->pSelect
4d10: 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0;.#else.# def
4d20: 69 6e 65 20 70 54 72 69 67 67 65 72 20 30 0a 23  ine pTrigger 0.#
4d30: 20 64 65 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a   define tmask 0.
4d40: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
4d50: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
4d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
4d70: 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77 0a  .# undef isView.
4d80: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
4d90: 30 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  0.#endif.  asser
4da0: 74 28 20 28 70 54 72 69 67 67 65 72 20 26 26 20  t( (pTrigger && 
4db0: 74 6d 61 73 6b 29 20 7c 7c 20 28 70 54 72 69 67  tmask) || (pTrig
4dc0: 67 65 72 3d 3d 30 20 26 26 20 74 6d 61 73 6b 3d  ger==0 && tmask=
4dd0: 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
4de0: 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79 20 61  pTab is really a
4df0: 20 76 69 65 77 2c 20 6d 61 6b 65 20 73 75 72 65   view, make sure
4e00: 20 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 69   it has been ini
4e10: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 56  tialized..  ** V
4e20: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
4e30: 73 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  s() is a no-op i
4e40: 66 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20  f pTab is not a 
4e50: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  view..  */.  if(
4e60: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
4e70: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
4e80: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
4e90: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
4ea0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nup;.  }..  /* C
4eb0: 61 6e 6e 6f 74 20 69 6e 73 65 72 74 20 69 6e 74  annot insert int
4ec0: 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 61  o a read-only ta
4ed0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
4ee0: 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c  sqlite3IsReadOnl
4ef0: 79 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  y(pParse, pTab, 
4f00: 74 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 67 6f  tmask) ){.    go
4f10: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
4f20: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  p;.  }..  /* All
4f30: 6f 63 61 74 65 20 61 20 56 44 42 45 0a 20 20 2a  ocate a VDBE.  *
4f40: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
4f50: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
4f60: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
4f70: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
4f80: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
4f90: 6e 65 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69  nested==0 ) sqli
4fa0: 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
4fb0: 67 65 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ges(v);.  sqlite
4fc0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
4fd0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 53 65  tion(pParse, pSe
4fe0: 6c 65 63 74 20 7c 7c 20 70 54 72 69 67 67 65 72  lect || pTrigger
4ff0: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
5000: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45   SQLITE_OMIT_XFE
5010: 52 5f 4f 50 54 0a 20 20 2f 2a 20 49 66 20 74 68  R_OPT.  /* If th
5020: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
5030: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 0a  f the form.  **.
5040: 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 53 45 52    **       INSER
5050: 54 20 49 4e 54 4f 20 3c 74 61 62 6c 65 31 3e 20  T INTO <table1> 
5060: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
5070: 61 62 6c 65 32 3e 3b 0a 20 20 2a 2a 0a 20 20 2a  able2>;.  **.  *
5080: 2a 20 54 68 65 6e 20 73 70 65 63 69 61 6c 20 6f  * Then special o
5090: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
50a0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 68 61 74   be applied that
50b0: 20 6d 61 6b 65 20 74 68 65 20 74 72 61 6e 73 66   make the transf
50c0: 65 72 0a 20 20 2a 2a 20 76 65 72 79 20 66 61 73  er.  ** very fas
50d0: 74 20 61 6e 64 20 77 68 69 63 68 20 72 65 64 75  t and which redu
50e0: 63 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  ce fragmentation
50f0: 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a   of indices..  *
5100: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 74  *.  ** This is t
5110: 68 65 20 32 6e 64 20 74 65 6d 70 6c 61 74 65 2e  he 2nd template.
5120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
5130: 75 6d 6e 3d 3d 30 20 26 26 20 78 66 65 72 4f 70  umn==0 && xferOp
5140: 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73  timization(pPars
5150: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
5160: 2c 20 6f 6e 45 72 72 6f 72 2c 20 69 44 62 29 20  , onError, iDb) 
5170: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
5180: 70 54 72 69 67 67 65 72 20 29 3b 0a 20 20 20 20  pTrigger );.    
5190: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
51a0: 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   );.    goto ins
51b0: 65 72 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ert_end;.  }.#en
51c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
51d0: 49 54 5f 58 46 45 52 5f 4f 50 54 20 2a 2f 0a 0a  IT_XFER_OPT */..
51e0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
51f0: 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  an AUTOINCREMENT
5200: 20 74 61 62 6c 65 2c 20 6c 6f 6f 6b 20 75 70 20   table, look up 
5210: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  the sequence num
5220: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
5230: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
5240: 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 20  table and store 
5250: 69 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  it in memory cel
5260: 6c 20 72 65 67 41 75 74 6f 69 6e 63 2e 0a 20 20  l regAutoinc..  
5270: 2a 2f 0a 20 20 72 65 67 41 75 74 6f 69 6e 63 20  */.  regAutoinc 
5280: 3d 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 70  = autoIncBegin(p
5290: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
52a0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
52b0: 65 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  e registers for 
52c0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 6f 77 69  holding the rowi
52d0: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
52e0: 2c 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ,.  ** the conte
52f0: 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  nt of the new ro
5300: 77 2c 20 61 6e 64 20 74 68 65 20 61 73 73 65 6d  w, and the assem
5310: 62 6c 65 64 20 72 6f 77 20 72 65 63 6f 72 64 2e  bled row record.
5320: 0a 20 20 2a 2f 0a 20 20 72 65 67 52 6f 77 69 64  .  */.  regRowid
5330: 20 3d 20 72 65 67 49 6e 73 20 3d 20 70 50 61 72   = regIns = pPar
5340: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
5350: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54  arse->nMem += pT
5360: 61 62 2d 3e 6e 43 6f 6c 20 2b 20 31 3b 0a 20 20  ab->nCol + 1;.  
5370: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
5380: 61 62 29 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ab) ){.    regRo
5390: 77 69 64 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  wid++;.    pPars
53a0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 7d 0a 20  e->nMem++;.  }. 
53b0: 20 72 65 67 44 61 74 61 20 3d 20 72 65 67 52 6f   regData = regRo
53c0: 77 69 64 2b 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  wid+1;..  /* If 
53d0: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
53e0: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 64 20 61 6e  ment included an
53f0: 20 49 44 4c 49 53 54 20 74 65 72 6d 2c 20 74 68   IDLIST term, th
5400: 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 20 20 2a  en make sure.  *
5410: 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f  * all elements o
5420: 66 20 74 68 65 20 49 44 4c 49 53 54 20 72 65 61  f the IDLIST rea
5430: 6c 6c 79 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  lly are columns 
5440: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
5450: 20 0a 20 20 2a 2a 20 72 65 6d 65 6d 62 65 72 20   .  ** remember 
5460: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
5470: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  es..  **.  ** If
5480: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
5490: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
54a0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 6e 64  Y KEY column and
54b0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0a 20 20 2a   that column.  *
54c0: 2a 20 69 73 20 6e 61 6d 65 64 20 69 6e 20 74 68  * is named in th
54d0: 65 20 49 44 4c 49 53 54 2c 20 74 68 65 6e 20 72  e IDLIST, then r
54e0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 69 70 6b  ecord in the ipk
54f0: 43 6f 6c 75 6d 6e 20 76 61 72 69 61 62 6c 65 0a  Column variable.
5500: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
5510: 6e 74 6f 20 49 44 4c 49 53 54 20 6f 66 20 74 68  nto IDLIST of th
5520: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  e primary key co
5530: 6c 75 6d 6e 2e 20 20 69 70 6b 43 6f 6c 75 6d 6e  lumn.  ipkColumn
5540: 20 69 73 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   is.  ** the ind
5550: 65 78 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  ex of the primar
5560: 79 20 6b 65 79 20 61 73 20 69 74 20 61 70 70 65  y key as it appe
5570: 61 72 73 20 69 6e 20 49 44 4c 49 53 54 2c 20 6e  ars in IDLIST, n
5580: 6f 74 20 61 73 0a 20 20 2a 2a 20 69 73 20 61 70  ot as.  ** is ap
5590: 70 65 61 72 73 20 69 6e 20 74 68 65 20 6f 72 69  pears in the ori
55a0: 67 69 6e 61 6c 20 74 61 62 6c 65 2e 20 20 28 54  ginal table.  (T
55b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
55c0: 49 4e 54 45 47 45 52 0a 20 20 2a 2a 20 50 52 49  INTEGER.  ** PRI
55d0: 4d 41 52 59 20 4b 45 59 20 69 6e 20 74 68 65 20  MARY KEY in the 
55e0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 69  original table i
55f0: 73 20 70 54 61 62 2d 3e 69 50 4b 65 79 2e 29 0a  s pTab->iPKey.).
5600: 20 20 2a 2f 0a 20 20 62 49 64 4c 69 73 74 49 6e    */.  bIdListIn
5610: 4f 72 64 65 72 20 3d 20 28 70 54 61 62 2d 3e 74  Order = (pTab->t
5620: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 4f 4f 4f  abFlags & TF_OOO
5630: 48 69 64 64 65 6e 29 3d 3d 30 3b 0a 20 20 69 66  Hidden)==0;.  if
5640: 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ( pColumn ){.   
5650: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
5660: 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  umn->nId; i++){.
5670: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61        pColumn->a
5680: 5b 69 5d 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20  [i].idx = -1;.  
5690: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
56a0: 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   i<pColumn->nId;
56b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
56c0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
56d0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
56e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
56f0: 49 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b  ICmp(pColumn->a[
5700: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
5710: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
5720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
5730: 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78  Column->a[i].idx
5740: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
5750: 69 66 28 20 69 21 3d 6a 20 29 20 62 49 64 4c 69  if( i!=j ) bIdLi
5760: 73 74 49 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20  stInOrder = 0;. 
5770: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
5780: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
5790: 20 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f             ipkCo
57a0: 6c 75 6d 6e 20 3d 20 69 3b 20 20 61 73 73 65 72  lumn = i;  asser
57b0: 74 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64  t( !withoutRowid
57c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
57d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
57e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
57f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
5800: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
5810: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5820: 33 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e  3IsRowid(pColumn
5830: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26  ->a[i].zName) &&
5840: 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29   !withoutRowid )
5850: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 70 6b 43  {.          ipkC
5860: 6f 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20  olumn = i;.     
5870: 20 20 20 20 20 62 49 64 4c 69 73 74 49 6e 4f 72       bIdListInOr
5880: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  der = 0;.       
5890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
58a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
58b0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
58c0: 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %S has no colum
58d0: 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
58e0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
58f0: 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d  ist, 0, pColumn-
5900: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
5910: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5920: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
5930: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
5940: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
5950: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5960: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
5970: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
5980: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66   many columns of
5990: 20 64 61 74 61 20 61 72 65 20 73 75 70 70 6c 69   data are suppli
59a0: 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
59b0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20  .  ** is coming 
59c0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
59d0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65  atement, then ge
59e0: 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
59f0: 69 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 70 72  ine that.  ** pr
5a00: 6f 64 75 63 65 73 20 61 20 73 69 6e 67 6c 65 20  oduces a single 
5a10: 72 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43  row of the SELEC
5a20: 54 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  T on each invoca
5a30: 74 69 6f 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20  tion.  The.  ** 
5a40: 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 74 68  co-routine is th
5a50: 65 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20  e common header 
5a60: 74 6f 20 74 68 65 20 33 72 64 20 61 6e 64 20 34  to the 3rd and 4
5a70: 74 68 20 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20  th templates..  
5a80: 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
5a90: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 61 74 61 20   ){.    /* Data 
5aa0: 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61  is coming from a
5ab0: 20 53 45 4c 45 43 54 20 6f 72 20 66 72 6f 6d 20   SELECT or from 
5ac0: 61 20 6d 75 6c 74 69 2d 72 6f 77 20 56 41 4c 55  a multi-row VALU
5ad0: 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  ES clause..    *
5ae0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d  * Generate a co-
5af0: 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 74  routine to run t
5b00: 68 65 20 53 45 4c 45 43 54 2e 20 2a 2f 0a 20 20  he SELECT. */.  
5b10: 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20    int regYield; 
5b20: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
5b30: 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75  r holding co-rou
5b40: 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74  tine entry-point
5b50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5b60: 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
5b70: 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
5b80: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tine */.    int 
5b90: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5ba0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
5bb0: 2f 0a 0a 20 20 20 20 72 65 67 59 69 65 6c 64 20  /..    regYield 
5bc0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5bd0: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
5be0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5bf0: 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
5c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5c10: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
5c20: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
5c30: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
5c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
5c50: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
5c60: 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
5c70: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
5c80: 64 65 73 74 2e 69 53 64 73 74 20 3d 20 62 49 64  dest.iSdst = bId
5c90: 4c 69 73 74 49 6e 4f 72 64 65 72 20 3f 20 72 65  ListInOrder ? re
5ca0: 67 44 61 74 61 20 3a 20 30 3b 0a 20 20 20 20 64  gData : 0;.    d
5cb0: 65 73 74 2e 6e 53 64 73 74 20 3d 20 70 54 61 62  est.nSdst = pTab
5cc0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 72 63 20 3d  ->nCol;.    rc =
5cd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
5ce0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
5cf0: 26 64 65 73 74 29 3b 0a 20 20 20 20 72 65 67 46  &dest);.    regF
5d00: 72 6f 6d 53 65 6c 65 63 74 20 3d 20 64 65 73 74  romSelect = dest
5d10: 2e 69 53 64 73 74 3b 0a 20 20 20 20 69 66 28 20  .iSdst;.    if( 
5d20: 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
5d30: 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
5d40: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 69 6e  ->nErr ) goto in
5d50: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
5d60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d70: 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
5d80: 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64  outine, regYield
5d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5da0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5db0: 64 72 54 6f 70 20 2d 20 31 29 3b 20 20 20 20 20  drTop - 1);     
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 2f 2a 20 6c 61 62 65 6c 20 42 3a 20 2a 2f    /* label B: */
5de0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
5df0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  lect->pEList );.
5e00: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 53      nColumn = pS
5e10: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
5e20: 45 78 70 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  Expr;..    /* Se
5e30: 74 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 74  t useTempTable t
5e40: 6f 20 54 52 55 45 20 69 66 20 74 68 65 20 72 65  o TRUE if the re
5e50: 73 75 6c 74 20 6f 66 20 74 68 65 20 53 45 4c 45  sult of the SELE
5e60: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
5e70: 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 77 72   ** should be wr
5e80: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 74 65 6d  itten into a tem
5e90: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 74 65  porary table (te
5ea0: 6d 70 6c 61 74 65 20 34 29 2e 20 20 53 65 74 20  mplate 4).  Set 
5eb0: 74 6f 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20  to.    ** FALSE 
5ec0: 69 66 20 65 61 63 68 20 6f 75 74 70 75 74 20 72  if each output r
5ed0: 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ow of the SELECT
5ee0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
5ef0: 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 0a 20 20  directly into.  
5f00: 20 20 2a 2a 20 74 68 65 20 64 65 73 74 69 6e 61    ** the destina
5f10: 74 69 6f 6e 20 74 61 62 6c 65 20 28 74 65 6d 70  tion table (temp
5f20: 6c 61 74 65 20 33 29 2e 0a 20 20 20 20 2a 2a 0a  late 3)..    **.
5f30: 20 20 20 20 2a 2a 20 41 20 74 65 6d 70 20 74 61      ** A temp ta
5f40: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
5f50: 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   if the table be
5f60: 69 6e 67 20 75 70 64 61 74 65 64 20 69 73 20 61  ing updated is a
5f70: 6c 73 6f 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 6f  lso one.    ** o
5f80: 66 20 74 68 65 20 74 61 62 6c 65 73 20 62 65 69  f the tables bei
5f90: 6e 67 20 72 65 61 64 20 62 79 20 74 68 65 20 53  ng read by the S
5fa0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
5fb0: 20 20 41 6c 73 6f 20 75 73 65 20 61 20 0a 20 20    Also use a .  
5fc0: 20 20 2a 2a 20 74 65 6d 70 20 74 61 62 6c 65 20    ** temp table 
5fd0: 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 72  in the case of r
5fe0: 6f 77 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20  ow triggers..   
5ff0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 72 69   */.    if( pTri
6000: 67 67 65 72 20 7c 7c 20 72 65 61 64 73 54 61 62  gger || readsTab
6010: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  le(pParse, iDb, 
6020: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 75  pTab) ){.      u
6030: 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 31 3b  seTempTable = 1;
6040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
6050: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  useTempTable ){.
6060: 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
6070: 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  the coroutine to
6080: 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
6090: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 53 45  tion from the SE
60a0: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 61 6e  LECT.      ** an
60b0: 64 20 61 64 64 20 69 74 20 74 6f 20 61 20 74 72  d add it to a tr
60c0: 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 72  ansient table sr
60d0: 63 54 61 62 2e 20 20 54 68 65 20 63 6f 64 65 20  cTab.  The code 
60e0: 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 20 20  generated.      
60f0: 2a 2a 20 68 65 72 65 20 69 73 20 66 72 6f 6d 20  ** here is from 
6100: 74 68 65 20 34 74 68 20 74 65 6d 70 6c 61 74 65  the 4th template
6110: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
6120: 20 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e   **      B: open
6130: 20 74 65 6d 70 20 74 61 62 6c 65 0a 20 20 20 20   temp table.    
6140: 20 20 2a 2a 20 20 20 20 20 20 4c 3a 20 79 69 65    **      L: yie
6150: 6c 64 20 58 2c 20 67 6f 74 6f 20 4d 20 61 74 20  ld X, goto M at 
6160: 45 4f 46 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  EOF.      **    
6170: 20 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20       insert row 
6180: 66 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f  from R..R+n into
6190: 20 74 65 6d 70 20 74 61 62 6c 65 0a 20 20 20 20   temp table.    
61a0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74    **         got
61b0: 6f 20 4c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  o L.      **    
61c0: 20 20 4d 3a 20 2e 2e 2e 0a 20 20 20 20 20 20 2a    M: ....      *
61d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
61e0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ec;          /* 
61f0: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
6200: 20 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 2a   packed record *
6210: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 54  /.      int regT
6220: 65 6d 70 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  empRowid;    /* 
6230: 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64  Register to hold
6240: 20 74 65 6d 70 20 74 61 62 6c 65 20 52 4f 57 49   temp table ROWI
6250: 44 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  D */.      int a
6260: 64 64 72 4c 3b 20 20 20 20 20 20 20 20 20 20 20  ddrL;           
6270: 2f 2a 20 4c 61 62 65 6c 20 22 4c 22 20 2a 2f 0a  /* Label "L" */.
6280: 0a 20 20 20 20 20 20 73 72 63 54 61 62 20 3d 20  .      srcTab = 
6290: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
62a0: 20 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 73        regRec = s
62b0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
62c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
62d0: 72 65 67 54 65 6d 70 52 6f 77 69 64 20 3d 20 73  regTempRowid = s
62e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
62f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6310: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
6320: 6d 65 72 61 6c 2c 20 73 72 63 54 61 62 2c 20 6e  meral, srcTab, n
6330: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
6340: 64 64 72 4c 20 3d 20 73 71 6c 69 74 65 33 56 64  ddrL = sqlite3Vd
6350: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
6360: 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
6370: 72 6d 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  rm); VdbeCoverag
6380: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
6390: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
63a0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
63b0: 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2c 20 6e  regFromSelect, n
63c0: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 63 29 3b  Column, regRec);
63d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
63e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
63f0: 65 77 52 6f 77 69 64 2c 20 73 72 63 54 61 62 2c  ewRowid, srcTab,
6400: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a   regTempRowid);.
6410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6420: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6430: 73 65 72 74 2c 20 73 72 63 54 61 62 2c 20 72 65  sert, srcTab, re
6440: 67 52 65 63 2c 20 72 65 67 54 65 6d 70 52 6f 77  gRec, regTempRow
6450: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6460: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
6470: 64 72 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  drL);.      sqli
6480: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
6490: 76 2c 20 61 64 64 72 4c 29 3b 0a 20 20 20 20 20  v, addrL);.     
64a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
64b0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
64c0: 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71  egRec);.      sq
64d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
64e0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
64f0: 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  empRowid);.    }
6500: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6510: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73   This is the cas
6520: 65 20 69 66 20 74 68 65 20 64 61 74 61 20 66 6f  e if the data fo
6530: 72 20 74 68 65 20 49 4e 53 45 52 54 20 69 73 20  r the INSERT is 
6540: 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 0a 20  coming from a . 
6550: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 72 6f 77     ** single-row
6560: 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 0a 20   VALUES clause. 
6570: 20 20 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f     */.    NameCo
6580: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d  ntext sNC;.    m
6590: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
65a0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
65b0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
65c0: 61 72 73 65 3b 0a 20 20 20 20 73 72 63 54 61 62  arse;.    srcTab
65d0: 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
65e0: 74 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 3d  t( useTempTable=
65f0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
6600: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f  ist ){.      nCo
6610: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
6620: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73  xpr;.      if( s
6630: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
6640: 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c  rListNames(&sNC,
6650: 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20   pList) ){.     
6660: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
6670: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
6680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6690: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20   nColumn = 0;.  
66a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
66b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49 44 4c   there is no IDL
66c0: 49 53 54 20 74 65 72 6d 20 62 75 74 20 74 68 65  IST term but the
66d0: 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6e   table has an in
66e0: 74 65 67 65 72 20 70 72 69 6d 61 72 79 0a 20 20  teger primary.  
66f0: 2a 2a 20 6b 65 79 2c 20 74 68 65 20 73 65 74 20  ** key, the set 
6700: 74 68 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61  the ipkColumn va
6710: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e  riable to the in
6720: 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
6730: 79 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69  y .  ** column i
6740: 6e 64 65 78 20 69 6e 20 74 68 65 20 6f 72 69 67  ndex in the orig
6750: 69 6e 61 6c 20 74 61 62 6c 65 20 64 65 66 69 6e  inal table defin
6760: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ition..  */.  if
6770: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
6780: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
6790: 20 69 70 6b 43 6f 6c 75 6d 6e 20 3d 20 70 54 61   ipkColumn = pTa
67a0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 7d 0a 0a 20  b->iPKey;.  }.. 
67b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
67c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
67d0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
67e0: 65 20 64 61 74 61 20 6d 61 74 63 68 65 73 20 74  e data matches t
67f0: 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  he number.  ** o
6800: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
6810: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
6820: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e table..  */.  
6830: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
6840: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
6850: 20 6e 48 69 64 64 65 6e 20 2b 3d 20 28 49 73 48   nHidden += (IsH
6860: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
6870: 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 3f 20 31 20  b->aCol[i]) ? 1 
6880: 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  : 0);.  }.  if( 
6890: 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43  pColumn==0 && nC
68a0: 6f 6c 75 6d 6e 20 26 26 20 6e 43 6f 6c 75 6d 6e  olumn && nColumn
68b0: 21 3d 28 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e 48  !=(pTab->nCol-nH
68c0: 69 64 64 65 6e 29 20 29 7b 0a 20 20 20 20 73 71  idden) ){.    sq
68d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
68e0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 74  arse, .       "t
68f0: 61 62 6c 65 20 25 53 20 68 61 73 20 25 64 20 63  able %S has %d c
6900: 6f 6c 75 6d 6e 73 20 62 75 74 20 25 64 20 76 61  olumns but %d va
6910: 6c 75 65 73 20 77 65 72 65 20 73 75 70 70 6c 69  lues were suppli
6920: 65 64 22 2c 0a 20 20 20 20 20 20 20 70 54 61 62  ed",.       pTab
6930: 4c 69 73 74 2c 20 30 2c 20 70 54 61 62 2d 3e 6e  List, 0, pTab->n
6940: 43 6f 6c 2d 6e 48 69 64 64 65 6e 2c 20 6e 43 6f  Col-nHidden, nCo
6950: 6c 75 6d 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  lumn);.    goto 
6960: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
6970: 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d    }.  if( pColum
6980: 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 21  n!=0 && nColumn!
6990: 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20 29 7b  =pColumn->nId ){
69a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
69b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64  rMsg(pParse, "%d
69c0: 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63   values for %d c
69d0: 6f 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c 75 6d 6e  olumns", nColumn
69e0: 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 3b  , pColumn->nId);
69f0: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
6a00: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
6a10: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
6a20: 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  ze the count of 
6a30: 72 6f 77 73 20 74 6f 20 62 65 20 69 6e 73 65 72  rows to be inser
6a40: 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ted.  */.  if( d
6a50: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6a60: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20  E_CountRows ){. 
6a70: 20 20 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d     regRowCount =
6a80: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6aa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6ab0: 65 67 65 72 2c 20 30 2c 20 72 65 67 52 6f 77 43  eger, 0, regRowC
6ac0: 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ount);.  }..  /*
6ad0: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
6ae0: 61 20 76 69 65 77 2c 20 6f 70 65 6e 20 74 68 65  a view, open the
6af0: 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 64 20 61   table and and a
6b00: 6c 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ll indices */.  
6b10: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
6b20: 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20 20     int nIdx;.   
6b30: 20 6e 49 64 78 20 3d 20 73 71 6c 69 74 65 33 4f   nIdx = sqlite3O
6b40: 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63  penTableAndIndic
6b50: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  es(pParse, pTab,
6b60: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
6b70: 2c 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , -1, 0,.       
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
6ba0: 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43  iDataCur, &iIdxC
6bb0: 75 72 29 3b 0a 20 20 20 20 61 52 65 67 49 64 78  ur);.    aRegIdx
6bc0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6bd0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
6be0: 28 69 6e 74 29 2a 28 6e 49 64 78 2b 31 29 29 3b  (int)*(nIdx+1));
6bf0: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
6c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
6c10: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
6c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
6c30: 69 3d 30 3b 20 69 3c 6e 49 64 78 3b 20 69 2b 2b  i=0; i<nIdx; i++
6c40: 29 7b 0a 20 20 20 20 20 20 61 52 65 67 49 64 78  ){.      aRegIdx
6c50: 5b 69 5d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  [i] = ++pParse->
6c60: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nMem;.    }.  }.
6c70: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68  .  /* This is th
6c80: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6d 61 69  e top of the mai
6c90: 6e 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70  n insertion loop
6ca0: 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54 65 6d   */.  if( useTem
6cb0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  pTable ){.    /*
6cc0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64 65   This block code
6cd0: 73 20 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f 6f  s the top of loo
6ce0: 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 6d  p only.  The com
6cf0: 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73 20 74 68  plete loop is th
6d00: 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
6d10: 6e 67 20 70 73 65 75 64 6f 63 6f 64 65 20 28 74  ng pseudocode (t
6d20: 65 6d 70 6c 61 74 65 20 34 29 3a 0a 20 20 20 20  emplate 4):.    
6d30: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
6d40: 20 20 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61    rewind temp ta
6d50: 62 6c 65 2c 20 69 66 20 65 6d 70 74 79 20 67 6f  ble, if empty go
6d60: 74 6f 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20  to D.    **     
6d70: 20 43 3a 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f   C: loop over ro
6d80: 77 73 20 6f 66 20 69 6e 74 65 72 6d 65 64 69 61  ws of intermedia
6d90: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
6da0: 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66            transf
6db0: 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20 69  er values form i
6dc0: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
6dd0: 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 20  e into <table>. 
6de0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 65 6e     **         en
6df0: 64 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20  d loop.    **   
6e00: 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f     D: ....    */
6e10: 0a 20 20 20 20 61 64 64 72 49 6e 73 54 6f 70 20  .    addrInsTop 
6e20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6e30: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
6e40: 2c 20 73 72 63 54 61 62 29 3b 20 56 64 62 65 43  , srcTab); VdbeC
6e50: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6e60: 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
6e70: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6e80: 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  r(v);.  }else if
6e90: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
6ea0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63   /* This block c
6eb0: 6f 64 65 73 20 74 68 65 20 74 6f 70 20 6f 66 20  odes the top of 
6ec0: 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20  loop only.  The 
6ed0: 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73  complete loop is
6ee0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   the.    ** foll
6ef0: 6f 77 69 6e 67 20 70 73 65 75 64 6f 63 6f 64 65  owing pseudocode
6f00: 20 28 74 65 6d 70 6c 61 74 65 20 33 29 3a 0a 20   (template 3):. 
6f10: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
6f20: 20 20 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74    C: yield X, at
6f30: 20 45 4f 46 20 67 6f 74 6f 20 44 0a 20 20 20 20   EOF goto D.    
6f40: 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65 72  **         inser
6f50: 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65 73  t the select res
6f60: 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e  ult into <table>
6f70: 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 20 20 20   from R..R+n.   
6f80: 20 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f   **         goto
6f90: 20 43 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 44   C.    **      D
6fa0: 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  : ....    */.   
6fb0: 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 61 64   addrInsTop = ad
6fc0: 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
6fd0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6fe0: 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
6ff0: 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62 65 43  Parm);.    VdbeC
7000: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
7010: 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 42 45  .  /* Run the BE
7020: 46 4f 52 45 20 61 6e 64 20 49 4e 53 54 45 41 44  FORE and INSTEAD
7030: 20 4f 46 20 74 72 69 67 67 65 72 73 2c 20 69 66   OF triggers, if
7040: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 0a 20   there are any. 
7050: 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20   */.  endOfLoop 
7060: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
7070: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
7080: 20 74 6d 61 73 6b 20 26 20 54 52 49 47 47 45 52   tmask & TRIGGER
7090: 5f 42 45 46 4f 52 45 20 29 7b 0a 20 20 20 20 69  _BEFORE ){.    i
70a0: 6e 74 20 72 65 67 43 6f 6c 73 20 3d 20 73 71 6c  nt regCols = sql
70b0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
70c0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
70d0: 43 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  Col+1);..    /* 
70e0: 62 75 69 6c 64 20 74 68 65 20 4e 45 57 2e 2a 20  build the NEW.* 
70f0: 72 65 66 65 72 65 6e 63 65 20 72 6f 77 2e 20 20  reference row.  
7100: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65  Note that if the
7110: 72 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  re is an INTEGER
7120: 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  .    ** PRIMARY 
7130: 4b 45 59 20 69 6e 74 6f 20 77 68 69 63 68 20 61  KEY into which a
7140: 20 4e 55 4c 4c 20 69 73 20 62 65 69 6e 67 20 69   NULL is being i
7150: 6e 73 65 72 74 65 64 2c 20 74 68 61 74 20 4e 55  nserted, that NU
7160: 4c 4c 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  LL will be.    *
7170: 2a 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  * translated int
7180: 6f 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  o a unique ID fo
7190: 72 20 74 68 65 20 72 6f 77 2e 20 20 42 75 74 20  r the row.  But 
71a0: 6f 6e 20 61 20 42 45 46 4f 52 45 20 74 72 69 67  on a BEFORE trig
71b0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 77 65 20 64  ger,.    ** we d
71c0: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 61 74 20  o not know what 
71d0: 74 68 65 20 75 6e 69 71 75 65 20 49 44 20 77 69  the unique ID wi
71e0: 6c 6c 20 62 65 20 28 62 65 63 61 75 73 65 20 74  ll be (because t
71f0: 68 65 20 69 6e 73 65 72 74 20 68 61 73 0a 20 20  he insert has.  
7200: 20 20 2a 2a 20 6e 6f 74 20 68 61 70 70 65 6e 65    ** not happene
7210: 64 20 79 65 74 29 20 73 6f 20 77 65 20 73 75 62  d yet) so we sub
7220: 73 74 69 74 75 74 65 20 61 20 72 6f 77 69 64 20  stitute a rowid 
7230: 6f 66 20 2d 31 0a 20 20 20 20 2a 2f 0a 20 20 20  of -1.    */.   
7240: 20 69 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3c 30   if( ipkColumn<0
7250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7270: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72  P_Integer, -1, r
7280: 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 65 6c  egCols);.    }el
7290: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  se{.      int ad
72a0: 64 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  dr1;.      asser
72b0: 74 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64  t( !withoutRowid
72c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75 73   );.      if( us
72d0: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
72e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
72f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
7300: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 70  lumn, srcTab, ip
7310: 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 43 6f 6c 73  kColumn, regCols
7320: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7330: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7340: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f  pSelect==0 );  /
7350: 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 54  * Otherwise useT
7360: 65 6d 70 54 61 62 6c 65 20 69 73 20 74 72 75 65  empTable is true
7370: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
7380: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
7390: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 70 6b  se, pList->a[ipk
73a0: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72  Column].pExpr, r
73b0: 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d  egCols);.      }
73c0: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
73d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
73e0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
73f0: 72 65 67 43 6f 6c 73 29 3b 20 56 64 62 65 43 6f  regCols); VdbeCo
7400: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
7410: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7420: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
7430: 2c 20 2d 31 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  , -1, regCols);.
7440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7450: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
7460: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
7470: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
7480: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65  OP_MustBeInt, re
7490: 67 43 6f 6c 73 29 3b 20 56 64 62 65 43 6f 76 65  gCols); VdbeCove
74a0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a  rage(v);.    }..
74b0: 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61      /* Cannot ha
74c0: 76 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20 61  ve triggers on a
74d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
74e0: 49 66 20 69 74 20 77 65 72 65 20 70 6f 73 73 69  If it were possi
74f0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73  ble,.    ** this
7500: 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 68 61 76   block would hav
7510: 65 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  e to account for
7520: 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 2e 0a   hidden column..
7530: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
7540: 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  t( !IsVirtual(pT
7550: 61 62 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ab) );..    /* C
7560: 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 63 6f  reate the new co
7570: 6c 75 6d 6e 20 64 61 74 61 0a 20 20 20 20 2a 2f  lumn data.    */
7580: 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  .    for(i=j=0; 
7590: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
75a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
75b0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
75c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c   for(j=0; j<pCol
75d0: 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  umn->nId; j++){.
75e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
75f0: 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d  olumn->a[j].idx=
7600: 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
7610: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7620: 20 20 20 20 69 66 28 20 28 21 75 73 65 54 65 6d      if( (!useTem
7630: 70 54 61 62 6c 65 20 26 26 20 21 70 4c 69 73 74  pTable && !pList
7640: 29 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20 26 26  ) || (pColumn &&
7650: 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64   j>=pColumn->nId
7660: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ).            ||
7670: 20 28 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20   (pColumn==0 && 
7680: 49 73 4f 72 64 69 6e 61 72 79 48 69 64 64 65 6e  IsOrdinaryHidden
7690: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
76a0: 6f 6c 5b 69 5d 29 29 20 29 7b 0a 20 20 20 20 20  ol[i])) ){.     
76b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
76c0: 64 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  de(pParse, pTab-
76d0: 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20  >aCol[i].pDflt, 
76e0: 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 0a 20 20  regCols+i+1);.  
76f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 73      }else if( us
7700: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
7710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7720: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
7730: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a 2c  lumn, srcTab, j,
7740: 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 20 0a   regCols+i+1); .
7750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7760: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
7770: 6c 65 63 74 3d 3d 30 20 29 3b 20 2f 2a 20 4f 74  lect==0 ); /* Ot
7780: 68 65 72 77 69 73 65 20 75 73 65 54 65 6d 70 54  herwise useTempT
7790: 61 62 6c 65 20 69 73 20 74 72 75 65 20 2a 2f 0a  able is true */.
77a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
77b0: 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
77c0: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
77d0: 5b 6a 5d 2e 70 45 78 70 72 2c 20 72 65 67 43 6f  [j].pExpr, regCo
77e0: 6c 73 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20 7d  ls+i+1);.      }
77f0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75  .      if( pColu
7800: 6d 6e 3d 3d 30 20 26 26 20 21 49 73 4f 72 64 69  mn==0 && !IsOrdi
7810: 6e 61 72 79 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  naryHiddenColumn
7820: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29  (&pTab->aCol[i])
7830: 20 29 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20   ) j++;.    }.. 
7840: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
7850: 20 61 6e 20 49 4e 53 45 52 54 20 6f 6e 20 61 20   an INSERT on a 
7860: 76 69 65 77 20 77 69 74 68 20 61 6e 20 49 4e 53  view with an INS
7870: 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20 74  TEAD OF INSERT t
7880: 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64  rigger,.    ** d
7890: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 61 6e  o not attempt an
78a0: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62 65  y conversions be
78b0: 66 6f 72 65 20 61 73 73 65 6d 62 6c 69 6e 67 20  fore assembling 
78c0: 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20  the record..    
78d0: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
78e0: 72 65 61 6c 20 74 61 62 6c 65 2c 20 61 74 74 65  real table, atte
78f0: 6d 70 74 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  mpt conversions 
7900: 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
7910: 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  he.    ** table 
7920: 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 69 65  column affinitie
7930: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
7940: 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
7950: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41     sqlite3TableA
7960: 66 66 69 6e 69 74 79 28 76 2c 20 70 54 61 62 2c  ffinity(v, pTab,
7970: 20 72 65 67 43 6f 6c 73 2b 31 29 3b 0a 20 20 20   regCols+1);.   
7980: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20   }..    /* Fire 
7990: 42 45 46 4f 52 45 20 6f 72 20 49 4e 53 54 45 41  BEFORE or INSTEA
79a0: 44 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a 2f  D OF triggers */
79b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
79c0: 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72 73  RowTrigger(pPars
79d0: 65 2c 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f  e, pTrigger, TK_
79e0: 49 4e 53 45 52 54 2c 20 30 2c 20 54 52 49 47 47  INSERT, 0, TRIGG
79f0: 45 52 5f 42 45 46 4f 52 45 2c 20 0a 20 20 20 20  ER_BEFORE, .    
7a00: 20 20 20 20 70 54 61 62 2c 20 72 65 67 43 6f 6c      pTab, regCol
7a10: 73 2d 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c 20  s-pTab->nCol-1, 
7a20: 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f  onError, endOfLo
7a30: 6f 70 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  op);..    sqlite
7a40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
7a50: 65 28 70 50 61 72 73 65 2c 20 72 65 67 43 6f 6c  e(pParse, regCol
7a60: 73 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  s, pTab->nCol+1)
7a70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
7a80: 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ute the content 
7a90: 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  of the next row 
7aa0: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61  to insert into a
7ab0: 20 72 61 6e 67 65 20 6f 66 0a 20 20 2a 2a 20 72   range of.  ** r
7ac0: 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69  egisters beginni
7ad0: 6e 67 20 61 74 20 72 65 67 49 6e 73 2e 0a 20 20  ng at regIns..  
7ae0: 2a 2f 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  */.  if( !isView
7af0: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 56 69   ){.    if( IsVi
7b00: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
7b10: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20       /* The row 
7b20: 74 68 61 74 20 74 68 65 20 56 55 70 64 61 74 65  that the VUpdate
7b30: 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 64 65 6c   opcode will del
7b40: 65 74 65 3a 20 6e 6f 6e 65 20 2a 2f 0a 20 20 20  ete: none */.   
7b50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b60: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7b70: 20 30 2c 20 72 65 67 49 6e 73 29 3b 0a 20 20 20   0, regIns);.   
7b80: 20 7d 0a 20 20 20 20 69 66 28 20 69 70 6b 43 6f   }.    if( ipkCo
7b90: 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  lumn>=0 ){.     
7ba0: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
7bb0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7bd0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
7be0: 54 61 62 2c 20 69 70 6b 43 6f 6c 75 6d 6e 2c 20  Tab, ipkColumn, 
7bf0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
7c00: 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65   }else if( pSele
7c10: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
7c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7c30: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 46  v, OP_Copy, regF
7c40: 72 6f 6d 53 65 6c 65 63 74 2b 69 70 6b 43 6f 6c  romSelect+ipkCol
7c50: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  umn, regRowid);.
7c60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7c70: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
7c80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7c90: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
7ca0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 70 6b 43 6f  , pList->a[ipkCo
7cb0: 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72 65 67  lumn].pExpr, reg
7cc0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
7cd0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
7ce0: 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20  eGetOp(v, -1);. 
7cf0: 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59         if( ALWAY
7d00: 53 28 70 4f 70 29 20 26 26 20 70 4f 70 2d 3e 6f  S(pOp) && pOp->o
7d10: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 20 26  pcode==OP_Null &
7d20: 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
7d30: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
7d40: 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 31 3b 0a  appendFlag = 1;.
7d50: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
7d60: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 65 77 52 6f  pcode = OP_NewRo
7d70: 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  wid;.          p
7d80: 4f 70 2d 3e 70 31 20 3d 20 69 44 61 74 61 43 75  Op->p1 = iDataCu
7d90: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
7da0: 2d 3e 70 32 20 3d 20 72 65 67 52 6f 77 69 64 3b  ->p2 = regRowid;
7db0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
7dc0: 70 33 20 3d 20 72 65 67 41 75 74 6f 69 6e 63 3b  p3 = regAutoinc;
7dd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7de0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   }.      /* If t
7df0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 65  he PRIMARY KEY e
7e00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c  xpression is NUL
7e10: 4c 2c 20 74 68 65 6e 20 75 73 65 20 4f 50 5f 4e  L, then use OP_N
7e20: 65 77 52 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  ewRowid.      **
7e30: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 75   to generate a u
7e40: 6e 69 71 75 65 20 70 72 69 6d 61 72 79 20 6b 65  nique primary ke
7e50: 79 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 2a  y value..      *
7e60: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 61 70 70  /.      if( !app
7e70: 65 6e 64 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  endFlag ){.     
7e80: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
7e90: 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72        if( !IsVir
7ea0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
7eb0: 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d 20          addr1 = 
7ec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ed0: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
7ee0: 20 72 65 67 52 6f 77 69 64 29 3b 20 56 64 62 65   regRowid); Vdbe
7ef0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
7f00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7f10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7f20: 65 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43 75  ewRowid, iDataCu
7f30: 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67  r, regRowid, reg
7f40: 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20  Autoinc);.      
7f50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
7f60: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
7f70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
7f90: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
7fa0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
7fb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7fc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7fd0: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 69  _IsNull, regRowi
7fe0: 64 2c 20 61 64 64 72 31 2b 32 29 3b 20 56 64 62  d, addr1+2); Vdb
7ff0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8020: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
8030: 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 20 56 64  t, regRowid); Vd
8040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8050: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8060: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
8070: 54 61 62 29 20 7c 7c 20 77 69 74 68 6f 75 74 52  Tab) || withoutR
8080: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73 71  owid ){.      sq
8090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
80a0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
80b0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65  egRowid);.    }e
80c0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
80d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
80e0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 44 61  OP_NewRowid, iDa
80f0: 74 61 43 75 72 2c 20 72 65 67 52 6f 77 69 64 2c  taCur, regRowid,
8100: 20 72 65 67 41 75 74 6f 69 6e 63 29 3b 0a 20 20   regAutoinc);.  
8110: 20 20 20 20 61 70 70 65 6e 64 46 6c 61 67 20 3d      appendFlag =
8120: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 75   1;.    }.    au
8130: 74 6f 49 6e 63 53 74 65 70 28 70 50 61 72 73 65  toIncStep(pParse
8140: 2c 20 72 65 67 41 75 74 6f 69 6e 63 2c 20 72 65  , regAutoinc, re
8150: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 2f 2a  gRowid);..    /*
8160: 20 43 6f 6d 70 75 74 65 20 64 61 74 61 20 66 6f   Compute data fo
8170: 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
8180: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2c 20   the new entry, 
8190: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
81a0: 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
81b0: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
81c0: 20 20 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b 0a     nHidden = 0;.
81d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
81e0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
81f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67 53  .      int iRegS
8200: 74 6f 72 65 20 3d 20 72 65 67 52 6f 77 69 64 2b  tore = regRowid+
8210: 31 2b 69 3b 0a 20 20 20 20 20 20 69 66 28 20 69  1+i;.      if( i
8220: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
8230: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
8240: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 4e 54  value of the INT
8250: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8260: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79   column is alway
8270: 73 20 61 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20  s a NULL..      
8280: 20 20 2a 2a 20 57 68 65 6e 65 76 65 72 20 74 68    ** Whenever th
8290: 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 61  is column is rea
82a0: 64 2c 20 74 68 65 20 72 6f 77 69 64 20 77 69 6c  d, the rowid wil
82b0: 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  l be substituted
82c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 69  .        ** in i
82d0: 74 73 20 70 6c 61 63 65 2e 20 20 48 65 6e 63 65  ts place.  Hence
82e0: 2c 20 66 69 6c 6c 20 74 68 69 73 20 63 6f 6c 75  , fill this colu
82f0: 6d 6e 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 74  mn with a NULL t
8300: 6f 20 61 76 6f 69 64 0a 20 20 20 20 20 20 20 20  o avoid.        
8310: 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 64 61 74  ** taking up dat
8320: 61 20 73 70 61 63 65 20 77 69 74 68 20 69 6e 66  a space with inf
8330: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
8340: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
8350: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 73 20  ..        ** As 
8360: 74 68 65 72 65 20 6d 61 79 20 62 65 20 73 68 61  there may be sha
8370: 6c 6c 6f 77 20 63 6f 70 69 65 73 20 6f 66 20 74  llow copies of t
8380: 68 69 73 20 76 61 6c 75 65 2c 20 6d 61 6b 65 20  his value, make 
8390: 69 74 20 61 20 73 6f 66 74 2d 4e 55 4c 4c 20 2a  it a soft-NULL *
83a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
83b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
83c0: 50 5f 53 6f 66 74 4e 75 6c 6c 2c 20 69 52 65 67  P_SoftNull, iReg
83d0: 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Store);.        
83e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
83f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
8400: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
8410: 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
8420: 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
8430: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
8440: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
8450: 20 20 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20      nHidden++;. 
8460: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8470: 20 20 20 20 20 20 20 20 6a 20 3d 20 69 20 2d 20          j = i - 
8480: 6e 48 69 64 64 65 6e 3b 0a 20 20 20 20 20 20 20  nHidden;.       
8490: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
84a0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
84b0: 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   j<pColumn->nId;
84c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
84d0: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b   if( pColumn->a[
84e0: 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65 61  j].idx==i ) brea
84f0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8500: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
8510: 3c 30 20 7c 7c 20 6e 43 6f 6c 75 6d 6e 3d 3d 30  <0 || nColumn==0
8520: 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20 26 26 20   || (pColumn && 
8530: 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29  j>=pColumn->nId)
8540: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8550: 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
8560: 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  rable(pParse, pT
8570: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c  ab->aCol[i].pDfl
8580: 74 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20  t, iRegStore);. 
8590: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75       }else if( u
85a0: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
85b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
85c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
85d0: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a  olumn, srcTab, j
85e0: 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 20 0a 20  , iRegStore); . 
85f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8600: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
8610: 20 20 69 66 28 20 72 65 67 46 72 6f 6d 53 65 6c    if( regFromSel
8620: 65 63 74 21 3d 72 65 67 44 61 74 61 20 29 7b 0a  ect!=regData ){.
8630: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8640: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8650: 50 5f 53 43 6f 70 79 2c 20 72 65 67 46 72 6f 6d  P_SCopy, regFrom
8660: 53 65 6c 65 63 74 2b 6a 2c 20 69 52 65 67 53 74  Select+j, iRegSt
8670: 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ore);.        }.
8680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8690: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
86a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
86b0: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  st->a[j].pExpr, 
86c0: 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20 20  iRegStore);.    
86d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
86e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
86f0: 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  to check constra
8700: 69 6e 74 73 20 61 6e 64 20 67 65 6e 65 72 61 74  ints and generat
8710: 65 20 69 6e 64 65 78 20 6b 65 79 73 20 61 6e 64  e index keys and
8720: 0a 20 20 20 20 2a 2a 20 64 6f 20 74 68 65 20 69  .    ** do the i
8730: 6e 73 65 72 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  nsertion..    */
8740: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8750: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8760: 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  E.    if( IsVirt
8770: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
8780: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
8790: 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  VTab = (const ch
87a0: 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
87b0: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
87c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
87d0: 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28 70  abMakeWritable(p
87e0: 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
87f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8800: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70 64  ddOp4(v, OP_VUpd
8810: 61 74 65 2c 20 31 2c 20 70 54 61 62 2d 3e 6e 43  ate, 1, pTab->nC
8820: 6f 6c 2b 32 2c 20 72 65 67 49 6e 73 2c 20 70 56  ol+2, regIns, pV
8830: 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
8840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8850: 43 68 61 6e 67 65 50 35 28 76 2c 20 6f 6e 45 72  ChangeP5(v, onEr
8860: 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
8870: 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 6f 6e 45  ? OE_Abort : onE
8880: 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rror);.      sql
8890: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
88a0: 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  rse);.    }else.
88b0: 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
88c0: 20 20 20 69 6e 74 20 69 73 52 65 70 6c 61 63 65     int isReplace
88d0: 3b 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74  ;    /* Set to t
88e0: 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69 6e  rue if constrain
88f0: 74 73 20 6d 61 79 20 63 61 75 73 65 20 61 20 72  ts may cause a r
8900: 65 70 6c 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  eplace */.      
8910: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
8920: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
8930: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 61 52  pParse, pTab, aR
8940: 65 67 49 64 78 2c 20 69 44 61 74 61 43 75 72 2c  egIdx, iDataCur,
8950: 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20   iIdxCur,.      
8960: 20 20 20 20 72 65 67 49 6e 73 2c 20 30 2c 20 69      regIns, 0, i
8970: 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 2c 20 6f 6e 45  pkColumn>=0, onE
8980: 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 2c  rror, endOfLoop,
8990: 20 26 69 73 52 65 70 6c 61 63 65 0a 20 20 20 20   &isReplace.    
89a0: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
89b0: 65 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65  e3FkCheck(pParse
89c0: 2c 20 70 54 61 62 2c 20 30 2c 20 72 65 67 49 6e  , pTab, 0, regIn
89d0: 73 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  s, 0, 0);.      
89e0: 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65 49  sqlite3CompleteI
89f0: 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73 65 2c  nsertion(pParse,
8a00: 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c   pTab, iDataCur,
8a10: 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20   iIdxCur,.      
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 72 65 67 49 6e 73 2c           regIns,
8a40: 20 61 52 65 67 49 64 78 2c 20 30 2c 20 61 70 70   aRegIdx, 0, app
8a50: 65 6e 64 46 6c 61 67 2c 20 69 73 52 65 70 6c 61  endFlag, isRepla
8a60: 63 65 3d 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ce==0);.    }.  
8a70: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
8a80: 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73  he count of rows
8a90: 20 74 68 61 74 20 61 72 65 20 69 6e 73 65 72 74   that are insert
8aa0: 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64  ed.  */.  if( (d
8ab0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8ac0: 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20  E_CountRows)!=0 
8ad0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
8ae0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
8af0: 64 64 49 6d 6d 2c 20 72 65 67 52 6f 77 43 6f 75  ddImm, regRowCou
8b00: 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69  nt, 1);.  }..  i
8b10: 66 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  f( pTrigger ){. 
8b20: 20 20 20 2f 2a 20 43 6f 64 65 20 41 46 54 45 52     /* Code AFTER
8b30: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 20   triggers */.   
8b40: 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54   sqlite3CodeRowT
8b50: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70  rigger(pParse, p
8b60: 54 72 69 67 67 65 72 2c 20 54 4b 5f 49 4e 53 45  Trigger, TK_INSE
8b70: 52 54 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 41  RT, 0, TRIGGER_A
8b80: 46 54 45 52 2c 20 0a 20 20 20 20 20 20 20 20 70  FTER, .        p
8b90: 54 61 62 2c 20 72 65 67 44 61 74 61 2d 32 2d 70  Tab, regData-2-p
8ba0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 6f 6e 45 72 72  Tab->nCol, onErr
8bb0: 6f 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a  or, endOfLoop);.
8bc0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f    }..  /* The bo
8bd0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6d 61 69 6e  ttom of the main
8be0: 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 2c   insertion loop,
8bf0: 20 69 66 20 74 68 65 20 64 61 74 61 20 73 6f 75   if the data sou
8c00: 72 63 65 0a 20 20 2a 2a 20 69 73 20 61 20 53 45  rce.  ** is a SE
8c10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
8c20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
8c30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
8c40: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20  , endOfLoop);.  
8c50: 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65  if( useTempTable
8c60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
8c70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8c80: 4e 65 78 74 2c 20 73 72 63 54 61 62 2c 20 61 64  Next, srcTab, ad
8c90: 64 72 43 6f 6e 74 29 3b 20 56 64 62 65 43 6f 76  drCont); VdbeCov
8ca0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
8cb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8cc0: 65 28 76 2c 20 61 64 64 72 49 6e 73 54 6f 70 29  e(v, addrInsTop)
8cd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ce0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
8cf0: 6f 73 65 2c 20 73 72 63 54 61 62 29 3b 0a 20 20  ose, srcTab);.  
8d00: 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63  }else if( pSelec
8d10: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
8d20: 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
8d30: 43 6f 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Cont);.    sqlit
8d40: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8d50: 2c 20 61 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20  , addrInsTop);. 
8d60: 20 7d 0a 0a 20 20 69 66 28 20 21 49 73 56 69 72   }..  if( !IsVir
8d70: 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 21 69  tual(pTab) && !i
8d80: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20  sView ){.    /* 
8d90: 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65 73  Close all tables
8da0: 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 69   opened */.    i
8db0: 66 28 20 69 44 61 74 61 43 75 72 3c 69 49 64 78  f( iDataCur<iIdx
8dc0: 43 75 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  Cur ) sqlite3Vdb
8dd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
8de0: 6f 73 65 2c 20 69 44 61 74 61 43 75 72 29 3b 0a  ose, iDataCur);.
8df0: 20 20 20 20 66 6f 72 28 69 64 78 3d 30 2c 20 70      for(idx=0, p
8e00: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
8e10: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
8e20: 78 2d 3e 70 4e 65 78 74 2c 20 69 64 78 2b 2b 29  x->pNext, idx++)
8e30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8e40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8e50: 43 6c 6f 73 65 2c 20 69 64 78 2b 69 49 64 78 43  Close, idx+iIdxC
8e60: 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ur);.    }.  }..
8e70: 69 6e 73 65 72 74 5f 65 6e 64 3a 0a 20 20 2f 2a  insert_end:.  /*
8e80: 20 55 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   Update the sqli
8e90: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
8ea0: 65 20 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65  e by storing the
8eb0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
8ec0: 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77    ** maximum row
8ed0: 69 64 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65  id counter value
8ee0: 73 20 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65  s recorded while
8ef0: 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a   inserting into.
8f00: 20 20 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65    ** autoincreme
8f10: 6e 74 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  nt tables..  */.
8f20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
8f30: 73 74 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73  sted==0 && pPars
8f40: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d  e->pTriggerTab==
8f50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8f60: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64  AutoincrementEnd
8f70: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20  (pParse);.  }.. 
8f80: 20 2f 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   /*.  ** Return 
8f90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
8fa0: 77 73 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  ws inserted. If 
8fb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8fc0: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67  .  ** generating
8fd0: 20 63 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66   code because of
8fe0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
8ff0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c  e3NestedParse(),
9000: 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76   do not.  ** inv
9010: 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
9020: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a   function..  */.
9030: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
9040: 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77  &SQLITE_CountRow
9050: 73 29 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e  s) && !pParse->n
9060: 65 73 74 65 64 20 26 26 20 21 70 50 61 72 73 65  ested && !pParse
9070: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20 29 7b  ->pTriggerTab ){
9080: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9090: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
90a0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 6f 77 43 6f  ultRow, regRowCo
90b0: 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  unt, 1);.    sql
90c0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
90d0: 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71  ls(v, 1);.    sq
90e0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
90f0: 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d  ame(v, 0, COLNAM
9100: 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20 69 6e  E_NAME, "rows in
9110: 73 65 72 74 65 64 22 2c 20 53 51 4c 49 54 45 5f  serted", SQLITE_
9120: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 69 6e  STATIC);.  }..in
9130: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  sert_cleanup:.  
9140: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
9150: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 4c 69 73  lete(db, pTabLis
9160: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
9170: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9180: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
9190: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
91a0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  , pSelect);.  sq
91b0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
91c0: 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a  e(db, pColumn);.
91d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
91e0: 64 62 2c 20 61 52 65 67 49 64 78 29 3b 0a 7d 0a  db, aRegIdx);.}.
91f0: 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69  ./* Make sure "i
9200: 73 56 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72  sView" and other
9210: 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20   macros defined 
9220: 61 62 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69  above are undefi
9230: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ned. Otherwise.*
9240: 2a 20 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72  * they may inter
9250: 66 65 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c  fere with compil
9260: 61 74 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66  ation of other f
9270: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  unctions in this
9280: 20 66 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20   file.** (or in 
9290: 61 6e 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66  another file, if
92a0: 20 74 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d   this file becom
92b0: 65 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 61  es part of the a
92c0: 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a  malgamation).  *
92d0: 2f 0a 23 69 66 64 65 66 20 69 73 56 69 65 77 0a  /.#ifdef isView.
92e0: 20 23 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23   #undef isView.#
92f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 70 54 72  endif.#ifdef pTr
9300: 69 67 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54  igger. #undef pT
9310: 72 69 67 67 65 72 0a 23 65 6e 64 69 66 0a 23 69  rigger.#endif.#i
9320: 66 64 65 66 20 74 6d 61 73 6b 0a 20 23 75 6e 64  fdef tmask. #und
9330: 65 66 20 74 6d 61 73 6b 0a 23 65 6e 64 69 66 0a  ef tmask.#endif.
9340: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9350: 63 6f 64 65 20 74 6f 20 64 6f 20 63 6f 6e 73 74  code to do const
9360: 72 61 69 6e 74 20 63 68 65 63 6b 73 20 70 72 69  raint checks pri
9370: 6f 72 20 74 6f 20 61 6e 20 49 4e 53 45 52 54 20  or to an INSERT 
9380: 6f 72 20 61 6e 20 55 50 44 41 54 45 0a 2a 2a 20  or an UPDATE.** 
9390: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 2e 0a 2a  on table pTab..*
93a0: 2a 0a 2a 2a 20 54 68 65 20 72 65 67 4e 65 77 44  *.** The regNewD
93b0: 61 74 61 20 70 61 72 61 6d 65 74 65 72 20 69 73  ata parameter is
93c0: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
93d0: 74 65 72 20 69 6e 20 61 20 72 61 6e 67 65 20 74  ter in a range t
93e0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
93f0: 74 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 69  the data to be i
9400: 6e 73 65 72 74 65 64 20 6f 72 20 74 68 65 20 64  nserted or the d
9410: 61 74 61 20 61 66 74 65 72 20 74 68 65 20 75 70  ata after the up
9420: 64 61 74 65 2e 20 20 54 68 65 72 65 20 77 69 6c  date.  There wil
9430: 6c 20 62 65 0a 2a 2a 20 70 54 61 62 2d 3e 6e 43  l be.** pTab->nC
9440: 6f 6c 2b 31 20 72 65 67 69 73 74 65 72 73 20 69  ol+1 registers i
9450: 6e 20 74 68 69 73 20 72 61 6e 67 65 2e 20 20 54  n this range.  T
9460: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
9470: 72 20 28 74 68 65 20 6f 6e 65 0a 2a 2a 20 74 68  r (the one.** th
9480: 61 74 20 72 65 67 4e 65 77 44 61 74 61 20 70 6f  at regNewData po
9490: 69 6e 74 73 20 74 6f 29 20 77 69 6c 6c 20 63 6f  ints to) will co
94a0: 6e 74 61 69 6e 20 74 68 65 20 6e 65 77 20 72 6f  ntain the new ro
94b0: 77 69 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 6e 20  wid, or NULL in 
94c0: 74 68 65 0a 2a 2a 20 63 61 73 65 20 6f 66 20 61  the.** case of a
94d0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
94e0: 61 62 6c 65 2e 20 20 54 68 65 20 73 65 63 6f 6e  able.  The secon
94f0: 64 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  d register in th
9500: 65 20 72 61 6e 67 65 20 77 69 6c 6c 0a 2a 2a 20  e range will.** 
9510: 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e 74  contain the cont
9520: 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  ent of the first
9530: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20   table column.  
9540: 54 68 65 20 74 68 69 72 64 20 72 65 67 69 73 74  The third regist
9550: 65 72 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61  er will.** conta
9560: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
9570: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 74 61 62  f the second tab
9580: 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 41 6e 64 20  le column.  And 
9590: 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20  so forth..**.** 
95a0: 54 68 65 20 72 65 67 4f 6c 64 44 61 74 61 20 70  The regOldData p
95b0: 61 72 61 6d 65 74 65 72 20 69 73 20 73 69 6d 69  arameter is simi
95c0: 6c 61 72 20 74 6f 20 72 65 67 4e 65 77 44 61 74  lar to regNewDat
95d0: 61 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  a except that it
95e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
95f0: 20 64 61 74 61 20 70 72 69 6f 72 20 74 6f 20 61   data prior to a
9600: 6e 20 55 50 44 41 54 45 20 72 61 74 68 65 72 20  n UPDATE rather 
9610: 74 68 61 6e 20 61 66 74 65 72 77 61 72 64 73 2e  than afterwards.
9620: 20 20 72 65 67 4f 6c 64 44 61 74 61 20 69 73 20    regOldData is 
9630: 7a 65 72 6f 0a 2a 2a 20 66 6f 72 20 61 6e 20 49  zero.** for an I
9640: 4e 53 45 52 54 2e 20 20 54 68 69 73 20 72 6f 75  NSERT.  This rou
9650: 74 69 6e 65 20 63 61 6e 20 64 69 73 74 69 6e 67  tine can disting
9660: 75 69 73 68 20 62 65 74 77 65 65 6e 20 55 50 44  uish between UPD
9670: 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 62  ATE and INSERT b
9680: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 72 65  y.** checking re
9690: 67 4f 6c 64 44 61 74 61 20 66 6f 72 20 7a 65 72  gOldData for zer
96a0: 6f 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  o..**.** For an 
96b0: 55 50 44 41 54 45 2c 20 74 68 65 20 70 6b 43 68  UPDATE, the pkCh
96c0: 6e 67 20 62 6f 6f 6c 65 61 6e 20 69 73 20 74 72  ng boolean is tr
96d0: 75 65 20 69 66 20 74 68 65 20 74 72 75 65 20 70  ue if the true p
96e0: 72 69 6d 61 72 79 20 6b 65 79 20 28 74 68 65 0a  rimary key (the.
96f0: 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 61 20 6e  ** rowid for a n
9700: 6f 72 6d 61 6c 20 74 61 62 6c 65 20 6f 72 20 74  ormal table or t
9710: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
9720: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
9730: 49 44 20 74 61 62 6c 65 29 0a 2a 2a 20 6d 69 67  ID table).** mig
9740: 68 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62  ht be modified b
9750: 79 20 74 68 65 20 55 50 44 41 54 45 2e 20 20 49  y the UPDATE.  I
9760: 66 20 70 6b 43 68 6e 67 20 69 73 20 66 61 6c 73  f pkChng is fals
9770: 65 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  e, then the key 
9780: 6f 66 0a 2a 2a 20 74 68 65 20 69 44 61 74 61 43  of.** the iDataC
9790: 75 72 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  ur content table
97a0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
97b0: 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 20 62  o be unchanged b
97c0: 79 20 74 68 65 20 55 50 44 41 54 45 2e 0a 2a 2a  y the UPDATE..**
97d0: 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 53 45 52  .** For an INSER
97e0: 54 2c 20 74 68 65 20 70 6b 43 68 6e 67 20 62 6f  T, the pkChng bo
97f0: 6f 6c 65 61 6e 20 69 6e 64 69 63 61 74 65 73 20  olean indicates 
9800: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
9810: 68 65 20 72 6f 77 69 64 0a 2a 2a 20 77 61 73 20  he rowid.** was 
9820: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
9830: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
9840: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
9850: 6d 65 6e 74 2e 20 20 49 66 20 70 6b 43 68 6e 67  ment.  If pkChng
9860: 0a 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 69 74 20  .** is zero, it 
9870: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
9880: 69 74 68 65 72 20 72 6f 77 69 64 20 69 73 20 63  ither rowid is c
9890: 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69  omputed automati
98a0: 63 61 6c 6c 79 20 6f 72 0a 2a 2a 20 74 68 61 74  cally or.** that
98b0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
98c0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
98d0: 62 6c 65 20 61 6e 64 20 68 61 73 20 6e 6f 20 72  ble and has no r
98e0: 6f 77 69 64 2e 20 20 4f 6e 20 61 6e 20 49 4e 53  owid.  On an INS
98f0: 45 52 54 2c 0a 2a 2a 20 70 6b 43 68 6e 67 20 77  ERT,.** pkChng w
9900: 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  ill only be true
9910: 20 69 66 20 74 68 65 20 49 4e 53 45 52 54 20 73   if the INSERT s
9920: 74 61 74 65 6d 65 6e 74 20 70 72 6f 76 69 64 65  tatement provide
9930: 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20  s an integer.** 
9940: 76 61 6c 75 65 20 66 6f 72 20 65 69 74 68 65 72  value for either
9950: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
9960: 6e 20 6f 72 20 69 74 73 20 49 4e 54 45 47 45 52  n or its INTEGER
9970: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6c 69   PRIMARY KEY ali
9980: 61 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  as..**.** The co
9990: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
99a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
99b0: 6c 20 73 74 6f 72 65 20 6e 65 77 20 69 6e 64 65  l store new inde
99c0: 78 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 0a 2a  x entries into.*
99d0: 2a 20 72 65 67 69 73 74 65 72 73 20 69 64 65 6e  * registers iden
99e0: 74 69 66 69 65 64 20 62 79 20 61 52 65 67 49 64  tified by aRegId
99f0: 78 5b 5d 2e 20 20 4e 6f 20 69 6e 64 65 78 20 65  x[].  No index e
9a00: 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
9a10: 66 6f 72 0a 2a 2a 20 69 6e 64 69 63 65 73 20 77  for.** indices w
9a20: 68 65 72 65 20 61 52 65 67 49 64 78 5b 69 5d 3d  here aRegIdx[i]=
9a30: 3d 30 2e 20 20 54 68 65 20 6f 72 64 65 72 20 6f  =0.  The order o
9a40: 66 20 69 6e 64 69 63 65 73 20 69 6e 20 61 52 65  f indices in aRe
9a50: 67 49 64 78 5b 5d 20 69 73 0a 2a 2a 20 74 68 65  gIdx[] is.** the
9a60: 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 64   same as the ord
9a70: 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 6f 6e  er of indices on
9a80: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9a90: 20 6f 66 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61   of indices.** a
9aa0: 74 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2e 0a  t pTab->pIndex..
9ab0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
9ac0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
9ad0: 64 79 20 6f 70 65 6e 65 64 20 77 72 69 74 65 61  dy opened writea
9ae0: 62 6c 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ble cursors on t
9af0: 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65  he main.** table
9b00: 20 61 6e 64 20 61 6c 6c 20 61 70 70 6c 69 63 61   and all applica
9b10: 62 6c 65 20 69 6e 64 69 63 65 73 20 28 74 68 61  ble indices (tha
9b20: 74 20 69 73 20 74 6f 20 73 61 79 2c 20 61 6c 6c  t is to say, all
9b30: 20 69 6e 64 69 63 65 73 20 66 6f 72 20 77 68 69   indices for whi
9b40: 63 68 0a 2a 2a 20 61 52 65 67 49 64 78 5b 5d 20  ch.** aRegIdx[] 
9b50: 69 73 20 6e 6f 74 20 7a 65 72 6f 29 2e 20 20 69  is not zero).  i
9b60: 44 61 74 61 43 75 72 20 69 73 20 74 68 65 20 63  DataCur is the c
9b70: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d 61  ursor for the ma
9b80: 69 6e 20 74 61 62 6c 65 20 77 68 65 6e 0a 2a 2a  in table when.**
9b90: 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 20 75 70   inserting or up
9ba0: 64 61 74 69 6e 67 20 61 20 72 6f 77 69 64 20 74  dating a rowid t
9bb0: 61 62 6c 65 2c 20 6f 72 20 74 68 65 20 63 75 72  able, or the cur
9bc0: 73 6f 72 20 66 6f 72 20 74 68 65 20 50 52 49 4d  sor for the PRIM
9bd0: 41 52 59 20 4b 45 59 0a 2a 2a 20 69 6e 64 65 78  ARY KEY.** index
9be0: 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 20   when operating 
9bf0: 6f 6e 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  on a WITHOUT ROW
9c00: 49 44 20 74 61 62 6c 65 2e 20 20 69 49 64 78 43  ID table.  iIdxC
9c10: 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ur is the cursor
9c20: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73  .** for the firs
9c30: 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 70  t index in the p
9c40: 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74  Tab->pIndex list
9c50: 2e 20 20 43 75 72 73 6f 72 73 20 66 6f 72 20 6f  .  Cursors for o
9c60: 74 68 65 72 20 69 6e 64 69 63 65 73 0a 2a 2a 20  ther indices.** 
9c70: 61 72 65 20 61 74 20 69 49 64 78 43 75 72 2b 4e  are at iIdxCur+N
9c80: 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6c   for the N-th el
9c90: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 54 61  ement of the pTa
9ca0: 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e 0a  b->pIndex list..
9cb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9cc0: 6e 65 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65  ne also generate
9cd0: 73 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  s code to check 
9ce0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 4e 4f  constraints.  NO
9cf0: 54 20 4e 55 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b  T NULL,.** CHECK
9d00: 2c 20 61 6e 64 20 55 4e 49 51 55 45 20 63 6f 6e  , and UNIQUE con
9d10: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
9d20: 20 63 68 65 63 6b 65 64 2e 20 20 49 66 20 61 20   checked.  If a 
9d30: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73  constraint fails
9d40: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 70  ,.** then the ap
9d50: 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e  propriate action
9d60: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
9d70: 54 68 65 72 65 20 61 72 65 20 66 69 76 65 20 70  There are five p
9d80: 6f 73 73 69 62 6c 65 0a 2a 2a 20 61 63 74 69 6f  ossible.** actio
9d90: 6e 73 3a 20 52 4f 4c 4c 42 41 43 4b 2c 20 41 42  ns: ROLLBACK, AB
9da0: 4f 52 54 2c 20 46 41 49 4c 2c 20 52 45 50 4c 41  ORT, FAIL, REPLA
9db0: 43 45 2c 20 61 6e 64 20 49 47 4e 4f 52 45 2e 0a  CE, and IGNORE..
9dc0: 2a 2a 0a 2a 2a 20 20 43 6f 6e 73 74 72 61 69 6e  **.**  Constrain
9dd0: 74 20 74 79 70 65 20 20 41 63 74 69 6f 6e 20 20  t type  Action  
9de0: 20 20 20 20 20 57 68 61 74 20 48 61 70 70 65 6e       What Happen
9df0: 73 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.**  ----------
9e00: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
9e10: 2d 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -   ------------
9e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
9e40: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
9e50: 20 20 52 4f 4c 4c 42 41 43 4b 20 20 20 20 20 54    ROLLBACK     T
9e60: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
9e70: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
9e80: 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 20 20 20   back and.**    
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
9eb0: 74 65 33 5f 73 74 65 70 28 29 20 72 65 74 75 72  te3_step() retur
9ec0: 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77  ns immediately w
9ed0: 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ith a.**        
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
9f00: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ode of SQLITE_CO
9f10: 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20  NSTRAINT..**.** 
9f20: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
9f30: 20 20 41 42 4f 52 54 20 20 20 20 20 20 20 20 42    ABORT        B
9f40: 61 63 6b 20 6f 75 74 20 63 68 61 6e 67 65 73 20  ack out changes 
9f50: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9f60: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20 20 20   command.**     
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 6c 79 20             only 
9f90: 28 64 6f 20 6e 6f 74 20 64 6f 20 61 20 63 6f 6d  (do not do a com
9fa0: 70 6c 65 74 65 20 72 6f 6c 6c 62 61 63 6b 29 20  plete rollback) 
9fb0: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 63 61 75 73 65 20 73 71 6c         cause sql
9fe0: 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72  ite3_step() to r
9ff0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
a000: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f      with SQLITE_
a030: 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a  CONSTRAINT..**.*
a040: 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20  *  any          
a050: 20 20 20 20 46 41 49 4c 20 20 20 20 20 20 20 20      FAIL        
a060: 20 53 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   Sqlite3_step() 
a070: 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69 61 74  returns immediat
a080: 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20 20 20  ely with a.**   
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
a0b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
a0c0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 20 20  TE_CONSTRAINT.  
a0d0: 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  The.**          
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f        transactio
a100: 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20  n is not rolled 
a110: 62 61 63 6b 20 61 6e 64 20 61 6e 79 0a 2a 2a 20  back and any.** 
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
a140: 68 61 6e 67 65 73 20 74 6f 20 70 72 69 6f 72 20  hanges to prior 
a150: 72 6f 77 73 20 61 72 65 20 72 65 74 61 69 6e 65  rows are retaine
a160: 64 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20  d..**.**  any   
a170: 20 20 20 20 20 20 20 20 20 20 20 49 47 4e 4f 52             IGNOR
a180: 45 20 20 20 20 20 20 20 54 68 65 20 61 74 74 65  E       The atte
a190: 6d 70 74 20 69 6e 20 69 6e 73 65 72 74 20 6f 72  mpt in insert or
a1a0: 20 75 70 64 61 74 65 20 74 68 65 20 63 75 72 72   update the curr
a1b0: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ent.**          
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 20 20 20 72 6f 77 20 69 73 20 73 6b 69        row is ski
a1e0: 70 70 65 64 2c 20 77 69 74 68 6f 75 74 20 74 68  pped, without th
a1f0: 72 6f 77 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  rowing an error.
a200: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 20 50 72 6f 63 65 73 73 69 6e 67 20 63 6f     Processing co
a230: 6e 74 69 6e 75 65 73 20 77 69 74 68 20 74 68 65  ntinues with the
a240: 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2a 20 20 20   next row..**   
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 68               (Th
a270: 65 72 65 20 69 73 20 61 6e 20 69 6d 6d 65 64 69  ere is an immedi
a280: 61 74 65 20 6a 75 6d 70 20 74 6f 20 69 67 6e 6f  ate jump to igno
a290: 72 65 44 65 73 74 2e 29 0a 2a 2a 0a 2a 2a 20 20  reDest.).**.**  
a2a0: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20  NOT NULL        
a2b0: 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 54 68   REPLACE      Th
a2c0: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  e NULL value is 
a2d0: 72 65 70 6c 61 63 65 20 62 79 20 74 68 65 20 64  replace by the d
a2e0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 66           value f
a310: 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20  or that column. 
a320: 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   If the default 
a330: 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20 20 20  value.**        
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 20 20 69 73 20 4e 55 4c 4c 2c          is NULL,
a360: 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 20 74   the action is t
a370: 68 65 20 73 61 6d 65 20 61 73 20 41 42 4f 52 54  he same as ABORT
a380: 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e 49 51 55 45 20  ..**.**  UNIQUE 
a390: 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43            REPLAC
a3a0: 45 20 20 20 20 20 20 54 68 65 20 6f 74 68 65 72  E      The other
a3b0: 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 66 6c 69   row that confli
a3c0: 63 74 73 20 77 69 74 68 20 74 68 65 20 72 6f 77  cts with the row
a3d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65     being inserte
a400: 64 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a  d is removed..**
a410: 0a 2a 2a 20 20 43 48 45 43 4b 20 20 20 20 20 20  .**  CHECK      
a420: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
a430: 20 20 20 49 6c 6c 65 67 61 6c 2e 20 20 54 68 65     Illegal.  The
a440: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 65   results in an e
a450: 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xception..**.** 
a460: 57 68 69 63 68 20 61 63 74 69 6f 6e 20 74 6f 20  Which action to 
a470: 74 61 6b 65 20 69 73 20 64 65 74 65 72 6d 69 6e  take is determin
a480: 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 72 69  ed by the overri
a490: 64 65 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  deError paramete
a4a0: 72 2e 0a 2a 2a 20 4f 72 20 69 66 20 6f 76 65 72  r..** Or if over
a4b0: 72 69 64 65 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  rideError==OE_De
a4c0: 66 61 75 6c 74 2c 20 74 68 65 6e 20 74 68 65 20  fault, then the 
a4d0: 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 20  pParse->onError 
a4e0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 69 73 20  parameter.** is 
a4f0: 75 73 65 64 2e 20 20 4f 72 20 69 66 20 70 50 61  used.  Or if pPa
a500: 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  rse->onError==OE
a510: 5f 44 65 66 61 75 6c 74 20 74 68 65 6e 20 74 68  _Default then th
a520: 65 20 6f 6e 45 72 72 6f 72 20 76 61 6c 75 65 0a  e onError value.
a530: 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ** for the const
a540: 72 61 69 6e 74 20 69 73 20 75 73 65 64 2e 0a 2a  raint is used..*
a550: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65  /.void sqlite3Ge
a560: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
a570: 43 68 65 63 6b 73 28 0a 20 20 50 61 72 73 65 20  Checks(.  Parse 
a580: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
a590: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
a5a0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
a5b0: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
a5c0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
a5d0: 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70  g inserted or up
a5e0: 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  dated */.  int *
a5f0: 61 52 65 67 49 64 78 2c 20 20 20 20 20 20 20 20  aRegIdx,        
a600: 2f 2a 20 55 73 65 20 72 65 67 69 73 74 65 72 20  /* Use register 
a610: 61 52 65 67 49 64 78 5b 69 5d 20 66 6f 72 20 69  aRegIdx[i] for i
a620: 6e 64 65 78 20 69 2e 20 20 30 20 66 6f 72 20 75  ndex i.  0 for u
a630: 6e 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  nused */.  int i
a640: 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 20 20  DataCur,        
a650: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 64 61 74  /* Canonical dat
a660: 61 20 63 75 72 73 6f 72 20 28 6d 61 69 6e 20 74  a cursor (main t
a670: 61 62 6c 65 20 6f 72 20 50 4b 20 69 6e 64 65 78  able or PK index
a680: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  ) */.  int iIdxC
a690: 75 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ur,         /* F
a6a0: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
a6b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65  r */.  int regNe
a6c0: 77 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 46  wData,      /* F
a6d0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
a6e0: 20 61 20 72 61 6e 67 65 20 68 6f 6c 64 69 6e 67   a range holding
a6f0: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72   values to inser
a700: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c  t */.  int regOl
a710: 64 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 50  dData,      /* P
a720: 72 65 76 69 6f 75 73 20 63 6f 6e 74 65 6e 74 2e  revious content.
a730: 20 20 30 20 66 6f 72 20 49 4e 53 45 52 54 73 20    0 for INSERTs 
a740: 2a 2f 0a 20 20 75 38 20 70 6b 43 68 6e 67 2c 20  */.  u8 pkChng, 
a750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
a760: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 72 6f 77  -zero if the row
a770: 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  id or PRIMARY KE
a780: 59 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  Y changed */.  u
a790: 38 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 2c  8 overrideError,
a7a0: 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 20      /* Override 
a7b0: 6f 6e 45 72 72 6f 72 20 74 6f 20 74 68 69 73 20  onError to this 
a7c0: 69 66 20 6e 6f 74 20 4f 45 5f 44 65 66 61 75 6c  if not OE_Defaul
a7d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72  t */.  int ignor
a7e0: 65 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 4a  eDest,      /* J
a7f0: 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
a800: 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49 67 6e 6f 72  l on an OE_Ignor
a810: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 2a 2f 0a  e resolution */.
a820: 20 20 69 6e 74 20 2a 70 62 4d 61 79 52 65 70 6c    int *pbMayRepl
a830: 61 63 65 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53  ace    /* OUT: S
a840: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 63 6f  et to true if co
a850: 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 63 61 75  nstraint may cau
a860: 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a 2f 0a  se a replace */.
a870: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  ){.  Vdbe *v;   
a880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42            /* VDB
a890: 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 74  E under construt
a8a0: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
a8b0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIdx;         /*
a8c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20   Pointer to one 
a8d0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 2a  of the indices *
a8e0: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
a8f0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20   0;      /* The 
a900: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
a910: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  x */.  sqlite3 *
a920: 64 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db;         /* D
a930: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a940: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  on */.  int i;  
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a960: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
a970: 20 20 69 6e 74 20 69 78 3b 20 20 20 20 20 20 20    int ix;       
a980: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a990: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
a9a0: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a9b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a9c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
a9d0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 3b 20 20 20   int onError;   
a9e0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
a9f0: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72  t resolution str
aa00: 61 74 65 67 79 20 2a 2f 0a 20 20 69 6e 74 20 61  ategy */.  int a
aa10: 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
aa20: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75  /* Address of ju
aa30: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  mp instruction *
aa40: 2f 0a 20 20 69 6e 74 20 73 65 65 6e 52 65 70 6c  /.  int seenRepl
aa50: 61 63 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  ace = 0; /* True
aa60: 20 69 66 20 52 45 50 4c 41 43 45 20 69 73 20 75   if REPLACE is u
aa70: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 49  sed to resolve I
aa80: 4e 54 20 50 4b 20 63 6f 6e 66 6c 69 63 74 20 2a  NT PK conflict *
aa90: 2f 0a 20 20 69 6e 74 20 6e 50 6b 46 69 65 6c 64  /.  int nPkField
aaa0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
aab0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
aac0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 31 20 66  PRIMARY KEY. 1 f
aad0: 6f 72 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  or ROWID tables 
aae0: 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 54 6f 70 20  */.  int ipkTop 
aaf0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70  = 0;      /* Top
ab00: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 68   of the rowid ch
ab10: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
ab20: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
ab30: 70 6b 42 6f 74 74 6f 6d 20 3d 20 30 3b 20 20 20  pkBottom = 0;   
ab40: 2f 2a 20 42 6f 74 74 6f 6d 20 6f 66 20 74 68 65  /* Bottom of the
ab50: 20 72 6f 77 69 64 20 63 68 61 6e 67 65 20 63 6f   rowid change co
ab60: 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 20 2a  nstraint check *
ab70: 2f 0a 20 20 75 38 20 69 73 55 70 64 61 74 65 3b  /.  u8 isUpdate;
ab80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ab90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 55   if this is an U
aba0: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 20  PDATE operation 
abb0: 2a 2f 0a 20 20 75 38 20 62 41 66 66 69 6e 69 74  */.  u8 bAffinit
abc0: 79 44 6f 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 54  yDone = 0;  /* T
abd0: 72 75 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66  rue if the OP_Af
abe0: 66 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e  finity operation
abf0: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20 2a 2f   has been run */
ac00: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20  .  int regRowid 
ac10: 3d 20 2d 31 3b 20 20 20 2f 2a 20 52 65 67 69 73  = -1;   /* Regis
ac20: 74 65 72 20 68 6f 6c 64 69 6e 67 20 52 4f 57 49  ter holding ROWI
ac30: 44 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 69 73  D value */..  is
ac40: 55 70 64 61 74 65 20 3d 20 72 65 67 4f 6c 64 44  Update = regOldD
ac50: 61 74 61 21 3d 30 3b 0a 20 20 64 62 20 3d 20 70  ata!=0;.  db = p
ac60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
ac70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ac80: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
ac90: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
aca0: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
acb0: 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69  ct==0 );  /* Thi
acc0: 73 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  s table is not a
acd0: 20 56 49 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20   VIEW */.  nCol 
ace0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
acf0: 0a 20 20 2f 2a 20 70 50 6b 20 69 73 20 74 68 65  .  /* pPk is the
ad00: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
ad10: 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ex for WITHOUT R
ad20: 4f 57 49 44 20 74 61 62 6c 65 73 20 61 6e 64 20  OWID tables and 
ad30: 4e 55 4c 4c 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f  NULL for.  ** no
ad40: 72 6d 61 6c 20 72 6f 77 69 64 20 74 61 62 6c 65  rmal rowid table
ad50: 73 2e 20 20 6e 50 6b 46 69 65 6c 64 20 69 73 20  s.  nPkField is 
ad60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65  the number of ke
ad70: 79 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  y fields in the 
ad80: 0a 20 20 2a 2a 20 70 50 6b 20 69 6e 64 65 78 20  .  ** pPk index 
ad90: 6f 72 20 31 20 66 6f 72 20 61 20 72 6f 77 69 64  or 1 for a rowid
ada0: 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65   table.  In othe
adb0: 72 20 77 6f 72 64 73 2c 20 6e 50 6b 46 69 65 6c  r words, nPkFiel
adc0: 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  d is the.  ** nu
add0: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
ade0: 6e 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61  n the true prima
adf0: 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61  ry key of the ta
ae00: 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 48 61  ble. */.  if( Ha
ae10: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
ae20: 20 20 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20      pPk = 0;.   
ae30: 20 6e 50 6b 46 69 65 6c 64 20 3d 20 31 3b 0a 20   nPkField = 1;. 
ae40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
ae50: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
ae60: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
ae70: 20 20 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20 70      nPkField = p
ae80: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d  Pk->nKeyCol;.  }
ae90: 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
aea0: 61 74 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68  at this module h
aeb0: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
aec0: 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
aed0: 74 28 28 76 2c 20 22 42 45 47 49 4e 3a 20 47 65  t((v, "BEGIN: Ge
aee0: 6e 43 6e 73 74 43 6b 73 28 25 64 2c 25 64 2c 25  nCnstCks(%d,%d,%
aef0: 64 2c 25 64 2c 25 64 29 22 2c 0a 20 20 20 20 20  d,%d,%d)",.     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
af20: 72 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20 72  r, regNewData, r
af30: 65 67 4f 6c 64 44 61 74 61 2c 20 70 6b 43 68 6e  egOldData, pkChn
af40: 67 29 29 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20  g));..  /* Test 
af50: 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  all NOT NULL con
af60: 73 74 72 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20  straints..  */. 
af70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
af80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
af90: 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  i==pTab->iPKey )
afa0: 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
afb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6e 45 72  ;.    }.    onEr
afc0: 72 6f 72 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ror = pTab->aCol
afd0: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20  [i].notNull;.   
afe0: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
aff0: 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  _None ) continue
b000: 3b 0a 20 20 20 20 69 66 28 20 6f 76 65 72 72 69  ;.    if( overri
b010: 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61  deError!=OE_Defa
b020: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
b030: 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45  rror = overrideE
b040: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rror;.    }else 
b050: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
b060: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
b070: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
b080: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ort;.    }.    i
b090: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  f( onError==OE_R
b0a0: 65 70 6c 61 63 65 20 26 26 20 70 54 61 62 2d 3e  eplace && pTab->
b0b0: 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30  aCol[i].pDflt==0
b0c0: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
b0d0: 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r = OE_Abort;.  
b0e0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
b0f0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c  onError==OE_Roll
b100: 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d  back || onError=
b110: 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45  =OE_Abort || onE
b120: 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20  rror==OE_Fail.  
b130: 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72        || onError
b140: 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f  ==OE_Ignore || o
b150: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
b160: 63 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68  ce );.    switch
b170: 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ( onError ){.   
b180: 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74     case OE_Abort
b190: 3a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  :.        sqlite
b1a0: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
b1b0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  );.        /* Fa
b1c0: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
b1d0: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c      case OE_Roll
b1e0: 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65  back:.      case
b1f0: 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20   OE_Fail: {.    
b200: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
b210: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
b220: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
b230: 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
b260: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d  ab->aCol[i].zNam
b270: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
b280: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
b290: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 2c 20   OP_HaltIfNull, 
b2a0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b2b0: 54 5f 4e 4f 54 4e 55 4c 4c 2c 20 6f 6e 45 72 72  T_NOTNULL, onErr
b2c0: 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
b2e0: 67 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20 7a 4d  gNewData+1+i, zM
b2f0: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
b300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b310: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b320: 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 4e 6f 74  P5_ConstraintNot
b330: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56  Null);.        V
b340: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b350: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
b370: 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20  e OE_Ignore: {. 
b380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b390: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b3a0: 73 4e 75 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74  sNull, regNewDat
b3b0: 61 2b 31 2b 69 2c 20 69 67 6e 6f 72 65 44 65 73  a+1+i, ignoreDes
b3c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
b3d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b3e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3f0: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
b400: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t: {.        ass
b410: 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  ert( onError==OE
b420: 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20  _Replace );.    
b430: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
b440: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b450: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67   OP_NotNull, reg
b460: 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20  NewData+1+i);.  
b470: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
b480: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b490: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b4a0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
b4b0: 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72  aCol[i].pDflt, r
b4c0: 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a  egNewData+1+i);.
b4d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b4e0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b4f0: 64 64 72 31 29 3b 0a 20 20 20 20 20 20 20 20 62  ddr1);.        b
b500: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b510: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65    }.  }..  /* Te
b520: 73 74 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  st all CHECK con
b530: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 23 69  straints.  */.#i
b540: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b550: 54 5f 43 48 45 43 4b 0a 20 20 69 66 28 20 70 54  T_CHECK.  if( pT
b560: 61 62 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 64  ab->pCheck && (d
b570: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
b580: 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d  E_IgnoreChecks)=
b590: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
b5a0: 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 70 54 61  st *pCheck = pTa
b5b0: 62 2d 3e 70 43 68 65 63 6b 3b 0a 20 20 20 20 70  b->pCheck;.    p
b5c0: 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20  Parse->ckBase = 
b5d0: 72 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20  regNewData+1;.  
b5e0: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72    onError = over
b5f0: 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65  rideError!=OE_De
b600: 66 61 75 6c 74 20 3f 20 6f 76 65 72 72 69 64 65  fault ? override
b610: 45 72 72 6f 72 20 3a 20 4f 45 5f 41 62 6f 72 74  Error : OE_Abort
b620: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
b630: 3c 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 3b 20  <pCheck->nExpr; 
b640: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
b650: 61 6c 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  allOk = sqlite3V
b660: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b680: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
b690: 20 70 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e 70 45   pCheck->a[i].pE
b6a0: 78 70 72 2c 20 61 6c 6c 4f 6b 2c 20 53 51 4c 49  xpr, allOk, SQLI
b6b0: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
b6c0: 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f        if( onErro
b6d0: 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  r==OE_Ignore ){.
b6e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b6f0: 64 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72  dbeGoto(v, ignor
b700: 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  eDest);.      }e
b710: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
b720: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 43 68 65 63  r *zName = pChec
b730: 6b 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  k->a[i].zName;. 
b740: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
b750: 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 70 54  ==0 ) zName = pT
b760: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
b770: 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d     if( onError==
b780: 4f 45 5f 52 65 70 6c 61 63 65 20 29 20 6f 6e 45  OE_Replace ) onE
b790: 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  rror = OE_Abort;
b7a0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 35 36 39   /* IMP: R-15569
b7b0: 2d 36 33 36 32 35 20 2a 2f 0a 20 20 20 20 20 20  -63625 */.      
b7c0: 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
b7d0: 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
b7e0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b7f0: 54 5f 43 48 45 43 4b 2c 0a 20 20 20 20 20 20 20  T_CHECK,.       
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20         onError, 
b820: 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53 49  zName, P4_TRANSI
b830: 45 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ENT,.           
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74     P5_Constraint
b860: 43 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  Check);.      }.
b870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b880: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b890: 20 61 6c 6c 4f 6b 29 3b 0a 20 20 20 20 7d 0a 20   allOk);.    }. 
b8a0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
b8b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b8c0: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
b8d0: 2a 20 49 66 20 72 6f 77 69 64 20 69 73 20 63 68  * If rowid is ch
b8e0: 61 6e 67 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72  anging, make sur
b8f0: 65 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20  e the new rowid 
b900: 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75  does not previou
b910: 73 6c 79 0a 20 20 2a 2a 20 65 78 69 73 74 20 69  sly.  ** exist i
b920: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  n the table..  *
b930: 2f 0a 20 20 69 66 28 20 70 6b 43 68 6e 67 20 26  /.  if( pkChng &
b940: 26 20 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPk==0 ){.    
b950: 69 6e 74 20 61 64 64 72 52 6f 77 69 64 4f 6b 20  int addrRowidOk 
b960: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b970: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
b980: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
b990: 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b  at action to tak
b9a0: 65 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20 72  e in case of a r
b9b0: 6f 77 69 64 20 63 6f 6c 6c 69 73 69 6f 6e 20 2a  owid collision *
b9c0: 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20  /.    onError = 
b9d0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20  pTab->keyConf;. 
b9e0: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
b9f0: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
ba00: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
ba10: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
ba20: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
ba30: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
ba40: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e  ault ){.      on
ba50: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
ba60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
ba70: 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20   isUpdate ){.   
ba80: 20 20 20 2f 2a 20 70 6b 43 68 6e 67 21 3d 30 20     /* pkChng!=0 
ba90: 64 6f 65 73 20 6e 6f 74 20 6d 65 61 6e 20 74 68  does not mean th
baa0: 61 74 20 74 68 65 20 72 6f 77 69 64 20 68 61 73  at the rowid has
bab0: 20 63 68 61 6e 67 65 2c 20 6f 6e 6c 79 20 74 68   change, only th
bac0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  at.      ** it m
bad0: 69 67 68 74 20 68 61 76 65 20 63 68 61 6e 67 65  ight have change
bae0: 64 2e 20 20 53 6b 69 70 20 74 68 65 20 63 6f 6e  d.  Skip the con
baf0: 66 6c 69 63 74 20 6c 6f 67 69 63 20 62 65 6c 6f  flict logic belo
bb00: 77 20 69 66 20 74 68 65 20 72 6f 77 69 64 0a 20  w if the rowid. 
bb10: 20 20 20 20 20 2a 2a 20 69 73 20 75 6e 63 68 61       ** is uncha
bb20: 6e 67 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  nged. */.      s
bb30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bb40: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 4e 65  (v, OP_Eq, regNe
bb50: 77 44 61 74 61 2c 20 61 64 64 72 52 6f 77 69 64  wData, addrRowid
bb60: 4f 6b 2c 20 72 65 67 4f 6c 64 44 61 74 61 29 3b  Ok, regOldData);
bb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bb80: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
bb90: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
bba0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
bbb0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  e(v);.    }..   
bbc0: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 73 70 6f   /* If the respo
bbd0: 6e 73 65 20 74 6f 20 61 20 72 6f 77 69 64 20 63  nse to a rowid c
bbe0: 6f 6e 66 6c 69 63 74 20 69 73 20 52 45 50 4c 41  onflict is REPLA
bbf0: 43 45 20 62 75 74 20 74 68 65 20 72 65 73 70 6f  CE but the respo
bc00: 6e 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 73 6f  nse.    ** to so
bc10: 6d 65 20 6f 74 68 65 72 20 55 4e 49 51 55 45 20  me other UNIQUE 
bc20: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 46 41  constraint is FA
bc30: 49 4c 20 6f 72 20 49 47 4e 4f 52 45 2c 20 74 68  IL or IGNORE, th
bc40: 65 6e 20 77 65 20 6e 65 65 64 0a 20 20 20 20 2a  en we need.    *
bc50: 2a 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 72  * to defer the r
bc60: 75 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72 6f  unning of the ro
bc70: 77 69 64 20 63 6f 6e 66 6c 69 63 74 20 63 68 65  wid conflict che
bc80: 63 6b 69 6e 67 20 75 6e 74 69 6c 20 61 66 74 65  cking until afte
bc90: 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 55 4e 49  r.    ** the UNI
bca0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  QUE constraints 
bcb0: 68 61 76 65 20 72 75 6e 2e 0a 20 20 20 20 2a 2f  have run..    */
bcc0: 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
bcd0: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 26 26 20  ==OE_Replace && 
bce0: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f  overrideError!=O
bcf0: 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
bd00: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
bd10: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
bd20: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
bd30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
bd40: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
bd50: 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 49 64 78 2d  _Ignore || pIdx-
bd60: 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69  >onError==OE_Fai
bd70: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
bd80: 70 6b 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  pkTop = sqlite3V
bd90: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
bda0: 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Goto);.         
bdb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bdc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
bdd0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
bde0: 20 73 65 65 20 69 66 20 74 68 65 20 6e 65 77 20   see if the new 
bdf0: 72 6f 77 69 64 20 61 6c 72 65 61 64 79 20 65 78  rowid already ex
be00: 69 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ists in the tabl
be10: 65 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20  e.  Skip.    ** 
be20: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
be30: 6e 66 6c 69 63 74 20 6c 6f 67 69 63 20 69 66 20  nflict logic if 
be40: 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a  it does not. */.
be50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
be60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
be70: 78 69 73 74 73 2c 20 69 44 61 74 61 43 75 72 2c  xists, iDataCur,
be80: 20 61 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72 65   addrRowidOk, re
be90: 67 4e 65 77 44 61 74 61 29 3b 0a 20 20 20 20 56  gNewData);.    V
bea0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
beb0: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
bec0: 20 63 6f 64 65 20 74 68 61 74 20 64 65 61 6c 73   code that deals
bed0: 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 63 6f   with a rowid co
bee0: 6c 6c 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  llision */.    s
bef0: 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29  witch( onError )
bf00: 7b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  {.      default:
bf10: 20 7b 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72   {.        onErr
bf20: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
bf30: 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74         /* Fall t
bf40: 68 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78  hru into the nex
bf50: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  t case */.      
bf60: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  }.      case OE_
bf70: 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20  Rollback:.      
bf80: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20  case OE_Abort:. 
bf90: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
bfa0: 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l: {.        sql
bfb0: 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
bfc0: 69 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45 72  int(pParse, onEr
bfd0: 72 6f 72 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  ror, pTab);.    
bfe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bff0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
c000: 5f 52 65 70 6c 61 63 65 3a 20 7b 0a 20 20 20 20  _Replace: {.    
c010: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
c020: 61 72 65 20 44 45 4c 45 54 45 20 74 72 69 67 67  are DELETE trigg
c030: 65 72 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ers on this tabl
c040: 65 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20  e and the.      
c050: 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74    ** recursive-t
c060: 72 69 67 67 65 72 73 20 66 6c 61 67 20 69 73 20  riggers flag is 
c070: 73 65 74 2c 20 63 61 6c 6c 20 47 65 6e 65 72 61  set, call Genera
c080: 74 65 52 6f 77 44 65 6c 65 74 65 28 29 20 74 6f  teRowDelete() to
c090: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
c0a0: 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69  ve the conflicti
c0b0: 6e 67 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 20  ng row from the 
c0c0: 74 61 62 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c  table. This will
c0d0: 20 66 69 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   fire.        **
c0e0: 20 74 68 65 20 74 72 69 67 67 65 72 73 20 61 6e   the triggers an
c0f0: 64 20 72 65 6d 6f 76 65 20 62 6f 74 68 20 74 68  d remove both th
c100: 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  e table and inde
c110: 78 20 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73  x b-tree entries
c120: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
c130: 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
c140: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
c150: 6e 6f 20 74 72 69 67 67 65 72 73 20 6f 72 20 74  no triggers or t
c160: 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 72 69  he recursive-tri
c170: 67 67 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  ggers.        **
c180: 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
c190: 2c 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20  , but the table 
c1a0: 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
c1b0: 69 6e 64 65 78 65 73 2c 20 63 61 6c 6c 20 0a 20  indexes, call . 
c1c0: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
c1d0: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
c1e0: 28 29 2e 20 54 68 69 73 20 72 65 6d 6f 76 65 73  (). This removes
c1f0: 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
c200: 65 20 65 6e 74 72 69 65 73 20 0a 20 20 20 20 20  e entries .     
c210: 20 20 20 2a 2a 20 6f 6e 6c 79 2e 20 54 68 65 20     ** only. The 
c220: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 65 6e 74  table b-tree ent
c230: 72 79 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  ry will be repla
c240: 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 65  ced by the new e
c250: 6e 74 72 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ntry .        **
c260: 20 77 68 65 6e 20 69 74 20 69 73 20 69 6e 73 65   when it is inse
c270: 72 74 65 64 2e 20 20 0a 20 20 20 20 20 20 20 20  rted.  .        
c280: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  **.        ** If
c290: 20 65 69 74 68 65 72 20 47 65 6e 65 72 61 74 65   either Generate
c2a0: 52 6f 77 44 65 6c 65 74 65 28 29 20 6f 72 20 47  RowDelete() or G
c2b0: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
c2c0: 65 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65  elete() is calle
c2d0: 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  d,.        ** al
c2e0: 73 6f 20 69 6e 76 6f 6b 65 20 4d 75 6c 74 69 57  so invoke MultiW
c2f0: 72 69 74 65 28 29 20 74 6f 20 69 6e 64 69 63 61  rite() to indica
c300: 74 65 20 74 68 61 74 20 74 68 69 73 20 56 44 42  te that this VDB
c310: 45 20 6d 61 79 20 72 65 71 75 69 72 65 0a 20 20  E may require.  
c320: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
c330: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 28 69 66 20  nt rollback (if 
c340: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c350: 20 61 62 6f 72 74 65 64 20 61 66 74 65 72 20 74   aborted after t
c360: 68 65 20 64 65 6c 65 74 65 0a 20 20 20 20 20 20  he delete.      
c370: 20 20 2a 2a 20 74 61 6b 65 73 20 70 6c 61 63 65    ** takes place
c380: 29 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ). Earlier versi
c390: 6f 6e 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74  ons called sqlit
c3a0: 65 33 4d 75 6c 74 69 57 72 69 74 65 28 29 20 72  e3MultiWrite() r
c3b0: 65 67 61 72 64 6c 65 73 73 2c 0a 20 20 20 20 20  egardless,.     
c3c0: 20 20 20 2a 2a 20 62 75 74 20 62 65 69 6e 67 20     ** but being 
c3d0: 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 68  more selective h
c3e0: 65 72 65 20 61 6c 6c 6f 77 73 20 73 74 61 74 65  ere allows state
c3f0: 6d 65 6e 74 73 20 6c 69 6b 65 3a 0a 20 20 20 20  ments like:.    
c400: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c410: 2a 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f  *   REPLACE INTO
c420: 20 74 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53   t(rowid) VALUES
c430: 28 24 6e 65 77 72 6f 77 69 64 29 0a 20 20 20 20  ($newrowid).    
c440: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
c450: 2a 20 74 6f 20 72 75 6e 20 77 69 74 68 6f 75 74  * to run without
c460: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75   a statement jou
c470: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 61 72  rnal if there ar
c480: 65 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20  e no indexes on 
c490: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  the.        ** t
c4a0: 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  able..        */
c4b0: 0a 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72  .        Trigger
c4c0: 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a   *pTrigger = 0;.
c4d0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
c4e0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 63  flags&SQLITE_Rec
c4f0: 54 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20  Triggers ){.    
c500: 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d        pTrigger =
c510: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73   sqlite3Triggers
c520: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
c530: 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30  ab, TK_DELETE, 0
c540: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
c550: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 72 69          if( pTri
c560: 67 67 65 72 20 7c 7c 20 73 71 6c 69 74 65 33 46  gger || sqlite3F
c570: 6b 52 65 71 75 69 72 65 64 28 70 50 61 72 73 65  kRequired(pParse
c580: 2c 20 70 54 61 62 2c 20 30 2c 20 30 29 20 29 7b  , pTab, 0, 0) ){
c590: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c5a0: 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61  e3MultiWrite(pPa
c5b0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
c5c0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52  sqlite3GenerateR
c5d0: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  owDelete(pParse,
c5e0: 20 70 54 61 62 2c 20 70 54 72 69 67 67 65 72 2c   pTab, pTrigger,
c5f0: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
c600: 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 20 72 65 67 4e 65 77 44 61 74         regNewDat
c630: 61 2c 20 31 2c 20 30 2c 20 4f 45 5f 52 65 70 6c  a, 1, 0, OE_Repl
c640: 61 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ace,.           
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 20 20 20 20 20 20 4f 4e 45 50 41 53 53 5f          ONEPASS_
c670: 53 49 4e 47 4c 45 2c 20 2d 31 29 3b 0a 20 20 20  SINGLE, -1);.   
c680: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c690: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
c6a0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
c6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 6c        sqlite3Mul
c6c0: 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
c6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
c6e0: 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49  ite3GenerateRowI
c6f0: 6e 64 65 78 44 65 6c 65 74 65 28 70 50 61 72 73  ndexDelete(pPars
c700: 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75  e, pTab, iDataCu
c710: 72 2c 20 69 49 64 78 43 75 72 2c 30 2c 2d 31 29  r, iIdxCur,0,-1)
c720: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c740: 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b  seenReplace = 1;
c750: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
c770: 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a  se OE_Ignore: {.
c780: 20 20 20 20 20 20 20 20 2f 2a 61 73 73 65 72 74          /*assert
c790: 28 20 73 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30  ( seenReplace==0
c7a0: 20 29 3b 2a 2f 0a 20 20 20 20 20 20 20 20 73 71   );*/.        sq
c7b0: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
c7c0: 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20   ignoreDest);.  
c7d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c7e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
c7f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c800: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 6f  eLabel(v, addrRo
c810: 77 69 64 4f 6b 29 3b 0a 20 20 20 20 69 66 28 20  widOk);.    if( 
c820: 69 70 6b 54 6f 70 20 29 7b 0a 20 20 20 20 20 20  ipkTop ){.      
c830: 69 70 6b 42 6f 74 74 6f 6d 20 3d 20 73 71 6c 69  ipkBottom = sqli
c840: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
c850: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20   OP_Goto);.     
c860: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c870: 48 65 72 65 28 76 2c 20 69 70 6b 54 6f 70 29 3b  Here(v, ipkTop);
c880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c890: 20 54 65 73 74 20 61 6c 6c 20 55 4e 49 51 55 45   Test all UNIQUE
c8a0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 79 20   constraints by 
c8b0: 63 72 65 61 74 69 6e 67 20 65 6e 74 72 69 65 73  creating entries
c8c0: 20 66 6f 72 20 65 61 63 68 20 55 4e 49 51 55 45   for each UNIQUE
c8d0: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20  .  ** index and 
c8e0: 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 61 74  making sure that
c8f0: 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 69   duplicate entri
c900: 65 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61 64  es do not alread
c910: 79 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 43 6f  y exist..  ** Co
c920: 6d 70 75 74 65 20 74 68 65 20 72 65 76 69 73 65  mpute the revise
c930: 64 20 72 65 63 6f 72 64 20 65 6e 74 72 69 65 73  d record entries
c940: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 61 73 20   for indices as 
c950: 77 65 20 67 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  we go..  **.  **
c960: 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
c970: 68 61 6e 64 6c 65 73 20 74 68 65 20 63 61 73 65  handles the case
c980: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
c990: 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 61 0a  KEY index for a.
c9a0: 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52 4f 57    ** WITHOUT ROW
c9b0: 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ID table..  */. 
c9c0: 20 66 6f 72 28 69 78 3d 30 2c 20 70 49 64 78 3d   for(ix=0, pIdx=
c9d0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c9e0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
c9f0: 4e 65 78 74 2c 20 69 78 2b 2b 29 7b 0a 20 20 20  Next, ix++){.   
ca00: 20 69 6e 74 20 72 65 67 49 64 78 3b 20 20 20 20   int regIdx;    
ca10: 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f        /* Range o
ca20: 66 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64  f registers hold
ca30: 20 63 6f 6e 65 6e 74 20 66 6f 72 20 70 49 64 78   conent for pIdx
ca40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
ca50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ca60: 52 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  Range of registe
ca70: 72 73 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 66 6c  rs holding confl
ca80: 69 63 74 69 6e 67 20 50 4b 20 2a 2f 0a 20 20 20  icting PK */.   
ca90: 20 69 6e 74 20 69 54 68 69 73 43 75 72 3b 20 20   int iThisCur;  
caa0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
cab0: 66 6f 72 20 74 68 69 73 20 55 4e 49 51 55 45 20  for this UNIQUE 
cac0: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
cad0: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 3b 20 20   addrUniqueOk;  
cae0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
caf0: 66 20 74 68 65 20 55 4e 49 51 55 45 20 63 6f 6e  f the UNIQUE con
cb00: 73 74 72 61 69 6e 74 20 69 73 20 73 61 74 69 73  straint is satis
cb10: 66 69 65 64 20 2a 2f 0a 0a 20 20 20 20 69 66 28  fied */..    if(
cb20: 20 61 52 65 67 49 64 78 5b 69 78 5d 3d 3d 30 20   aRegIdx[ix]==0 
cb30: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
cb40: 53 6b 69 70 20 69 6e 64 69 63 65 73 20 74 68 61  Skip indices tha
cb50: 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
cb60: 2a 2f 0a 20 20 20 20 69 66 28 20 62 41 66 66 69  */.    if( bAffi
cb70: 6e 69 74 79 44 6f 6e 65 3d 3d 30 20 29 7b 0a 20  nityDone==0 ){. 
cb80: 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
cb90: 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70 54 61  eAffinity(v, pTa
cba0: 62 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31 29  b, regNewData+1)
cbb0: 3b 0a 20 20 20 20 20 20 62 41 66 66 69 6e 69 74  ;.      bAffinit
cbc0: 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  yDone = 1;.    }
cbd0: 0a 20 20 20 20 69 54 68 69 73 43 75 72 20 3d 20  .    iThisCur = 
cbe0: 69 49 64 78 43 75 72 2b 69 78 3b 0a 20 20 20 20  iIdxCur+ix;.    
cbf0: 61 64 64 72 55 6e 69 71 75 65 4f 6b 20 3d 20 73  addrUniqueOk = s
cc00: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cc10: 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
cc20: 53 6b 69 70 20 70 61 72 74 69 61 6c 20 69 6e 64  Skip partial ind
cc30: 69 63 65 73 20 66 6f 72 20 77 68 69 63 68 20 74  ices for which t
cc40: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
cc50: 69 73 20 6e 6f 74 20 74 72 75 65 20 2a 2f 0a 20  is not true */. 
cc60: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61     if( pIdx->pPa
cc70: 72 74 49 64 78 57 68 65 72 65 20 29 7b 0a 20 20  rtIdxWhere ){.  
cc80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cc90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
cca0: 2c 20 30 2c 20 61 52 65 67 49 64 78 5b 69 78 5d  , 0, aRegIdx[ix]
ccb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
ccc0: 3e 63 6b 42 61 73 65 20 3d 20 72 65 67 4e 65 77  >ckBase = regNew
ccd0: 44 61 74 61 2b 31 3b 0a 20 20 20 20 20 20 73 71  Data+1;.      sq
cce0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
ccf0: 44 75 70 28 70 50 61 72 73 65 2c 20 70 49 64 78  Dup(pParse, pIdx
cd00: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
cd10: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20   addrUniqueOk,. 
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
cd40: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
cd50: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 42       pParse->ckB
cd60: 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ase = 0;.    }..
cd70: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
cd80: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 69 73 20  record for this 
cd90: 69 6e 64 65 78 20 65 6e 74 72 79 20 61 73 20 69  index entry as i
cda0: 74 20 73 68 6f 75 6c 64 20 61 70 70 65 61 72 20  t should appear 
cdb0: 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  after.    ** the
cdc0: 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74   insert or updat
cdd0: 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74 20 72  e.  Store that r
cde0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 61 52 65  ecord in the aRe
cdf0: 67 49 64 78 5b 69 78 5d 20 72 65 67 69 73 74 65  gIdx[ix] registe
ce00: 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  r.    */.    reg
ce10: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Idx = sqlite3Get
ce20: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
ce30: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
ce40: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ce50: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
ce60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
ce70: 69 46 69 65 6c 64 20 3d 20 70 49 64 78 2d 3e 61  iField = pIdx->a
ce80: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
ce90: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
cea0: 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e 5f 45 58  f( iField==XN_EX
ceb0: 50 52 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  PR ){.        pP
cec0: 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72  arse->ckBase = r
ced0: 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20 20  egNewData+1;.   
cee0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cef0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 64  Code(pParse, pId
cf00: 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69  x->aColExpr->a[i
cf10: 5d 2e 70 45 78 70 72 2c 20 72 65 67 49 64 78 2b  ].pExpr, regIdx+
cf20: 69 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  i);.        pPar
cf30: 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 30 3b 0a  se->ckBase = 0;.
cf40: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
cf50: 65 6e 74 28 28 76 2c 20 22 25 73 20 63 6f 6c 75  ent((v, "%s colu
cf60: 6d 6e 20 25 64 22 2c 20 70 49 64 78 2d 3e 7a 4e  mn %d", pIdx->zN
cf70: 61 6d 65 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  ame, i));.      
cf80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
cf90: 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e 5f 52 4f  f( iField==XN_RO
cfa0: 57 49 44 20 7c 7c 20 69 46 69 65 6c 64 3d 3d 70  WID || iField==p
cfb0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
cfc0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67 52          if( regR
cfd0: 6f 77 69 64 3d 3d 72 65 67 49 64 78 2b 69 20 29  owid==regIdx+i )
cfe0: 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 52 4f   continue; /* RO
cff0: 57 49 44 20 61 6c 72 65 61 64 79 20 69 6e 20 72  WID already in r
d000: 65 67 49 64 78 2b 69 20 2a 2f 0a 20 20 20 20 20  egIdx+i */.     
d010: 20 20 20 20 20 78 20 3d 20 72 65 67 4e 65 77 44       x = regNewD
d020: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ata;.          r
d030: 65 67 52 6f 77 69 64 20 3d 20 20 70 49 64 78 2d  egRowid =  pIdx-
d040: 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3f  >pPartIdxWhere ?
d050: 20 2d 31 20 3a 20 72 65 67 49 64 78 2b 69 3b 0a   -1 : regIdx+i;.
d060: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d070: 20 20 20 20 20 20 20 20 20 78 20 3d 20 69 46 69           x = iFi
d080: 65 6c 64 20 2b 20 72 65 67 4e 65 77 44 61 74 61  eld + regNewData
d090: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 1;.        }.
d0a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d0b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 69 46 69  dbeAddOp2(v, iFi
d0c0: 65 6c 64 3c 30 20 3f 20 4f 50 5f 49 6e 74 43 6f  eld<0 ? OP_IntCo
d0d0: 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 20 78  py : OP_SCopy, x
d0e0: 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20 20  , regIdx+i);.   
d0f0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d100: 28 28 76 2c 20 22 25 73 22 2c 20 69 46 69 65 6c  ((v, "%s", iFiel
d110: 64 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  d<0 ? "rowid" : 
d120: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 46 69 65 6c  pTab->aCol[iFiel
d130: 64 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  d].zName));.    
d140: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
d150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d160: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
d170: 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e  , regIdx, pIdx->
d180: 6e 43 6f 6c 75 6d 6e 2c 20 61 52 65 67 49 64 78  nColumn, aRegIdx
d190: 5b 69 78 5d 29 3b 0a 20 20 20 20 56 64 62 65 43  [ix]);.    VdbeC
d1a0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
d1b0: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
d1c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ));.    sqlite3E
d1d0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
d1e0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
d1f0: 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f  egIdx, pIdx->nCo
d200: 6c 75 6d 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  lumn);..    /* I
d210: 6e 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72  n an UPDATE oper
d220: 61 74 69 6f 6e 2c 20 69 66 20 74 68 69 73 20 69  ation, if this i
d230: 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
d240: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 0a 20  ARY KEY index . 
d250: 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f     ** of a WITHO
d260: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61  UT ROWID table a
d270: 6e 64 20 74 68 65 72 65 20 68 61 73 20 62 65 65  nd there has bee
d280: 6e 20 6e 6f 20 63 68 61 6e 67 65 20 74 68 65 0a  n no change the.
d290: 20 20 20 20 2a 2a 20 70 72 69 6d 61 72 79 20 6b      ** primary k
d2a0: 65 79 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 6c 6c  ey, then no coll
d2b0: 69 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  ision is possibl
d2c0: 65 2e 20 20 54 68 65 20 63 6f 6c 6c 69 73 69 6f  e.  The collisio
d2d0: 6e 20 64 65 74 65 63 74 69 6f 6e 0a 20 20 20 20  n detection.    
d2e0: 2a 2a 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 63  ** logic below c
d2f0: 61 6e 20 61 6c 6c 20 62 65 20 73 6b 69 70 70 65  an all be skippe
d300: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  d. */.    if( is
d310: 55 70 64 61 74 65 20 26 26 20 70 50 6b 3d 3d 70  Update && pPk==p
d320: 49 64 78 20 26 26 20 70 6b 43 68 6e 67 3d 3d 30  Idx && pkChng==0
d330: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d340: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d350: 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f  l(v, addrUniqueO
d360: 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  k);.      contin
d370: 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
d380: 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61 74 20  * Find out what 
d390: 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69  action to take i
d3a0: 6e 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  n case there is 
d3b0: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
d3c0: 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 6f 6e 45  flict */.    onE
d3d0: 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e 45  rror = pIdx->onE
d3e0: 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f 6e  rror;.    if( on
d3f0: 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
d400: 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  { .      sqlite3
d410: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
d420: 28 70 50 61 72 73 65 2c 20 72 65 67 49 64 78 2c  (pParse, regIdx,
d430: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d450: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d460: 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b  , addrUniqueOk);
d470: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
d480: 20 20 2f 2a 20 70 49 64 78 20 69 73 20 6e 6f 74    /* pIdx is not
d490: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20   a UNIQUE index 
d4a0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
d4b0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d   overrideError!=
d4c0: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
d4d0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
d4e0: 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20  errideError;.   
d4f0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72   }else if( onErr
d500: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
d510: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
d520: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
d530: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 43 68  }.    .    /* Ch
d540: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
d550: 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72  e new index entr
d560: 79 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  y will be unique
d570: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
d580: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
d590: 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 69  OP_NoConflict, i
d5a0: 54 68 69 73 43 75 72 2c 20 61 64 64 72 55 6e 69  ThisCur, addrUni
d5b0: 71 75 65 4f 6b 2c 0a 20 20 20 20 20 20 20 20 20  queOk,.         
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  regIdx, pIdx->nK
d5e0: 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
d5f0: 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  rage(v);..    /*
d600: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d610: 6f 20 68 61 6e 64 6c 65 20 63 6f 6c 6c 69 73 69  o handle collisi
d620: 6f 6e 73 20 2a 2f 0a 20 20 20 20 72 65 67 52 20  ons */.    regR 
d630: 3d 20 28 70 49 64 78 3d 3d 70 50 6b 29 20 3f 20  = (pIdx==pPk) ? 
d640: 72 65 67 49 64 78 20 3a 20 73 71 6c 69 74 65 33  regIdx : sqlite3
d650: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
d660: 72 73 65 2c 20 6e 50 6b 46 69 65 6c 64 29 3b 0a  rse, nPkField);.
d670: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
d680: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
d690: 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
d6a0: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
d6b0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ab) ){.        s
d6c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d6d0: 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
d6e0: 20 69 54 68 69 73 43 75 72 2c 20 72 65 67 52 29   iThisCur, regR)
d6f0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ;.        /* Con
d700: 66 6c 69 63 74 20 6f 6e 6c 79 20 69 66 20 74 68  flict only if th
d710: 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
d720: 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 65 6e  xisting index en
d730: 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  try.        ** i
d740: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
d750: 20 6f 6c 64 2d 72 6f 77 69 64 20 2a 2f 0a 20 20   old-rowid */.  
d760: 20 20 20 20 20 20 69 66 28 20 69 73 55 70 64 61        if( isUpda
d770: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
d780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d790: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52  3(v, OP_Eq, regR
d7a0: 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 20  , addrUniqueOk, 
d7b0: 72 65 67 4f 6c 64 44 61 74 61 29 3b 0a 20 20 20  regOldData);.   
d7c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d7d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
d7e0: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
d7f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
d800: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
d810: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
d820: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  .        int x;.
d830: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
d840: 63 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ct the PRIMARY K
d850: 45 59 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  EY from the end 
d860: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
d870: 72 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  ry and.        *
d880: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 72 65  * store it in re
d890: 67 69 73 74 65 72 73 20 72 65 67 52 2e 2e 72 65  gisters regR..re
d8a0: 67 52 2b 6e 50 6b 2d 31 20 2a 2f 0a 20 20 20 20  gR+nPk-1 */.    
d8b0: 20 20 20 20 69 66 28 20 70 49 64 78 21 3d 70 50      if( pIdx!=pP
d8c0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  k ){.          f
d8d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e 6e  or(i=0; i<pPk->n
d8e0: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
d8f0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
d900: 28 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  ( pPk->aiColumn[
d910: 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  i]>=0 );.       
d920: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
d930: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
d940: 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  dx, pPk->aiColum
d950: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  n[i]);.         
d960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d970: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
d980: 6e 2c 20 69 54 68 69 73 43 75 72 2c 20 78 2c 20  n, iThisCur, x, 
d990: 72 65 67 52 2b 69 29 3b 0a 20 20 20 20 20 20 20  regR+i);.       
d9a0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d9b0: 28 28 76 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  ((v, "%s.%s", pT
d9c0: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
d9f0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Pk->aiColumn[i]]
da00: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  .zName));.      
da10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
da20: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 55 70          if( isUp
da30: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  date ){.        
da40: 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c    /* If currentl
da50: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  y processing the
da60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
da70: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
da80: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61  .          ** ta
da90: 62 6c 65 2c 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69  ble, only confli
daa0: 63 74 20 69 66 20 74 68 65 20 6e 65 77 20 50 52  ct if the new PR
dab0: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73  IMARY KEY values
dac0: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20   are actually.  
dad0: 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65          ** diffe
dae0: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c  rent from the ol
daf0: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  d..          **.
db00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72            ** For
db10: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c   a UNIQUE index,
db20: 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69   only conflict i
db30: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
db40: 59 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 20  Y values.       
db50: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74     ** of the mat
db60: 63 68 65 64 20 69 6e 64 65 78 20 72 6f 77 20 61  ched index row a
db70: 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  re different fro
db80: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 50  m the original P
db90: 52 49 4d 41 52 59 0a 20 20 20 20 20 20 20 20 20  RIMARY.         
dba0: 20 2a 2a 20 4b 45 59 20 76 61 6c 75 65 73 20 6f   ** KEY values o
dbb0: 66 20 74 68 69 73 20 72 6f 77 20 62 65 66 6f 72  f this row befor
dbc0: 65 20 74 68 65 20 75 70 64 61 74 65 2e 20 20 2a  e the update.  *
dbd0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
dbe0: 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74  addrJump = sqlit
dbf0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
dc00: 72 28 76 29 2b 70 50 6b 2d 3e 6e 4b 65 79 43 6f  r(v)+pPk->nKeyCo
dc10: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  l;.          int
dc20: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 0a 20 20 20   op = OP_Ne;.   
dc30: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 43 6d         int regCm
dc40: 70 20 3d 20 28 49 73 50 72 69 6d 61 72 79 4b 65  p = (IsPrimaryKe
dc50: 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 72  yIndex(pIdx) ? r
dc60: 65 67 49 64 78 20 3a 20 72 65 67 52 29 3b 0a 20  egIdx : regR);. 
dc70: 20 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28   .          for(
dc80: 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79  i=0; i<pPk->nKey
dc90: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
dca0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 34 20         char *p4 
dcb0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
dcc0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
dcd0: 61 72 73 65 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c  arse, pPk->azCol
dce0: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  l[i]);.         
dcf0: 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f     x = pPk->aiCo
dd00: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
dd10: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
dd20: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
dd30: 20 69 66 28 20 69 3d 3d 28 70 50 6b 2d 3e 6e 4b   if( i==(pPk->nK
dd40: 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20  eyCol-1) ){.    
dd50: 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4a 75            addrJu
dd60: 6d 70 20 3d 20 61 64 64 72 55 6e 69 71 75 65 4f  mp = addrUniqueO
dd70: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
dd80: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 0a 20 20 20   op = OP_Eq;.   
dd90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
dda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ddb0: 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
ddc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddd0: 20 72 65 67 4f 6c 64 44 61 74 61 2b 31 2b 78 2c   regOldData+1+x,
dde0: 20 61 64 64 72 4a 75 6d 70 2c 20 72 65 67 43 6d   addrJump, regCm
ddf0: 70 2b 69 2c 20 70 34 2c 20 50 34 5f 43 4f 4c 4c  p+i, p4, P4_COLL
de00: 53 45 51 0a 20 20 20 20 20 20 20 20 20 20 20 20  SEQ.            
de10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
de20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
de30: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
de40: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
de50: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
de60: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 29 3b  f(v, op==OP_Eq);
de70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
de80: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
de90: 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
dea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
deb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
dec0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
ded0: 63 6f 64 65 20 74 68 61 74 20 65 78 65 63 75 74  code that execut
dee0: 65 73 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e  es if the new in
def0: 64 65 78 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  dex entry is not
df00: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 61   unique */.    a
df10: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
df20: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f  OE_Rollback || o
df30: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
df40: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
df50: 46 61 69 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20  Fail.        || 
df60: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f  onError==OE_Igno
df70: 72 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f  re || onError==O
df80: 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20  E_Replace );.   
df90: 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72   switch( onError
dfa0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
dfb0: 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  E_Rollback:.    
dfc0: 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a    case OE_Abort:
dfd0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46  .      case OE_F
dfe0: 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ail: {.        s
dff0: 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
e000: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f  traint(pParse, o
e010: 6e 45 72 72 6f 72 2c 20 70 49 64 78 29 3b 0a 20  nError, pIdx);. 
e020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e030: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
e040: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20   OE_Ignore: {.  
e050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e060: 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72 65 44  eGoto(v, ignoreD
e070: 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  est);.        br
e080: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e090: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
e0a0: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70        Trigger *p
e0b0: 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20  Trigger = 0;.   
e0c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45       assert( onE
e0d0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
e0e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
e0f0: 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
e100: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
e110: 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  f( db->flags&SQL
e120: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 20  ITE_RecTriggers 
e130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 72  ){.          pTr
e140: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
e150: 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61  riggersExist(pPa
e160: 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45  rse, pTab, TK_DE
e170: 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LETE, 0, 0);.   
e180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
e190: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
e1a0: 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  wDelete(pParse, 
e1b0: 70 54 61 62 2c 20 70 54 72 69 67 67 65 72 2c 20  pTab, pTrigger, 
e1c0: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
e1d0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r,.            r
e1e0: 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 2c 20 30  egR, nPkField, 0
e1f0: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 0a 20 20  , OE_Replace,.  
e200: 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 3d            (pIdx=
e210: 3d 70 50 6b 20 3f 20 4f 4e 45 50 41 53 53 5f 53  =pPk ? ONEPASS_S
e220: 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f  INGLE : ONEPASS_
e230: 4f 46 46 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20  OFF), -1);.     
e240: 20 20 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d     seenReplace =
e250: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
e260: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
e270: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e280: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e290: 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20  addrUniqueOk);. 
e2a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
e2b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
e2c0: 65 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d  e, regIdx, pIdx-
e2d0: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69  >nColumn);.    i
e2e0: 66 28 20 72 65 67 52 21 3d 72 65 67 49 64 78 20  f( regR!=regIdx 
e2f0: 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  ) sqlite3Release
e300: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
e310: 2c 20 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64  , regR, nPkField
e320: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 70 6b  );.  }.  if( ipk
e330: 54 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Top ){.    sqlit
e340: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 70  e3VdbeGoto(v, ip
e350: 6b 54 6f 70 2b 31 29 3b 0a 20 20 20 20 73 71 6c  kTop+1);.    sql
e360: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e370: 28 76 2c 20 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a  (v, ipkBottom);.
e380: 20 20 7d 0a 20 20 0a 20 20 2a 70 62 4d 61 79 52    }.  .  *pbMayR
e390: 65 70 6c 61 63 65 20 3d 20 73 65 65 6e 52 65 70  eplace = seenRep
e3a0: 6c 61 63 65 3b 0a 20 20 56 64 62 65 4d 6f 64 75  lace;.  VdbeModu
e3b0: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
e3c0: 4e 44 3a 20 47 65 6e 43 6e 73 74 43 6b 73 28 25  ND: GenCnstCks(%
e3d0: 64 29 22 2c 20 73 65 65 6e 52 65 70 6c 61 63 65  d)", seenReplace
e3e0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
e3f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
e400: 74 65 73 20 63 6f 64 65 20 74 6f 20 66 69 6e 69  tes code to fini
e410: 73 68 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72  sh the INSERT or
e420: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
e430: 6e 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 73 74  n.** that was st
e440: 61 72 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  arted by a prior
e450: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
e460: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
e470: 6e 74 43 68 65 63 6b 73 2e 0a 2a 2a 20 41 20 63  ntChecks..** A c
e480: 6f 6e 73 65 63 75 74 69 76 65 20 72 61 6e 67 65  onsecutive range
e490: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
e4a0: 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77  arting at regNew
e4b0: 44 61 74 61 20 63 6f 6e 74 61 69 6e 73 20 74 68  Data contains th
e4c0: 65 0a 2a 2a 20 72 6f 77 69 64 20 61 6e 64 20 74  e.** rowid and t
e4d0: 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65  he content to be
e4e0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
e4f0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
e500: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
e510: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  hould be the sam
e520: 65 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  e as the first s
e530: 69 78 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ix.** arguments 
e540: 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  to sqlite3Genera
e550: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
e560: 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ks..*/.void sqli
e570: 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  te3CompleteInser
e580: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
e590: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
e5a0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
e5b0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
e5c0: 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ab,        /* th
e5d0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
e5e0: 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  ch we are insert
e5f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ing */.  int iDa
e600: 74 61 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20  taCur,       /* 
e610: 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 63 61  Cursor of the ca
e620: 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 73 6f 75  nonical data sou
e630: 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  rce */.  int iId
e640: 78 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  xCur,        /* 
e650: 46 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73  First index curs
e660: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  or */.  int regN
e670: 65 77 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 52  ewData,     /* R
e680: 61 6e 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ange of content 
e690: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64  */.  int *aRegId
e6a0: 78 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  x,       /* Regi
e6b0: 73 74 65 72 20 75 73 65 64 20 62 79 20 65 61 63  ster used by eac
e6c0: 68 20 69 6e 64 65 78 2e 20 20 30 20 66 6f 72 20  h index.  0 for 
e6d0: 75 6e 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a  unused indices *
e6e0: 2f 0a 20 20 69 6e 74 20 69 73 55 70 64 61 74 65  /.  int isUpdate
e6f0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
e700: 66 6f 72 20 55 50 44 41 54 45 2c 20 46 61 6c 73  for UPDATE, Fals
e710: 65 20 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a  e for INSERT */.
e720: 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
e730: 2c 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ,     /* True if
e740: 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
e750: 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 20  to be an append 
e760: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 53 65 65 6b  */.  int useSeek
e770: 52 65 73 75 6c 74 20 20 20 2f 2a 20 54 72 75 65  Result   /* True
e780: 20 74 6f 20 73 65 74 20 74 68 65 20 55 53 45 53   to set the USES
e790: 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
e7a0: 6e 20 4f 50 5f 5b 49 64 78 5d 49 6e 73 65 72 74  n OP_[Idx]Insert
e7b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
e7c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e7d0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
e7e0: 6e 74 73 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  nts under constr
e7f0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
e800: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
e810: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 62 65 69 6e  /* An index bein
e820: 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70  g inserted or up
e830: 64 61 74 65 64 20 2a 2f 0a 20 20 75 38 20 70 69  dated */.  u8 pi
e840: 6b 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  k_flags;       /
e850: 2a 20 66 6c 61 67 20 76 61 6c 75 65 73 20 70 61  * flag values pa
e860: 73 73 65 64 20 74 6f 20 74 68 65 20 62 74 72 65  ssed to the btre
e870: 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e  e insert */.  in
e880: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
e890: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 72 65 67    /* Content reg
e8a0: 69 73 74 65 72 73 20 28 61 66 74 65 72 20 74 68  isters (after th
e8b0: 65 20 72 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e  e rowid) */.  in
e8c0: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
e8d0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
e8e0: 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
e8f0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74  record for the t
e900: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
e910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e920: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e930: 0a 20 20 75 38 20 62 41 66 66 69 6e 69 74 79 44  .  u8 bAffinityD
e940: 6f 6e 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  one = 0; /* True
e950: 20 69 66 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   if OP_Affinity 
e960: 68 61 73 20 62 65 65 6e 20 72 75 6e 20 61 6c 72  has been run alr
e970: 65 61 64 79 20 2a 2f 0a 0a 20 20 76 20 3d 20 73  eady */..  v = s
e980: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e990: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
e9a0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
e9b0: 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
e9c0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  ==0 );  /* This 
e9d0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56  table is not a V
e9e0: 49 45 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  IEW */.  for(i=0
e9f0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
ea00: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
ea10: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
ea20: 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65 67 49  ){.    if( aRegI
ea30: 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  dx[i]==0 ) conti
ea40: 6e 75 65 3b 0a 20 20 20 20 62 41 66 66 69 6e 69  nue;.    bAffini
ea50: 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  tyDone = 1;.    
ea60: 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49  if( pIdx->pPartI
ea70: 64 78 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  dxWhere ){.     
ea80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea90: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
eaa0: 20 61 52 65 67 49 64 78 5b 69 5d 2c 20 73 71 6c   aRegIdx[i], sql
eab0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
eac0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
ead0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
eae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
eaf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eb00: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
eb10: 49 64 78 43 75 72 2b 69 2c 20 61 52 65 67 49 64  IdxCur+i, aRegId
eb20: 78 5b 69 5d 29 3b 0a 20 20 20 20 70 69 6b 5f 66  x[i]);.    pik_f
eb30: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  lags = 0;.    if
eb40: 28 20 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20  ( useSeekResult 
eb50: 29 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50  ) pik_flags = OP
eb60: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
eb70: 4c 54 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72  LT;.    if( IsPr
eb80: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
eb90: 64 78 29 20 26 26 20 21 48 61 73 52 6f 77 69 64  dx) && !HasRowid
eba0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
ebb0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
ebc0: 6e 65 73 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  nested==0 );.   
ebd0: 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20     pik_flags |= 
ebe0: 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a  OPFLAG_NCHANGE;.
ebf0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 69      }.    if( pi
ec00: 6b 5f 66 6c 61 67 73 20 29 20 20 73 71 6c 69 74  k_flags )  sqlit
ec10: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
ec20: 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 20 20  , pik_flags);.  
ec30: 7d 0a 20 20 69 66 28 20 21 48 61 73 52 6f 77 69  }.  if( !HasRowi
ec40: 64 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  d(pTab) ) return
ec50: 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72 65  ;.  regData = re
ec60: 67 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a 20 20  gNewData + 1;.  
ec70: 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65 33  regRec = sqlite3
ec80: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ec90: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
eca0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
ecb0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 44 61 74  keRecord, regDat
ecc0: 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 72  a, pTab->nCol, r
ecd0: 65 67 52 65 63 29 3b 0a 20 20 69 66 28 20 21 62  egRec);.  if( !b
ece0: 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 29 20 73  AffinityDone ) s
ecf0: 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
ed00: 69 74 79 28 76 2c 20 70 54 61 62 2c 20 30 29 3b  ity(v, pTab, 0);
ed10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
ed20: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ed30: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
ed40: 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  a, pTab->nCol);.
ed50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
ed60: 73 74 65 64 20 29 7b 0a 20 20 20 20 70 69 6b 5f  sted ){.    pik_
ed70: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  flags = 0;.  }el
ed80: 73 65 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67  se{.    pik_flag
ed90: 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e  s = OPFLAG_NCHAN
eda0: 47 45 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67  GE;.    pik_flag
edb0: 73 20 7c 3d 20 28 69 73 55 70 64 61 74 65 3f 4f  s |= (isUpdate?O
edc0: 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 3a 4f  PFLAG_ISUPDATE:O
edd0: 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 29  PFLAG_LASTROWID)
ede0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 70 65  ;.  }.  if( appe
edf0: 6e 64 42 69 61 73 20 29 7b 0a 20 20 20 20 70 69  ndBias ){.    pi
ee00: 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41  k_flags |= OPFLA
ee10: 47 5f 41 50 50 45 4e 44 3b 0a 20 20 7d 0a 20 20  G_APPEND;.  }.  
ee20: 69 66 28 20 75 73 65 53 65 65 6b 52 65 73 75 6c  if( useSeekResul
ee30: 74 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  t ){.    pik_fla
ee40: 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 55 53 45  gs |= OPFLAG_USE
ee50: 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20 20 7d 0a  SEEKRESULT;.  }.
ee60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ee70: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
ee80: 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65 67 52  , iDataCur, regR
ee90: 65 63 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b  ec, regNewData);
eea0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
eeb0: 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 73 71  nested ){.    sq
eec0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
eed0: 34 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  4(v, -1, pTab->z
eee0: 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53 49 45  Name, P4_TRANSIE
eef0: 4e 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  NT);.  }.  sqlit
ef00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
ef10: 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a  , pik_flags);.}.
ef20: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
ef30: 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20  cursors for the 
ef40: 70 54 61 62 20 74 61 62 6c 65 20 61 6e 64 20 61  pTab table and a
ef50: 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
ef60: 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  nd generate.** c
ef70: 6f 64 65 20 74 6f 20 6f 70 65 6e 20 61 6e 64 20  ode to open and 
ef80: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 6f 73  initialized thos
ef90: 65 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  e cursors..**.**
efa0: 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   The cursor for 
efb0: 74 68 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  the object that 
efc0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
efd0: 70 6c 65 74 65 20 64 61 74 61 20 28 6e 6f 72 6d  plete data (norm
efe0: 61 6c 6c 79 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ally.** the tabl
eff0: 65 20 69 74 73 65 6c 66 2c 20 62 75 74 20 74 68  e itself, but th
f000: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
f010: 64 65 78 20 69 6e 20 74 68 65 20 63 61 73 65 20  dex in the case 
f020: 6f 66 20 61 20 57 49 54 48 4f 55 54 0a 2a 2a 20  of a WITHOUT.** 
f030: 52 4f 57 49 44 20 74 61 62 6c 65 29 20 69 73 20  ROWID table) is 
f040: 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 44  returned in *piD
f050: 61 74 61 43 75 72 2e 20 20 54 68 65 20 66 69 72  ataCur.  The fir
f060: 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  st index cursor 
f070: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
f080: 6e 20 2a 70 69 49 64 78 43 75 72 2e 20 20 54 68  n *piIdxCur.  Th
f090: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69  e number of indi
f0a0: 63 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ces is returned.
f0b0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 69 42 61 73 65  .**.** Use iBase
f0c0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 63 75   as the first cu
f0d0: 72 73 6f 72 20 28 65 69 74 68 65 72 20 74 68 65  rsor (either the
f0e0: 20 2a 70 69 44 61 74 61 43 75 72 20 66 6f 72 20   *piDataCur for 
f0f0: 72 6f 77 69 64 20 74 61 62 6c 65 73 0a 2a 2a 20  rowid tables.** 
f100: 6f 72 20 74 68 65 20 66 69 72 73 74 20 69 6e 64  or the first ind
f110: 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ex for WITHOUT R
f120: 4f 57 49 44 20 74 61 62 6c 65 73 29 20 69 66 20  OWID tables) if 
f130: 69 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  it is non-negati
f140: 76 65 2e 0a 2a 2a 20 49 66 20 69 42 61 73 65 20  ve..** If iBase 
f150: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
f160: 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e  n allocate the n
f170: 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75  ext available cu
f180: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rsor..**.** For 
f190: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 2a  a rowid table, *
f1a0: 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20 62  piDataCur will b
f1b0: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6c 65  e exactly one le
f1c0: 73 73 20 74 68 61 6e 20 2a 70 69 49 64 78 43 75  ss than *piIdxCu
f1d0: 72 2e 0a 2a 2a 20 46 6f 72 20 61 20 57 49 54 48  r..** For a WITH
f1e0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
f1f0: 20 2a 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c   *piDataCur will
f200: 20 62 65 20 73 6f 6d 65 77 68 65 72 65 20 69 6e   be somewhere in
f210: 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66   the range.** of
f220: 20 2a 70 69 49 64 78 43 75 72 73 2c 20 64 65 70   *piIdxCurs, dep
f230: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 72 65 20  ending on where 
f240: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
f250: 69 6e 64 65 78 20 61 70 70 65 61 72 73 20 6f 6e  index appears on
f260: 20 74 68 65 0a 2a 2a 20 70 54 61 62 2d 3e 70 49   the.** pTab->pI
f270: 6e 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  ndex list..**.**
f280: 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
f290: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65  rtual table, the
f2a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
f2b0: 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 74 68  s a no-op and th
f2c0: 65 0a 2a 2a 20 2a 70 69 44 61 74 61 43 75 72 20  e.** *piDataCur 
f2d0: 61 6e 64 20 2a 70 69 49 64 78 43 75 72 20 76 61  and *piIdxCur va
f2e0: 6c 75 65 73 20 61 72 65 20 6c 65 66 74 20 75 6e  lues are left un
f2f0: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a  initialized..*/.
f300: 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
f310: 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a  ableAndIndices(.
f320: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f330: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f340: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
f350: 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54   *pTab,     /* T
f360: 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  able to be opene
f370: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  d */.  int op,  
f380: 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70          /* OP_Op
f390: 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
f3a0: 6e 57 72 69 74 65 20 2a 2f 0a 20 20 75 38 20 70  nWrite */.  u8 p
f3b0: 35 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5,           /* 
f3c0: 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
f3d0: 4f 70 65 6e 2a 20 69 6e 73 74 72 75 63 74 69 6f  Open* instructio
f3e0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  ns */.  int iBas
f3f0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  e,       /* Use 
f400: 74 68 69 73 20 66 6f 72 20 74 68 65 20 74 61 62  this for the tab
f410: 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 74 68  le cursor, if th
f420: 65 72 65 20 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  ere is one */.  
f430: 75 38 20 2a 61 54 6f 4f 70 65 6e 2c 20 20 20 20  u8 *aToOpen,    
f440: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 3a   /* If not NULL:
f450: 20 62 6f 6f 6c 65 61 6e 20 66 6f 72 20 65 61 63   boolean for eac
f460: 68 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  h table and inde
f470: 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 44 61  x */.  int *piDa
f480: 74 61 43 75 72 2c 20 20 2f 2a 20 57 72 69 74 65  taCur,  /* Write
f490: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
f4a0: 75 72 63 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  urce cursor numb
f4b0: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  er here */.  int
f4c0: 20 2a 70 69 49 64 78 43 75 72 20 20 20 20 2f 2a   *piIdxCur    /*
f4d0: 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
f4e0: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75   index cursor nu
f4f0: 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mber here */.){.
f500: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
f510: 44 62 3b 0a 20 20 69 6e 74 20 69 44 61 74 61 43  Db;.  int iDataC
f520: 75 72 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ur;.  Index *pId
f530: 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  x;.  Vdbe *v;.. 
f540: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
f550: 4f 70 65 6e 52 65 61 64 20 7c 7c 20 6f 70 3d 3d  OpenRead || op==
f560: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 3b 0a  OP_OpenWrite );.
f570: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
f580: 5f 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 35  _OpenWrite || p5
f590: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 49 73 56  ==0 );.  if( IsV
f5a0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
f5b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
f5c0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  ine is a no-op f
f5d0: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
f5e0: 73 2e 20 4c 65 61 76 65 20 74 68 65 20 6f 75 74  s. Leave the out
f5f0: 70 75 74 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  put.    ** varia
f600: 62 6c 65 73 20 2a 70 69 44 61 74 61 43 75 72 20  bles *piDataCur 
f610: 61 6e 64 20 2a 70 69 49 64 78 43 75 72 20 75 6e  and *piIdxCur un
f620: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 6f 20 74  initialized so t
f630: 68 61 74 20 76 61 6c 67 72 69 6e 64 0a 20 20 20  hat valgrind.   
f640: 20 2a 2a 20 63 61 6e 20 64 65 74 65 63 74 20 69   ** can detect i
f650: 66 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  f they are used 
f660: 62 79 20 6d 69 73 74 61 6b 65 20 69 6e 20 74 68  by mistake in th
f670: 65 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20  e caller. */.   
f680: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f690: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
f6a0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
f6b0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
f6c0: 63 68 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71  chema);.  v = sq
f6d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f6e0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
f6f0: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 42  v!=0 );.  if( iB
f700: 61 73 65 3c 30 20 29 20 69 42 61 73 65 20 3d 20  ase<0 ) iBase = 
f710: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
f720: 69 44 61 74 61 43 75 72 20 3d 20 69 42 61 73 65  iDataCur = iBase
f730: 2b 2b 3b 0a 20 20 69 66 28 20 70 69 44 61 74 61  ++;.  if( piData
f740: 43 75 72 20 29 20 2a 70 69 44 61 74 61 43 75 72  Cur ) *piDataCur
f750: 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20 20 69   = iDataCur;.  i
f760: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
f770: 29 20 26 26 20 28 61 54 6f 4f 70 65 6e 3d 3d 30  ) && (aToOpen==0
f780: 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 30 5d 29 20   || aToOpen[0]) 
f790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ){.    sqlite3Op
f7a0: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
f7b0: 69 44 61 74 61 43 75 72 2c 20 69 44 62 2c 20 70  iDataCur, iDb, p
f7c0: 54 61 62 2c 20 6f 70 29 3b 0a 20 20 7d 65 6c 73  Tab, op);.  }els
f7d0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  e{.    sqlite3Ta
f7e0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
f7f0: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
f800: 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74   op==OP_OpenWrit
f810: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  e, pTab->zName);
f820: 0a 20 20 7d 0a 20 20 69 66 28 20 70 69 49 64 78  .  }.  if( piIdx
f830: 43 75 72 20 29 20 2a 70 69 49 64 78 43 75 72 20  Cur ) *piIdxCur 
f840: 3d 20 69 42 61 73 65 3b 0a 20 20 66 6f 72 28 69  = iBase;.  for(i
f850: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
f860: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f870: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69  x=pIdx->pNext, i
f880: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  ++){.    int iId
f890: 78 43 75 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a  xCur = iBase++;.
f8a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f8b0: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
f8c0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
f8d0: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
f8e0: 49 6e 64 65 78 28 70 49 64 78 29 20 26 26 20 21  Index(pIdx) && !
f8f0: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
f900: 26 20 70 69 44 61 74 61 43 75 72 20 29 7b 0a 20  & piDataCur ){. 
f910: 20 20 20 20 20 2a 70 69 44 61 74 61 43 75 72 20       *piDataCur 
f920: 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 7d  = iIdxCur;.    }
f930: 0a 20 20 20 20 69 66 28 20 61 54 6f 4f 70 65 6e  .    if( aToOpen
f940: 3d 3d 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 69  ==0 || aToOpen[i
f950: 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  +1] ){.      sql
f960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f970: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 70  , op, iIdxCur, p
f980: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
f990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f9a0: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
f9b0: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
f9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
f9d0: 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a  hangeP5(v, p5);.
f9e0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f9f0: 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78  t((v, "%s", pIdx
fa00: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
fa10: 0a 20 20 7d 0a 20 20 69 66 28 20 69 42 61 73 65  .  }.  if( iBase
fa20: 3e 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 29 20  >pParse->nTab ) 
fa30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69  pParse->nTab = i
fa40: 42 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 69  Base;.  return i
fa50: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
fa60: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
fa70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
fa80: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
fa90: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
faa0: 65 76 65 72 20 74 68 65 0a 2a 2a 20 74 72 61 6e  ever the.** tran
fab0: 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  sfer optimizatio
fac0: 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 69 73  n is used.  This
fad0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
fae0: 74 69 6e 67 0a 2a 2a 20 70 75 72 70 6f 73 65 73  ting.** purposes
faf0: 20 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65 20   only - to make 
fb00: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 66 65  sure the transfe
fb10: 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72  r optimization r
fb20: 65 61 6c 6c 79 0a 2a 2a 20 69 73 20 68 61 70 70  eally.** is happ
fb30: 65 6e 69 6e 67 20 77 68 65 6e 20 69 74 20 69 73  ening when it is
fb40: 20 73 75 70 70 6f 73 65 64 20 74 6f 2e 0a 2a 2f   supposed to..*/
fb50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65  .int sqlite3_xfe
fb60: 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  ropt_count;.#end
fb70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
fb80: 54 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  T */...#ifndef S
fb90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f  QLITE_OMIT_XFER_
fba0: 4f 50 54 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  OPT./*.** Check 
fbb0: 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 61 6d  to collation nam
fbc0: 65 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  es to see if the
fbd0: 79 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65  y are compatible
fbe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fbf0: 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 43 6f  xferCompatibleCo
fc00: 6c 6c 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  llation(const ch
fc10: 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68  ar *z1, const ch
fc20: 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20 7a  ar *z2){.  if( z
fc30: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  1==0 ){.    retu
fc40: 72 6e 20 7a 32 3d 3d 30 3b 0a 20 20 7d 0a 20 20  rn z2==0;.  }.  
fc50: 69 66 28 20 7a 32 3d 3d 30 20 29 7b 0a 20 20 20  if( z2==0 ){.   
fc60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
fc70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
fc80: 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 3d 3d  trICmp(z1, z2)==
fc90: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  0;.}.../*.** Che
fca0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 6e 64  ck to see if ind
fcb0: 65 78 20 70 53 72 63 20 69 73 20 63 6f 6d 70 61  ex pSrc is compa
fcc0: 74 69 62 6c 65 20 61 73 20 61 20 73 6f 75 72 63  tible as a sourc
fcd0: 65 20 6f 66 20 64 61 74 61 0a 2a 2a 20 66 6f 72  e of data.** for
fce0: 20 69 6e 64 65 78 20 70 44 65 73 74 20 69 6e 20   index pDest in 
fcf0: 61 6e 20 69 6e 73 65 72 74 20 74 72 61 6e 73 66  an insert transf
fd00: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  er optimization.
fd10: 20 20 54 68 65 20 72 75 6c 65 73 0a 2a 2a 20 66    The rules.** f
fd20: 6f 72 20 61 20 63 6f 6d 70 61 74 69 62 6c 65 20  or a compatible 
fd30: 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  index:.**.**    
fd40: 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20 69 73  *   The index is
fd50: 20 6f 76 65 72 20 74 68 65 20 73 61 6d 65 20 73   over the same s
fd60: 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  et of columns.**
fd70: 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65      *   The same
fd80: 20 44 45 53 43 20 61 6e 64 20 41 53 43 20 6d 61   DESC and ASC ma
fd90: 72 6b 69 6e 67 73 20 6f 63 63 75 72 73 20 6f 6e  rkings occurs on
fda0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20   all columns.** 
fdb0: 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65 20     *   The same 
fdc0: 6f 6e 45 72 72 6f 72 20 70 72 6f 63 65 73 73 69  onError processi
fdd0: 6e 67 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45  ng (OE_Abort, OE
fde0: 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 0a 2a 2a  _Ignore, etc).**
fdf0: 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65      *   The same
fe00: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fe10: 6e 63 65 20 6f 6e 20 65 61 63 68 20 63 6f 6c 75  nce on each colu
fe20: 6d 6e 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65  mn.**    *   The
fe30: 20 69 6e 64 65 78 20 68 61 73 20 74 68 65 20 65   index has the e
fe40: 78 61 63 74 20 73 61 6d 65 20 57 48 45 52 45 20  xact same WHERE 
fe50: 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
fe60: 20 69 6e 74 20 78 66 65 72 43 6f 6d 70 61 74 69   int xferCompati
fe70: 62 6c 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  bleIndex(Index *
fe80: 70 44 65 73 74 2c 20 49 6e 64 65 78 20 2a 70 53  pDest, Index *pS
fe90: 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rc){.  int i;.  
fea0: 61 73 73 65 72 74 28 20 70 44 65 73 74 20 26 26  assert( pDest &&
feb0: 20 70 53 72 63 20 29 3b 0a 20 20 61 73 73 65 72   pSrc );.  asser
fec0: 74 28 20 70 44 65 73 74 2d 3e 70 54 61 62 6c 65  t( pDest->pTable
fed0: 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c 65 20 29  !=pSrc->pTable )
fee0: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  ;.  if( pDest->n
fef0: 4b 65 79 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e 4b  KeyCol!=pSrc->nK
ff00: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74  eyCol ){.    ret
ff10: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
ff20: 65 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  erent number of 
ff30: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 7d 0a 20  columns */.  }. 
ff40: 20 69 66 28 20 70 44 65 73 74 2d 3e 6f 6e 45 72   if( pDest->onEr
ff50: 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e 45 72 72  ror!=pSrc->onErr
ff60: 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
ff70: 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65   0;   /* Differe
ff80: 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  nt conflict reso
ff90: 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67 69 65  lution strategie
ffa0: 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  s */.  }.  for(i
ffb0: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 4b 65 79  =0; i<pSrc->nKey
ffc0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
ffd0: 66 28 20 70 53 72 63 2d 3e 61 69 43 6f 6c 75 6d  f( pSrc->aiColum
ffe0: 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61 69 43  n[i]!=pDest->aiC
fff0: 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  olumn[i] ){.    
10000 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
10010 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c 75 6d   Different colum
10020 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ns indexed */.  
10030 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 72 63    }.    if( pSrc
10040 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3d 3d 58  ->aiColumn[i]==X
10050 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20 20  N_EXPR ){.      
10060 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 43  assert( pSrc->aC
10070 6f 6c 45 78 70 72 21 3d 30 20 26 26 20 70 44 65  olExpr!=0 && pDe
10080 73 74 2d 3e 61 43 6f 6c 45 78 70 72 21 3d 30 20  st->aColExpr!=0 
10090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
100a0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
100b0 70 53 72 63 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  pSrc->aColExpr->
100c0 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20  a[i].pExpr,.    
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
100f0 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70  aColExpr->a[i].p
10100 45 78 70 72 2c 20 2d 31 29 21 3d 30 20 29 7b 0a  Expr, -1)!=0 ){.
10110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
10120 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74  ;   /* Different
10130 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
10140 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
10150 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10160 66 28 20 70 53 72 63 2d 3e 61 53 6f 72 74 4f 72  f( pSrc->aSortOr
10170 64 65 72 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61  der[i]!=pDest->a
10180 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
10190 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
101a0 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 73    /* Different s
101b0 6f 72 74 20 6f 72 64 65 72 73 20 2a 2f 0a 20 20  ort orders */.  
101c0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 78 66 65    }.    if( !xfe
101d0 72 43 6f 6d 70 61 74 69 62 6c 65 43 6f 6c 6c 61  rCompatibleColla
101e0 74 69 6f 6e 28 70 53 72 63 2d 3e 61 7a 43 6f 6c  tion(pSrc->azCol
101f0 6c 5b 69 5d 2c 70 44 65 73 74 2d 3e 61 7a 43 6f  l[i],pDest->azCo
10200 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ll[i]) ){.      
10210 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44  return 0;   /* D
10220 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
10230 6e 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a  ng sequences */.
10240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10250 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
10260 72 65 28 70 53 72 63 2d 3e 70 50 61 72 74 49 64  re(pSrc->pPartId
10270 78 57 68 65 72 65 2c 20 70 44 65 73 74 2d 3e 70  xWhere, pDest->p
10280 50 61 72 74 49 64 78 57 68 65 72 65 2c 20 2d 31  PartIdxWhere, -1
10290 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
102a0 30 3b 20 20 20 20 20 2f 2a 20 44 69 66 66 65 72  0;     /* Differ
102b0 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ent WHERE clause
102c0 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  s */.  }..  /* I
102d0 66 20 6e 6f 20 74 65 73 74 20 61 62 6f 76 65 20  f no test above 
102e0 66 61 69 6c 73 20 74 68 65 6e 20 74 68 65 20 69  fails then the i
102f0 6e 64 69 63 65 73 20 6d 75 73 74 20 62 65 20 63  ndices must be c
10300 6f 6d 70 61 74 69 62 6c 65 20 2a 2f 0a 20 20 72  ompatible */.  r
10310 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
10320 2a 20 41 74 74 65 6d 70 74 20 74 68 65 20 74 72  * Attempt the tr
10330 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
10340 69 6f 6e 20 6f 6e 20 49 4e 53 45 52 54 73 20 6f  ion on INSERTs o
10350 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
10360 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
10370 20 74 61 62 31 20 53 45 4c 45 43 54 20 2a 20 46   tab1 SELECT * F
10380 52 4f 4d 20 74 61 62 32 3b 0a 2a 2a 0a 2a 2a 20  ROM tab2;.**.** 
10390 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  The xfer optimiz
103a0 61 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20  ation transfers 
103b0 72 61 77 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  raw records from
103c0 20 74 61 62 32 20 6f 76 65 72 20 74 6f 20 74 61   tab2 over to ta
103d0 62 31 2e 20 20 0a 2a 2a 20 43 6f 6c 75 6d 6e 73  b1.  .** Columns
103e0 20 61 72 65 20 6e 6f 74 20 64 65 63 6f 64 65 64   are not decoded
103f0 20 61 6e 64 20 72 65 61 73 73 65 6d 62 6c 65 64   and reassembled
10400 2c 20 77 68 69 63 68 20 67 72 65 61 74 6c 79 20  , which greatly 
10410 69 6d 70 72 6f 76 65 73 0a 2a 2a 20 70 65 72 66  improves.** perf
10420 6f 72 6d 61 6e 63 65 2e 20 20 52 61 77 20 69 6e  ormance.  Raw in
10430 64 65 78 20 72 65 63 6f 72 64 73 20 61 72 65 20  dex records are 
10440 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 20 74  transferred in t
10450 68 65 20 73 61 6d 65 20 77 61 79 2e 0a 2a 2a 0a  he same way..**.
10460 2a 2a 20 54 68 65 20 78 66 65 72 20 6f 70 74 69  ** The xfer opti
10470 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  mization is only
10480 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 74 61   attempted if ta
10490 62 31 20 61 6e 64 20 74 61 62 32 20 61 72 65 20  b1 and tab2 are 
104a0 63 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a 2a 20 54  compatible..** T
104b0 68 65 72 65 20 61 72 65 20 6c 6f 74 73 20 6f 66  here are lots of
104c0 20 72 75 6c 65 73 20 66 6f 72 20 64 65 74 65 72   rules for deter
104d0 6d 69 6e 69 6e 67 20 63 6f 6d 70 61 74 69 62 69  mining compatibi
104e0 6c 69 74 79 20 2d 20 73 65 65 20 63 6f 6d 6d 65  lity - see comme
104f0 6e 74 73 0a 2a 2a 20 65 6d 62 65 64 64 65 64 20  nts.** embedded 
10500 69 6e 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  in the code for 
10510 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  details..**.** T
10520 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10530 72 6e 73 20 54 52 55 45 20 69 66 20 74 68 65 20  rns TRUE if the 
10540 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
10550 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
10560 20 75 73 65 64 2e 0a 2a 2a 20 53 6f 6d 65 74 69   used..** Someti
10570 6d 65 73 20 74 68 65 20 78 66 65 72 20 6f 70 74  mes the xfer opt
10580 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c 20 6f  imization will o
10590 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74 68 65 20  nly work if the 
105a0 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
105b0 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 2d 20  e.** is empty - 
105c0 61 20 66 61 63 74 6f 72 20 74 68 61 74 20 63 61  a factor that ca
105d0 6e 20 6f 6e 6c 79 20 62 65 20 64 65 74 65 72 6d  n only be determ
105e0 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
105f0 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20 63 61  .  In that.** ca
10600 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
10610 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
10620 66 6f 72 20 74 68 65 20 78 66 65 72 20 6f 70 74  for the xfer opt
10630 69 6d 69 7a 61 74 69 6f 6e 20 62 75 74 20 61 6c  imization but al
10640 73 6f 0a 2a 2a 20 64 6f 65 73 20 61 20 74 65 73  so.** does a tes
10650 74 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  t to see if the 
10660 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
10670 65 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 6a  e is empty and j
10680 75 6d 70 73 20 6f 76 65 72 20 74 68 65 0a 2a 2a  umps over the.**
10690 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
106a0 6f 6e 20 63 6f 64 65 20 69 66 20 74 68 65 20 74  on code if the t
106b0 65 73 74 20 66 61 69 6c 73 2e 20 20 49 6e 20 74  est fails.  In t
106c0 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 72  hat case, this r
106d0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
106e0 73 20 46 41 4c 53 45 20 73 6f 20 74 68 61 74 20  s FALSE so that 
106f0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
10700 6b 6e 6f 77 20 74 6f 20 67 6f 20 61 68 65 61 64  know to go ahead
10710 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a   and generate.**
10720 20 61 6e 20 75 6e 6f 70 74 69 6d 69 7a 65 64 20   an unoptimized 
10730 74 72 61 6e 73 66 65 72 2e 20 20 54 68 69 73 20  transfer.  This 
10740 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 72 65 74  routine also ret
10750 75 72 6e 73 20 46 41 4c 53 45 20 69 66 20 74 68  urns FALSE if th
10760 65 72 65 0a 2a 2a 20 69 73 20 6e 6f 20 63 68 61  ere.** is no cha
10770 6e 63 65 20 74 68 61 74 20 74 68 65 20 78 66 65  nce that the xfe
10780 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  r optimization c
10790 61 6e 20 62 65 20 61 70 70 6c 69 65 64 2e 0a 2a  an be applied..*
107a0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69  *.** This optimi
107b0 7a 61 74 69 6f 6e 20 69 73 20 70 61 72 74 69 63  zation is partic
107c0 75 6c 61 72 6c 79 20 75 73 65 66 75 6c 20 61 74  ularly useful at
107d0 20 6d 61 6b 69 6e 67 20 56 41 43 55 55 4d 20 72   making VACUUM r
107e0 75 6e 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74  un faster..*/.st
107f0 61 74 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74  atic int xferOpt
10800 69 6d 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72  imization(.  Par
10810 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10820 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
10830 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
10840 2a 70 44 65 73 74 2c 20 20 20 20 20 20 20 20 20  *pDest,         
10850 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 65 20  /* The table we 
10860 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  are inserting in
10870 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  to */.  Select *
10880 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
10890 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
108a0 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20 74 68  ent to use as th
108b0 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f  e data source */
108c0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
108d0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
108e0 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72  to handle constr
108f0 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  aint errors */. 
10900 20 69 6e 74 20 69 44 62 44 65 73 74 20 20 20 20   int iDbDest    
10910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
10920 74 61 62 61 73 65 20 6f 66 20 70 44 65 73 74 20  tabase of pDest 
10930 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
10940 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10950 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
10960 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
10970 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
10980 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
10990 4c 45 43 54 20 2a 2f 0a 20 20 54 61 62 6c 65 20  LECT */.  Table 
109a0 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
109b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
109c0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
109d0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 53 45  ROM clause of SE
109e0 4c 45 43 54 20 2a 2f 0a 20 20 49 6e 64 65 78 20  LECT */.  Index 
109f0 2a 70 53 72 63 49 64 78 2c 20 2a 70 44 65 73 74  *pSrcIdx, *pDest
10a00 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 53 6f  Idx;       /* So
10a10 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61  urce and destina
10a20 74 69 6f 6e 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tion indices */.
10a30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
10a40 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20  _item *pItem;   
10a50 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
10a60 20 6f 66 20 70 53 65 6c 65 63 74 2d 3e 70 53 72   of pSelect->pSr
10a70 63 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  c */.  int i;   
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10aa0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
10ab0 20 69 44 62 53 72 63 3b 20 20 20 20 20 20 20 20   iDbSrc;        
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ad0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 66   The database of
10ae0 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
10af0 53 72 63 2c 20 69 44 65 73 74 3b 20 20 20 20 20  Src, iDest;     
10b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
10b10 75 72 73 6f 72 73 20 66 72 6f 6d 20 73 6f 75 72  ursors from sour
10b20 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
10b30 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
10b40 31 2c 20 61 64 64 72 32 3b 20 20 20 20 20 20 20  1, addr2;       
10b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
10b60 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
10b70 69 6e 74 20 65 6d 70 74 79 44 65 73 74 54 65 73  int emptyDestTes
10b80 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
10b90 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10ba0 65 73 74 20 66 6f 72 20 65 6d 70 74 79 20 70 44  est for empty pD
10bb0 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 6d 70  est */.  int emp
10bc0 74 79 53 72 63 54 65 73 74 20 3d 20 30 3b 20 20  tySrcTest = 0;  
10bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10be0 72 65 73 73 20 6f 66 20 74 65 73 74 20 66 6f 72  ress of test for
10bf0 20 65 6d 70 74 79 20 70 53 72 63 20 2a 2f 0a 20   empty pSrc */. 
10c00 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 77 65    /* The VDBE we
10c30 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 2a 2f   are building */
10c40 0a 20 20 69 6e 74 20 72 65 67 41 75 74 6f 69 6e  .  int regAutoin
10c50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10c60 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 72 65      /* Memory re
10c70 67 69 73 74 65 72 20 75 73 65 64 20 62 79 20 41  gister used by A
10c80 55 54 4f 49 4e 43 20 2a 2f 0a 20 20 69 6e 74 20  UTOINC */.  int 
10c90 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78  destHasUniqueIdx
10ca0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
10cb0 54 72 75 65 20 69 66 20 70 44 65 73 74 20 68 61  True if pDest ha
10cc0 73 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  s a UNIQUE index
10cd0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
10ce0 61 2c 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20  a, regRowid;    
10cf0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10d00 65 72 73 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ers holding data
10d10 20 61 6e 64 20 72 6f 77 69 64 20 2a 2f 0a 0a 20   and rowid */.. 
10d20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20   if( pSelect==0 
10d30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10d40 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 6f 66     /* Must be of
10d50 20 74 68 65 20 66 6f 72 6d 20 20 49 4e 53 45 52   the form  INSER
10d60 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
10d70 54 20 2e 2e 2e 20 2a 2f 0a 20 20 7d 0a 20 20 69  T ... */.  }.  i
10d80 66 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  f( pParse->pWith
10d90 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 70 57 69   || pSelect->pWi
10da0 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  th ){.    /* Do 
10db0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 70  not attempt to p
10dc0 72 6f 63 65 73 73 20 74 68 69 73 20 71 75 65 72  rocess this quer
10dd0 79 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  y if there are a
10de0 6e 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 20  n WITH clauses. 
10df0 20 20 20 2a 2a 20 61 74 74 61 63 68 65 64 20 74     ** attached t
10e00 6f 20 69 74 2e 20 50 72 6f 63 65 65 64 69 6e 67  o it. Proceeding
10e10 20 6d 61 79 20 67 65 6e 65 72 61 74 65 20 61 20   may generate a 
10e20 66 61 6c 73 65 20 22 6e 6f 20 73 75 63 68 20 74  false "no such t
10e30 61 62 6c 65 3a 20 78 78 78 22 0a 20 20 20 20 2a  able: xxx".    *
10e40 2a 20 65 72 72 6f 72 20 69 66 20 70 53 65 6c 65  * error if pSele
10e50 63 74 20 72 65 61 64 73 20 66 72 6f 6d 20 61 20  ct reads from a 
10e60 43 54 45 20 6e 61 6d 65 64 20 22 78 78 78 22 2e  CTE named "xxx".
10e70 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
10e80 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
10e90 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
10ea0 70 50 61 72 73 65 2c 20 70 44 65 73 74 29 20 29  pParse, pDest) )
10eb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
10ec0 20 20 2f 2a 20 74 61 62 31 20 6d 75 73 74 20 6e    /* tab1 must n
10ed0 6f 74 20 68 61 76 65 20 74 72 69 67 67 65 72 73  ot have triggers
10ee0 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20   */.  }.#ifndef 
10ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10f00 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
10f10 44 65 73 74 2d 3e 74 61 62 46 6c 61 67 73 20 26  Dest->tabFlags &
10f20 20 54 46 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20   TF_Virtual ){. 
10f30 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
10f40 2a 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20  * tab1 must not 
10f50 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
10f60 6c 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66  le */.  }.#endif
10f70 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  .  if( onError==
10f80 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
10f90 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b    if( pDest->iPK
10fa0 65 79 3e 3d 30 20 29 20 6f 6e 45 72 72 6f 72 20  ey>=0 ) onError 
10fb0 3d 20 70 44 65 73 74 2d 3e 6b 65 79 43 6f 6e 66  = pDest->keyConf
10fc0 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  ;.    if( onErro
10fd0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 20  r==OE_Default ) 
10fe0 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
10ff0 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rt;.  }.  assert
11000 28 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  (pSelect->pSrc);
11010 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 64 20     /* allocated 
11020 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 69 73  even if there is
11030 20 6e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   no FROM clause 
11040 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
11050 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
11060 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
11070 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
11080 65 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  e must have exac
11090 74 6c 79 20 6f 6e 65 20 74 65 72 6d 20 2a 2f 0a  tly one term */.
110a0 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
110b0 74 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  t->pSrc->a[0].pS
110c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74  elect ){.    ret
110d0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d  urn 0;   /* FROM
110e0 20 63 6c 61 75 73 65 20 63 61 6e 6e 6f 74 20 63   clause cannot c
110f0 6f 6e 74 61 69 6e 20 61 20 73 75 62 71 75 65 72  ontain a subquer
11100 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  y */.  }.  if( p
11110 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 20 29  Select->pWhere )
11120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
11130 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
11140 6e 6f 74 20 68 61 76 65 20 61 20 57 48 45 52 45  not have a WHERE
11150 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20   clause */.  }. 
11160 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f   if( pSelect->pO
11170 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
11180 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c  turn 0;   /* SEL
11190 45 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ECT may not have
111a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
111b0 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 2f 2a 20  use */.  }.  /* 
111c0 44 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 74  Do not need to t
111d0 65 73 74 20 66 6f 72 20 61 20 48 41 56 49 4e 47  est for a HAVING
111e0 20 63 6c 61 75 73 65 2e 20 20 49 66 20 48 41 56   clause.  If HAV
111f0 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 20 62  ING is present b
11200 75 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ut.  ** there is
11210 20 6e 6f 20 4f 52 44 45 52 20 42 59 2c 20 77 65   no ORDER BY, we
11220 20 77 69 6c 6c 20 67 65 74 20 61 6e 20 65 72 72   will get an err
11230 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  or. */.  if( pSe
11240 6c 65 63 74 2d 3e 70 47 72 6f 75 70 42 79 20 29  lect->pGroupBy )
11250 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
11260 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
11270 6e 6f 74 20 68 61 76 65 20 61 20 47 52 4f 55 50  not have a GROUP
11280 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11290 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
112a0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
112b0 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45  eturn 0;   /* SE
112c0 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76  LECT may not hav
112d0 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
112e0 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
112f0 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 66 66 73  ( pSelect->pOffs
11300 65 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4d 75 73  et==0 );  /* Mus
11310 74 20 62 65 20 73 6f 20 69 66 20 70 4c 69 6d 69  t be so if pLimi
11320 74 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 70 53  t==0 */.  if( pS
11330 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
11340 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
11350 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e   /* SELECT may n
11360 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  ot be a compound
11370 20 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20   query */.  }.  
11380 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  if( pSelect->sel
11390 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
113a0 6e 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nct ){.    retur
113b0 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
113c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
113d0 49 4e 43 54 20 2a 2f 0a 20 20 7d 0a 20 20 70 45  INCT */.  }.  pE
113e0 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
113f0 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
11400 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
11410 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
11420 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  pr!=1 ){.    ret
11430 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  urn 0;   /* The 
11440 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 20  result set must 
11450 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
11460 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 7d 0a 20   column */.  }. 
11470 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
11480 3e 61 5b 30 5d 2e 70 45 78 70 72 20 29 3b 0a 20  >a[0].pExpr );. 
11490 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
114a0 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
114b0 41 53 54 45 52 49 53 4b 20 29 7b 0a 20 20 20 20  ASTERISK ){.    
114c0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
114d0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75  he result set mu
114e0 73 74 20 62 65 20 74 68 65 20 73 70 65 63 69 61  st be the specia
114f0 6c 20 6f 70 65 72 61 74 6f 72 20 22 2a 22 20 2a  l operator "*" *
11500 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  /.  }..  /* At t
11510 68 69 73 20 70 6f 69 6e 74 20 77 65 20 68 61 76  his point we hav
11520 65 20 65 73 74 61 62 6c 69 73 68 65 64 20 74 68  e established th
11530 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
11540 20 69 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20   is of the.  ** 
11550 63 6f 72 72 65 63 74 20 73 79 6e 74 61 63 74 69  correct syntacti
11560 63 20 66 6f 72 6d 20 74 6f 20 70 61 72 74 69 63  c form to partic
11570 69 70 61 74 65 20 69 6e 20 74 68 69 73 20 6f 70  ipate in this op
11580 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f 77  timization.  Now
11590 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
115a0 20 63 68 65 63 6b 20 74 68 65 20 73 65 6d 61 6e   check the seman
115b0 74 69 63 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 74  tics..  */.  pIt
115c0 65 6d 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  em = pSelect->pS
115d0 72 63 2d 3e 61 3b 0a 20 20 70 53 72 63 20 3d 20  rc->a;.  pSrc = 
115e0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
115f0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
11600 2c 20 70 49 74 65 6d 29 3b 0a 20 20 69 66 28 20  , pItem);.  if( 
11610 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pSrc==0 ){.    r
11620 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52  eturn 0;   /* FR
11630 4f 4d 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  OM clause does n
11640 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 61  ot contain a rea
11650 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20  l table */.  }. 
11660 20 69 66 28 20 70 53 72 63 3d 3d 70 44 65 73 74   if( pSrc==pDest
11670 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11680 3b 20 20 20 2f 2a 20 74 61 62 31 20 61 6e 64 20  ;   /* tab1 and 
11690 74 61 62 32 20 6d 61 79 20 6e 6f 74 20 62 65 20  tab2 may not be 
116a0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 2a  the same table *
116b0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 48 61 73 52  /.  }.  if( HasR
116c0 6f 77 69 64 28 70 44 65 73 74 29 21 3d 48 61 73  owid(pDest)!=Has
116d0 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a 20  Rowid(pSrc) ){. 
116e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
116f0 2a 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73  * source and des
11700 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 6f  tination must bo
11710 74 68 20 62 65 20 57 49 54 48 4f 55 54 20 52 4f  th be WITHOUT RO
11720 57 49 44 20 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20  WID or not */.  
11730 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
11740 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11750 4c 45 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 74  LE.  if( pSrc->t
11760 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56 69 72  abFlags & TF_Vir
11770 74 75 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  tual ){.    retu
11780 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20  rn 0;   /* tab2 
11790 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20 76 69  must not be a vi
117a0 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
117b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
117c0 70 53 72 63 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pSrc->pSelect ){
117d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
117e0 20 2f 2a 20 74 61 62 32 20 6d 61 79 20 6e 6f 74   /* tab2 may not
117f0 20 62 65 20 61 20 76 69 65 77 20 2a 2f 0a 20 20   be a view */.  
11800 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  }.  if( pDest->n
11810 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e 43 6f 6c 20  Col!=pSrc->nCol 
11820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
11830 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11840 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20  columns must be 
11850 74 68 65 20 73 61 6d 65 20 69 6e 20 74 61 62 31  the same in tab1
11860 20 61 6e 64 20 74 61 62 32 20 2a 2f 0a 20 20 7d   and tab2 */.  }
11870 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50  .  if( pDest->iP
11880 4b 65 79 21 3d 70 53 72 63 2d 3e 69 50 4b 65 79  Key!=pSrc->iPKey
11890 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
118a0 3b 20 20 20 2f 2a 20 42 6f 74 68 20 74 61 62 6c  ;   /* Both tabl
118b0 65 73 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  es must have the
118c0 20 73 61 6d 65 20 49 4e 54 45 47 45 52 20 50 52   same INTEGER PR
118d0 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 7d  IMARY KEY */.  }
118e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
118f0 65 73 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  est->nCol; i++){
11900 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 44 65  .    Column *pDe
11910 73 74 43 6f 6c 20 3d 20 26 70 44 65 73 74 2d 3e  stCol = &pDest->
11920 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 43 6f 6c  aCol[i];.    Col
11930 75 6d 6e 20 2a 70 53 72 63 43 6f 6c 20 3d 20 26  umn *pSrcCol = &
11940 70 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 23  pSrc->aCol[i];.#
11950 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11960 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
11970 4e 53 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e  NS.    if( (db->
11980 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
11990 61 63 75 75 6d 29 3d 3d 30 20 0a 20 20 20 20 20  acuum)==0 .     
119a0 26 26 20 28 70 44 65 73 74 43 6f 6c 2d 3e 63 6f  && (pDestCol->co
119b0 6c 46 6c 61 67 73 20 7c 20 70 53 72 63 43 6f 6c  lFlags | pSrcCol
119c0 2d 3e 63 6f 6c 46 6c 61 67 73 29 20 26 20 43 4f  ->colFlags) & CO
119d0 4c 46 4c 41 47 5f 48 49 44 44 45 4e 20 0a 20 20  LFLAG_HIDDEN .  
119e0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
119f0 6e 20 30 3b 20 20 20 20 2f 2a 20 4e 65 69 74 68  n 0;    /* Neith
11a00 65 72 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  er table may hav
11a10 65 20 5f 5f 68 69 64 64 65 6e 5f 5f 20 63 6f 6c  e __hidden__ col
11a20 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  umns */.    }.#e
11a30 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 44 65  ndif.    if( pDe
11a40 73 74 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 21  stCol->affinity!
11a50 3d 70 53 72 63 43 6f 6c 2d 3e 61 66 66 69 6e 69  =pSrcCol->affini
11a60 74 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ty ){.      retu
11a70 72 6e 20 30 3b 20 20 20 20 2f 2a 20 41 66 66 69  rn 0;    /* Affi
11a80 6e 69 74 79 20 6d 75 73 74 20 62 65 20 74 68 65  nity must be the
11a90 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c   same on all col
11aa0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
11ab0 20 20 69 66 28 20 21 78 66 65 72 43 6f 6d 70 61    if( !xferCompa
11ac0 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 70  tibleCollation(p
11ad0 44 65 73 74 43 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20  DestCol->zColl, 
11ae0 70 53 72 63 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 20  pSrcCol->zColl) 
11af0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11b00 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  0;    /* Collati
11b10 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  ng sequence must
11b20 20 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20   be the same on 
11b30 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  all columns */. 
11b40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65     }.    if( pDe
11b50 73 74 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 26  stCol->notNull &
11b60 26 20 21 70 53 72 63 43 6f 6c 2d 3e 6e 6f 74 4e  & !pSrcCol->notN
11b70 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ull ){.      ret
11b80 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 74 61 62  urn 0;    /* tab
11b90 32 20 6d 75 73 74 20 62 65 20 4e 4f 54 20 4e 55  2 must be NOT NU
11ba0 4c 4c 20 69 66 20 74 61 62 31 20 69 73 20 2a 2f  LL if tab1 is */
11bb0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 65  .    }.    /* De
11bc0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f 72  fault values for
11bd0 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
11be0 65 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 6e  equent columns n
11bf0 65 65 64 20 74 6f 20 6d 61 74 63 68 2e 20 2a 2f  eed to match. */
11c00 0a 20 20 20 20 69 66 28 20 69 3e 30 0a 20 20 20  .    if( i>0.   
11c10 20 20 26 26 20 28 28 70 44 65 73 74 43 6f 6c 2d    && ((pDestCol-
11c20 3e 7a 44 66 6c 74 3d 3d 30 29 21 3d 28 70 53 72  >zDflt==0)!=(pSr
11c30 63 43 6f 6c 2d 3e 7a 44 66 6c 74 3d 3d 30 29 20  cCol->zDflt==0) 
11c40 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44  .         || (pD
11c50 65 73 74 43 6f 6c 2d 3e 7a 44 66 6c 74 20 26 26  estCol->zDflt &&
11c60 20 73 74 72 63 6d 70 28 70 44 65 73 74 43 6f 6c   strcmp(pDestCol
11c70 2d 3e 7a 44 66 6c 74 2c 20 70 53 72 63 43 6f 6c  ->zDflt, pSrcCol
11c80 2d 3e 7a 44 66 6c 74 29 21 3d 30 29 29 0a 20 20  ->zDflt)!=0)).  
11c90 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
11ca0 6e 20 30 3b 20 20 20 20 2f 2a 20 44 65 66 61 75  n 0;    /* Defau
11cb0 6c 74 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  lt values must b
11cc0 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
11cd0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ll columns */.  
11ce0 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44    }.  }.  for(pD
11cf0 65 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70 49  estIdx=pDest->pI
11d00 6e 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b 20  ndex; pDestIdx; 
11d10 70 44 65 73 74 49 64 78 3d 70 44 65 73 74 49 64  pDestIdx=pDestId
11d20 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
11d30 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
11d40 28 70 44 65 73 74 49 64 78 29 20 29 7b 0a 20 20  (pDestIdx) ){.  
11d50 20 20 20 20 64 65 73 74 48 61 73 55 6e 69 71 75      destHasUniqu
11d60 65 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eIdx = 1;.    }.
11d70 20 20 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d      for(pSrcIdx=
11d80 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53  pSrc->pIndex; pS
11d90 72 63 49 64 78 3b 20 70 53 72 63 49 64 78 3d 70  rcIdx; pSrcIdx=p
11da0 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  SrcIdx->pNext){.
11db0 20 20 20 20 20 20 69 66 28 20 78 66 65 72 43 6f        if( xferCo
11dc0 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70 44  mpatibleIndex(pD
11dd0 65 73 74 49 64 78 2c 20 70 53 72 63 49 64 78 29  estIdx, pSrcIdx)
11de0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
11df0 20 20 20 20 69 66 28 20 70 53 72 63 49 64 78 3d      if( pSrcIdx=
11e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
11e10 72 6e 20 30 3b 20 20 20 20 2f 2a 20 70 44 65 73  rn 0;    /* pDes
11e20 74 49 64 78 20 68 61 73 20 6e 6f 20 63 6f 72 72  tIdx has no corr
11e30 65 73 70 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20  esponding index 
11e40 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d  in pSrc */.    }
11e50 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
11e60 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
11e70 20 69 66 28 20 70 44 65 73 74 2d 3e 70 43 68 65   if( pDest->pChe
11e80 63 6b 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ck && sqlite3Exp
11e90 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 53 72  rListCompare(pSr
11ea0 63 2d 3e 70 43 68 65 63 6b 2c 70 44 65 73 74 2d  c->pCheck,pDest-
11eb0 3e 70 43 68 65 63 6b 2c 2d 31 29 20 29 7b 0a 20  >pCheck,-1) ){. 
11ec0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
11ed0 2a 20 54 61 62 6c 65 73 20 68 61 76 65 20 64 69  * Tables have di
11ee0 66 66 65 72 65 6e 74 20 43 48 45 43 4b 20 63 6f  fferent CHECK co
11ef0 6e 73 74 72 61 69 6e 74 73 2e 20 20 54 69 63 6b  nstraints.  Tick
11f00 65 74 20 23 32 32 35 32 20 2a 2f 0a 20 20 7d 0a  et #2252 */.  }.
11f10 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
11f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11f30 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 69 73 61  GN_KEY.  /* Disa
11f40 6c 6c 6f 77 20 74 68 65 20 74 72 61 6e 73 66 65  llow the transfe
11f50 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  r optimization i
11f60 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
11f70 6e 20 74 61 62 6c 65 20 63 6f 6e 73 74 61 69 6e  n table constain
11f80 73 0a 20 20 2a 2a 20 61 6e 79 20 66 6f 72 65 69  s.  ** any forei
11f90 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
11fa0 74 73 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ts.  This is mor
11fb0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 74 68  e restrictive th
11fc0 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  an necessary..  
11fd0 2a 2a 20 42 75 74 20 74 68 65 20 6d 61 69 6e 20  ** But the main 
11fe0 62 65 6e 65 66 69 63 69 61 72 79 20 6f 66 20 74  beneficiary of t
11ff0 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
12000 6d 69 7a 61 74 69 6f 6e 20 69 73 20 74 68 65 20  mization is the 
12010 56 41 43 55 55 4d 20 0a 20 20 2a 2a 20 63 6f 6d  VACUUM .  ** com
12020 6d 61 6e 64 2c 20 61 6e 64 20 74 68 65 20 56 41  mand, and the VA
12030 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 64 69 73  CUUM command dis
12040 61 62 6c 65 73 20 66 6f 72 65 69 67 6e 20 6b 65  ables foreign ke
12050 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
12060 53 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 74 72  So.  ** the extr
12070 61 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 74  a complication t
12080 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 75 6c 65  o make this rule
12090 20 6c 65 73 73 20 72 65 73 74 72 69 63 74 69 76   less restrictiv
120a0 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20  e is probably.  
120b0 2a 2a 20 6e 6f 74 20 77 6f 72 74 68 20 74 68 65  ** not worth the
120c0 20 65 66 66 6f 72 74 2e 20 20 54 69 63 6b 65 74   effort.  Ticket
120d0 20 5b 36 32 38 34 64 66 38 39 64 65 62 64 66 61   [6284df89debdfa
120e0 36 31 64 62 38 30 37 33 65 30 36 32 39 30 38 61  61db8073e062908a
120f0 66 30 63 39 62 36 31 31 38 65 5d 0a 20 20 2a 2f  f0c9b6118e].  */
12100 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
12110 73 20 26 20 53 51 4c 49 54 45 5f 46 6f 72 65 69  s & SQLITE_Forei
12120 67 6e 4b 65 79 73 29 21 3d 30 20 26 26 20 70 44  gnKeys)!=0 && pD
12130 65 73 74 2d 3e 70 46 4b 65 79 21 3d 30 20 29 7b  est->pFKey!=0 ){
12140 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12150 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
12160 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
12170 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d  ITE_CountRows)!=
12180 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
12190 30 3b 20 20 2f 2a 20 78 66 65 72 20 6f 70 74 20  0;  /* xfer opt 
121a0 64 6f 65 73 20 6e 6f 74 20 70 6c 61 79 20 77 65  does not play we
121b0 6c 6c 20 77 69 74 68 20 50 52 41 47 4d 41 20 63  ll with PRAGMA c
121c0 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20 2a 2f 0a  ount_changes */.
121d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
121e0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
121f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
12200 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  xfer optimizatio
12210 6e 20 69 73 20 61 74 0a 20 20 2a 2a 20 6c 65 61  n is at.  ** lea
12220 73 74 20 61 20 70 6f 73 73 69 62 69 6c 69 74 79  st a possibility
12230 2c 20 74 68 6f 75 67 68 20 69 74 20 6d 69 67 68  , though it migh
12240 74 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74  t only work if t
12250 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
12260 20 2a 2a 20 74 61 62 6c 65 20 28 74 61 62 31 29   ** table (tab1)
12270 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   is initially em
12280 70 74 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  pty..  */.#ifdef
12290 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
122a0 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
122b0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
122c0 20 69 44 62 53 72 63 20 3d 20 73 71 6c 69 74 65   iDbSrc = sqlite
122d0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
122e0 62 2c 20 70 53 72 63 2d 3e 70 53 63 68 65 6d 61  b, pSrc->pSchema
122f0 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  );.  v = sqlite3
12300 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12310 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
12320 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
12330 65 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 69 53  e, iDbSrc);.  iS
12340 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  rc = pParse->nTa
12350 62 2b 2b 3b 0a 20 20 69 44 65 73 74 20 3d 20 70  b++;.  iDest = p
12360 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12370 20 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 61 75   regAutoinc = au
12380 74 6f 49 6e 63 42 65 67 69 6e 28 70 50 61 72 73  toIncBegin(pPars
12390 65 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73  e, iDbDest, pDes
123a0 74 29 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20  t);.  regData = 
123b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
123c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
123d0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
123e0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
123f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  );.  sqlite3Open
12400 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
12410 65 73 74 2c 20 69 44 62 44 65 73 74 2c 20 70 44  est, iDbDest, pD
12420 65 73 74 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  est, OP_OpenWrit
12430 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 48 61  e);.  assert( Ha
12440 73 52 6f 77 69 64 28 70 44 65 73 74 29 20 7c 7c  sRowid(pDest) ||
12450 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64   destHasUniqueId
12460 78 20 29 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e  x );.  if( (db->
12470 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
12480 61 63 75 75 6d 29 3d 3d 30 20 26 26 20 28 0a 20  acuum)==0 && (. 
12490 20 20 20 20 20 28 70 44 65 73 74 2d 3e 69 50 4b       (pDest->iPK
124a0 65 79 3c 30 20 26 26 20 70 44 65 73 74 2d 3e 70  ey<0 && pDest->p
124b0 49 6e 64 65 78 21 3d 30 29 20 20 20 20 20 20 20  Index!=0)       
124c0 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
124d0 7c 7c 20 64 65 73 74 48 61 73 55 6e 69 71 75 65  || destHasUnique
124e0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 7c 7c   /* (2) */.   ||
12510 20 28 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 41 62   (onError!=OE_Ab
12520 6f 72 74 20 26 26 20 6f 6e 45 72 72 6f 72 21 3d  ort && onError!=
12530 4f 45 5f 52 6f 6c 6c 62 61 63 6b 29 20 20 20 2f  OE_Rollback)   /
12540 2a 20 28 33 29 20 2a 2f 0a 20 20 29 29 7b 0a 20  * (3) */.  )){. 
12550 20 20 20 2f 2a 20 49 6e 20 73 6f 6d 65 20 63 69     /* In some ci
12560 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 77 65 20  rcumstances, we 
12570 61 72 65 20 61 62 6c 65 20 74 6f 20 72 75 6e 20  are able to run 
12580 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
12590 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c  ation.    ** onl
125a0 79 20 69 66 20 74 68 65 20 64 65 73 74 69 6e 61  y if the destina
125b0 74 69 6f 6e 20 74 61 62 6c 65 20 69 73 20 69 6e  tion table is in
125c0 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 20 55  itially empty. U
125d0 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20 2a 2a  nless the.    **
125e0 20 53 51 4c 49 54 45 5f 56 61 63 75 75 6d 20 66   SQLITE_Vacuum f
125f0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 69 73  lag is set, this
12600 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74 65 73   block generates
12610 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 0a 20 20   code to make.  
12620 20 20 2a 2a 20 74 68 61 74 20 64 65 74 65 72 6d    ** that determ
12630 69 6e 61 74 69 6f 6e 2e 20 49 66 20 53 51 4c 49  ination. If SQLI
12640 54 45 5f 56 61 63 75 75 6d 20 69 73 20 73 65 74  TE_Vacuum is set
12650 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 69  , then the desti
12660 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 61  nation.    ** ta
12670 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 65 6d  ble is always em
12680 70 74 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  pty..    **.    
12690 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e  ** Conditions un
126a0 64 65 72 20 77 68 69 63 68 20 74 68 65 20 64 65  der which the de
126b0 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
126c0 65 20 65 6d 70 74 79 3a 0a 20 20 20 20 2a 2a 0a  e empty:.    **.
126d0 20 20 20 20 2a 2a 20 28 31 29 20 54 68 65 72 65      ** (1) There
126e0 20 69 73 20 6e 6f 20 49 4e 54 45 47 45 52 20 50   is no INTEGER P
126f0 52 49 4d 41 52 59 20 4b 45 59 20 62 75 74 20 74  RIMARY KEY but t
12700 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
12710 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 28 49 66  ..    **     (If
12720 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
12730 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c   is not initiall
12740 79 20 65 6d 70 74 79 2c 20 74 68 65 20 72 6f 77  y empty, the row
12750 69 64 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  id fields.    **
12760 20 20 20 20 20 6f 66 20 69 6e 64 65 78 20 65 6e       of index en
12770 74 72 69 65 73 20 6d 69 67 68 74 20 6e 65 65 64  tries might need
12780 20 74 6f 20 63 68 61 6e 67 65 2e 29 0a 20 20 20   to change.).   
12790 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 32 29 20 54   **.    ** (2) T
127a0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 68  he destination h
127b0 61 73 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  as a unique inde
127c0 78 2e 20 20 28 54 68 65 20 78 66 65 72 20 6f 70  x.  (The xfer op
127d0 74 69 6d 69 7a 61 74 69 6f 6e 20 0a 20 20 20 20  timization .    
127e0 2a 2a 20 20 20 20 20 69 73 20 75 6e 61 62 6c 65  **     is unable
127f0 20 74 6f 20 74 65 73 74 20 75 6e 69 71 75 65 6e   to test uniquen
12800 65 73 73 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  ess.).    **.   
12810 20 2a 2a 20 28 33 29 20 6f 6e 45 72 72 6f 72 20   ** (3) onError 
12820 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
12830 65 72 20 74 68 61 6e 20 4f 45 5f 41 62 6f 72 74  er than OE_Abort
12840 20 61 6e 64 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b   and OE_Rollback
12850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64  ..    */.    add
12860 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
12870 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
12880 69 6e 64 2c 20 69 44 65 73 74 2c 20 30 29 3b 20  ind, iDest, 0); 
12890 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
128a0 0a 20 20 20 20 65 6d 70 74 79 44 65 73 74 54 65  .    emptyDestTe
128b0 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
128c0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
128d0 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  o);.    sqlite3V
128e0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
128f0 64 64 72 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ddr1);.  }.  if(
12900 20 48 61 73 52 6f 77 69 64 28 70 53 72 63 29 20   HasRowid(pSrc) 
12910 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ){.    sqlite3Op
12920 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
12930 69 53 72 63 2c 20 69 44 62 53 72 63 2c 20 70 53  iSrc, iDbSrc, pS
12940 72 63 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  rc, OP_OpenRead)
12950 3b 0a 20 20 20 20 65 6d 70 74 79 53 72 63 54 65  ;.    emptySrcTe
12960 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
12970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
12980 69 6e 64 2c 20 69 53 72 63 2c 20 30 29 3b 20 56  ind, iSrc, 0); V
12990 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
129a0 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
129b0 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20  PKey>=0 ){.     
129c0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
129d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
129e0 5f 52 6f 77 69 64 2c 20 69 53 72 63 2c 20 72 65  _Rowid, iSrc, re
129f0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61  gRowid);.      a
12a00 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
12a10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
12a20 6f 74 45 78 69 73 74 73 2c 20 69 44 65 73 74 2c  otExists, iDest,
12a30 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   0, regRowid);. 
12a40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12a50 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
12a60 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
12a70 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72  nt(pParse, onErr
12a80 6f 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20  or, pDest);.    
12a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12aa0 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
12ab0 0a 20 20 20 20 20 20 61 75 74 6f 49 6e 63 53 74  .      autoIncSt
12ac0 65 70 28 70 50 61 72 73 65 2c 20 72 65 67 41 75  ep(pParse, regAu
12ad0 74 6f 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29  toinc, regRowid)
12ae0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
12af0 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3d 3d 30  pDest->pIndex==0
12b00 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20   ){.      addr1 
12b10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12b20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
12b30 69 64 2c 20 69 44 65 73 74 2c 20 72 65 67 52 6f  id, iDest, regRo
12b40 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
12b50 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
12b60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12b70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53  (v, OP_Rowid, iS
12b80 72 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rc, regRowid);. 
12b90 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 44       assert( (pD
12ba0 65 73 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  est->tabFlags & 
12bb0 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
12bc0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
12bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12be0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
12bf0 61 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74 61  a, iSrc, regData
12c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12c10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
12c20 6e 73 65 72 74 2c 20 69 44 65 73 74 2c 20 72 65  nsert, iDest, re
12c30 67 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64 29  gData, regRowid)
12c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12c50 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
12c60 4c 41 47 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c  LAG_NCHANGE|OPFL
12c70 41 47 5f 4c 41 53 54 52 4f 57 49 44 7c 4f 50 46  AG_LASTROWID|OPF
12c80 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
12c90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
12ca0 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 44 65 73  geP4(v, -1, pDes
12cb0 74 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  t->zName, 0);.  
12cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12cd0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
12ce0 69 53 72 63 2c 20 61 64 64 72 31 29 3b 20 56 64  iSrc, addr1); Vd
12cf0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d10 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
12d20 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20 20 20  , iSrc, 0);.    
12d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d40 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
12d50 44 65 73 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Dest, 0);.  }els
12d60 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  e{.    sqlite3Ta
12d70 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
12d80 69 44 62 44 65 73 74 2c 20 70 44 65 73 74 2d 3e  iDbDest, pDest->
12d90 74 6e 75 6d 2c 20 31 2c 20 70 44 65 73 74 2d 3e  tnum, 1, pDest->
12da0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
12db0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
12dc0 72 73 65 2c 20 69 44 62 53 72 63 2c 20 70 53 72  rse, iDbSrc, pSr
12dd0 63 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 53 72 63  c->tnum, 0, pSrc
12de0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
12df0 66 6f 72 28 70 44 65 73 74 49 64 78 3d 70 44 65  for(pDestIdx=pDe
12e00 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65 73  st->pIndex; pDes
12e10 74 49 64 78 3b 20 70 44 65 73 74 49 64 78 3d 70  tIdx; pDestIdx=p
12e20 44 65 73 74 49 64 78 2d 3e 70 4e 65 78 74 29 7b  DestIdx->pNext){
12e30 0a 20 20 20 20 75 38 20 69 64 78 49 6e 73 46 6c  .    u8 idxInsFl
12e40 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
12e50 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e 70  (pSrcIdx=pSrc->p
12e60 49 6e 64 65 78 3b 20 41 4c 57 41 59 53 28 70 53  Index; ALWAYS(pS
12e70 72 63 49 64 78 29 3b 20 70 53 72 63 49 64 78 3d  rcIdx); pSrcIdx=
12e80 70 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b  pSrcIdx->pNext){
12e90 0a 20 20 20 20 20 20 69 66 28 20 78 66 65 72 43  .      if( xferC
12ea0 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70  ompatibleIndex(p
12eb0 44 65 73 74 49 64 78 2c 20 70 53 72 63 49 64 78  DestIdx, pSrcIdx
12ec0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
12ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
12ee0 63 49 64 78 20 29 3b 0a 20 20 20 20 73 71 6c 69  cIdx );.    sqli
12ef0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12f00 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 53   OP_OpenRead, iS
12f10 72 63 2c 20 70 53 72 63 49 64 78 2d 3e 74 6e 75  rc, pSrcIdx->tnu
12f20 6d 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 20 20  m, iDbSrc);.    
12f30 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
12f40 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
12f50 70 53 72 63 49 64 78 29 3b 0a 20 20 20 20 56 64  pSrcIdx);.    Vd
12f60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
12f70 73 22 2c 20 70 53 72 63 49 64 78 2d 3e 7a 4e 61  s", pSrcIdx->zNa
12f80 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
12f90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12fa0 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 44 65  P_OpenWrite, iDe
12fb0 73 74 2c 20 70 44 65 73 74 49 64 78 2d 3e 74 6e  st, pDestIdx->tn
12fc0 75 6d 2c 20 69 44 62 44 65 73 74 29 3b 0a 20 20  um, iDbDest);.  
12fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
12fe0 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
12ff0 2c 20 70 44 65 73 74 49 64 78 29 3b 0a 20 20 20  , pDestIdx);.   
13000 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13010 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
13020 55 4c 4b 43 53 52 29 3b 0a 20 20 20 20 56 64 62  ULKCSR);.    Vdb
13030 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
13040 22 2c 20 70 44 65 73 74 49 64 78 2d 3e 7a 4e 61  ", pDestIdx->zNa
13050 6d 65 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  me));.    addr1 
13060 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13070 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
13080 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62 65  , iSrc, 0); Vdbe
13090 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
130a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130b0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
130c0 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b   iSrc, regData);
130d0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
130e0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75  gs & SQLITE_Vacu
130f0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
13100 68 69 73 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61  his INSERT comma
13110 6e 64 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  nd is part of a 
13120 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69 6f 6e  VACUUM operation
13130 2c 20 77 68 69 63 68 20 67 75 61 72 61 6e 74 65  , which guarante
13140 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
13150 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
13160 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
13170 20 49 66 20 61 6c 6c 20 69 6e 64 65 78 65 64 20   If all indexed 
13180 63 6f 6c 75 6d 6e 73 20 75 73 65 0a 20 20 20 20  columns use.    
13190 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73    ** collation s
131a0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2c 20  equence BINARY, 
131b0 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f  then it can also
131c0 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
131d0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e   the.      ** in
131e0 64 65 78 20 77 69 6c 6c 20 62 65 20 70 6f 70 75  dex will be popu
131f0 6c 61 74 65 64 20 62 79 20 69 6e 73 65 72 74 69  lated by inserti
13200 6e 67 20 6b 65 79 73 20 69 6e 20 73 74 72 69 63  ng keys in stric
13210 74 6c 79 20 73 6f 72 74 65 64 20 0a 20 20 20 20  tly sorted .    
13220 20 20 2a 2a 20 6f 72 64 65 72 2e 20 49 6e 20 74    ** order. In t
13230 68 69 73 20 63 61 73 65 2c 20 69 6e 73 74 65 61  his case, instea
13240 64 20 6f 66 20 73 65 65 6b 69 6e 67 20 77 69 74  d of seeking wit
13250 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 61  hin the b-tree a
13260 73 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a 20  s part.      ** 
13270 6f 66 20 65 76 65 72 79 20 4f 50 5f 49 64 78 49  of every OP_IdxI
13280 6e 73 65 72 74 20 6f 70 63 6f 64 65 2c 20 61 6e  nsert opcode, an
13290 20 4f 50 5f 4c 61 73 74 20 69 73 20 61 64 64 65   OP_Last is adde
132a0 64 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  d before the.   
132b0 20 20 20 2a 2a 20 4f 50 5f 49 64 78 49 6e 73 65     ** OP_IdxInse
132c0 72 74 20 74 6f 20 73 65 65 6b 20 74 6f 20 74 68  rt to seek to th
132d0 65 20 70 6f 69 6e 74 20 77 69 74 68 69 6e 20 74  e point within t
132e0 68 65 20 62 2d 74 72 65 65 20 77 68 65 72 65 20  he b-tree where 
132f0 65 61 63 68 20 6b 65 79 20 0a 20 20 20 20 20 20  each key .      
13300 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  ** should be ins
13310 65 72 74 65 64 2e 20 54 68 69 73 20 69 73 20 66  erted. This is f
13320 61 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  aster..      **.
13330 20 20 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20        ** If any 
13340 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63  of the indexed c
13350 6f 6c 75 6d 6e 73 20 75 73 65 20 61 20 63 6f 6c  olumns use a col
13360 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13370 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20 20  other than.     
13380 20 2a 2a 20 42 49 4e 41 52 59 2c 20 74 68 69 73   ** BINARY, this
13390 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
133a0 20 64 69 73 61 62 6c 65 64 2e 20 54 68 69 73 20   disabled. This 
133b0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 75  is because the u
133c0 73 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6d 69  ser .      ** mi
133d0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
133e0 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20 63  efinition of a c
133f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13400 65 20 61 6e 64 20 74 68 65 6e 20 72 75 6e 0a 20  e and then run. 
13410 20 20 20 20 20 2a 2a 20 61 20 56 41 43 55 55 4d       ** a VACUUM
13420 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 61   command. In tha
13430 74 20 63 61 73 65 20 6b 65 79 73 20 6d 61 79 20  t case keys may 
13440 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 69  not be written i
13450 6e 20 73 74 72 69 63 74 6c 79 0a 20 20 20 20 20  n strictly.     
13460 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72   ** sorted order
13470 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
13480 69 3d 30 3b 20 69 3c 70 53 72 63 49 64 78 2d 3e  i=0; i<pSrcIdx->
13490 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
134a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
134b0 6c 6c 20 3d 20 70 53 72 63 49 64 78 2d 3e 61 7a  ll = pSrcIdx->az
134c0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
134d0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
134e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
134f0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
13500 28 22 42 49 4e 41 52 59 22 2c 20 7a 43 6f 6c 6c  ("BINARY", zColl
13510 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
13520 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
13530 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  pSrcIdx->nColumn
13540 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78 49   ){.        idxI
13550 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47  nsFlags = OPFLAG
13560 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a  _USESEEKRESULT;.
13570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13580 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13590 4c 61 73 74 2c 20 69 44 65 73 74 2c 20 30 2c 20  Last, iDest, 0, 
135a0 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
135b0 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
135c0 6f 77 69 64 28 70 53 72 63 29 20 26 26 20 70 44  owid(pSrc) && pD
135d0 65 73 74 49 64 78 2d 3e 69 64 78 54 79 70 65 3d  estIdx->idxType=
135e0 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 64 78 49  =2 ){.      idxI
135f0 6e 73 46 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41  nsFlags |= OPFLA
13600 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 7d  G_NCHANGE;.    }
13610 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13620 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
13630 49 6e 73 65 72 74 2c 20 69 44 65 73 74 2c 20 72  Insert, iDest, r
13640 65 67 44 61 74 61 2c 20 31 29 3b 0a 20 20 20 20  egData, 1);.    
13650 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13660 65 50 35 28 76 2c 20 69 64 78 49 6e 73 46 6c 61  eP5(v, idxInsFla
13670 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gs);.    sqlite3
13680 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13690 5f 4e 65 78 74 2c 20 69 53 72 63 2c 20 61 64 64  _Next, iSrc, add
136a0 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
136b0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
136c0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
136d0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
136e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
136f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
13700 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
13710 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13720 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74   OP_Close, iDest
13730 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
13740 65 6d 70 74 79 53 72 63 54 65 73 74 20 29 20 73  emptySrcTest ) s
13750 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13760 72 65 28 76 2c 20 65 6d 70 74 79 53 72 63 54 65  re(v, emptySrcTe
13770 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  st);.  sqlite3Re
13780 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
13790 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
137a0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
137b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
137c0 72 65 67 44 61 74 61 29 3b 0a 20 20 69 66 28 20  regData);.  if( 
137d0 65 6d 70 74 79 44 65 73 74 54 65 73 74 20 29 7b  emptyDestTest ){
137e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
137f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
13800 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  t, SQLITE_OK, 0)
13810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13820 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d 70  eJumpHere(v, emp
13830 74 79 44 65 73 74 54 65 73 74 29 3b 0a 20 20 20  tyDestTest);.   
13840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13850 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
13860 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20 72  iDest, 0);.    r
13870 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
13880 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
13890 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
138a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52  SQLITE_OMIT_XFER
138b0 5f 4f 50 54 20 2a 2f 0a                          _OPT */.