/ Hex Artifact Content
Login

Artifact 2d5e197f2f60351937b201196965fd14cd88489c:


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 73 71 6c 69 74 65 33 4f  {.      sqlite3O
0bb0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
0bc0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0bd0: 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20   }.    for(n=0; 
0be0: 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  n<pIdx->nColumn;
0bf0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   n++){.      i16
0c00: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
0c10: 75 6d 6e 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  umn[n];.      if
0c20: 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
0c30: 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b    pIdx->zColAff[
0c40: 6e 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  n] = pTab->aCol[
0c50: 78 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  x].affinity;.   
0c60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d     }else if( x==
0c70: 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  XN_ROWID ){.    
0c80: 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66      pIdx->zColAf
0c90: 66 5b 6e 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[n] = SQLITE_AF
0ca0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
0cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0cc0: 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
0cd0: 20 20 61 73 73 65 72 74 28 20 78 3d 3d 58 4e 5f    assert( x==XN_
0ce0: 45 58 50 52 20 29 3b 0a 20 20 20 20 20 20 20 20  EXPR );.        
0cf0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
0d00: 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  olExpr!=0 );.   
0d10: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
0d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0d30: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
0d40: 5b 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [n].pExpr);.    
0d50: 20 20 20 20 69 66 28 20 61 66 66 3d 3d 30 20 29      if( aff==0 )
0d60: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
0d70: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
0d80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d  pIdx->zColAff[n]
0d90: 20 3d 20 61 66 66 3b 0a 20 20 20 20 20 20 7d 0a   = aff;.      }.
0da0: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e      }.    pIdx->
0db0: 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d 20 30 3b 0a  zColAff[n] = 0;.
0dc0: 20 20 7d 0a 20 0a 20 20 72 65 74 75 72 6e 20 70    }. .  return p
0dd0: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 3b 0a 7d 0a  Idx->zColAff;.}.
0de0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
0df0: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
0e00: 6e 67 20 66 6f 72 20 74 61 62 6c 65 20 70 54 61  ng for table pTa
0e10: 62 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  b, if it has not
0e20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
0e30: 20 63 6f 6d 70 75 74 65 64 2e 20 20 41 73 20 61   computed.  As a
0e40: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
0e50: 6f 6d 69 74 20 74 72 61 69 6c 69 6e 67 20 53 51  omit trailing SQ
0e60: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 61 66  LITE_AFF_BLOB af
0e70: 66 69 6e 69 74 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  finities..**.** 
0e80: 49 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  If the affinity 
0e90: 65 78 69 73 74 73 20 28 69 66 20 69 74 20 69 73  exists (if it is
0ea0: 20 6e 6f 20 65 6e 74 69 72 65 6c 79 20 53 51 4c   no entirely SQL
0eb0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 76 61 6c  ITE_AFF_BLOB val
0ec0: 75 65 73 29 20 61 6e 64 0a 2a 2a 20 69 66 20 69  ues) and.** if i
0ed0: 52 65 67 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  Reg>0 then code 
0ee0: 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
0ef0: 70 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20  pcode that will 
0f00: 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 69  set the affiniti
0f10: 65 73 0a 2a 2a 20 66 6f 72 20 72 65 67 69 73 74  es.** for regist
0f20: 65 72 20 69 52 65 67 20 61 6e 64 20 66 6f 6c 6c  er iReg and foll
0f30: 6f 77 69 6e 67 2e 20 20 4f 72 20 69 66 20 61 66  owing.  Or if af
0f40: 66 69 6e 69 74 69 65 73 20 65 78 69 73 74 73 20  finities exists 
0f50: 61 6e 64 20 69 52 65 67 3d 3d 30 2c 0a 2a 2a 20  and iReg==0,.** 
0f60: 74 68 65 6e 20 6a 75 73 74 20 73 65 74 20 74 68  then just set th
0f70: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P4 operand of 
0f80: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 70 63  the previous opc
0f90: 6f 64 65 20 28 77 68 69 63 68 20 73 68 6f 75 6c  ode (which shoul
0fa0: 64 20 20 62 65 0a 2a 2a 20 61 6e 20 4f 50 5f 4d  d  be.** an OP_M
0fb0: 61 6b 65 52 65 63 6f 72 64 29 20 74 6f 20 74 68  akeRecord) to th
0fc0: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
0fd0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6c 75 6d  g..**.** A colum
0fe0: 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
0ff0: 67 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61 63  g has one charac
1000: 74 65 72 20 70 65 72 20 63 6f 6c 75 6d 6e 3a 0a  ter per column:.
1010: 2a 2a 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72  **.**  Character
1020: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66        Column aff
1030: 69 6e 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d  inity.**  ------
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 0a 2a 2a 20 20 27 41 27  --------.**  'A'
1060: 20 20 20 20 20 20 20 20 20 20 20 20 42 4c 4f 42              BLOB
1070: 0a 2a 2a 20 20 27 42 27 20 20 20 20 20 20 20 20  .**  'B'        
1080: 20 20 20 20 54 45 58 54 0a 2a 2a 20 20 27 43 27      TEXT.**  'C'
1090: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45              NUME
10a0: 52 49 43 0a 2a 2a 20 20 27 44 27 20 20 20 20 20  RIC.**  'D'     
10b0: 20 20 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a         INTEGER.*
10c0: 2a 20 20 27 45 27 20 20 20 20 20 20 20 20 20 20  *  'E'          
10d0: 20 20 52 45 41 4c 0a 2a 2f 0a 76 6f 69 64 20 73    REAL.*/.void s
10e0: 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
10f0: 69 74 79 28 56 64 62 65 20 2a 76 2c 20 54 61 62  ity(Vdbe *v, Tab
1100: 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 52  le *pTab, int iR
1110: 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1120: 63 68 61 72 20 2a 7a 43 6f 6c 41 66 66 20 3d 20  char *zColAff = 
1130: 70 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 3b 0a 20  pTab->zColAff;. 
1140: 20 69 66 28 20 7a 43 6f 6c 41 66 66 3d 3d 30 20   if( zColAff==0 
1150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
1160: 64 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  db = sqlite3Vdbe
1170: 44 62 28 76 29 3b 0a 20 20 20 20 7a 43 6f 6c 41  Db(v);.    zColA
1180: 66 66 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ff = (char *)sql
1190: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
11a0: 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  0, pTab->nCol+1)
11b0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 41  ;.    if( !zColA
11c0: 66 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ff ){.      sqli
11d0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
11e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11f0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
1200: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1210: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6f   i++){.      zCo
1220: 6c 41 66 66 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  lAff[i] = pTab->
1230: 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79  aCol[i].affinity
1240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
1250: 20 20 20 20 20 20 7a 43 6f 6c 41 66 66 5b 69 2d        zColAff[i-
1260: 2d 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  -] = 0;.    }whi
1270: 6c 65 28 20 69 3e 3d 30 20 26 26 20 7a 43 6f 6c  le( i>=0 && zCol
1280: 41 66 66 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[i]==SQLITE_A
1290: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 70  FF_BLOB );.    p
12a0: 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 20 3d 20 7a  Tab->zColAff = z
12b0: 43 6f 6c 41 66 66 3b 0a 20 20 7d 0a 20 20 69 20  ColAff;.  }.  i 
12c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12d0: 30 28 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66  0(zColAff);.  if
12e0: 28 20 69 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ( i ){.    if( i
12f0: 52 65 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Reg ){.      sql
1300: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1310: 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 69  , OP_Affinity, i
1320: 52 65 67 2c 20 69 2c 20 30 2c 20 7a 43 6f 6c 41  Reg, i, 0, zColA
1330: 66 66 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73  ff, i);.    }els
1340: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1350: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1360: 2d 31 2c 20 7a 43 6f 6c 41 66 66 2c 20 69 29 3b  -1, zColAff, i);
1370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1380: 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
1390: 65 72 6f 20 69 66 20 74 68 65 20 74 61 62 6c 65  ero if the table
13a0: 20 70 54 61 62 20 69 6e 20 64 61 74 61 62 61 73   pTab in databas
13b0: 65 20 69 44 62 20 6f 72 20 61 6e 79 20 6f 66 20  e iDb or any of 
13c0: 69 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 68  its indices.** h
13d0: 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
13e0: 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
13f0: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1400: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
1410: 6f 20 73 65 65 20 69 66 20 0a 2a 2a 20 61 20 73  o see if .** a s
1420: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  tatement of the 
1430: 66 6f 72 6d 20 20 22 49 4e 53 45 52 54 20 49 4e  form  "INSERT IN
1440: 54 4f 20 3c 69 44 62 2c 20 70 54 61 62 3e 20 53  TO <iDb, pTab> S
1450: 45 4c 45 43 54 20 2e 2e 2e 22 20 63 61 6e 20 0a  ELECT ..." can .
1460: 2a 2a 20 72 75 6e 20 77 69 74 68 6f 75 74 20 75  ** run without u
1470: 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
1480: 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 72   table for the r
1490: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
14a0: 4c 45 43 54 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  LECT. .*/.static
14b0: 20 69 6e 74 20 72 65 61 64 73 54 61 62 6c 65 28   int readsTable(
14c0: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
14d0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  b, Table *pTab){
14e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
14f0: 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a  ite3GetVdbe(p);.
1500: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
1510: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1520: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1530: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1540: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1550: 45 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61  E.  VTable *pVTa
1560: 62 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  b = IsVirtual(pT
1570: 61 62 29 20 3f 20 73 71 6c 69 74 65 33 47 65 74  ab) ? sqlite3Get
1580: 56 54 61 62 6c 65 28 70 2d 3e 64 62 2c 20 70 54  VTable(p->db, pT
1590: 61 62 29 20 3a 20 30 3b 0a 23 65 6e 64 69 66 0a  ab) : 0;.#endif.
15a0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 69 45  .  for(i=1; i<iE
15b0: 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64  nd; i++){.    Vd
15c0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
15d0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15e0: 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i);.    assert( 
15f0: 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pOp!=0 );.    if
1600: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
1610: 50 5f 4f 70 65 6e 52 65 61 64 20 26 26 20 70 4f  P_OpenRead && pO
1620: 70 2d 3e 70 33 3d 3d 69 44 62 20 29 7b 0a 20 20  p->p3==iDb ){.  
1630: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
1640: 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6e 75  x;.      int tnu
1650: 6d 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  m = pOp->p2;.   
1660: 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 70 54 61     if( tnum==pTa
1670: 62 2d 3e 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20  b->tnum ){.     
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1690: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70     }.      for(p
16a0: 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
16b0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
16c0: 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
16d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  ){.        if( t
16e0: 6e 75 6d 3d 3d 70 49 6e 64 65 78 2d 3e 74 6e 75  num==pIndex->tnu
16f0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  m ){.          r
1700: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1710: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1720: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1730: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1740: 45 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  E.    if( pOp->o
1750: 70 63 6f 64 65 3d 3d 4f 50 5f 56 4f 70 65 6e 20  pcode==OP_VOpen 
1760: 26 26 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62  && pOp->p4.pVtab
1770: 3d 3d 70 56 54 61 62 20 29 7b 0a 20 20 20 20 20  ==pVTab ){.     
1780: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1790: 2e 70 56 74 61 62 21 3d 30 20 29 3b 0a 20 20 20  .pVtab!=0 );.   
17a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
17b0: 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41 42 20  p4type==P4_VTAB 
17c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17d0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
17e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1800: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
1810: 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  MENT./*.** Locat
1820: 65 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 41  e or create an A
1830: 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75 63  utoincInfo struc
1840: 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
1850: 77 69 74 68 20 74 61 62 6c 65 20 70 54 61 62 0a  with table pTab.
1860: 2a 2a 20 77 68 69 63 68 20 69 73 20 69 6e 20 64  ** which is in d
1870: 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 52 65  atabase iDb.  Re
1880: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1890: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18a0: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 74 68 61   register.** tha
18b0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6d 61 78 69  t holds the maxi
18c0: 6d 75 6d 20 72 6f 77 69 64 2e 20 20 52 65 74 75  mum rowid.  Retu
18d0: 72 6e 20 7a 65 72 6f 20 69 66 20 70 54 61 62 20  rn zero if pTab 
18e0: 69 73 20 6e 6f 74 20 61 6e 20 41 55 54 4f 49 4e  is not an AUTOIN
18f0: 43 52 45 4d 45 4e 54 0a 2a 2a 20 74 61 62 6c 65  CREMENT.** table
1900: 2e 20 20 28 41 6c 73 6f 20 72 65 74 75 72 6e 20  .  (Also return 
1910: 7a 65 72 6f 20 77 68 65 6e 20 64 6f 69 6e 67 20  zero when doing 
1920: 61 20 56 41 43 55 55 4d 20 73 69 6e 63 65 20 77  a VACUUM since w
1930: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
1940: 0a 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 41  .** update the A
1950: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 63 6f 75  UTOINCREMENT cou
1960: 6e 74 65 72 73 20 64 75 72 69 6e 67 20 61 20 56  nters during a V
1970: 41 43 55 55 4d 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ACUUM.).**.** Th
1980: 65 72 65 20 69 73 20 61 74 20 6d 6f 73 74 20 6f  ere is at most o
1990: 6e 65 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73  ne AutoincInfo s
19a0: 74 72 75 63 74 75 72 65 20 70 65 72 20 74 61 62  tructure per tab
19b0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65 0a 2a  le even if the.*
19c0: 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 69 73 20  * same table is 
19d0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 65 64 20  autoincremented 
19e0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 64  multiple times d
19f0: 75 65 20 74 6f 20 69 6e 73 65 72 74 73 20 77 69  ue to inserts wi
1a00: 74 68 69 6e 0a 2a 2a 20 74 72 69 67 67 65 72 73  thin.** triggers
1a10: 2e 20 20 41 20 6e 65 77 20 41 75 74 6f 69 6e 63  .  A new Autoinc
1a20: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
1a30: 73 20 63 72 65 61 74 65 64 20 69 66 20 74 68 69  s created if thi
1a40: 73 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  s is the.** firs
1a50: 74 20 75 73 65 20 6f 66 20 74 61 62 6c 65 20 70  t use of table p
1a60: 54 61 62 2e 20 20 4f 6e 20 32 6e 64 20 61 6e 64  Tab.  On 2nd and
1a70: 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73   subsequent uses
1a80: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  , the original.*
1a90: 2a 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74  * AutoincInfo st
1aa0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 2e  ructure is used.
1ab0: 0a 2a 2a 0a 2a 2a 20 54 68 72 65 65 20 6d 65 6d  .**.** Three mem
1ac0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 61 72  ory locations ar
1ad0: 65 20 61 6c 6c 6f 63 61 74 65 64 3a 0a 2a 2a 0a  e allocated:.**.
1ae0: 2a 2a 20 20 20 28 31 29 20 20 52 65 67 69 73 74  **   (1)  Regist
1af0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  er to hold the n
1b00: 61 6d 65 20 6f 66 20 74 68 65 20 70 54 61 62 20  ame of the pTab 
1b10: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28 32 29 20  table..**   (2) 
1b20: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
1b30: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 52 4f  d the maximum RO
1b40: 57 49 44 20 6f 66 20 70 54 61 62 2e 0a 2a 2a 20  WID of pTab..** 
1b50: 20 20 28 33 29 20 20 52 65 67 69 73 74 65 72 20    (3)  Register 
1b60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 69  to hold the rowi
1b70: 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  d in sqlite_sequ
1b80: 65 6e 63 65 20 6f 66 20 70 54 61 62 0a 2a 2a 0a  ence of pTab.**.
1b90: 2a 2a 20 54 68 65 20 32 6e 64 20 72 65 67 69 73  ** The 2nd regis
1ba0: 74 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 74  ter is the one t
1bb0: 68 61 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  hat is returned.
1bc0: 20 20 54 68 61 74 20 69 73 20 61 6c 6c 20 74 68    That is all th
1bd0: 65 0a 2a 2a 20 69 6e 73 65 72 74 20 72 6f 75 74  e.** insert rout
1be0: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  ine needs to kno
1bf0: 77 20 61 62 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  w about..*/.stat
1c00: 69 63 20 69 6e 74 20 61 75 74 6f 49 6e 63 42 65  ic int autoIncBe
1c10: 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
1c20: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
1c30: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c40: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
1c50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c70: 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a  holding pTab */.
1c80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
1c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
1ca0: 6c 65 20 77 65 20 61 72 65 20 77 72 69 74 69 6e  le we are writin
1cb0: 67 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g to */.){.  int
1cc0: 20 6d 65 6d 49 64 20 3d 20 30 3b 20 20 20 20 20   memId = 0;     
1cd0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1ce0: 64 69 6e 67 20 6d 61 78 69 6d 75 6d 20 72 6f 77  ding maximum row
1cf0: 69 64 20 2a 2f 0a 20 20 69 66 28 20 28 70 54 61  id */.  if( (pTa
1d00: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1d10: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
1d20: 3d 30 0a 20 20 20 26 26 20 28 70 50 61 72 73 65  =0.   && (pParse
1d30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1d40: 4c 49 54 45 5f 56 61 63 75 75 6d 29 3d 3d 30 0a  LITE_Vacuum)==0.
1d50: 20 20 29 7b 0a 20 20 20 20 50 61 72 73 65 20 2a    ){.    Parse *
1d60: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1d70: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1d80: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 41 75  (pParse);.    Au
1d90: 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 49 6e 66 6f  toincInfo *pInfo
1da0: 3b 0a 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 70  ;..    pInfo = p
1db0: 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 3b  Toplevel->pAinc;
1dc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 66  .    while( pInf
1dd0: 6f 20 26 26 20 70 49 6e 66 6f 2d 3e 70 54 61 62  o && pInfo->pTab
1de0: 21 3d 70 54 61 62 20 29 7b 20 70 49 6e 66 6f 20  !=pTab ){ pInfo 
1df0: 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65 78 74 3b 20  = pInfo->pNext; 
1e00: 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d  }.    if( pInfo=
1e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  =0 ){.      pInf
1e20: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
1e30: 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d  locRawNN(pParse-
1e40: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  >db, sizeof(*pIn
1e50: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
1e60: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
1e70: 6e 20 30 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  n 0;.      pInfo
1e80: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70 6c 65  ->pNext = pTople
1e90: 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20 20 20  vel->pAinc;.    
1ea0: 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69    pToplevel->pAi
1eb0: 6e 63 20 3d 20 70 49 6e 66 6f 3b 0a 20 20 20 20  nc = pInfo;.    
1ec0: 20 20 70 49 6e 66 6f 2d 3e 70 54 61 62 20 3d 20    pInfo->pTab = 
1ed0: 70 54 61 62 3b 0a 20 20 20 20 20 20 70 49 6e 66  pTab;.      pInf
1ee0: 6f 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  o->iDb = iDb;.  
1ef0: 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e      pToplevel->n
1f00: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Mem++;          
1f10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1f20: 74 65 72 20 74 6f 20 68 6f 6c 64 20 6e 61 6d 65  ter to hold name
1f30: 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20   of table */.   
1f40: 20 20 20 70 49 6e 66 6f 2d 3e 72 65 67 43 74 72     pInfo->regCtr
1f50: 20 3d 20 2b 2b 70 54 6f 70 6c 65 76 65 6c 2d 3e   = ++pToplevel->
1f60: 6e 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78 20 72 6f  nMem;  /* Max ro
1f70: 77 69 64 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  wid register */.
1f80: 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1f90: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20  >nMem++;        
1fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
1fb0: 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65 71  id in sqlite_seq
1fc0: 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  uence */.    }. 
1fd0: 20 20 20 6d 65 6d 49 64 20 3d 20 70 49 6e 66 6f     memId = pInfo
1fe0: 2d 3e 72 65 67 43 74 72 3b 0a 20 20 7d 0a 20 20  ->regCtr;.  }.  
1ff0: 72 65 74 75 72 6e 20 6d 65 6d 49 64 3b 0a 7d 0a  return memId;.}.
2000: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2010: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2020: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69  de that will ini
2030: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 6f 66 20 74  tialize all of t
2040: 68 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 75  he.** register u
2050: 73 65 64 20 62 79 20 74 68 65 20 61 75 74 6f 69  sed by the autoi
2060: 6e 63 72 65 6d 65 6e 74 20 74 72 61 63 6b 65 72  ncrement tracker
2070: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
2080: 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  te3Autoincrement
2090: 42 65 67 69 6e 28 50 61 72 73 65 20 2a 70 50 61  Begin(Parse *pPa
20a0: 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63 49  rse){.  AutoincI
20b0: 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 20 20  nfo *p;         
20c0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
20d0: 6e 20 61 62 6f 75 74 20 61 6e 20 41 55 54 4f 49  n about an AUTOI
20e0: 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 73 71  NCREMENT */.  sq
20f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2100: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
2110: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2120: 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ion */.  Db *pDb
2130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2140: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2150: 6f 6e 6c 79 20 61 75 74 6f 69 6e 63 20 74 61 62  only autoinc tab
2160: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 49  le */.  int memI
2170: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2180: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
2190: 6f 6c 64 69 6e 67 20 6d 61 78 20 72 6f 77 69 64  olding max rowid
21a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
21b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
21c0: 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72 20 63   /* VDBE under c
21d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
21e0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
21f0: 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2200: 64 20 64 75 72 69 6e 67 20 74 72 69 67 67 65 72  d during trigger
2210: 2d 67 65 6e 65 72 61 74 69 6f 6e 2e 20 20 49 74  -generation.  It
2220: 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79 20 63 61   is.  ** only ca
2230: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 74 6f  lled from the to
2240: 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20 20 61 73 73  p-level */.  ass
2250: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 54 72  ert( pParse->pTr
2260: 69 67 67 65 72 54 61 62 3d 3d 30 20 29 3b 0a 20  iggerTab==0 );. 
2270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2280: 49 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  IsToplevel(pPars
2290: 65 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  e) );..  assert(
22a0: 20 76 20 29 3b 20 20 20 2f 2a 20 57 65 20 66 61   v );   /* We fa
22b0: 69 6c 65 64 20 6c 6f 6e 67 20 61 67 6f 20 69 66  iled long ago if
22c0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
22d0: 2a 2f 0a 20 20 66 6f 72 28 70 20 3d 20 70 50 61  */.  for(p = pPa
22e0: 72 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20 70  rse->pAinc; p; p
22f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   = p->pNext){.  
2300: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
2310: 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46  nt iLn = VDBE_OF
2320: 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a  FSET_LINENO(2);.
2330: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2340: 20 56 64 62 65 4f 70 4c 69 73 74 20 61 75 74 6f   VdbeOpList auto
2350: 49 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  Inc[] = {.      
2360: 2f 2a 20 30 20 20 2a 2f 20 7b 4f 50 5f 4e 75 6c  /* 0  */ {OP_Nul
2370: 6c 2c 20 20 20 20 30 2c 20 20 30 2c 20 30 7d 2c  l,    0,  0, 0},
2380: 0a 20 20 20 20 20 20 2f 2a 20 31 20 20 2a 2f 20  .      /* 1  */ 
2390: 7b 4f 50 5f 52 65 77 69 6e 64 2c 20 20 30 2c 20  {OP_Rewind,  0, 
23a0: 20 39 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a   9, 0},.      /*
23b0: 20 32 20 20 2a 2f 20 7b 4f 50 5f 43 6f 6c 75 6d   2  */ {OP_Colum
23c0: 6e 2c 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20  n,  0,  0, 0},. 
23d0: 20 20 20 20 20 2f 2a 20 33 20 20 2a 2f 20 7b 4f       /* 3  */ {O
23e0: 50 5f 4e 65 2c 20 20 20 20 20 20 30 2c 20 20 37  P_Ne,      0,  7
23f0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 34  , 0},.      /* 4
2400: 20 20 2a 2f 20 7b 4f 50 5f 52 6f 77 69 64 2c 20    */ {OP_Rowid, 
2410: 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20 20 20    0,  0, 0},.   
2420: 20 20 20 2f 2a 20 35 20 20 2a 2f 20 7b 4f 50 5f     /* 5  */ {OP_
2430: 43 6f 6c 75 6d 6e 2c 20 20 30 2c 20 20 31 2c 20  Column,  0,  1, 
2440: 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 36 20 20  0},.      /* 6  
2450: 2a 2f 20 7b 4f 50 5f 47 6f 74 6f 2c 20 20 20 20  */ {OP_Goto,    
2460: 30 2c 20 20 39 2c 20 30 7d 2c 0a 20 20 20 20 20  0,  9, 0},.     
2470: 20 2f 2a 20 37 20 20 2a 2f 20 7b 4f 50 5f 4e 65   /* 7  */ {OP_Ne
2480: 78 74 2c 20 20 20 20 30 2c 20 20 32 2c 20 30 7d  xt,    0,  2, 0}
2490: 2c 0a 20 20 20 20 20 20 2f 2a 20 38 20 20 2a 2f  ,.      /* 8  */
24a0: 20 7b 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c   {OP_Integer, 0,
24b0: 20 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f    0, 0},.      /
24c0: 2a 20 39 20 20 2a 2f 20 7b 4f 50 5f 43 6c 6f 73  * 9  */ {OP_Clos
24d0: 65 2c 20 20 20 30 2c 20 20 30 2c 20 30 7d 20 0a  e,   0,  0, 0} .
24e0: 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f      };.    VdbeO
24f0: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 70 44 62 20  p *aOp;.    pDb 
2500: 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  = &db->aDb[p->iD
2510: 62 5d 3b 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20  b];.    memId = 
2520: 70 2d 3e 72 65 67 43 74 72 3b 0a 20 20 20 20 61  p->regCtr;.    a
2530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2540: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2550: 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  , 0, pDb->pSchem
2560: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
2570: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2580: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44  e, 0, p->iDb, pD
2590: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
25a0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
25b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
25c0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
25d0: 6d 65 6d 49 64 2d 31 2c 20 70 2d 3e 70 54 61 62  memId-1, p->pTab
25e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 4f  ->zName);.    aO
25f0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
2600: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
2610: 79 53 69 7a 65 28 61 75 74 6f 49 6e 63 29 2c 20  ySize(autoInc), 
2620: 61 75 74 6f 49 6e 63 2c 20 69 4c 6e 29 3b 0a 20  autoInc, iLn);. 
2630: 20 20 20 69 66 28 20 61 4f 70 3d 3d 30 20 29 20     if( aOp==0 ) 
2640: 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f 70 5b 30  break;.    aOp[0
2650: 5d 2e 70 32 20 3d 20 6d 65 6d 49 64 3b 0a 20 20  ].p2 = memId;.  
2660: 20 20 61 4f 70 5b 30 5d 2e 70 33 20 3d 20 6d 65    aOp[0].p3 = me
2670: 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70 5b 32  mId+1;.    aOp[2
2680: 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a 20 20  ].p3 = memId;.  
2690: 20 20 61 4f 70 5b 33 5d 2e 70 31 20 3d 20 6d 65    aOp[3].p1 = me
26a0: 6d 49 64 2d 31 3b 0a 20 20 20 20 61 4f 70 5b 33  mId-1;.    aOp[3
26b0: 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a 20 20  ].p3 = memId;.  
26c0: 20 20 61 4f 70 5b 33 5d 2e 70 35 20 3d 20 53 51    aOp[3].p5 = SQ
26d0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 3b  LITE_JUMPIFNULL;
26e0: 0a 20 20 20 20 61 4f 70 5b 34 5d 2e 70 32 20 3d  .    aOp[4].p2 =
26f0: 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f   memId+1;.    aO
2700: 70 5b 35 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b  p[5].p3 = memId;
2710: 0a 20 20 20 20 61 4f 70 5b 38 5d 2e 70 32 20 3d  .    aOp[8].p2 =
2720: 20 6d 65 6d 49 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f   memId;.  }.}../
2730: 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
2740: 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 66 6f  maximum rowid fo
2750: 72 20 61 6e 20 61 75 74 6f 69 6e 63 72 65 6d 65  r an autoincreme
2760: 6e 74 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2e 0a  nt calculation..
2770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2780: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
2790: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 67  led when the reg
27a0: 52 6f 77 69 64 20 72 65 67 69 73 74 65 72 20 68  Rowid register h
27b0: 6f 6c 64 73 20 61 0a 2a 2a 20 6e 65 77 20 72 6f  olds a.** new ro
27c0: 77 69 64 20 74 68 61 74 20 69 73 20 61 62 6f 75  wid that is abou
27d0: 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  t to be inserted
27e0: 2e 20 20 49 66 20 74 68 61 74 20 6e 65 77 20 72  .  If that new r
27f0: 6f 77 69 64 20 69 73 0a 2a 2a 20 6c 61 72 67 65  owid is.** large
2800: 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d  r than the maxim
2810: 75 6d 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  um rowid in the 
2820: 6d 65 6d 49 64 20 6d 65 6d 6f 72 79 20 63 65 6c  memId memory cel
2830: 6c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  l, then the.** m
2840: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20 75 70  emory cell is up
2850: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
2860: 20 76 6f 69 64 20 61 75 74 6f 49 6e 63 53 74 65   void autoIncSte
2870: 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
2880: 20 69 6e 74 20 6d 65 6d 49 64 2c 20 69 6e 74 20   int memId, int 
2890: 72 65 67 52 6f 77 69 64 29 7b 0a 20 20 69 66 28  regRowid){.  if(
28a0: 20 6d 65 6d 49 64 3e 30 20 29 7b 0a 20 20 20 20   memId>0 ){.    
28b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28c0: 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
28d0: 20 4f 50 5f 4d 65 6d 4d 61 78 2c 20 6d 65 6d 49   OP_MemMax, memI
28e0: 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  d, regRowid);.  
28f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2900: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
2910: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
2920: 64 20 74 6f 20 77 72 69 74 65 20 61 75 74 6f 69  d to write autoi
2930: 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 6d 61 78 69  ncrement.** maxi
2940: 6d 75 6d 20 72 6f 77 69 64 20 76 61 6c 75 65 73  mum rowid values
2950: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73   back into the s
2960: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 72  qlite_sequence r
2970: 65 67 69 73 74 65 72 2e 0a 2a 2a 20 45 76 65 72  egister..** Ever
2980: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
2990: 20 6d 69 67 68 74 20 64 6f 20 61 6e 20 49 4e 53   might do an INS
29a0: 45 52 54 20 69 6e 74 6f 20 61 6e 20 61 75 74 6f  ERT into an auto
29b0: 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 61 62  increment.** tab
29c0: 6c 65 20 28 65 69 74 68 65 72 20 64 69 72 65 63  le (either direc
29d0: 74 6c 79 20 6f 72 20 74 68 72 6f 75 67 68 20 74  tly or through t
29e0: 72 69 67 67 65 72 73 29 20 6e 65 65 64 73 20 74  riggers) needs t
29f0: 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  o call this.** r
2a00: 6f 75 74 69 6e 65 20 6a 75 73 74 20 62 65 66 6f  outine just befo
2a10: 72 65 20 74 68 65 20 22 65 78 69 74 22 20 63 6f  re the "exit" co
2a20: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  de..*/.static SQ
2a30: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
2a40: 69 64 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74  id autoIncrement
2a50: 45 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  End(Parse *pPars
2a60: 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63 49 6e 66  e){.  AutoincInf
2a70: 6f 20 2a 70 3b 0a 20 20 56 64 62 65 20 2a 76 20  o *p;.  Vdbe *v 
2a80: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2a90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2aa0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2ab0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 66  assert( v );.  f
2ac0: 6f 72 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  or(p = pParse->p
2ad0: 41 69 6e 63 3b 20 70 3b 20 70 20 3d 20 70 2d 3e  Ainc; p; p = p->
2ae0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 73 74 61 74  pNext){.    stat
2af0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
2b00: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
2b10: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
2b20: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
2b30: 70 4c 69 73 74 20 61 75 74 6f 49 6e 63 45 6e 64  pList autoIncEnd
2b40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20  [] = {.      /* 
2b50: 30 20 2a 2f 20 7b 4f 50 5f 4e 6f 74 4e 75 6c 6c  0 */ {OP_NotNull
2b60: 2c 20 20 20 20 20 30 2c 20 32 2c 20 30 7d 2c 0a  ,     0, 2, 0},.
2b70: 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 20 7b 4f        /* 1 */ {O
2b80: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 20 20 20 30  P_NewRowid,    0
2b90: 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f  , 0, 0},.      /
2ba0: 2a 20 32 20 2a 2f 20 7b 4f 50 5f 4d 61 6b 65 52  * 2 */ {OP_MakeR
2bb0: 65 63 6f 72 64 2c 20 20 30 2c 20 32 2c 20 30 7d  ecord,  0, 2, 0}
2bc0: 2c 0a 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 20  ,.      /* 3 */ 
2bd0: 7b 4f 50 5f 49 6e 73 65 72 74 2c 20 20 20 20 20  {OP_Insert,     
2be0: 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20   0, 0, 0},.     
2bf0: 20 2f 2a 20 34 20 2a 2f 20 7b 4f 50 5f 43 6c 6f   /* 4 */ {OP_Clo
2c00: 73 65 2c 20 20 20 20 20 20 20 30 2c 20 30 2c 20  se,       0, 0, 
2c10: 30 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  0}.    };.    Vd
2c20: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 44  beOp *aOp;.    D
2c30: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2c40: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 69  b[p->iDb];.    i
2c50: 6e 74 20 69 52 65 63 3b 0a 20 20 20 20 69 6e 74  nt iRec;.    int
2c60: 20 6d 65 6d 49 64 20 3d 20 70 2d 3e 72 65 67 43   memId = p->regC
2c70: 74 72 3b 0a 0a 20 20 20 20 69 52 65 63 20 3d 20  tr;..    iRec = 
2c80: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2c90: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  g(pParse);.    a
2ca0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2cb0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2cc0: 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  , 0, pDb->pSchem
2cd0: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
2ce0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2cf0: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44  e, 0, p->iDb, pD
2d00: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
2d10: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  Tab, OP_OpenWrit
2d20: 65 29 3b 0a 20 20 20 20 61 4f 70 20 3d 20 73 71  e);.    aOp = sq
2d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2d40: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
2d50: 61 75 74 6f 49 6e 63 45 6e 64 29 2c 20 61 75 74  autoIncEnd), aut
2d60: 6f 49 6e 63 45 6e 64 2c 20 69 4c 6e 29 3b 0a 20  oIncEnd, iLn);. 
2d70: 20 20 20 69 66 28 20 61 4f 70 3d 3d 30 20 29 20     if( aOp==0 ) 
2d80: 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f 70 5b 30  break;.    aOp[0
2d90: 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a  ].p1 = memId+1;.
2da0: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20      aOp[1].p2 = 
2db0: 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70  memId+1;.    aOp
2dc0: 5b 32 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2d 31  [2].p1 = memId-1
2dd0: 3b 0a 20 20 20 20 61 4f 70 5b 32 5d 2e 70 33 20  ;.    aOp[2].p3 
2de0: 3d 20 69 52 65 63 3b 0a 20 20 20 20 61 4f 70 5b  = iRec;.    aOp[
2df0: 33 5d 2e 70 32 20 3d 20 69 52 65 63 3b 0a 20 20  3].p2 = iRec;.  
2e00: 20 20 61 4f 70 5b 33 5d 2e 70 33 20 3d 20 6d 65    aOp[3].p3 = me
2e10: 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70 5b 33  mId+1;.    aOp[3
2e20: 5d 2e 70 35 20 3d 20 4f 50 46 4c 41 47 5f 41 50  ].p5 = OPFLAG_AP
2e30: 50 45 4e 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  PEND;.    sqlite
2e40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2e50: 70 50 61 72 73 65 2c 20 69 52 65 63 29 3b 0a 20  pParse, iRec);. 
2e60: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
2e70: 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e  3AutoincrementEn
2e80: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  d(Parse *pParse)
2e90: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2ea0: 70 41 69 6e 63 20 29 20 61 75 74 6f 49 6e 63 72  pAinc ) autoIncr
2eb0: 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29  ementEnd(pParse)
2ec0: 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20  ;.}.#else./*.** 
2ed0: 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  If SQLITE_OMIT_A
2ee0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
2ef0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
2f00: 65 20 74 68 72 65 65 20 72 6f 75 74 69 6e 65 73  e three routines
2f10: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 61 6c  .** above are al
2f20: 6c 20 6e 6f 2d 6f 70 73 0a 2a 2f 0a 23 20 64 65  l no-ops.*/.# de
2f30: 66 69 6e 65 20 61 75 74 6f 49 6e 63 42 65 67 69  fine autoIncBegi
2f40: 6e 28 41 2c 42 2c 43 29 20 28 30 29 0a 23 20 64  n(A,B,C) (0).# d
2f50: 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 53 74 65  efine autoIncSte
2f60: 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 20  p(A,B,C).#endif 
2f70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
2f80: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a  UTOINCREMENT */.
2f90: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
2fa0: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
2fb0: 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d  ic int xferOptim
2fc0: 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  ization(.  Parse
2fd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2fe0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
2ff0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
3000: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Dest,         /*
3010: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
3020: 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  e inserting into
3030: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
3040: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41  elect,      /* A
3050: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3060: 74 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  t to use as the 
3070: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
3080: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
3090: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
30a0: 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69   handle constrai
30b0: 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  nt errors */.  i
30c0: 6e 74 20 69 44 62 44 65 73 74 20 20 20 20 20 20  nt iDbDest      
30d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
30e0: 62 61 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f  base of pDest */
30f0: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .);../*.** This 
3100: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3110: 64 20 74 6f 20 68 61 6e 64 6c 65 20 53 51 4c 20  d to handle SQL 
3120: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3130: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
3140: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42   insert into TAB
3150: 4c 45 20 28 49 44 4c 49 53 54 29 20 76 61 6c 75  LE (IDLIST) valu
3160: 65 73 28 45 58 50 52 4c 49 53 54 29 2c 28 45 58  es(EXPRLIST),(EX
3170: 50 52 4c 49 53 54 29 2c 2e 2e 2e 0a 2a 2a 20 20  PRLIST),....**  
3180: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41    insert into TA
3190: 42 4c 45 20 28 49 44 4c 49 53 54 29 20 73 65 6c  BLE (IDLIST) sel
31a0: 65 63 74 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74  ect.**    insert
31b0: 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c   into TABLE (IDL
31c0: 49 53 54 29 20 64 65 66 61 75 6c 74 20 76 61 6c  IST) default val
31d0: 75 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44  ues.**.** The ID
31e0: 4c 49 53 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  LIST following t
31f0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
3200: 20 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c   always optional
3210: 2e 20 20 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a  .  If omitted,.*
3220: 2a 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66  * then a list of
3230: 20 61 6c 6c 20 28 6e 6f 6e 2d 68 69 64 64 65 6e   all (non-hidden
3240: 29 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  ) columns for th
3250: 65 20 74 61 62 6c 65 20 69 73 20 73 75 62 73 74  e table is subst
3260: 69 74 75 74 65 64 2e 0a 2a 2a 20 54 68 65 20 49  ituted..** The I
3270: 44 4c 49 53 54 20 61 70 70 65 61 72 73 20 69 6e  DLIST appears in
3280: 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61 72   the pColumn par
3290: 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d 6e  ameter.  pColumn
32a0: 20 69 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c 49   is NULL if IDLI
32b0: 53 54 0a 2a 2a 20 69 73 20 6f 6d 69 74 74 65 64  ST.** is omitted
32c0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
32d0: 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74 65  pSelect paramete
32e0: 72 20 68 6f 6c 64 73 20 74 68 65 20 76 61 6c 75  r holds the valu
32f0: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  es to be inserte
3300: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 66 69 72  d for the.** fir
3310: 73 74 20 74 77 6f 20 66 6f 72 6d 73 20 73 68 6f  st two forms sho
3320: 77 6e 20 61 62 6f 76 65 2e 20 20 41 20 56 41 4c  wn above.  A VAL
3330: 55 45 53 20 63 6c 61 75 73 65 20 69 73 20 72 65  UES clause is re
3340: 61 6c 6c 79 20 6a 75 73 74 20 73 68 6f 72 74 2d  ally just short-
3350: 68 61 6e 64 0a 2a 2a 20 66 6f 72 20 61 20 53 45  hand.** for a SE
3360: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
3370: 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 46 52  hat omits the FR
3380: 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 65 76  OM clause and ev
3390: 65 72 79 74 68 69 6e 67 20 65 6c 73 65 0a 2a 2a  erything else.**
33a0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 20 20   that follows.  
33b0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 70  If the pSelect p
33c0: 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c  arameter is NULL
33d0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
33e0: 74 20 74 68 65 0a 2a 2a 20 44 45 46 41 55 4c 54  t the.** DEFAULT
33f0: 20 56 41 4c 55 45 53 20 66 6f 72 6d 20 6f 66 20   VALUES form of 
3400: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
3410: 6d 65 6e 74 20 69 73 20 69 6e 74 65 6e 64 65 64  ment is intended
3420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
3430: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 6c 6c 6f   generated follo
3440: 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75 72 20 74  ws one of four t
3450: 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f 72 20 61  emplates.  For a
3460: 20 73 69 6d 70 6c 65 0a 2a 2a 20 69 6e 73 65 72   simple.** inser
3470: 74 20 77 69 74 68 20 64 61 74 61 20 63 6f 6d 69  t with data comi
3480: 6e 67 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ng from a single
3490: 2d 72 6f 77 20 56 41 4c 55 45 53 20 63 6c 61 75  -row VALUES clau
34a0: 73 65 2c 20 74 68 65 20 63 6f 64 65 20 65 78 65  se, the code exe
34b0: 63 75 74 65 73 0a 2a 2a 20 6f 6e 63 65 20 73 74  cutes.** once st
34c0: 72 61 69 67 68 74 20 64 6f 77 6e 20 74 68 72 6f  raight down thro
34d0: 75 67 68 2e 20 20 50 73 65 75 64 6f 2d 63 6f 64  ugh.  Pseudo-cod
34e0: 65 20 66 6f 6c 6c 6f 77 73 20 28 77 65 20 63 61  e follows (we ca
34f0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 74 68 65 20 22  ll this.** the "
3500: 31 73 74 20 74 65 6d 70 6c 61 74 65 22 29 3a 0a  1st template"):.
3510: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70  **.**         op
3520: 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  en write cursor 
3530: 74 6f 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69  to <table> and i
3540: 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20  ts indices.**   
3550: 20 20 20 20 20 20 70 75 74 20 56 41 4c 55 45 53        put VALUES
3560: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
3570: 6f 6e 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ons into registe
3580: 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 72  rs.**         wr
3590: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ite the resultin
35a0: 67 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 3c 74  g record into <t
35b0: 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20  able>.**        
35c0: 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 54   cleanup.**.** T
35d0: 68 65 20 74 68 72 65 65 20 72 65 6d 61 69 6e 69  he three remaini
35e0: 6e 67 20 74 65 6d 70 6c 61 74 65 73 20 61 73 73  ng templates ass
35f0: 75 6d 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ume the statemen
3600: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
3610: 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20  .**.**   INSERT 
3620: 49 4e 54 4f 20 3c 74 61 62 6c 65 3e 20 53 45 4c  INTO <table> SEL
3630: 45 43 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ECT ....**.** If
3640: 20 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61 75   the SELECT clau
3650: 73 65 20 69 73 20 6f 66 20 74 68 65 20 72 65 73  se is of the res
3660: 74 72 69 63 74 65 64 20 66 6f 72 6d 20 22 53 45  tricted form "SE
3670: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
3680: 6c 65 32 3e 22 20 2d 0a 2a 2a 20 69 6e 20 6f 74  le2>" -.** in ot
3690: 68 65 72 20 77 6f 72 64 73 20 69 66 20 74 68 65  her words if the
36a0: 20 53 45 4c 45 43 54 20 70 75 6c 6c 73 20 61 6c   SELECT pulls al
36b0: 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61  l columns from a
36c0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 0a 2a 2a   single table.**
36d0: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
36e0: 20 57 48 45 52 45 20 6f 72 20 4c 49 4d 49 54 20   WHERE or LIMIT 
36f0: 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 4f  or GROUP BY or O
3700: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2c  RDER BY clauses,
3710: 20 61 6e 64 0a 2a 2a 20 69 66 20 3c 74 61 62 6c   and.** if <tabl
3720: 65 32 3e 20 61 6e 64 20 3c 74 61 62 6c 65 31 3e  e2> and <table1>
3730: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 74 61   are distinct ta
3740: 62 6c 65 73 20 62 75 74 20 68 61 76 65 20 69 64  bles but have id
3750: 65 6e 74 69 63 61 6c 0a 2a 2a 20 73 63 68 65 6d  entical.** schem
3760: 61 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  as, including al
3770: 6c 20 74 68 65 20 73 61 6d 65 20 69 6e 64 69 63  l the same indic
3780: 65 73 2c 20 74 68 65 6e 20 61 20 73 70 65 63 69  es, then a speci
3790: 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  al optimization.
37a0: 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 68  ** is invoked th
37b0: 61 74 20 63 6f 70 69 65 73 20 72 61 77 20 72 65  at copies raw re
37c0: 63 6f 72 64 73 20 66 72 6f 6d 20 3c 74 61 62 6c  cords from <tabl
37d0: 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c 74 61 62  e2> over to <tab
37e0: 6c 65 31 3e 2e 0a 2a 2a 20 53 65 65 20 74 68 65  le1>..** See the
37f0: 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f   xferOptimizatio
3800: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  n() function for
3810: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
3820: 69 6f 6e 20 6f 66 20 74 68 69 73 0a 2a 2a 20 74  ion of this.** t
3830: 65 6d 70 6c 61 74 65 2e 20 20 54 68 69 73 20 69  emplate.  This i
3840: 73 20 74 68 65 20 32 6e 64 20 74 65 6d 70 6c 61  s the 2nd templa
3850: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  te..**.**       
3860: 20 20 6f 70 65 6e 20 61 20 77 72 69 74 65 20 63    open a write c
3870: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3880: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 65 6e  .**         open
3890: 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20   read cursor on 
38a0: 3c 74 61 62 6c 65 32 3e 0a 2a 2a 20 20 20 20 20  <table2>.**     
38b0: 20 20 20 20 74 72 61 6e 73 66 65 72 20 61 6c 6c      transfer all
38c0: 20 72 65 63 6f 72 64 73 20 69 6e 20 3c 74 61 62   records in <tab
38d0: 6c 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c 74 61  le2> over to <ta
38e0: 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble>.**         
38f0: 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a 2a  close cursors.**
3900: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
3910: 20 69 6e 64 65 78 20 6f 6e 20 3c 74 61 62 6c 65   index on <table
3920: 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f  >.**           o
3930: 70 65 6e 20 61 20 77 72 69 74 65 20 63 75 72 73  pen a write curs
3940: 6f 72 20 6f 6e 20 74 68 65 20 3c 74 61 62 6c 65  or on the <table
3950: 3e 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20  > index.**      
3960: 20 20 20 20 20 6f 70 65 6e 20 61 20 72 65 61 64       open a read
3970: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 63   cursor on the c
3980: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c 74 61  orresponding <ta
3990: 62 6c 65 32 3e 20 69 6e 64 65 78 0a 2a 2a 20 20  ble2> index.**  
39a0: 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65           transfe
39b0: 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 66 72  r all records fr
39c0: 6f 6d 20 74 68 65 20 72 65 61 64 20 74 6f 20 74  om the read to t
39d0: 68 65 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  he write cursors
39e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6c  .**           cl
39f0: 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20  ose cursors.**  
3a00: 20 20 20 20 20 20 20 65 6e 64 20 66 6f 72 65 61         end forea
3a10: 63 68 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 72 64  ch.**.** The 3rd
3a20: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 66 6f 72   template is for
3a30: 20 77 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   when the second
3a40: 20 74 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e   template does n
3a50: 6f 74 20 61 70 70 6c 79 0a 2a 2a 20 61 6e 64 20  ot apply.** and 
3a60: 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61 75 73  the SELECT claus
3a70: 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20  e does not read 
3a80: 66 72 6f 6d 20 3c 74 61 62 6c 65 3e 20 61 74 20  from <table> at 
3a90: 61 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 54 68 65  any time..** The
3aa0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
3ab0: 66 6f 6c 6c 6f 77 73 20 74 68 69 73 20 74 65 6d  follows this tem
3ac0: 70 6c 61 74 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  plate:.**.**    
3ad0: 20 20 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20       X <- A.**  
3ae0: 20 20 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a         goto B.**
3af0: 20 20 20 20 20 20 41 3a 20 73 65 74 75 70 20 66        A: setup f
3b00: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  or the SELECT.**
3b10: 20 20 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76           loop ov
3b20: 65 72 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  er the rows in t
3b30: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
3b40: 20 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75         load valu
3b50: 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  es into register
3b60: 73 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20  s R..R+n.**     
3b70: 20 20 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a        yield X.**
3b80: 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f           end loo
3b90: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65  p.**         cle
3ba0: 61 6e 75 70 20 61 66 74 65 72 20 74 68 65 20 53  anup after the S
3bb0: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
3bc0: 20 65 6e 64 2d 63 6f 72 6f 75 74 69 6e 65 20 58   end-coroutine X
3bd0: 0a 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e  .**      B: open
3be0: 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f   write cursor to
3bf0: 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73   <table> and its
3c00: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20   indices.**     
3c10: 20 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20   C: yield X, at 
3c20: 45 4f 46 20 67 6f 74 6f 20 44 0a 2a 2a 20 20 20  EOF goto D.**   
3c30: 20 20 20 20 20 20 69 6e 73 65 72 74 20 74 68 65        insert the
3c40: 20 73 65 6c 65 63 74 20 72 65 73 75 6c 74 20 69   select result i
3c50: 6e 74 6f 20 3c 74 61 62 6c 65 3e 20 66 72 6f 6d  nto <table> from
3c60: 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20   R..R+n.**      
3c70: 20 20 20 67 6f 74 6f 20 43 0a 2a 2a 20 20 20 20     goto C.**    
3c80: 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a    D: cleanup.**.
3c90: 2a 2a 20 54 68 65 20 34 74 68 20 74 65 6d 70 6c  ** The 4th templ
3ca0: 61 74 65 20 69 73 20 75 73 65 64 20 69 66 20 74  ate is used if t
3cb0: 68 65 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d  he insert statem
3cc0: 65 6e 74 20 74 61 6b 65 73 20 69 74 73 0a 2a 2a  ent takes its.**
3cd0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 61 20 53   values from a S
3ce0: 45 4c 45 43 54 20 62 75 74 20 74 68 65 20 64 61  ELECT but the da
3cf0: 74 61 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ta is being inse
3d00: 72 74 65 64 20 69 6e 74 6f 20 61 20 74 61 62 6c  rted into a tabl
3d10: 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 6c 73  e.** that is als
3d20: 6f 20 72 65 61 64 20 61 73 20 70 61 72 74 20 6f  o read as part o
3d30: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 20 20 49  f the SELECT.  I
3d40: 6e 20 74 68 65 20 74 68 69 72 64 20 66 6f 72 6d  n the third form
3d50: 2c 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  ,.** we have to 
3d60: 75 73 65 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  use an intermedi
3d70: 61 74 65 20 74 61 62 6c 65 20 74 6f 20 73 74 6f  ate table to sto
3d80: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
3d90: 66 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63 74 2e  f.** the select.
3da0: 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 69    The template i
3db0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
3dc0: 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c 2d 20  **         X <- 
3dd0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74  A.**         got
3de0: 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73  o B.**      A: s
3df0: 65 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c  etup for the SEL
3e00: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c  ECT.**         l
3e10: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
3e20: 6c 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  les in the SELEC
3e30: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c  T.**           l
3e40: 6f 61 64 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  oad value into r
3e50: 65 67 69 73 74 65 72 20 52 2e 2e 52 2b 6e 0a 2a  egister R..R+n.*
3e60: 2a 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  *           yiel
3e70: 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  d X.**         e
3e80: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
3e90: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
3ea0: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3eb0: 20 20 20 20 20 20 20 65 6e 64 20 63 6f 2d 72 6f         end co-ro
3ec0: 75 74 69 6e 65 20 52 0a 2a 2a 20 20 20 20 20 20  utine R.**      
3ed0: 42 3a 20 6f 70 65 6e 20 74 65 6d 70 20 74 61 62  B: open temp tab
3ee0: 6c 65 0a 2a 2a 20 20 20 20 20 20 4c 3a 20 79 69  le.**      L: yi
3ef0: 65 6c 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f  eld X, at EOF go
3f00: 74 6f 20 4d 0a 2a 2a 20 20 20 20 20 20 20 20 20  to M.**         
3f10: 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f 6d 20  insert row from 
3f20: 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65 6d 70  R..R+n into temp
3f30: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
3f40: 20 20 67 6f 74 6f 20 4c 0a 2a 2a 20 20 20 20 20    goto L.**     
3f50: 20 4d 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63   M: open write c
3f60: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3f70: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
3f80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 77 69  .**         rewi
3f90: 6e 64 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a  nd temp table.**
3fa0: 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20 6f 76        C: loop ov
3fb0: 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74 65 72  er rows of inter
3fc0: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a 2a 2a  mediate table.**
3fd0: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
3fe0: 66 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20  fer values form 
3ff0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62  intermediate tab
4000: 6c 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a  le into <table>.
4010: 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c  **         end l
4020: 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 44 3a 20 63  oop.**      D: c
4030: 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f 69 64 20 73  leanup.*/.void s
4040: 71 6c 69 74 65 33 49 6e 73 65 72 74 28 0a 20 20  qlite3Insert(.  
4050: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4060: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4070: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
4080: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
4090: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
40a0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
40b0: 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20  e are inserting 
40c0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
40d0: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20  lect,      /* A 
40e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
40f0: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64   to use as the d
4100: 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  ata source */.  
4110: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c  IdList *pColumn,
4120: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4130: 6e 61 6d 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  names correspond
4140: 69 6e 67 20 74 6f 20 49 44 4c 49 53 54 2e 20 2a  ing to IDLIST. *
4150: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
4160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
4170: 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74   to handle const
4180: 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a  raint errors */.
4190: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
41a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
41b0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
41c0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54  structure */.  T
41d0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
41e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
41f0: 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  e to insert into
4200: 2e 20 20 61 6b 61 20 54 41 42 4c 45 20 2a 2f 0a  .  aka TABLE */.
4210: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20    char *zTab;   
4220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4230: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
4240: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
4250: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  nserting */.  in
4260: 74 20 69 2c 20 6a 2c 20 69 64 78 3b 20 20 20 20  t i, j, idx;    
4270: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4280: 74 65 72 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ters */.  Vdbe *
4290: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
42a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
42b0: 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
42c0: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
42d0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
42e0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
42f0: 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65  ping over indice
4300: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  s of the table *
4310: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  /.  int nColumn;
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4330: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
4340: 6e 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  n the data */.  
4350: 69 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b  int nHidden = 0;
4360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4370: 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
4380: 73 20 69 66 20 54 41 42 4c 45 20 69 73 20 76 69  s if TABLE is vi
4390: 72 74 75 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  rtual */.  int i
43a0: 44 61 74 61 43 75 72 20 3d 20 30 3b 20 20 20 20  DataCur = 0;    
43b0: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
43c0: 74 68 61 74 20 69 73 20 74 68 65 20 6d 61 69 6e  that is the main
43d0: 20 64 61 74 61 20 72 65 70 6f 73 69 74 6f 72 79   data repository
43e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
43f0: 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 46  r = 0;      /* F
4400: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
4410: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 43 6f  r */.  int ipkCo
4420: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  lumn = -1;   /* 
4430: 43 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 74  Column that is t
4440: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
4450: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20  RY KEY */.  int 
4460: 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  endOfLoop;      
4470: 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
4480: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
4490: 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a  sertion loop */.
44a0: 20 20 69 6e 74 20 73 72 63 54 61 62 20 3d 20 30    int srcTab = 0
44b0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20  ;       /* Data 
44c0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 69 73 20  comes from this 
44d0: 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
44e0: 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74   if >=0 */.  int
44f0: 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 30 3b   addrInsTop = 0;
4500: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 6c 61     /* Jump to la
4510: 62 65 6c 20 22 44 22 20 2a 2f 0a 20 20 69 6e 74  bel "D" */.  int
4520: 20 61 64 64 72 43 6f 6e 74 20 3d 20 30 3b 20 20   addrCont = 0;  
4530: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 69 6e 73     /* Top of ins
4540: 65 72 74 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  ert loop. Label 
4550: 22 43 22 20 69 6e 20 74 65 6d 70 6c 61 74 65 73  "C" in templates
4560: 20 33 20 61 6e 64 20 34 20 2a 2f 0a 20 20 53 65   3 and 4 */.  Se
4570: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
4580: 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
4590: 6f 6e 20 66 6f 72 20 53 45 4c 45 43 54 20 6f 6e  on for SELECT on
45a0: 20 72 68 73 20 6f 66 20 49 4e 53 45 52 54 20 2a   rhs of INSERT *
45b0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
45c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
45d0: 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 68  ex of database h
45e0: 6f 6c 64 69 6e 67 20 54 41 42 4c 45 20 2a 2f 0a  olding TABLE */.
45f0: 20 20 75 38 20 75 73 65 54 65 6d 70 54 61 62 6c    u8 useTempTabl
4600: 65 20 3d 20 30 3b 20 20 2f 2a 20 53 74 6f 72 65  e = 0;  /* Store
4610: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
4620: 69 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  in intermediate 
4630: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 61 70  table */.  u8 ap
4640: 70 65 6e 64 46 6c 61 67 20 3d 20 30 3b 20 20 20  pendFlag = 0;   
4650: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4660: 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79  insert is likely
4670: 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64   to be an append
4680: 20 2a 2f 0a 20 20 75 38 20 77 69 74 68 6f 75 74   */.  u8 without
4690: 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 30  Rowid;      /* 0
46a0: 20 66 6f 72 20 6e 6f 72 6d 61 6c 20 74 61 62 6c   for normal tabl
46b0: 65 2e 20 20 31 20 66 6f 72 20 57 49 54 48 4f 55  e.  1 for WITHOU
46c0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 2a 2f  T ROWID table */
46d0: 0a 20 20 75 38 20 62 49 64 4c 69 73 74 49 6e 4f  .  u8 bIdListInO
46e0: 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65  rder;    /* True
46f0: 20 69 66 20 49 44 4c 49 53 54 20 69 73 20 69 6e   if IDLIST is in
4700: 20 74 61 62 6c 65 20 6f 72 64 65 72 20 2a 2f 0a   table order */.
4710: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4720: 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20  t = 0;  /* List 
4730: 6f 66 20 56 41 4c 55 45 53 28 29 20 74 6f 20 62  of VALUES() to b
4740: 65 20 69 6e 73 65 72 74 65 64 20 20 2a 2f 0a 0a  e inserted  */..
4750: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
4760: 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  locations */.  i
4770: 6e 74 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  nt regFromSelect
4780: 20 3d 20 30 3b 2f 2a 20 42 61 73 65 20 72 65 67   = 0;/* Base reg
4790: 69 73 74 65 72 20 66 6f 72 20 64 61 74 61 20 63  ister for data c
47a0: 6f 6d 69 6e 67 20 66 72 6f 6d 20 53 45 4c 45 43  oming from SELEC
47b0: 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75  T */.  int regAu
47c0: 74 6f 69 6e 63 20 3d 20 30 3b 20 20 20 2f 2a 20  toinc = 0;   /* 
47d0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
47e0: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
47f0: 4e 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  NT counter */.  
4800: 69 6e 74 20 72 65 67 52 6f 77 43 6f 75 6e 74 20  int regRowCount 
4810: 3d 20 30 3b 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  = 0;  /* Memory 
4820: 63 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 74 68  cell used for th
4830: 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f  e row counter */
4840: 0a 20 20 69 6e 74 20 72 65 67 49 6e 73 3b 20 20  .  int regIns;  
4850: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
4860: 6b 20 6f 66 20 72 65 67 73 20 68 6f 6c 64 69 6e  k of regs holdin
4870: 67 20 72 6f 77 69 64 2b 64 61 74 61 20 62 65 69  g rowid+data bei
4880: 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  ng inserted */. 
4890: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
48a0: 20 20 20 20 20 20 20 2f 2a 20 72 65 67 69 73 74         /* regist
48b0: 65 72 73 20 68 6f 6c 64 69 6e 67 20 69 6e 73 65  ers holding inse
48c0: 72 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  rt rowid */.  in
48d0: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
48e0: 20 20 20 20 2f 2a 20 72 65 67 69 73 74 65 72 20      /* register 
48f0: 68 6f 6c 64 69 6e 67 20 66 69 72 73 74 20 63 6f  holding first co
4900: 6c 75 6d 6e 20 74 6f 20 69 6e 73 65 72 74 20 2a  lumn to insert *
4910: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
4920: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4f 6e 65   = 0;     /* One
4930: 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
4940: 74 65 64 20 74 6f 20 65 61 63 68 20 69 6e 64 65  ted to each inde
4950: 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  x */..#ifndef SQ
4960: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4970: 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20  R.  int isView; 
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 2f 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d  /* True if attem
49a0: 70 74 69 6e 67 20 74 6f 20 69 6e 73 65 72 74 20  pting to insert 
49b0: 69 6e 74 6f 20 61 20 76 69 65 77 20 2a 2f 0a 20  into a view */. 
49c0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
49d0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
49e0: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
49f0: 20 6f 6e 20 70 54 61 62 2c 20 69 66 20 72 65 71   on pTab, if req
4a00: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  uired */.  int t
4a10: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
4a20: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4a30: 66 20 74 72 69 67 67 65 72 20 74 69 6d 65 73 20  f trigger times 
4a40: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  */.#endif..  db 
4a50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4a60: 6d 65 6d 73 65 74 28 26 64 65 73 74 2c 20 30 2c  memset(&dest, 0,
4a70: 20 73 69 7a 65 6f 66 28 64 65 73 74 29 29 3b 0a   sizeof(dest));.
4a80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
4a90: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
4aa0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
4ab0: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
4ac0: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  p;.  }..  /* If 
4ad0: 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
4ae0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
4af0: 20 61 20 73 69 6d 70 6c 65 20 56 41 4c 55 45 53   a simple VALUES
4b00: 28 29 20 6c 69 73 74 20 77 69 74 68 20 61 0a 20  () list with a. 
4b10: 20 2a 2a 20 73 69 6e 67 6c 65 20 72 6f 77 20 28   ** single row (
4b20: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 29  the common case)
4b30: 20 74 68 65 6e 20 6b 65 65 70 20 74 68 61 74 20   then keep that 
4b40: 6f 6e 65 20 72 6f 77 20 6f 66 20 76 61 6c 75 65  one row of value
4b50: 73 0a 20 20 2a 2a 20 61 6e 64 20 64 69 73 63 61  s.  ** and disca
4b60: 72 64 20 74 68 65 20 6f 74 68 65 72 20 28 75 6e  rd the other (un
4b70: 75 73 65 64 29 20 70 61 72 74 73 20 6f 66 20 74  used) parts of t
4b80: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
4b90: 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  t.  */.  if( pSe
4ba0: 6c 65 63 74 20 26 26 20 28 70 53 65 6c 65 63 74  lect && (pSelect
4bb0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
4bc0: 56 61 6c 75 65 73 29 21 3d 30 20 26 26 20 70 53  Values)!=0 && pS
4bd0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3d 3d 30  elect->pPrior==0
4be0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
4bf0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
4c00: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45  .    pSelect->pE
4c10: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  List = 0;.    sq
4c20: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4c30: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
4c40: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b      pSelect = 0;
4c50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
4c60: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  e the table into
4c70: 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 62   which we will b
4c80: 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
4c90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
4ca0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
4cb0: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  List->nSrc==1 );
4cc0: 0a 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69  .  zTab = pTabLi
4cd0: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[0].zName;.
4ce0: 20 20 69 66 28 20 4e 45 56 45 52 28 7a 54 61 62    if( NEVER(zTab
4cf0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 69 6e 73 65  ==0) ) goto inse
4d00: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54  rt_cleanup;.  pT
4d10: 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
4d20: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
4d30: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69  , pTabList);.  i
4d40: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
4d50: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
4d60: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62  eanup;.  }.  iDb
4d70: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
4d80: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
4d90: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
4da0: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
4db0: 62 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  b );.  if( sqlit
4dc0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
4dd0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
4de0: 54 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  T, pTab->zName, 
4df0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
4e00: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
4e10: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29  b[iDb].zDbSName)
4e20: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   ){.    goto ins
4e30: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ert_cleanup;.  }
4e40: 0a 20 20 77 69 74 68 6f 75 74 52 6f 77 69 64 20  .  withoutRowid 
4e50: 3d 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  = !HasRowid(pTab
4e60: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
4e70: 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20 61  out if we have a
4e80: 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64 20  ny triggers and 
4e90: 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  if the table bei
4ea0: 6e 67 0a 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  ng.  ** inserted
4eb0: 20 69 6e 74 6f 20 69 73 20 61 20 76 69 65 77 0a   into is a view.
4ec0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
4ed0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
4ee0: 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
4ef0: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
4f00: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  st(pParse, pTab,
4f10: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 26   TK_INSERT, 0, &
4f20: 74 6d 61 73 6b 29 3b 0a 20 20 69 73 56 69 65 77  tmask);.  isView
4f30: 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74   = pTab->pSelect
4f40: 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0;.#else.# def
4f50: 69 6e 65 20 70 54 72 69 67 67 65 72 20 30 0a 23  ine pTrigger 0.#
4f60: 20 64 65 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a   define tmask 0.
4f70: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
4f80: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
4f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
4fa0: 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77 0a  .# undef isView.
4fb0: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
4fc0: 30 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  0.#endif.  asser
4fd0: 74 28 20 28 70 54 72 69 67 67 65 72 20 26 26 20  t( (pTrigger && 
4fe0: 74 6d 61 73 6b 29 20 7c 7c 20 28 70 54 72 69 67  tmask) || (pTrig
4ff0: 67 65 72 3d 3d 30 20 26 26 20 74 6d 61 73 6b 3d  ger==0 && tmask=
5000: 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
5010: 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79 20 61  pTab is really a
5020: 20 76 69 65 77 2c 20 6d 61 6b 65 20 73 75 72 65   view, make sure
5030: 20 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 69   it has been ini
5040: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 56  tialized..  ** V
5050: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
5060: 73 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  s() is a no-op i
5070: 66 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20  f pTab is not a 
5080: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  view..  */.  if(
5090: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
50a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
50b0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
50c0: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
50d0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nup;.  }..  /* C
50e0: 61 6e 6e 6f 74 20 69 6e 73 65 72 74 20 69 6e 74  annot insert int
50f0: 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 61  o a read-only ta
5100: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
5110: 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c  sqlite3IsReadOnl
5120: 79 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  y(pParse, pTab, 
5130: 74 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 67 6f  tmask) ){.    go
5140: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
5150: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  p;.  }..  /* All
5160: 6f 63 61 74 65 20 61 20 56 44 42 45 0a 20 20 2a  ocate a VDBE.  *
5170: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
5180: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
5190: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
51a0: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
51b0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
51c0: 6e 65 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69  nested==0 ) sqli
51d0: 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
51e0: 67 65 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ges(v);.  sqlite
51f0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
5200: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 53 65  tion(pParse, pSe
5210: 6c 65 63 74 20 7c 7c 20 70 54 72 69 67 67 65 72  lect || pTrigger
5220: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
5230: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45   SQLITE_OMIT_XFE
5240: 52 5f 4f 50 54 0a 20 20 2f 2a 20 49 66 20 74 68  R_OPT.  /* If th
5250: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
5260: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 0a  f the form.  **.
5270: 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 53 45 52    **       INSER
5280: 54 20 49 4e 54 4f 20 3c 74 61 62 6c 65 31 3e 20  T INTO <table1> 
5290: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
52a0: 61 62 6c 65 32 3e 3b 0a 20 20 2a 2a 0a 20 20 2a  able2>;.  **.  *
52b0: 2a 20 54 68 65 6e 20 73 70 65 63 69 61 6c 20 6f  * Then special o
52c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
52d0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 68 61 74   be applied that
52e0: 20 6d 61 6b 65 20 74 68 65 20 74 72 61 6e 73 66   make the transf
52f0: 65 72 0a 20 20 2a 2a 20 76 65 72 79 20 66 61 73  er.  ** very fas
5300: 74 20 61 6e 64 20 77 68 69 63 68 20 72 65 64 75  t and which redu
5310: 63 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  ce fragmentation
5320: 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a   of indices..  *
5330: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 74  *.  ** This is t
5340: 68 65 20 32 6e 64 20 74 65 6d 70 6c 61 74 65 2e  he 2nd template.
5350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
5360: 75 6d 6e 3d 3d 30 20 26 26 20 78 66 65 72 4f 70  umn==0 && xferOp
5370: 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73  timization(pPars
5380: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
5390: 2c 20 6f 6e 45 72 72 6f 72 2c 20 69 44 62 29 20  , onError, iDb) 
53a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
53b0: 70 54 72 69 67 67 65 72 20 29 3b 0a 20 20 20 20  pTrigger );.    
53c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
53d0: 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   );.    goto ins
53e0: 65 72 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ert_end;.  }.#en
53f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5400: 49 54 5f 58 46 45 52 5f 4f 50 54 20 2a 2f 0a 0a  IT_XFER_OPT */..
5410: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5420: 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  an AUTOINCREMENT
5430: 20 74 61 62 6c 65 2c 20 6c 6f 6f 6b 20 75 70 20   table, look up 
5440: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  the sequence num
5450: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
5460: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
5470: 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 20  table and store 
5480: 69 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  it in memory cel
5490: 6c 20 72 65 67 41 75 74 6f 69 6e 63 2e 0a 20 20  l regAutoinc..  
54a0: 2a 2f 0a 20 20 72 65 67 41 75 74 6f 69 6e 63 20  */.  regAutoinc 
54b0: 3d 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 70  = autoIncBegin(p
54c0: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
54d0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
54e0: 65 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  e registers for 
54f0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 6f 77 69  holding the rowi
5500: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
5510: 2c 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ,.  ** the conte
5520: 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  nt of the new ro
5530: 77 2c 20 61 6e 64 20 74 68 65 20 61 73 73 65 6d  w, and the assem
5540: 62 6c 65 64 20 72 6f 77 20 72 65 63 6f 72 64 2e  bled row record.
5550: 0a 20 20 2a 2f 0a 20 20 72 65 67 52 6f 77 69 64  .  */.  regRowid
5560: 20 3d 20 72 65 67 49 6e 73 20 3d 20 70 50 61 72   = regIns = pPar
5570: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
5580: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54  arse->nMem += pT
5590: 61 62 2d 3e 6e 43 6f 6c 20 2b 20 31 3b 0a 20 20  ab->nCol + 1;.  
55a0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
55b0: 61 62 29 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ab) ){.    regRo
55c0: 77 69 64 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  wid++;.    pPars
55d0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 7d 0a 20  e->nMem++;.  }. 
55e0: 20 72 65 67 44 61 74 61 20 3d 20 72 65 67 52 6f   regData = regRo
55f0: 77 69 64 2b 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  wid+1;..  /* If 
5600: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
5610: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 64 20 61 6e  ment included an
5620: 20 49 44 4c 49 53 54 20 74 65 72 6d 2c 20 74 68   IDLIST term, th
5630: 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 20 20 2a  en make sure.  *
5640: 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f  * all elements o
5650: 66 20 74 68 65 20 49 44 4c 49 53 54 20 72 65 61  f the IDLIST rea
5660: 6c 6c 79 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  lly are columns 
5670: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
5680: 20 0a 20 20 2a 2a 20 72 65 6d 65 6d 62 65 72 20   .  ** remember 
5690: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
56a0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  es..  **.  ** If
56b0: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
56c0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
56d0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 6e 64  Y KEY column and
56e0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0a 20 20 2a   that column.  *
56f0: 2a 20 69 73 20 6e 61 6d 65 64 20 69 6e 20 74 68  * is named in th
5700: 65 20 49 44 4c 49 53 54 2c 20 74 68 65 6e 20 72  e IDLIST, then r
5710: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 69 70 6b  ecord in the ipk
5720: 43 6f 6c 75 6d 6e 20 76 61 72 69 61 62 6c 65 0a  Column variable.
5730: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
5740: 6e 74 6f 20 49 44 4c 49 53 54 20 6f 66 20 74 68  nto IDLIST of th
5750: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  e primary key co
5760: 6c 75 6d 6e 2e 20 20 69 70 6b 43 6f 6c 75 6d 6e  lumn.  ipkColumn
5770: 20 69 73 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   is.  ** the ind
5780: 65 78 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  ex of the primar
5790: 79 20 6b 65 79 20 61 73 20 69 74 20 61 70 70 65  y key as it appe
57a0: 61 72 73 20 69 6e 20 49 44 4c 49 53 54 2c 20 6e  ars in IDLIST, n
57b0: 6f 74 20 61 73 0a 20 20 2a 2a 20 69 73 20 61 70  ot as.  ** is ap
57c0: 70 65 61 72 73 20 69 6e 20 74 68 65 20 6f 72 69  pears in the ori
57d0: 67 69 6e 61 6c 20 74 61 62 6c 65 2e 20 20 28 54  ginal table.  (T
57e0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
57f0: 49 4e 54 45 47 45 52 0a 20 20 2a 2a 20 50 52 49  INTEGER.  ** PRI
5800: 4d 41 52 59 20 4b 45 59 20 69 6e 20 74 68 65 20  MARY KEY in the 
5810: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 69  original table i
5820: 73 20 70 54 61 62 2d 3e 69 50 4b 65 79 2e 29 0a  s pTab->iPKey.).
5830: 20 20 2a 2f 0a 20 20 62 49 64 4c 69 73 74 49 6e    */.  bIdListIn
5840: 4f 72 64 65 72 20 3d 20 28 70 54 61 62 2d 3e 74  Order = (pTab->t
5850: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 4f 4f 4f  abFlags & TF_OOO
5860: 48 69 64 64 65 6e 29 3d 3d 30 3b 0a 20 20 69 66  Hidden)==0;.  if
5870: 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ( pColumn ){.   
5880: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
5890: 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  umn->nId; i++){.
58a0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61        pColumn->a
58b0: 5b 69 5d 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20  [i].idx = -1;.  
58c0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
58d0: 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   i<pColumn->nId;
58e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
58f0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
5900: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
5910: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5920: 49 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b  ICmp(pColumn->a[
5930: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
5940: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
5950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
5960: 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78  Column->a[i].idx
5970: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
5980: 69 66 28 20 69 21 3d 6a 20 29 20 62 49 64 4c 69  if( i!=j ) bIdLi
5990: 73 74 49 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20  stInOrder = 0;. 
59a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
59b0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
59c0: 20 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f             ipkCo
59d0: 6c 75 6d 6e 20 3d 20 69 3b 20 20 61 73 73 65 72  lumn = i;  asser
59e0: 74 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64  t( !withoutRowid
59f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
5a00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5a10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
5a30: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
5a40: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a50: 33 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e  3IsRowid(pColumn
5a60: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26  ->a[i].zName) &&
5a70: 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29   !withoutRowid )
5a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 70 6b 43  {.          ipkC
5a90: 6f 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20  olumn = i;.     
5aa0: 20 20 20 20 20 62 49 64 4c 69 73 74 49 6e 4f 72       bIdListInOr
5ab0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  der = 0;.       
5ac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ad0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5ae0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
5af0: 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %S has no colum
5b00: 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
5b10: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
5b20: 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d  ist, 0, pColumn-
5b30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
5b40: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5b50: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
5b60: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
5b70: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
5b80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
5ba0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
5bb0: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66   many columns of
5bc0: 20 64 61 74 61 20 61 72 65 20 73 75 70 70 6c 69   data are suppli
5bd0: 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
5be0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20  .  ** is coming 
5bf0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
5c00: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65  atement, then ge
5c10: 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
5c20: 69 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 70 72  ine that.  ** pr
5c30: 6f 64 75 63 65 73 20 61 20 73 69 6e 67 6c 65 20  oduces a single 
5c40: 72 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43  row of the SELEC
5c50: 54 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  T on each invoca
5c60: 74 69 6f 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20  tion.  The.  ** 
5c70: 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 74 68  co-routine is th
5c80: 65 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20  e common header 
5c90: 74 6f 20 74 68 65 20 33 72 64 20 61 6e 64 20 34  to the 3rd and 4
5ca0: 74 68 20 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20  th templates..  
5cb0: 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
5cc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 61 74 61 20   ){.    /* Data 
5cd0: 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61  is coming from a
5ce0: 20 53 45 4c 45 43 54 20 6f 72 20 66 72 6f 6d 20   SELECT or from 
5cf0: 61 20 6d 75 6c 74 69 2d 72 6f 77 20 56 41 4c 55  a multi-row VALU
5d00: 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  ES clause..    *
5d10: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d  * Generate a co-
5d20: 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 74  routine to run t
5d30: 68 65 20 53 45 4c 45 43 54 2e 20 2a 2f 0a 20 20  he SELECT. */.  
5d40: 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20    int regYield; 
5d50: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
5d60: 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75  r holding co-rou
5d70: 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74  tine entry-point
5d80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5d90: 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
5da0: 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
5db0: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tine */.    int 
5dc0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5dd0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
5de0: 2f 0a 0a 20 20 20 20 72 65 67 59 69 65 6c 64 20  /..    regYield 
5df0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e00: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
5e10: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5e20: 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
5e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e40: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
5e50: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
5e60: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
5e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
5e80: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
5e90: 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
5ea0: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
5eb0: 64 65 73 74 2e 69 53 64 73 74 20 3d 20 62 49 64  dest.iSdst = bId
5ec0: 4c 69 73 74 49 6e 4f 72 64 65 72 20 3f 20 72 65  ListInOrder ? re
5ed0: 67 44 61 74 61 20 3a 20 30 3b 0a 20 20 20 20 64  gData : 0;.    d
5ee0: 65 73 74 2e 6e 53 64 73 74 20 3d 20 70 54 61 62  est.nSdst = pTab
5ef0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 72 63 20 3d  ->nCol;.    rc =
5f00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
5f10: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
5f20: 26 64 65 73 74 29 3b 0a 20 20 20 20 72 65 67 46  &dest);.    regF
5f30: 72 6f 6d 53 65 6c 65 63 74 20 3d 20 64 65 73 74  romSelect = dest
5f40: 2e 69 53 64 73 74 3b 0a 20 20 20 20 69 66 28 20  .iSdst;.    if( 
5f50: 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
5f60: 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
5f70: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 69 6e  ->nErr ) goto in
5f80: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
5f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
5fa0: 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
5fb0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 73 71 6c 69  Yield);.    sqli
5fc0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5fd0: 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b  v, addrTop - 1);
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 2f 2a 20 6c 61 62 65 6c 20         /* label 
6000: 42 3a 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  B: */.    assert
6010: 28 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ( pSelect->pELis
6020: 74 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  t );.    nColumn
6030: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
6040: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
6050: 2f 2a 20 53 65 74 20 75 73 65 54 65 6d 70 54 61  /* Set useTempTa
6060: 62 6c 65 20 74 6f 20 54 52 55 45 20 69 66 20 74  ble to TRUE if t
6070: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
6080: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6090: 74 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  t.    ** should 
60a0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
60b0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
60c0: 65 20 28 74 65 6d 70 6c 61 74 65 20 34 29 2e 20  e (template 4). 
60d0: 20 53 65 74 20 74 6f 0a 20 20 20 20 2a 2a 20 46   Set to.    ** F
60e0: 41 4c 53 45 20 69 66 20 65 61 63 68 20 6f 75 74  ALSE if each out
60f0: 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 53  put row of the S
6100: 45 4c 45 43 54 20 63 61 6e 20 62 65 20 77 72 69  ELECT can be wri
6110: 74 74 65 6e 20 64 69 72 65 63 74 6c 79 20 69 6e  tten directly in
6120: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 65  to.    ** the de
6130: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
6140: 28 74 65 6d 70 6c 61 74 65 20 33 29 2e 0a 20 20  (template 3)..  
6150: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 74 65    **.    ** A te
6160: 6d 70 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  mp table must be
6170: 20 75 73 65 64 20 69 66 20 74 68 65 20 74 61 62   used if the tab
6180: 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  le being updated
6190: 20 69 73 20 61 6c 73 6f 20 6f 6e 65 0a 20 20 20   is also one.   
61a0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
61b0: 73 20 62 65 69 6e 67 20 72 65 61 64 20 62 79 20  s being read by 
61c0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
61d0: 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 75 73 65 20  ment.  Also use 
61e0: 61 20 0a 20 20 20 20 2a 2a 20 74 65 6d 70 20 74  a .    ** temp t
61f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 63 61 73 65  able in the case
6200: 20 6f 66 20 72 6f 77 20 74 72 69 67 67 65 72 73   of row triggers
6210: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6220: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 72 65 61   pTrigger || rea
6230: 64 73 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  dsTable(pParse, 
6240: 69 44 62 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  iDb, pTab) ){.  
6250: 20 20 20 20 75 73 65 54 65 6d 70 54 61 62 6c 65      useTempTable
6260: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
6270: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
6280: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  e ){.      /* In
6290: 76 6f 6b 65 20 74 68 65 20 63 6f 72 6f 75 74 69  voke the corouti
62a0: 6e 65 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ne to extract in
62b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
62c0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
62d0: 2a 2a 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ** and add it to
62e0: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
62f0: 6c 65 20 73 72 63 54 61 62 2e 20 20 54 68 65 20  le srcTab.  The 
6300: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 20  code generated. 
6310: 20 20 20 20 20 2a 2a 20 68 65 72 65 20 69 73 20       ** here is 
6320: 66 72 6f 6d 20 74 68 65 20 34 74 68 20 74 65 6d  from the 4th tem
6330: 70 6c 61 74 65 3a 0a 20 20 20 20 20 20 2a 2a 0a  plate:.      **.
6340: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 42 3a        **      B:
6350: 20 6f 70 65 6e 20 74 65 6d 70 20 74 61 62 6c 65   open temp table
6360: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 4c  .      **      L
6370: 3a 20 79 69 65 6c 64 20 58 2c 20 67 6f 74 6f 20  : yield X, goto 
6380: 4d 20 61 74 20 45 4f 46 0a 20 20 20 20 20 20 2a  M at EOF.      *
6390: 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74  *         insert
63a0: 20 72 6f 77 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e   row from R..R+n
63b0: 20 69 6e 74 6f 20 74 65 6d 70 20 74 61 62 6c 65   into temp table
63c0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
63d0: 20 20 67 6f 74 6f 20 4c 0a 20 20 20 20 20 20 2a    goto L.      *
63e0: 2a 20 20 20 20 20 20 4d 3a 20 2e 2e 2e 0a 20 20  *      M: ....  
63f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
6400: 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
6410: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
6420: 20 68 6f 6c 64 20 70 61 63 6b 65 64 20 72 65 63   hold packed rec
6430: 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ord */.      int
6440: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 3b 20 20   regTempRowid;  
6450: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
6460: 20 68 6f 6c 64 20 74 65 6d 70 20 74 61 62 6c 65   hold temp table
6470: 20 52 4f 57 49 44 20 2a 2f 0a 20 20 20 20 20 20   ROWID */.      
6480: 69 6e 74 20 61 64 64 72 4c 3b 20 20 20 20 20 20  int addrL;      
6490: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 22 4c       /* Label "L
64a0: 22 20 2a 2f 0a 0a 20 20 20 20 20 20 73 72 63 54  " */..      srcT
64b0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
64c0: 62 2b 2b 3b 0a 20 20 20 20 20 20 72 65 67 52 65  b++;.      regRe
64d0: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
64e0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
64f0: 20 20 20 20 20 72 65 67 54 65 6d 70 52 6f 77 69       regTempRowi
6500: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6510: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6530: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6540: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 72 63 54  nEphemeral, srcT
6550: 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ab, nColumn);.  
6560: 20 20 20 20 61 64 64 72 4c 20 3d 20 73 71 6c 69      addrL = sqli
6570: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6580: 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
6590: 69 53 44 50 61 72 6d 29 3b 20 56 64 62 65 43 6f  iSDParm); VdbeCo
65a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
65b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
65c0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
65d0: 6f 72 64 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65  ord, regFromSele
65e0: 63 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ct, nColumn, reg
65f0: 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
6600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6610: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 73 72   OP_NewRowid, sr
6620: 63 54 61 62 2c 20 72 65 67 54 65 6d 70 52 6f 77  cTab, regTempRow
6630: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6640: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6650: 4f 50 5f 49 6e 73 65 72 74 2c 20 73 72 63 54 61  OP_Insert, srcTa
6660: 62 2c 20 72 65 67 52 65 63 2c 20 72 65 67 54 65  b, regRec, regTe
6670: 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  mpRowid);.      
6680: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
6690: 76 2c 20 61 64 64 72 4c 29 3b 0a 20 20 20 20 20  v, addrL);.     
66a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
66b0: 48 65 72 65 28 76 2c 20 61 64 64 72 4c 29 3b 0a  Here(v, addrL);.
66c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
66d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
66e0: 73 65 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20  se, regRec);.   
66f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6700: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6710: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a   regTempRowid);.
6720: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6730: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
6740: 65 20 63 61 73 65 20 69 66 20 74 68 65 20 64 61  e case if the da
6750: 74 61 20 66 6f 72 20 74 68 65 20 49 4e 53 45 52  ta for the INSER
6760: 54 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d  T is coming from
6770: 20 61 20 0a 20 20 20 20 2a 2a 20 73 69 6e 67 6c   a .    ** singl
6780: 65 2d 72 6f 77 20 56 41 4c 55 45 53 20 63 6c 61  e-row VALUES cla
6790: 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 4e  use.    */.    N
67a0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
67b0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
67c0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
67d0: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
67e0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
67f0: 72 63 54 61 62 20 3d 20 2d 31 3b 0a 20 20 20 20  rcTab = -1;.    
6800: 61 73 73 65 72 74 28 20 75 73 65 54 65 6d 70 54  assert( useTempT
6810: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  able==0 );.    i
6820: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6830: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73    nColumn = pLis
6840: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
6850: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
6860: 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28  veExprListNames(
6870: 26 73 4e 43 2c 20 70 4c 69 73 74 29 20 29 7b 0a  &sNC, pList) ){.
6880: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 73          goto ins
6890: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ert_cleanup;.   
68a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
68b0: 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
68c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
68d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
68e0: 6f 20 49 44 4c 49 53 54 20 74 65 72 6d 20 62 75  o IDLIST term bu
68f0: 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
6900: 61 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  an integer prima
6910: 72 79 0a 20 20 2a 2a 20 6b 65 79 2c 20 74 68 65  ry.  ** key, the
6920: 20 73 65 74 20 74 68 65 20 69 70 6b 43 6f 6c 75   set the ipkColu
6930: 6d 6e 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  mn variable to t
6940: 68 65 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  he integer prima
6950: 72 79 20 6b 65 79 20 0a 20 20 2a 2a 20 63 6f 6c  ry key .  ** col
6960: 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 74 68 65  umn index in the
6970: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6980: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f  definition..  */
6990: 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d  .  if( pColumn==
69a0: 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29  0 && nColumn>0 )
69b0: 7b 0a 20 20 20 20 69 70 6b 43 6f 6c 75 6d 6e 20  {.    ipkColumn 
69c0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
69d0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
69e0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
69f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
6a00: 73 6f 75 72 63 65 20 64 61 74 61 20 6d 61 74 63  source data matc
6a10: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  hes the number. 
6a20: 20 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74   ** of columns t
6a30: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  o be inserted in
6a40: 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  to the table..  
6a50: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
6a60: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
6a70: 7b 0a 20 20 20 20 6e 48 69 64 64 65 6e 20 2b 3d  {.    nHidden +=
6a80: 20 28 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e   (IsHiddenColumn
6a90: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29  (&pTab->aCol[i])
6aa0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 7d 0a 20   ? 1 : 0);.  }. 
6ab0: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20   if( pColumn==0 
6ac0: 26 26 20 6e 43 6f 6c 75 6d 6e 20 26 26 20 6e 43  && nColumn && nC
6ad0: 6f 6c 75 6d 6e 21 3d 28 70 54 61 62 2d 3e 6e 43  olumn!=(pTab->nC
6ae0: 6f 6c 2d 6e 48 69 64 64 65 6e 29 20 29 7b 0a 20  ol-nHidden) ){. 
6af0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6b00: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
6b10: 20 20 20 22 74 61 62 6c 65 20 25 53 20 68 61 73     "table %S has
6b20: 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
6b30: 25 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 73  %d values were s
6b40: 75 70 70 6c 69 65 64 22 2c 0a 20 20 20 20 20 20  upplied",.      
6b50: 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 54   pTabList, 0, pT
6b60: 61 62 2d 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e  ab->nCol-nHidden
6b70: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6b80: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
6b90: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nup;.  }.  if( p
6ba0: 43 6f 6c 75 6d 6e 21 3d 30 20 26 26 20 6e 43 6f  Column!=0 && nCo
6bb0: 6c 75 6d 6e 21 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e  lumn!=pColumn->n
6bc0: 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Id ){.    sqlite
6bd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6be0: 2c 20 22 25 64 20 76 61 6c 75 65 73 20 66 6f 72  , "%d values for
6bf0: 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 20 6e 43   %d columns", nC
6c00: 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 75 6d 6e 2d 3e  olumn, pColumn->
6c10: 6e 49 64 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69  nId);.    goto i
6c20: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
6c30: 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 49 6e 69   }.    .  /* Ini
6c40: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
6c50: 74 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20  t of rows to be 
6c60: 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20  inserted.  */.  
6c70: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
6c80: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
6c90: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 43 6f   ){.    regRowCo
6ca0: 75 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  unt = ++pParse->
6cb0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
6cc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6cd0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
6ce0: 67 52 6f 77 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a  gRowCount);.  }.
6cf0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6d00: 20 6e 6f 74 20 61 20 76 69 65 77 2c 20 6f 70 65   not a view, ope
6d10: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  n the table and 
6d20: 61 6e 64 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  and all indices 
6d30: 2a 2f 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  */.  if( !isView
6d40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64 78   ){.    int nIdx
6d50: 3b 0a 20 20 20 20 6e 49 64 78 20 3d 20 73 71 6c  ;.    nIdx = sql
6d60: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64  ite3OpenTableAnd
6d70: 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c 20  Indices(pParse, 
6d80: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  pTab, OP_OpenWri
6d90: 74 65 2c 20 30 2c 20 2d 31 2c 20 30 2c 0a 20 20  te, 0, -1, 0,.  
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 26 69 44 61 74 61 43 75 72 2c 20 26      &iDataCur, &
6dd0: 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 61 52  iIdxCur);.    aR
6de0: 65 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 44  egIdx = sqlite3D
6df0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
6e00: 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 49   sizeof(int)*(nI
6e10: 64 78 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20  dx+1));.    if( 
6e20: 61 52 65 67 49 64 78 3d 3d 30 20 29 7b 0a 20 20  aRegIdx==0 ){.  
6e30: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
6e40: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
6e50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49     for(i=0; i<nI
6e60: 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  dx; i++){.      
6e70: 61 52 65 67 49 64 78 5b 69 5d 20 3d 20 2b 2b 70  aRegIdx[i] = ++p
6e80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6e90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69   }.  }..  /* Thi
6ea0: 73 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66 20  s is the top of 
6eb0: 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72 74 69  the main inserti
6ec0: 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 66 28  on loop */.  if(
6ed0: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b   useTempTable ){
6ee0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
6ef0: 63 6b 20 63 6f 64 65 73 20 74 68 65 20 74 6f 70  ck codes the top
6f00: 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20   of loop only.  
6f10: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f  The complete loo
6f20: 70 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  p is the.    ** 
6f30: 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64 6f  following pseudo
6f40: 63 6f 64 65 20 28 74 65 6d 70 6c 61 74 65 20 34  code (template 4
6f50: 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ):.    **.    **
6f60: 20 20 20 20 20 20 20 20 20 72 65 77 69 6e 64 20           rewind 
6f70: 74 65 6d 70 20 74 61 62 6c 65 2c 20 69 66 20 65  temp table, if e
6f80: 6d 70 74 79 20 67 6f 74 6f 20 44 0a 20 20 20 20  mpty goto D.    
6f90: 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20  **      C: loop 
6fa0: 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74  over rows of int
6fb0: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a  ermediate table.
6fc0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
6fd0: 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73   transfer values
6fe0: 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61   form intermedia
6ff0: 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74  te table into <t
7000: 61 62 6c 65 3e 0a 20 20 20 20 2a 2a 20 20 20 20  able>.    **    
7010: 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 20 20       end loop.  
7020: 20 20 2a 2a 20 20 20 20 20 20 44 3a 20 2e 2e 2e    **      D: ...
7030: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72  .    */.    addr
7040: 49 6e 73 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  InsTop = sqlite3
7050: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
7060: 5f 52 65 77 69 6e 64 2c 20 73 72 63 54 61 62 29  _Rewind, srcTab)
7070: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
7080: 29 3b 0a 20 20 20 20 61 64 64 72 43 6f 6e 74 20  );.    addrCont 
7090: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
70a0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
70b0: 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63 74  else if( pSelect
70c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
70d0: 62 6c 6f 63 6b 20 63 6f 64 65 73 20 74 68 65 20  block codes the 
70e0: 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79  top of loop only
70f0: 2e 20 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  .  The complete 
7100: 6c 6f 6f 70 20 69 73 20 74 68 65 0a 20 20 20 20  loop is the.    
7110: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65  ** following pse
7120: 75 64 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61 74  udocode (templat
7130: 65 20 33 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e 3):.    **.   
7140: 20 2a 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c   **      C: yiel
7150: 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f  d X, at EOF goto
7160: 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   D.    **       
7170: 20 20 69 6e 73 65 72 74 20 74 68 65 20 73 65 6c    insert the sel
7180: 65 63 74 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  ect result into 
7190: 3c 74 61 62 6c 65 3e 20 66 72 6f 6d 20 52 2e 2e  <table> from R..
71a0: 52 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  R+n.    **      
71b0: 20 20 20 67 6f 74 6f 20 43 0a 20 20 20 20 2a 2a     goto C.    **
71c0: 20 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20        D: ....   
71d0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 49 6e 73 54   */.    addrInsT
71e0: 6f 70 20 3d 20 61 64 64 72 43 6f 6e 74 20 3d 20  op = addrCont = 
71f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7200: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64  1(v, OP_Yield, d
7210: 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
7220: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7230: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 75 6e  );.  }..  /* Run
7240: 20 74 68 65 20 42 45 46 4f 52 45 20 61 6e 64 20   the BEFORE and 
7250: 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67  INSTEAD OF trigg
7260: 65 72 73 2c 20 69 66 20 74 68 65 72 65 20 61 72  ers, if there ar
7270: 65 20 61 6e 79 0a 20 20 2a 2f 0a 20 20 65 6e 64  e any.  */.  end
7280: 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
7290: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
72a0: 3b 0a 20 20 69 66 28 20 74 6d 61 73 6b 20 26 20  ;.  if( tmask & 
72b0: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 29  TRIGGER_BEFORE )
72c0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c  {.    int regCol
72d0: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  s = sqlite3GetTe
72e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
72f0: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 0a  pTab->nCol+1);..
7300: 20 20 20 20 2f 2a 20 62 75 69 6c 64 20 74 68 65      /* build the
7310: 20 4e 45 57 2e 2a 20 72 65 66 65 72 65 6e 63 65   NEW.* reference
7320: 20 72 6f 77 2e 20 20 4e 6f 74 65 20 74 68 61 74   row.  Note that
7330: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
7340: 49 4e 54 45 47 45 52 0a 20 20 20 20 2a 2a 20 50  INTEGER.    ** P
7350: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 74 6f 20  RIMARY KEY into 
7360: 77 68 69 63 68 20 61 20 4e 55 4c 4c 20 69 73 20  which a NULL is 
7370: 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 2c 20  being inserted, 
7380: 74 68 61 74 20 4e 55 4c 4c 20 77 69 6c 6c 20 62  that NULL will b
7390: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61  e.    ** transla
73a0: 74 65 64 20 69 6e 74 6f 20 61 20 75 6e 69 71 75  ted into a uniqu
73b0: 65 20 49 44 20 66 6f 72 20 74 68 65 20 72 6f 77  e ID for the row
73c0: 2e 20 20 42 75 74 20 6f 6e 20 61 20 42 45 46 4f  .  But on a BEFO
73d0: 52 45 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20  RE trigger,.    
73e0: 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ** we do not kno
73f0: 77 20 77 68 61 74 20 74 68 65 20 75 6e 69 71 75  w what the uniqu
7400: 65 20 49 44 20 77 69 6c 6c 20 62 65 20 28 62 65  e ID will be (be
7410: 63 61 75 73 65 20 74 68 65 20 69 6e 73 65 72 74  cause the insert
7420: 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
7430: 68 61 70 70 65 6e 65 64 20 79 65 74 29 20 73 6f  happened yet) so
7440: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61   we substitute a
7450: 20 72 6f 77 69 64 20 6f 66 20 2d 31 0a 20 20 20   rowid of -1.   
7460: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 70 6b 43   */.    if( ipkC
7470: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
7480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7490: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
74a0: 2c 20 2d 31 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  , -1, regCols);.
74b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
74c0: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20   int addr1;.    
74d0: 20 20 61 73 73 65 72 74 28 20 21 77 69 74 68 6f    assert( !witho
74e0: 75 74 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  utRowid );.     
74f0: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
7500: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7520: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
7530: 54 61 62 2c 20 69 70 6b 43 6f 6c 75 6d 6e 2c 20  Tab, ipkColumn, 
7540: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  regCols);.      
7550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7560: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 3d 3d  ssert( pSelect==
7570: 30 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69  0 );  /* Otherwi
7580: 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  se useTempTable 
7590: 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20  is true */.     
75a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
75b0: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  de(pParse, pList
75c0: 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70  ->a[ipkColumn].p
75d0: 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  Expr, regCols);.
75e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
75f0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
7600: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
7610: 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29 3b  tNull, regCols);
7620: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7640: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7650: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67  Integer, -1, reg
7660: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
7670: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7680: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
7690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
76a0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
76b0: 49 6e 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20 56  Int, regCols); V
76c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
76d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
76e0: 6e 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67 65  nnot have trigge
76f0: 72 73 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20  rs on a virtual 
7700: 74 61 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72  table. If it wer
7710: 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20  e possible,.    
7720: 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f  ** this block wo
7730: 75 6c 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f  uld have to acco
7740: 75 6e 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63  unt for hidden c
7750: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
7760: 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
7770: 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20  tual(pTab) );.. 
7780: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
7790: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61   new column data
77a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
77b0: 69 3d 6a 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  i=j=0; i<pTab->n
77c0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
77d0: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a   if( pColumn ){.
77e0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
77f0: 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   j<pColumn->nId;
7800: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7810: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b   if( pColumn->a[
7820: 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65 61  j].idx==i ) brea
7830: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7840: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
7850: 21 75 73 65 54 65 6d 70 54 61 62 6c 65 20 26 26  !useTempTable &&
7860: 20 21 70 4c 69 73 74 29 20 7c 7c 20 28 70 43 6f   !pList) || (pCo
7870: 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75  lumn && j>=pColu
7880: 6d 6e 2d 3e 6e 49 64 29 0a 20 20 20 20 20 20 20  mn->nId).       
7890: 20 20 20 20 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e       || (pColumn
78a0: 3d 3d 30 20 26 26 20 49 73 4f 72 64 69 6e 61 72  ==0 && IsOrdinar
78b0: 79 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  yHiddenColumn(&p
78c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 29 20 29  Tab->aCol[i])) )
78d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
78e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
78f0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
7900: 70 44 66 6c 74 2c 20 72 65 67 43 6f 6c 73 2b 69  pDflt, regCols+i
7910: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
7920: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
7930: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7950: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
7960: 54 61 62 2c 20 6a 2c 20 72 65 67 43 6f 6c 73 2b  Tab, j, regCols+
7970: 69 2b 31 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c  i+1); .      }el
7980: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7990: 72 74 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29  rt( pSelect==0 )
79a0: 3b 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 75  ; /* Otherwise u
79b0: 73 65 54 65 6d 70 54 61 62 6c 65 20 69 73 20 74  seTempTable is t
79c0: 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  rue */.        s
79d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
79e0: 64 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  dCache(pParse, p
79f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
7a00: 2c 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 0a  , regCols+i+1);.
7a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7a20: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
7a30: 21 49 73 4f 72 64 69 6e 61 72 79 48 69 64 64 65  !IsOrdinaryHidde
7a40: 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
7a50: 43 6f 6c 5b 69 5d 29 20 29 20 6a 2b 2b 3b 0a 20  Col[i]) ) j++;. 
7a60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
7a70: 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
7a80: 54 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68  T on a view with
7a90: 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49   an INSTEAD OF I
7aa0: 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20  NSERT trigger,. 
7ab0: 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74     ** do not att
7ac0: 65 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73  empt any convers
7ad0: 69 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65  ions before asse
7ae0: 6d 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72  mbling the recor
7af0: 64 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  d..    ** If thi
7b00: 73 20 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c  s is a real tabl
7b10: 65 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65  e, attempt conve
7b20: 72 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72  rsions as requir
7b30: 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
7b40: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66   table column af
7b50: 66 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f  finities..    */
7b60: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
7b70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7b80: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
7b90: 2c 20 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2b  , pTab, regCols+
7ba0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
7bb0: 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72  * Fire BEFORE or
7bc0: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
7bd0: 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  gers */.    sqli
7be0: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
7bf0: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
7c00: 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  er, TK_INSERT, 0
7c10: 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  , TRIGGER_BEFORE
7c20: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c  , .        pTab,
7c30: 20 72 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e 6e   regCols-pTab->n
7c40: 43 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c 20  Col-1, onError, 
7c50: 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20  endOfLoop);..   
7c60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7c70: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7c80: 20 72 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d 3e   regCols, pTab->
7c90: 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  nCol+1);.  }..  
7ca0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
7cb0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
7cc0: 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
7cd0: 20 69 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f 66   into a range of
7ce0: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20  .  ** registers 
7cf0: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67  beginning at reg
7d00: 49 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  Ins..  */.  if( 
7d10: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69  !isView ){.    i
7d20: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
7d30: 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
7d40: 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20  he row that the 
7d50: 56 55 70 64 61 74 65 20 6f 70 63 6f 64 65 20 77  VUpdate opcode w
7d60: 69 6c 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e 65  ill delete: none
7d70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
7d80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7d90: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 6e  P_Null, 0, regIn
7da0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
7db0: 28 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20 29  ( ipkColumn>=0 )
7dc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 54  {.      if( useT
7dd0: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
7de0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7df0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
7e00: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43  mn, srcTab, ipkC
7e10: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29  olumn, regRowid)
7e20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7e30: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
7e40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7e50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
7e60: 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  y, regFromSelect
7e70: 2b 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52  +ipkColumn, regR
7e80: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
7e90: 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
7ea0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
7eb0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7ec0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
7ed0: 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78  a[ipkColumn].pEx
7ee0: 70 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  pr, regRowid);. 
7ef0: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
7f00: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
7f10: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66   -1);.        if
7f20: 28 20 41 4c 57 41 59 53 28 70 4f 70 29 20 26 26  ( ALWAYS(pOp) &&
7f30: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
7f40: 5f 4e 75 6c 6c 20 26 26 20 21 49 73 56 69 72 74  _Null && !IsVirt
7f50: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
7f60: 20 20 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61         appendFla
7f70: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  g = 1;.         
7f80: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
7f90: 50 5f 4e 65 77 52 6f 77 69 64 3b 0a 20 20 20 20  P_NewRowid;.    
7fa0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
7fb0: 69 44 61 74 61 43 75 72 3b 0a 20 20 20 20 20 20  iDataCur;.      
7fc0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
7fd0: 67 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  gRowid;.        
7fe0: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 72 65 67 41    pOp->p3 = regA
7ff0: 75 74 6f 69 6e 63 3b 0a 20 20 20 20 20 20 20 20  utoinc;.        
8000: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8010: 2f 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  /* If the PRIMAR
8020: 59 20 4b 45 59 20 65 78 70 72 65 73 73 69 6f 6e  Y KEY expression
8030: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 75   is NULL, then u
8040: 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 0a 20  se OP_NewRowid. 
8050: 20 20 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65 72       ** to gener
8060: 61 74 65 20 61 20 75 6e 69 71 75 65 20 70 72 69  ate a unique pri
8070: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 2e 0a  mary key value..
8080: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
8090: 66 28 20 21 61 70 70 65 6e 64 46 6c 61 67 20 29  f( !appendFlag )
80a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
80b0: 64 72 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dr1;.        if(
80c0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
80d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
80e0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
80f0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
8100: 6f 74 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 69 64  otNull, regRowid
8110: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8120: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
8130: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8140: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
8150: 69 44 61 74 61 43 75 72 2c 20 72 65 67 52 6f 77  iDataCur, regRow
8160: 69 64 2c 20 72 65 67 41 75 74 6f 69 6e 63 29 3b  id, regAutoinc);
8170: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8180: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8190: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
81a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
81b0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
81c0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
81d0: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
81e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
81f0: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
8200: 72 65 67 52 6f 77 69 64 2c 20 61 64 64 72 31 2b  regRowid, addr1+
8210: 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
8220: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (v);.        }. 
8230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8240: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
8250: 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f 77  ustBeInt, regRow
8260: 69 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  id); VdbeCoverag
8270: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
8280: 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
8290: 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 77  rtual(pTab) || w
82a0: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
82b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
82c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
82d0: 6c 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  l, 0, regRowid);
82e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
82f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8300: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op3(v, OP_NewRow
8310: 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65  id, iDataCur, re
8320: 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f 69  gRowid, regAutoi
8330: 6e 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e  nc);.      appen
8340: 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d  dFlag = 1;.    }
8350: 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70  .    autoIncStep
8360: 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f  (pParse, regAuto
8370: 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  inc, regRowid);.
8380: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
8390: 64 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  data for all col
83a0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77 20  umns of the new 
83b0: 65 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e 67  entry, beginning
83c0: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
83d0: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a 20   first column.. 
83e0: 20 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64 64 65     */.    nHidde
83f0: 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  n = 0;.    for(i
8400: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
8410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
8420: 74 20 69 52 65 67 53 74 6f 72 65 20 3d 20 72 65  t iRegStore = re
8430: 67 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20 20 20  gRowid+1+i;.    
8440: 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69    if( i==pTab->i
8450: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
8460: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
8470: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
8480: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
8490: 73 20 61 6c 77 61 79 73 20 61 20 4e 55 4c 4c 2e  s always a NULL.
84a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  .        ** When
84b0: 65 76 65 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e  ever this column
84c0: 20 69 73 20 72 65 61 64 2c 20 74 68 65 20 72 6f   is read, the ro
84d0: 77 69 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73  wid will be subs
84e0: 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
84f0: 2a 2a 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ** in its place.
8500: 20 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20 74 68    Hence, fill th
8510: 69 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61  is column with a
8520: 20 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a 20   NULL to avoid. 
8530: 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67         ** taking
8540: 20 75 70 20 64 61 74 61 20 73 70 61 63 65 20 77   up data space w
8550: 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ith information 
8560: 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
8570: 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20 20  be used..       
8580: 20 2a 2a 20 41 73 20 74 68 65 72 65 20 6d 61 79   ** As there may
8590: 20 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f 70 69   be shallow copi
85a0: 65 73 20 6f 66 20 74 68 69 73 20 76 61 6c 75 65  es of this value
85b0: 2c 20 6d 61 6b 65 20 69 74 20 61 20 73 6f 66 74  , make it a soft
85c0: 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20  -NULL */.       
85d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85e0: 70 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e 75 6c  p1(v, OP_SoftNul
85f0: 6c 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20  l, iRegStore);. 
8600: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8620: 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  f( pColumn==0 ){
8630: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48  .        if( IsH
8640: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
8650: 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  b->aCol[i]) ){. 
8660: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b           j = -1;
8670: 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64  .          nHidd
8680: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  en++;.        }e
8690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
86a0: 20 3d 20 69 20 2d 20 6e 48 69 64 64 65 6e 3b 0a   = i - nHidden;.
86b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
86d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d  or(j=0; j<pColum
86e0: 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  n->nId; j++){.  
86f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
8700: 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69  umn->a[j].idx==i
8710: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8720: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8730: 20 20 69 66 28 20 6a 3c 30 20 7c 7c 20 6e 43 6f    if( j<0 || nCo
8740: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28 70 43 6f 6c  lumn==0 || (pCol
8750: 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d  umn && j>=pColum
8760: 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20 20 20 20 20  n->nId) ){.     
8770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
8780: 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61  deFactorable(pPa
8790: 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  rse, pTab->aCol[
87a0: 69 5d 2e 70 44 66 6c 74 2c 20 69 52 65 67 53 74  i].pDflt, iRegSt
87b0: 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ore);.      }els
87c0: 65 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62  e if( useTempTab
87d0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
87e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
87f0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
8800: 63 54 61 62 2c 20 6a 2c 20 69 52 65 67 53 74 6f  cTab, j, iRegSto
8810: 72 65 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  re); .      }els
8820: 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b  e if( pSelect ){
8830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67  .        if( reg
8840: 46 72 6f 6d 53 65 6c 65 63 74 21 3d 72 65 67 44  FromSelect!=regD
8850: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
8860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8870: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
8880: 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b 6a 2c  regFromSelect+j,
8890: 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20   iRegStore);.   
88a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
88b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
88c0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
88d0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  se, pList->a[j].
88e0: 70 45 78 70 72 2c 20 69 52 65 67 53 74 6f 72 65  pExpr, iRegStore
88f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8900: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
8910: 65 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  e code to check 
8920: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20  constraints and 
8930: 67 65 6e 65 72 61 74 65 20 69 6e 64 65 78 20 6b  generate index k
8940: 65 79 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  eys and.    ** d
8950: 6f 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 2e  o the insertion.
8960: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
8970: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8980: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
8990: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
89a0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
89b0: 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
89c0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
89d0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
89e0: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71   pTab);.      sq
89f0: 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72 69  lite3VtabMakeWri
8a00: 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  table(pParse, pT
8a10: 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ab);.      sqlit
8a20: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
8a30: 4f 50 5f 56 55 70 64 61 74 65 2c 20 31 2c 20 70  OP_VUpdate, 1, p
8a40: 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c 20 72 65 67  Tab->nCol+2, reg
8a50: 49 6e 73 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  Ins, pVTab, P4_V
8a60: 54 41 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TAB);.      sqli
8a70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8a80: 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  v, onError==OE_D
8a90: 65 66 61 75 6c 74 20 3f 20 4f 45 5f 41 62 6f 72  efault ? OE_Abor
8aa0: 74 20 3a 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20  t : onError);.  
8ab0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
8ac0: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
8ad0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
8ae0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73    {.      int is
8af0: 52 65 70 6c 61 63 65 3b 20 20 20 20 2f 2a 20 53  Replace;    /* S
8b00: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 63 6f  et to true if co
8b10: 6e 73 74 72 61 69 6e 74 73 20 6d 61 79 20 63 61  nstraints may ca
8b20: 75 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a 2f  use a replace */
8b30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65  .      sqlite3Ge
8b40: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
8b50: 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70  Checks(pParse, p
8b60: 54 61 62 2c 20 61 52 65 67 49 64 78 2c 20 69 44  Tab, aRegIdx, iD
8b70: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c  ataCur, iIdxCur,
8b80: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 49 6e  .          regIn
8b90: 73 2c 20 30 2c 20 69 70 6b 43 6f 6c 75 6d 6e 3e  s, 0, ipkColumn>
8ba0: 3d 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64  =0, onError, end
8bb0: 4f 66 4c 6f 6f 70 2c 20 26 69 73 52 65 70 6c 61  OfLoop, &isRepla
8bc0: 63 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  ce, 0.      );. 
8bd0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43 68       sqlite3FkCh
8be0: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62  eck(pParse, pTab
8bf0: 2c 20 30 2c 20 72 65 67 49 6e 73 2c 20 30 2c 20  , 0, regIns, 0, 
8c00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
8c10: 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69  3CompleteInserti
8c20: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
8c30: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
8c40: 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur,.            
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 72 65 67 49 6e 73 2c 20 61 52 65 67 49     regIns, aRegI
8c70: 64 78 2c 20 30 2c 20 61 70 70 65 6e 64 46 6c 61  dx, 0, appendFla
8c80: 67 2c 20 69 73 52 65 70 6c 61 63 65 3d 3d 30 29  g, isReplace==0)
8c90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8ca0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 75  * Update the cou
8cb0: 6e 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  nt of rows that 
8cc0: 61 72 65 20 69 6e 73 65 72 74 65 64 0a 20 20 2a  are inserted.  *
8cd0: 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  /.  if( (db->fla
8ce0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
8cf0: 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20  tRows)!=0 ){.   
8d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8d10: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
8d20: 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29   regRowCount, 1)
8d30: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 72  ;.  }..  if( pTr
8d40: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  igger ){.    /* 
8d50: 43 6f 64 65 20 41 46 54 45 52 20 74 72 69 67 67  Code AFTER trigg
8d60: 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ers */.    sqlit
8d70: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
8d80: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
8d90: 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c  r, TK_INSERT, 0,
8da0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c 20   TRIGGER_AFTER, 
8db0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 72  .        pTab, r
8dc0: 65 67 44 61 74 61 2d 32 2d 70 54 61 62 2d 3e 6e  egData-2-pTab->n
8dd0: 43 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e  Col, onError, en
8de0: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20  dOfLoop);.  }.. 
8df0: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
8e00: 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72  f the main inser
8e10: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66 20 74 68  tion loop, if th
8e20: 65 20 64 61 74 61 20 73 6f 75 72 63 65 0a 20 20  e data source.  
8e30: 2a 2a 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  ** is a SELECT s
8e40: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
8e50: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
8e60: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f  lveLabel(v, endO
8e70: 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75 73  fLoop);.  if( us
8e80: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
8e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8ea0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
8eb0: 73 72 63 54 61 62 2c 20 61 64 64 72 43 6f 6e 74  srcTab, addrCont
8ec0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8ed0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
8ee0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8ef0: 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20 20 20 20  ddrInsTop);.    
8f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f10: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 73  1(v, OP_Close, s
8f20: 72 63 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20  rcTab);.  }else 
8f30: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
8f40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
8f50: 74 6f 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  to(v, addrCont);
8f60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8f70: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
8f80: 49 6e 73 54 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20  InsTop);.  }..  
8f90: 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
8fa0: 54 61 62 29 20 26 26 20 21 69 73 56 69 65 77 20  Tab) && !isView 
8fb0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20  ){.    /* Close 
8fc0: 61 6c 6c 20 74 61 62 6c 65 73 20 6f 70 65 6e 65  all tables opene
8fd0: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44 61  d */.    if( iDa
8fe0: 74 61 43 75 72 3c 69 49 64 78 43 75 72 20 29 20  taCur<iIdxCur ) 
8ff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9000: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
9010: 44 61 74 61 43 75 72 29 3b 0a 20 20 20 20 66 6f  DataCur);.    fo
9020: 72 28 69 64 78 3d 30 2c 20 70 49 64 78 3d 70 54  r(idx=0, pIdx=pT
9030: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
9040: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9050: 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  xt, idx++){.    
9060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9070: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
9080: 20 69 64 78 2b 69 49 64 78 43 75 72 29 3b 0a 20   idx+iIdxCur);. 
9090: 20 20 20 7d 0a 20 20 7d 0a 0a 69 6e 73 65 72 74     }.  }..insert
90a0: 5f 65 6e 64 3a 0a 20 20 2f 2a 20 55 70 64 61 74  _end:.  /* Updat
90b0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
90c0: 75 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73  uence table by s
90d0: 74 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  toring the conte
90e0: 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d  nt of the.  ** m
90f0: 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75  aximum rowid cou
9100: 6e 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f  nter values reco
9110: 72 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72  rded while inser
9120: 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ting into.  ** a
9130: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62  utoincrement tab
9140: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
9150: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
9160: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72  0 && pParse->pTr
9170: 69 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20  iggerTab==0 ){. 
9180: 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e     sqlite3Autoin
9190: 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73  crementEnd(pPars
91a0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e);.  }..  /*.  
91b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
91c0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 73  mber of rows ins
91d0: 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 72  erted. If this r
91e0: 6f 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a 20  outine is .  ** 
91f0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20  generating code 
9200: 62 65 63 61 75 73 65 20 6f 66 20 61 20 63 61 6c  because of a cal
9210: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73 74  l to sqlite3Nest
9220: 65 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e 6f  edParse(), do no
9230: 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  t.  ** invoke th
9240: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
9250: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
9260: 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
9270: 45 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26 20  E_CountRows) && 
9280: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
9290: 26 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  && !pParse->pTri
92a0: 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 73  ggerTab ){.    s
92b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
92c0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
92d0: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31  , regRowCount, 1
92e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
92f0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
9300: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
9310: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9320: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
9330: 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64  , "rows inserted
9340: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
9350: 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 63  );.  }..insert_c
9360: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
9370: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
9380: 62 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  b, pTabList);.  
9390: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
93a0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
93b0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
93c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
93d0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  ect);.  sqlite3I
93e0: 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
93f0: 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69  pColumn);.  sqli
9400: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 52  te3DbFree(db, aR
9410: 65 67 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d 61  egIdx);.}../* Ma
9420: 6b 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22  ke sure "isView"
9430: 20 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f   and other macro
9440: 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20  s defined above 
9450: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f  are undefined. O
9460: 74 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 79  therwise.** they
9470: 20 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77   may interfere w
9480: 69 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ith compilation 
9490: 6f 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  of other functio
94a0: 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a  ns in this file.
94b0: 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65  ** (or in anothe
94c0: 72 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20  r file, if this 
94d0: 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72  file becomes par
94e0: 74 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d  t of the amalgam
94f0: 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64  ation).  */.#ifd
9500: 65 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65  ef isView. #unde
9510: 66 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a  f isView.#endif.
9520: 23 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a  #ifdef pTrigger.
9530: 20 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72   #undef pTrigger
9540: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 74  .#endif.#ifdef t
9550: 6d 61 73 6b 0a 20 23 75 6e 64 65 66 20 74 6d 61  mask. #undef tma
9560: 73 6b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  sk.#endif../*.**
9570: 20 4d 65 61 6e 69 6e 67 73 20 6f 66 20 62 69 74   Meanings of bit
9580: 73 20 69 6e 20 6f 66 20 70 57 61 6c 6b 65 72 2d  s in of pWalker-
9590: 3e 65 43 6f 64 65 20 66 6f 72 20 63 68 65 63 6b  >eCode for check
95a0: 43 6f 6e 73 74 72 61 69 6e 74 55 6e 63 68 61 6e  ConstraintUnchan
95b0: 67 65 64 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ged().*/.#define
95c0: 20 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d   CKCNSTRNT_COLUM
95d0: 4e 20 20 20 30 78 30 31 20 20 20 20 2f 2a 20 43  N   0x01    /* C
95e0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
95f0: 75 73 65 73 20 61 20 63 68 61 6e 67 69 6e 67 20  uses a changing 
9600: 63 6f 6c 75 6d 6e 20 2a 2f 0a 23 64 65 66 69 6e  column */.#defin
9610: 65 20 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49  e CKCNSTRNT_ROWI
9620: 44 20 20 20 20 30 78 30 32 20 20 20 20 2f 2a 20  D    0x02    /* 
9630: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
9640: 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
9650: 52 4f 57 49 44 20 2a 2f 0a 0a 2f 2a 20 54 68 69  ROWID */../* Thi
9660: 73 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 20  s is the Walker 
9670: 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 63 68  callback from ch
9680: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e 63  eckConstraintUnc
9690: 68 61 6e 67 65 64 28 29 2e 20 20 53 65 74 0a 2a  hanged().  Set.*
96a0: 2a 20 62 69 74 20 30 78 30 31 20 6f 66 20 70 57  * bit 0x01 of pW
96b0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 66 0a  alker->eCode if.
96c0: 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  ** pWalker->eCod
96d0: 65 20 74 6f 20 30 20 69 66 20 74 68 69 73 20 65  e to 0 if this e
96e0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
96f0: 65 66 65 72 65 6e 63 65 73 20 61 6e 79 20 6f 66  eferences any of
9700: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20   the.** columns 
9710: 74 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 6d  that are being m
9720: 6f 64 69 66 65 64 20 62 79 20 61 6e 20 55 50 44  odifed by an UPD
9730: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ATE statement..*
9740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
9750: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 45 78 70 72  ckConstraintExpr
9760: 4e 6f 64 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  Node(Walker *pWa
9770: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
9780: 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
9790: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
97a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
97b0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
97c0: 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  || pExpr->iColum
97d0: 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 69 66 28  n==-1 );.    if(
97e0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
97f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
9800: 70 57 61 6c 6b 65 72 2d 3e 75 2e 61 69 43 6f 6c  pWalker->u.aiCol
9810: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
9820: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
9830: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 7c 3d  Walker->eCode |=
9840: 20 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d   CKCNSTRNT_COLUM
9850: 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  N;.      }.    }
9860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 61 6c  else{.      pWal
9870: 6b 65 72 2d 3e 65 43 6f 64 65 20 7c 3d 20 43 4b  ker->eCode |= CK
9880: 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 3b 0a 20  CNSTRNT_ROWID;. 
9890: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
98a0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
98b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
98c0: 73 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  s a CHECK constr
98d0: 61 69 6e 74 20 6f 6e 20 61 20 72 6f 77 20 74 68  aint on a row th
98e0: 61 74 20 69 73 20 62 65 69 6e 67 20 55 50 44 41  at is being UPDA
98f0: 54 45 2d 65 64 2e 20 20 54 68 65 0a 2a 2a 20 6f  TE-ed.  The.** o
9900: 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  nly columns that
9910: 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20 62 79   are modified by
9920: 20 74 68 65 20 55 50 44 41 54 45 20 61 72 65 20   the UPDATE are 
9930: 74 68 6f 73 65 20 66 6f 72 20 77 68 69 63 68 0a  those for which.
9940: 2a 2a 20 61 69 43 68 6e 67 5b 69 5d 3e 3d 30 2c  ** aiChng[i]>=0,
9950: 20 61 6e 64 20 61 6c 73 6f 20 74 68 65 20 52 4f   and also the RO
9960: 57 49 44 20 69 73 20 6d 6f 64 69 66 69 65 64 20  WID is modified 
9970: 69 66 20 63 68 6e 67 52 6f 77 69 64 20 69 73 20  if chngRowid is 
9980: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  true..**.** Retu
9990: 72 6e 20 74 72 75 65 20 69 66 20 43 48 45 43 4b  rn true if CHECK
99a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 45 78 70   constraint pExp
99b0: 72 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  r does not use a
99c0: 6e 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61  ny of the.** cha
99d0: 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 28 6f  nging columns (o
99e0: 72 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 69  r the rowid if i
99f0: 74 20 69 73 20 63 68 61 6e 67 69 6e 67 29 2e 20  t is changing). 
9a00: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9a10: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 20  .** return true 
9a20: 69 66 20 74 68 69 73 20 43 48 45 43 4b 20 63 6f  if this CHECK co
9a30: 6e 73 74 72 61 69 6e 74 20 63 61 6e 20 62 65 20  nstraint can be 
9a40: 73 6b 69 70 70 65 64 20 77 68 65 6e 20 76 61 6c  skipped when val
9a50: 69 64 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 6e  idating.** the n
9a60: 65 77 20 72 6f 77 20 69 6e 20 74 68 65 20 55 50  ew row in the UP
9a70: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  DATE statement..
9a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
9a90: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e 63  eckConstraintUnc
9aa0: 68 61 6e 67 65 64 28 45 78 70 72 20 2a 70 45 78  hanged(Expr *pEx
9ab0: 70 72 2c 20 69 6e 74 20 2a 61 69 43 68 6e 67 2c  pr, int *aiChng,
9ac0: 20 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 29 7b   int chngRowid){
9ad0: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
9ae0: 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
9af0: 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
9b00: 64 65 20 3d 20 30 3b 0a 20 20 77 2e 78 45 78 70  de = 0;.  w.xExp
9b10: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 68 65 63  rCallback = chec
9b20: 6b 43 6f 6e 73 74 72 61 69 6e 74 45 78 70 72 4e  kConstraintExprN
9b30: 6f 64 65 3b 0a 20 20 77 2e 75 2e 61 69 43 6f 6c  ode;.  w.u.aiCol
9b40: 20 3d 20 61 69 43 68 6e 67 3b 0a 20 20 73 71 6c   = aiChng;.  sql
9b50: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
9b60: 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 21   pExpr);.  if( !
9b70: 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20  chngRowid ){.   
9b80: 20 74 65 73 74 63 61 73 65 28 20 28 77 2e 65 43   testcase( (w.eC
9b90: 6f 64 65 20 26 20 43 4b 43 4e 53 54 52 4e 54 5f  ode & CKCNSTRNT_
9ba0: 52 4f 57 49 44 29 21 3d 30 20 29 3b 0a 20 20 20  ROWID)!=0 );.   
9bb0: 20 77 2e 65 43 6f 64 65 20 26 3d 20 7e 43 4b 43   w.eCode &= ~CKC
9bc0: 4e 53 54 52 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  NSTRNT_ROWID;.  
9bd0: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 2e  }.  testcase( w.
9be0: 65 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 74 65  eCode==0 );.  te
9bf0: 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64 65 3d  stcase( w.eCode=
9c00: 3d 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d  =CKCNSTRNT_COLUM
9c10: 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  N );.  testcase(
9c20: 20 77 2e 65 43 6f 64 65 3d 3d 43 4b 43 4e 53 54   w.eCode==CKCNST
9c30: 52 4e 54 5f 52 4f 57 49 44 20 29 3b 0a 20 20 74  RNT_ROWID );.  t
9c40: 65 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64 65  estcase( w.eCode
9c50: 3d 3d 28 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57  ==(CKCNSTRNT_ROW
9c60: 49 44 7c 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c  ID|CKCNSTRNT_COL
9c70: 55 4d 4e 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  UMN) );.  return
9c80: 20 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a   !w.eCode;.}../*
9c90: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
9ca0: 65 20 74 6f 20 64 6f 20 63 6f 6e 73 74 72 61 69  e to do constrai
9cb0: 6e 74 20 63 68 65 63 6b 73 20 70 72 69 6f 72 20  nt checks prior 
9cc0: 74 6f 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  to an INSERT or 
9cd0: 61 6e 20 55 50 44 41 54 45 0a 2a 2a 20 6f 6e 20  an UPDATE.** on 
9ce0: 74 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a  table pTab..**.*
9cf0: 2a 20 54 68 65 20 72 65 67 4e 65 77 44 61 74 61  * The regNewData
9d00: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
9d10: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
9d20: 20 69 6e 20 61 20 72 61 6e 67 65 20 74 68 61 74   in a range that
9d30: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
9d40: 20 64 61 74 61 20 74 6f 20 62 65 20 69 6e 73 65   data to be inse
9d50: 72 74 65 64 20 6f 72 20 74 68 65 20 64 61 74 61  rted or the data
9d60: 20 61 66 74 65 72 20 74 68 65 20 75 70 64 61 74   after the updat
9d70: 65 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62  e.  There will b
9d80: 65 0a 2a 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b  e.** pTab->nCol+
9d90: 31 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74  1 registers in t
9da0: 68 69 73 20 72 61 6e 67 65 2e 20 20 54 68 65 20  his range.  The 
9db0: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 28  first register (
9dc0: 74 68 65 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20  the one.** that 
9dd0: 72 65 67 4e 65 77 44 61 74 61 20 70 6f 69 6e 74  regNewData point
9de0: 73 20 74 6f 29 20 77 69 6c 6c 20 63 6f 6e 74 61  s to) will conta
9df0: 69 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64  in the new rowid
9e00: 2c 20 6f 72 20 4e 55 4c 4c 20 69 6e 20 74 68 65  , or NULL in the
9e10: 0a 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 57 49  .** case of a WI
9e20: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
9e30: 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 72  e.  The second r
9e40: 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72  egister in the r
9e50: 61 6e 67 65 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e  ange will.** con
9e60: 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  tain the content
9e70: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 61   of the first ta
9e80: 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  ble column.  The
9e90: 20 74 68 69 72 64 20 72 65 67 69 73 74 65 72 20   third register 
9ea0: 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  will.** contain 
9eb0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
9ec0: 68 65 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20  he second table 
9ed0: 63 6f 6c 75 6d 6e 2e 20 20 41 6e 64 20 73 6f 20  column.  And so 
9ee0: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  forth..**.** The
9ef0: 20 72 65 67 4f 6c 64 44 61 74 61 20 70 61 72 61   regOldData para
9f00: 6d 65 74 65 72 20 69 73 20 73 69 6d 69 6c 61 72  meter is similar
9f10: 20 74 6f 20 72 65 67 4e 65 77 44 61 74 61 20 65   to regNewData e
9f20: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 63 6f  xcept that it co
9f30: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61  ntains.** the da
9f40: 74 61 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 55  ta prior to an U
9f50: 50 44 41 54 45 20 72 61 74 68 65 72 20 74 68 61  PDATE rather tha
9f60: 6e 20 61 66 74 65 72 77 61 72 64 73 2e 20 20 72  n afterwards.  r
9f70: 65 67 4f 6c 64 44 61 74 61 20 69 73 20 7a 65 72  egOldData is zer
9f80: 6f 0a 2a 2a 20 66 6f 72 20 61 6e 20 49 4e 53 45  o.** for an INSE
9f90: 52 54 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  RT.  This routin
9fa0: 65 20 63 61 6e 20 64 69 73 74 69 6e 67 75 69 73  e can distinguis
9fb0: 68 20 62 65 74 77 65 65 6e 20 55 50 44 41 54 45  h between UPDATE
9fc0: 20 61 6e 64 20 49 4e 53 45 52 54 20 62 79 0a 2a   and INSERT by.*
9fd0: 2a 20 63 68 65 63 6b 69 6e 67 20 72 65 67 4f 6c  * checking regOl
9fe0: 64 44 61 74 61 20 66 6f 72 20 7a 65 72 6f 2e 0a  dData for zero..
9ff0: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 55 50 44  **.** For an UPD
a000: 41 54 45 2c 20 74 68 65 20 70 6b 43 68 6e 67 20  ATE, the pkChng 
a010: 62 6f 6f 6c 65 61 6e 20 69 73 20 74 72 75 65 20  boolean is true 
a020: 69 66 20 74 68 65 20 74 72 75 65 20 70 72 69 6d  if the true prim
a030: 61 72 79 20 6b 65 79 20 28 74 68 65 0a 2a 2a 20  ary key (the.** 
a040: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 72 6d  rowid for a norm
a050: 61 6c 20 74 61 62 6c 65 20 6f 72 20 74 68 65 20  al table or the 
a060: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
a070: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
a080: 74 61 62 6c 65 29 0a 2a 2a 20 6d 69 67 68 74 20  table).** might 
a090: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74  be modified by t
a0a0: 68 65 20 55 50 44 41 54 45 2e 20 20 49 66 20 70  he UPDATE.  If p
a0b0: 6b 43 68 6e 67 20 69 73 20 66 61 6c 73 65 2c 20  kChng is false, 
a0c0: 74 68 65 6e 20 74 68 65 20 6b 65 79 20 6f 66 0a  then the key of.
a0d0: 2a 2a 20 74 68 65 20 69 44 61 74 61 43 75 72 20  ** the iDataCur 
a0e0: 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 69 73  content table is
a0f0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
a100: 65 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 74  e unchanged by t
a110: 68 65 20 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a  he UPDATE..**.**
a120: 20 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 2c 20   For an INSERT, 
a130: 74 68 65 20 70 6b 43 68 6e 67 20 62 6f 6f 6c 65  the pkChng boole
a140: 61 6e 20 69 6e 64 69 63 61 74 65 73 20 77 68 65  an indicates whe
a150: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
a160: 72 6f 77 69 64 0a 2a 2a 20 77 61 73 20 65 78 70  rowid.** was exp
a170: 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
a180: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
a190: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
a1a0: 74 2e 20 20 49 66 20 70 6b 43 68 6e 67 0a 2a 2a  t.  If pkChng.**
a1b0: 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 6d 65 61   is zero, it mea
a1c0: 6e 73 20 74 68 61 74 20 74 68 65 20 65 69 74 68  ns that the eith
a1d0: 65 72 20 72 6f 77 69 64 20 69 73 20 63 6f 6d 70  er rowid is comp
a1e0: 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  uted automatical
a1f0: 6c 79 20 6f 72 0a 2a 2a 20 74 68 61 74 20 74 68  ly or.** that th
a200: 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54  e table is a WIT
a210: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
a220: 20 61 6e 64 20 68 61 73 20 6e 6f 20 72 6f 77 69   and has no rowi
a230: 64 2e 20 20 4f 6e 20 61 6e 20 49 4e 53 45 52 54  d.  On an INSERT
a240: 2c 0a 2a 2a 20 70 6b 43 68 6e 67 20 77 69 6c 6c  ,.** pkChng will
a250: 20 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66   only be true if
a260: 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74   the INSERT stat
a270: 65 6d 65 6e 74 20 70 72 6f 76 69 64 65 73 20 61  ement provides a
a280: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c  n integer.** val
a290: 75 65 20 66 6f 72 20 65 69 74 68 65 72 20 74 68  ue for either th
a2a0: 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f  e rowid column o
a2b0: 72 20 69 74 73 20 49 4e 54 45 47 45 52 20 50 52  r its INTEGER PR
a2c0: 49 4d 41 52 59 20 4b 45 59 20 61 6c 69 61 73 2e  IMARY KEY alias.
a2d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
a2e0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69  generated by thi
a2f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 73  s routine will s
a300: 74 6f 72 65 20 6e 65 77 20 69 6e 64 65 78 20 65  tore new index e
a310: 6e 74 72 69 65 73 20 69 6e 74 6f 0a 2a 2a 20 72  ntries into.** r
a320: 65 67 69 73 74 65 72 73 20 69 64 65 6e 74 69 66  egisters identif
a330: 69 65 64 20 62 79 20 61 52 65 67 49 64 78 5b 5d  ied by aRegIdx[]
a340: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 65 6e 74 72  .  No index entr
a350: 79 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  y is created for
a360: 0a 2a 2a 20 69 6e 64 69 63 65 73 20 77 68 65 72  .** indices wher
a370: 65 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 2e  e aRegIdx[i]==0.
a380: 20 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 69    The order of i
a390: 6e 64 69 63 65 73 20 69 6e 20 61 52 65 67 49 64  ndices in aRegId
a3a0: 78 5b 5d 20 69 73 0a 2a 2a 20 74 68 65 20 73 61  x[] is.** the sa
a3b0: 6d 65 20 61 73 20 74 68 65 20 6f 72 64 65 72 20  me as the order 
a3c0: 6f 66 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  of indices on th
a3d0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
a3e0: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61 74 20 70   indices.** at p
a3f0: 54 61 62 2d 3e 70 49 6e 64 65 78 2e 0a 2a 2a 0a  Tab->pIndex..**.
a400: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
a410: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
a420: 6f 70 65 6e 65 64 20 77 72 69 74 65 61 62 6c 65  opened writeable
a430: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
a440: 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  main.** table an
a450: 64 20 61 6c 6c 20 61 70 70 6c 69 63 61 62 6c 65  d all applicable
a460: 20 69 6e 64 69 63 65 73 20 28 74 68 61 74 20 69   indices (that i
a470: 73 20 74 6f 20 73 61 79 2c 20 61 6c 6c 20 69 6e  s to say, all in
a480: 64 69 63 65 73 20 66 6f 72 20 77 68 69 63 68 0a  dices for which.
a490: 2a 2a 20 61 52 65 67 49 64 78 5b 5d 20 69 73 20  ** aRegIdx[] is 
a4a0: 6e 6f 74 20 7a 65 72 6f 29 2e 20 20 69 44 61 74  not zero).  iDat
a4b0: 61 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  aCur is the curs
a4c0: 6f 72 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  or for the main 
a4d0: 74 61 62 6c 65 20 77 68 65 6e 0a 2a 2a 20 69 6e  table when.** in
a4e0: 73 65 72 74 69 6e 67 20 6f 72 20 75 70 64 61 74  serting or updat
a4f0: 69 6e 67 20 61 20 72 6f 77 69 64 20 74 61 62 6c  ing a rowid tabl
a500: 65 2c 20 6f 72 20 74 68 65 20 63 75 72 73 6f 72  e, or the cursor
a510: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
a520: 20 4b 45 59 0a 2a 2a 20 69 6e 64 65 78 20 77 68   KEY.** index wh
a530: 65 6e 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20  en operating on 
a540: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
a550: 74 61 62 6c 65 2e 20 20 69 49 64 78 43 75 72 20  table.  iIdxCur 
a560: 69 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  is the cursor.**
a570: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 69   for the first i
a580: 6e 64 65 78 20 69 6e 20 74 68 65 20 70 54 61 62  ndex in the pTab
a590: 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e 20 20  ->pIndex list.  
a5a0: 43 75 72 73 6f 72 73 20 66 6f 72 20 6f 74 68 65  Cursors for othe
a5b0: 72 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61 72 65  r indices.** are
a5c0: 20 61 74 20 69 49 64 78 43 75 72 2b 4e 20 66 6f   at iIdxCur+N fo
a5d0: 72 20 74 68 65 20 4e 2d 74 68 20 65 6c 65 6d 65  r the N-th eleme
a5e0: 6e 74 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e  nt of the pTab->
a5f0: 70 49 6e 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a  pIndex list..**.
a600: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a610: 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 73 20 63  also generates c
a620: 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e  ode to check con
a630: 73 74 72 61 69 6e 74 73 2e 20 20 4e 4f 54 20 4e  straints.  NOT N
a640: 55 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b 2c 20 61  ULL,.** CHECK, a
a650: 6e 64 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  nd UNIQUE constr
a660: 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 63 68  aints are all ch
a670: 65 63 6b 65 64 2e 20 20 49 66 20 61 20 63 6f 6e  ecked.  If a con
a680: 73 74 72 61 69 6e 74 20 66 61 69 6c 73 2c 0a 2a  straint fails,.*
a690: 2a 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f  * then the appro
a6a0: 70 72 69 61 74 65 20 61 63 74 69 6f 6e 20 69 73  priate action is
a6b0: 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65   performed.  The
a6c0: 72 65 20 61 72 65 20 66 69 76 65 20 70 6f 73 73  re are five poss
a6d0: 69 62 6c 65 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a  ible.** actions:
a6e0: 20 52 4f 4c 4c 42 41 43 4b 2c 20 41 42 4f 52 54   ROLLBACK, ABORT
a6f0: 2c 20 46 41 49 4c 2c 20 52 45 50 4c 41 43 45 2c  , FAIL, REPLACE,
a700: 20 61 6e 64 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a   and IGNORE..**.
a710: 2a 2a 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 74  **  Constraint t
a720: 79 70 65 20 20 41 63 74 69 6f 6e 20 20 20 20 20  ype  Action     
a730: 20 20 57 68 61 74 20 48 61 70 70 65 6e 73 0a 2a    What Happens.*
a740: 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *  -------------
a750: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --  ----------  
a760: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
a770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e  ---------.**  an
a790: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52  y              R
a7a0: 4f 4c 4c 42 41 43 4b 20 20 20 20 20 54 68 65 20  OLLBACK     The 
a7b0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
a7c0: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
a7d0: 63 6b 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ck and.**       
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a800: 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e 73 20  _step() returns 
a810: 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68  immediately with
a820: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65       return code
a850: 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   of SQLITE_CONST
a860: 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e  RAINT..**.**  an
a870: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41  y              A
a880: 42 4f 52 54 20 20 20 20 20 20 20 20 42 61 63 6b  BORT        Back
a890: 20 6f 75 74 20 63 68 61 6e 67 65 73 20 66 72 6f   out changes fro
a8a0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  m the current co
a8b0: 6d 6d 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  mmand.**        
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 20 20 20 20 20 20 6f 6e 6c 79 20 28 64 6f          only (do
a8e0: 20 6e 6f 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65   not do a comple
a8f0: 74 65 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65  te rollback) the
a900: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a920: 20 20 20 20 63 61 75 73 65 20 73 71 6c 69 74 65      cause sqlite
a930: 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74 75  3_step() to retu
a940: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  rn immediately.*
a950: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f 4e   with SQLITE_CON
a980: 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20  STRAINT..**.**  
a990: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
a9a0: 20 46 41 49 4c 20 20 20 20 20 20 20 20 20 53 71   FAIL         Sq
a9b0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 72 65 74  lite3_step() ret
a9c0: 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  urns immediately
a9d0: 20 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20   with a.**      
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
aa00: 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f   code of SQLITE_
aa10: 43 4f 4e 53 54 52 41 49 4e 54 2e 20 20 54 68 65  CONSTRAINT.  The
aa20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69     transaction i
aa50: 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63  s not rolled bac
aa60: 6b 20 61 6e 64 20 61 6e 79 0a 2a 2a 20 20 20 20  k and any.**    
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e              chan
aa90: 67 65 73 20 74 6f 20 70 72 69 6f 72 20 72 6f 77  ges to prior row
aaa0: 73 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a  s are retained..
aab0: 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20  **.**  any      
aac0: 20 20 20 20 20 20 20 20 49 47 4e 4f 52 45 20 20          IGNORE  
aad0: 20 20 20 20 20 54 68 65 20 61 74 74 65 6d 70 74       The attempt
aae0: 20 69 6e 20 69 6e 73 65 72 74 20 6f 72 20 75 70   in insert or up
aaf0: 64 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  date the current
ab00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 72 6f 77 20 69 73 20 73 6b 69 70 70 65     row is skippe
ab30: 64 2c 20 77 69 74 68 6f 75 74 20 74 68 72 6f 77  d, without throw
ab40: 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a  ing an error..**
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 50 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 69  Processing conti
ab80: 6e 75 65 73 20 77 69 74 68 20 74 68 65 20 6e 65  nues with the ne
ab90: 78 74 20 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20  xt row..**      
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 20 20 20 20 20 28 54 68 65 72 65            (There
abc0: 20 69 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   is an immediate
abd0: 20 6a 75 6d 70 20 74 6f 20 69 67 6e 6f 72 65 44   jump to ignoreD
abe0: 65 73 74 2e 29 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54  est.).**.**  NOT
abf0: 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 52 45   NULL         RE
ac00: 50 4c 41 43 45 20 20 20 20 20 20 54 68 65 20 4e  PLACE      The N
ac10: 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 70  ULL value is rep
ac20: 6c 61 63 65 20 62 79 20 74 68 65 20 64 65 66 61  lace by the defa
ac30: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 76 61 6c 75 65 20 66 6f 72 20        value for 
ac60: 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66  that column.  If
ac70: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
ac80: 75 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ue.**           
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 20 20 69 73 20 4e 55 4c 4c 2c 20 74 68       is NULL, th
acb0: 65 20 61 63 74 69 6f 6e 20 69 73 20 74 68 65 20  e action is the 
acc0: 73 61 6d 65 20 61 73 20 41 42 4f 52 54 2e 0a 2a  same as ABORT..*
acd0: 2a 0a 2a 2a 20 20 55 4e 49 51 55 45 20 20 20 20  *.**  UNIQUE    
ace0: 20 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20         REPLACE  
acf0: 20 20 20 20 54 68 65 20 6f 74 68 65 72 20 72 6f      The other ro
ad00: 77 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  w that conflicts
ad10: 20 77 69 74 68 20 74 68 65 20 72 6f 77 0a 2a 2a   with the row.**
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad40: 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69  being inserted i
ad50: 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  s removed..**.**
ad60: 20 20 43 48 45 43 4b 20 20 20 20 20 20 20 20 20    CHECK         
ad70: 20 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20     REPLACE      
ad80: 49 6c 6c 65 67 61 6c 2e 20 20 54 68 65 20 72 65  Illegal.  The re
ad90: 73 75 6c 74 73 20 69 6e 20 61 6e 20 65 78 63 65  sults in an exce
ada0: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69  ption..**.** Whi
adb0: 63 68 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b  ch action to tak
adc0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
add0: 62 79 20 74 68 65 20 6f 76 65 72 72 69 64 65 45  by the overrideE
ade0: 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 2e 0a  rror parameter..
adf0: 2a 2a 20 4f 72 20 69 66 20 6f 76 65 72 72 69 64  ** Or if overrid
ae00: 65 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  eError==OE_Defau
ae10: 6c 74 2c 20 74 68 65 6e 20 74 68 65 20 70 50 61  lt, then the pPa
ae20: 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 20 70 61 72  rse->onError par
ae30: 61 6d 65 74 65 72 0a 2a 2a 20 69 73 20 75 73 65  ameter.** is use
ae40: 64 2e 20 20 4f 72 20 69 66 20 70 50 61 72 73 65  d.  Or if pParse
ae50: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
ae60: 66 61 75 6c 74 20 74 68 65 6e 20 74 68 65 20 6f  fault then the o
ae70: 6e 45 72 72 6f 72 20 76 61 6c 75 65 0a 2a 2a 20  nError value.** 
ae80: 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69  for the constrai
ae90: 6e 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76  nt is used..*/.v
aea0: 6f 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72  oid sqlite3Gener
aeb0: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
aec0: 63 6b 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  cks(.  Parse *pP
aed0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
aee0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
aef0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
af00: 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab,         /* T
af10: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
af20: 6e 73 65 72 74 65 64 20 6f 72 20 75 70 64 61 74  nserted or updat
af30: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65  ed */.  int *aRe
af40: 67 49 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20  gIdx,        /* 
af50: 55 73 65 20 72 65 67 69 73 74 65 72 20 61 52 65  Use register aRe
af60: 67 49 64 78 5b 69 5d 20 66 6f 72 20 69 6e 64 65  gIdx[i] for inde
af70: 78 20 69 2e 20 20 30 20 66 6f 72 20 75 6e 75 73  x i.  0 for unus
af80: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74  ed */.  int iDat
af90: 61 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  aCur,        /* 
afa0: 43 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 63  Canonical data c
afb0: 75 72 73 6f 72 20 28 6d 61 69 6e 20 74 61 62 6c  ursor (main tabl
afc0: 65 20 6f 72 20 50 4b 20 69 6e 64 65 78 29 20 2a  e or PK index) *
afd0: 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c  /.  int iIdxCur,
afe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
aff0: 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a  t index cursor *
b000: 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44 61  /.  int regNewDa
b010: 74 61 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ta,      /* Firs
b020: 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
b030: 72 61 6e 67 65 20 68 6f 6c 64 69 6e 67 20 76 61  range holding va
b040: 6c 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 2a  lues to insert *
b050: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 44 61  /.  int regOldDa
b060: 74 61 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 76  ta,      /* Prev
b070: 69 6f 75 73 20 63 6f 6e 74 65 6e 74 2e 20 20 30  ious content.  0
b080: 20 66 6f 72 20 49 4e 53 45 52 54 73 20 2a 2f 0a   for INSERTs */.
b090: 20 20 75 38 20 70 6b 43 68 6e 67 2c 20 20 20 20    u8 pkChng,    
b0a0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
b0b0: 72 6f 20 69 66 20 74 68 65 20 72 6f 77 69 64 20  ro if the rowid 
b0c0: 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
b0d0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 6f  hanged */.  u8 o
b0e0: 76 65 72 72 69 64 65 45 72 72 6f 72 2c 20 20 20  verrideError,   
b0f0: 20 2f 2a 20 4f 76 65 72 72 69 64 65 20 6f 6e 45   /* Override onE
b100: 72 72 6f 72 20 74 6f 20 74 68 69 73 20 69 66 20  rror to this if 
b110: 6e 6f 74 20 4f 45 5f 44 65 66 61 75 6c 74 20 2a  not OE_Default *
b120: 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65 44 65  /.  int ignoreDe
b130: 73 74 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  st,      /* Jump
b140: 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 6f   to this label o
b150: 6e 20 61 6e 20 4f 45 5f 49 67 6e 6f 72 65 20 72  n an OE_Ignore r
b160: 65 73 6f 6c 75 74 69 6f 6e 20 2a 2f 0a 20 20 69  esolution */.  i
b170: 6e 74 20 2a 70 62 4d 61 79 52 65 70 6c 61 63 65  nt *pbMayReplace
b180: 2c 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20  ,   /* OUT: Set 
b190: 74 6f 20 74 72 75 65 20 69 66 20 63 6f 6e 73 74  to true if const
b1a0: 72 61 69 6e 74 20 6d 61 79 20 63 61 75 73 65 20  raint may cause 
b1b0: 61 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69  a replace */.  i
b1c0: 6e 74 20 2a 61 69 43 68 6e 67 20 20 20 20 20 20  nt *aiChng      
b1d0: 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 69 20      /* column i 
b1e0: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 69 66 20  is unchanged if 
b1f0: 61 69 43 68 6e 67 5b 69 5d 3c 30 20 2a 2f 0a 29  aiChng[i]<0 */.)
b200: 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
b210: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45           /* VDBE
b220: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 74 69   under construti
b230: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
b240: 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
b250: 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6f  Pointer to one o
b260: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 2a 2f  f the indices */
b270: 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
b280: 30 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50  0;      /* The P
b290: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
b2a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
b2b0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
b2c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b2d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c              /* l
b2f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b300: 20 69 6e 74 20 69 78 3b 20 20 20 20 20 20 20 20   int ix;        
b310: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c        /* Index l
b320: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b330: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
b340: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b350: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
b360: 69 6e 74 20 6f 6e 45 72 72 6f 72 3b 20 20 20 20  int onError;    
b370: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
b380: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61   resolution stra
b390: 74 65 67 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tegy */.  int ad
b3a0: 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  dr1;           /
b3b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
b3c0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  p instruction */
b3d0: 0a 20 20 69 6e 74 20 73 65 65 6e 52 65 70 6c 61  .  int seenRepla
b3e0: 63 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  ce = 0; /* True 
b3f0: 69 66 20 52 45 50 4c 41 43 45 20 69 73 20 75 73  if REPLACE is us
b400: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 49 4e  ed to resolve IN
b410: 54 20 50 4b 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  T PK conflict */
b420: 0a 20 20 69 6e 74 20 6e 50 6b 46 69 65 6c 64 3b  .  int nPkField;
b430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b440: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 50  r of fields in P
b450: 52 49 4d 41 52 59 20 4b 45 59 2e 20 31 20 66 6f  RIMARY KEY. 1 fo
b460: 72 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  r ROWID tables *
b470: 2f 0a 20 20 69 6e 74 20 69 70 6b 54 6f 70 20 3d  /.  int ipkTop =
b480: 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20   0;      /* Top 
b490: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 68 61  of the rowid cha
b4a0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  nge constraint c
b4b0: 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 70  heck */.  int ip
b4c0: 6b 42 6f 74 74 6f 6d 20 3d 20 30 3b 20 20 20 2f  kBottom = 0;   /
b4d0: 2a 20 42 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  * Bottom of the 
b4e0: 72 6f 77 69 64 20 63 68 61 6e 67 65 20 63 6f 6e  rowid change con
b4f0: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 20 2a 2f  straint check */
b500: 0a 20 20 75 38 20 69 73 55 70 64 61 74 65 3b 20  .  u8 isUpdate; 
b510: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b520: 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50  if this is an UP
b530: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 2a  DATE operation *
b540: 2f 0a 20 20 75 38 20 62 41 66 66 69 6e 69 74 79  /.  u8 bAffinity
b550: 44 6f 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 54 72  Done = 0;  /* Tr
b560: 75 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66  ue if the OP_Aff
b570: 69 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 20  inity operation 
b580: 68 61 73 20 62 65 65 6e 20 72 75 6e 20 2a 2f 0a  has been run */.
b590: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
b5a0: 20 2d 31 3b 20 20 20 2f 2a 20 52 65 67 69 73 74   -1;   /* Regist
b5b0: 65 72 20 68 6f 6c 64 69 6e 67 20 52 4f 57 49 44  er holding ROWID
b5c0: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 69 73 55   value */..  isU
b5d0: 70 64 61 74 65 20 3d 20 72 65 67 4f 6c 64 44 61  pdate = regOldDa
b5e0: 74 61 21 3d 30 3b 0a 20 20 64 62 20 3d 20 70 50  ta!=0;.  db = pP
b5f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
b600: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b610: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
b620: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
b630: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
b640: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73  t==0 );  /* This
b650: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
b660: 56 49 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  VIEW */.  nCol =
b670: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 0a   pTab->nCol;.  .
b680: 20 20 2f 2a 20 70 50 6b 20 69 73 20 74 68 65 20    /* pPk is the 
b690: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
b6a0: 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
b6b0: 57 49 44 20 74 61 62 6c 65 73 20 61 6e 64 20 4e  WID tables and N
b6c0: 55 4c 4c 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 72  ULL for.  ** nor
b6d0: 6d 61 6c 20 72 6f 77 69 64 20 74 61 62 6c 65 73  mal rowid tables
b6e0: 2e 20 20 6e 50 6b 46 69 65 6c 64 20 69 73 20 74  .  nPkField is t
b6f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79  he number of key
b700: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 0a   fields in the .
b710: 20 20 2a 2a 20 70 50 6b 20 69 6e 64 65 78 20 6f    ** pPk index o
b720: 72 20 31 20 66 6f 72 20 61 20 72 6f 77 69 64 20  r 1 for a rowid 
b730: 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
b740: 20 77 6f 72 64 73 2c 20 6e 50 6b 46 69 65 6c 64   words, nPkField
b750: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
b760: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
b770: 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61 72   the true primar
b780: 79 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62  y key of the tab
b790: 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 48 61 73  le. */.  if( Has
b7a0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
b7b0: 20 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20     pPk = 0;.    
b7c0: 6e 50 6b 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  nPkField = 1;.  
b7d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d  }else{.    pPk =
b7e0: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
b7f0: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
b800: 20 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20 70 50     nPkField = pP
b810: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a  k->nKeyCol;.  }.
b820: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 61  .  /* Record tha
b830: 74 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  t this module ha
b840: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 56  s started */.  V
b850: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
b860: 28 28 76 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e  ((v, "BEGIN: Gen
b870: 43 6e 73 74 43 6b 73 28 25 64 2c 25 64 2c 25 64  CnstCks(%d,%d,%d
b880: 2c 25 64 2c 25 64 29 22 2c 0a 20 20 20 20 20 20  ,%d,%d)",.      
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
b8a0: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
b8b0: 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20 72 65  , regNewData, re
b8c0: 67 4f 6c 64 44 61 74 61 2c 20 70 6b 43 68 6e 67  gOldData, pkChng
b8d0: 29 29 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61  ));..  /* Test a
b8e0: 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  ll NOT NULL cons
b8f0: 74 72 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  traints..  */.  
b900: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
b910: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
b920: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
b930: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
b940: 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 57 49 44          /* ROWID
b950: 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 20 2a   is never NULL *
b960: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
b970: 61 69 43 68 6e 67 20 26 26 20 61 69 43 68 6e 67  aiChng && aiChng
b980: 5b 69 5d 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  [i]<0 ){.      /
b990: 2a 20 44 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  * Don't bother c
b9a0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 4e 4f 54 20  hecking for NOT 
b9b0: 4e 55 4c 4c 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20  NULL on columns 
b9c0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
b9d0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  ge */.      cont
b9e0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
b9f0: 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e  onError = pTab->
ba00: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[i].notNull;
ba10: 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
ba20: 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74  ==OE_None ) cont
ba30: 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 63  inue;  /* This c
ba40: 6f 6c 75 6d 6e 20 69 73 20 61 6c 6c 6f 77 65 64  olumn is allowed
ba50: 20 74 6f 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20   to be NULL */. 
ba60: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
ba70: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
ba80: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
ba90: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
baa0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
bab0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
bac0: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e  ault ){.      on
bad0: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
bae0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
baf0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
bb00: 61 63 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  ace && pTab->aCo
bb10: 6c 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b  l[i].pDflt==0 ){
bb20: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
bb30: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
bb40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45  .    assert( onE
bb50: 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  rror==OE_Rollbac
bb60: 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  k || onError==OE
bb70: 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f  _Abort || onErro
bb80: 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  r==OE_Fail.     
bb90: 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f     || onError==O
bba0: 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72  E_Ignore || onEr
bbb0: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
bbc0: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
bbd0: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
bbe0: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20  case OE_Abort:. 
bbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
bc00: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
bc10: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
bc20: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 20  through */.     
bc30: 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
bc40: 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  k:.      case OE
bc50: 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20  _Fail: {.       
bc60: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
bc70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
bc80: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
bc90: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
bcc0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
bcd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bce0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
bcf0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 2c 20 53 51 4c  _HaltIfNull, SQL
bd00: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
bd10: 4f 54 4e 55 4c 4c 2c 20 6f 6e 45 72 72 6f 72 2c  OTNULL, onError,
bd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bd30: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4e 65             regNe
bd40: 77 44 61 74 61 2b 31 2b 69 2c 20 7a 4d 73 67 2c  wData+1+i, zMsg,
bd50: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
bd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd70: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 50 35 5f  eChangeP5(v, P5_
bd80: 43 6f 6e 73 74 72 61 69 6e 74 4e 6f 74 4e 75 6c  ConstraintNotNul
bd90: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
bda0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
bdb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bdc0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
bdd0: 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20  E_Ignore: {.    
bde0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bdf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
be00: 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31  ll, regNewData+1
be10: 2b 69 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b  +i, ignoreDest);
be20: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
be30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
be40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
be50: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
be60: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
be70: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ( onError==OE_Re
be80: 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20  place );.       
be90: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
bea0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
beb0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 4e 65 77  _NotNull, regNew
bec0: 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20 20  Data+1+i);.     
bed0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
bee0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
bef0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
bf00: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f  Parse, pTab->aCo
bf10: 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 4e  l[i].pDflt, regN
bf20: 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20  ewData+1+i);.   
bf30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
bf50: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
bf60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
bf70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
bf80: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
bf90: 61 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66 6e 64  aints.  */.#ifnd
bfa0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
bfb0: 48 45 43 4b 0a 20 20 69 66 28 20 70 54 61 62 2d  HECK.  if( pTab-
bfc0: 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e  >pCheck && (db->
bfd0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
bfe0: 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20  gnoreChecks)==0 
bff0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
c000: 2a 70 43 68 65 63 6b 20 3d 20 70 54 61 62 2d 3e  *pCheck = pTab->
c010: 70 43 68 65 63 6b 3b 0a 20 20 20 20 70 50 61 72  pCheck;.    pPar
c020: 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72 65 67  se->ckBase = reg
c030: 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20 20 20 6f  NewData+1;.    o
c040: 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64  nError = overrid
c050: 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75  eError!=OE_Defau
c060: 6c 74 20 3f 20 6f 76 65 72 72 69 64 65 45 72 72  lt ? overrideErr
c070: 6f 72 20 3a 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or : OE_Abort;. 
c080: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
c090: 68 65 63 6b 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  heck->nExpr; i++
c0a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 6c 6c  ){.      int all
c0b0: 4f 6b 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  Ok;.      Expr *
c0c0: 70 45 78 70 72 20 3d 20 70 43 68 65 63 6b 2d 3e  pExpr = pCheck->
c0d0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
c0e0: 20 20 69 66 28 20 61 69 43 68 6e 67 20 26 26 20    if( aiChng && 
c0f0: 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55  checkConstraintU
c100: 6e 63 68 61 6e 67 65 64 28 70 45 78 70 72 2c 20  nchanged(pExpr, 
c110: 61 69 43 68 6e 67 2c 20 70 6b 43 68 6e 67 29 20  aiChng, pkChng) 
c120: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
c130: 20 20 61 6c 6c 4f 6b 20 3d 20 73 71 6c 69 74 65    allOk = sqlite
c140: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
c150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c160: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
c170: 65 2c 20 70 45 78 70 72 2c 20 61 6c 6c 4f 6b 2c  e, pExpr, allOk,
c180: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
c190: 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  LL);.      if( o
c1a0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72  nError==OE_Ignor
c1b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
c1c0: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
c1d0: 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20  ignoreDest);.   
c1e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c1f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
c200: 70 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e 7a 4e 61  pCheck->a[i].zNa
c210: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
c220: 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65  zName==0 ) zName
c230: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
c240: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72          if( onEr
c250: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
c260: 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41  ) onError = OE_A
c270: 62 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  bort; /* IMP: R-
c280: 31 35 35 36 39 2d 36 33 36 32 35 20 2a 2f 0a 20  15569-63625 */. 
c290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
c2a0: 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
c2b0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
c2c0: 54 52 41 49 4e 54 5f 43 48 45 43 4b 2c 0a 20 20  TRAINT_CHECK,.  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72              onEr
c2f0: 72 6f 72 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 54  ror, zName, P4_T
c300: 52 41 4e 53 49 45 4e 54 2c 0a 20 20 20 20 20 20  RANSIENT,.      
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
c330: 72 61 69 6e 74 43 68 65 63 6b 29 3b 0a 20 20 20  raintCheck);.   
c340: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
c350: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
c360: 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b 0a 20 20  el(v, allOk);.  
c370: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c380: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c390: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
c3a0: 0a 0a 20 20 2f 2a 20 49 66 20 72 6f 77 69 64 20  ..  /* If rowid 
c3b0: 69 73 20 63 68 61 6e 67 69 6e 67 2c 20 6d 61 6b  is changing, mak
c3c0: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 72  e sure the new r
c3d0: 6f 77 69 64 20 64 6f 65 73 20 6e 6f 74 20 70 72  owid does not pr
c3e0: 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 65 78  eviously.  ** ex
c3f0: 69 73 74 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ist in the table
c400: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 6b 43  ..  */.  if( pkC
c410: 68 6e 67 20 26 26 20 70 50 6b 3d 3d 30 20 29 7b  hng && pPk==0 ){
c420: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52 6f 77  .    int addrRow
c430: 69 64 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  idOk = sqlite3Vd
c440: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
c450: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
c460: 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74  ut what action t
c470: 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65 20 6f  o take in case o
c480: 66 20 61 20 72 6f 77 69 64 20 63 6f 6c 6c 69 73  f a rowid collis
c490: 69 6f 6e 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72  ion */.    onErr
c4a0: 6f 72 20 3d 20 70 54 61 62 2d 3e 6b 65 79 43 6f  or = pTab->keyCo
c4b0: 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f 76 65 72  nf;.    if( over
c4c0: 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65  rideError!=OE_De
c4d0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f  fault ){.      o
c4e0: 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64  nError = overrid
c4f0: 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  eError;.    }els
c500: 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f  e if( onError==O
c510: 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
c520: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f     onError = OE_
c530: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  Abort;.    }..  
c540: 20 20 69 66 28 20 69 73 55 70 64 61 74 65 20 29    if( isUpdate )
c550: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 6b 43 68 6e  {.      /* pkChn
c560: 67 21 3d 30 20 64 6f 65 73 20 6e 6f 74 20 6d 65  g!=0 does not me
c570: 61 6e 20 74 68 61 74 20 74 68 65 20 72 6f 77 69  an that the rowi
c580: 64 20 68 61 73 20 63 68 61 6e 67 65 2c 20 6f 6e  d has change, on
c590: 6c 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ly that.      **
c5a0: 20 69 74 20 6d 69 67 68 74 20 68 61 76 65 20 63   it might have c
c5b0: 68 61 6e 67 65 64 2e 20 20 53 6b 69 70 20 74 68  hanged.  Skip th
c5c0: 65 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67 69 63  e conflict logic
c5d0: 20 62 65 6c 6f 77 20 69 66 20 74 68 65 20 72 6f   below if the ro
c5e0: 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  wid.      ** is 
c5f0: 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20  unchanged. */.  
c600: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c610: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
c620: 72 65 67 4e 65 77 44 61 74 61 2c 20 61 64 64 72  regNewData, addr
c630: 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4f 6c 64 44  RowidOk, regOldD
c640: 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
c650: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
c660: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
c670: 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
c680: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
c690: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
c6a0: 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 72 6f  response to a ro
c6b0: 77 69 64 20 63 6f 6e 66 6c 69 63 74 20 69 73 20  wid conflict is 
c6c0: 52 45 50 4c 41 43 45 20 62 75 74 20 74 68 65 20  REPLACE but the 
c6d0: 72 65 73 70 6f 6e 73 65 0a 20 20 20 20 2a 2a 20  response.    ** 
c6e0: 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 55 4e  to some other UN
c6f0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
c700: 69 73 20 46 41 49 4c 20 6f 72 20 49 47 4e 4f 52  is FAIL or IGNOR
c710: 45 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 0a  E, then we need.
c720: 20 20 20 20 2a 2a 20 74 6f 20 64 65 66 65 72 20      ** to defer 
c730: 74 68 65 20 72 75 6e 6e 69 6e 67 20 6f 66 20 74  the running of t
c740: 68 65 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63  he rowid conflic
c750: 74 20 63 68 65 63 6b 69 6e 67 20 75 6e 74 69 6c  t checking until
c760: 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68   after.    ** th
c770: 65 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  e UNIQUE constra
c780: 69 6e 74 73 20 68 61 76 65 20 72 75 6e 2e 0a 20  ints have run.. 
c790: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6e     */.    if( on
c7a0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
c7b0: 65 20 26 26 20 6f 76 65 72 72 69 64 65 45 72 72  e && overrideErr
c7c0: 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
c7d0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  {.      for(pIdx
c7e0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
c7f0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
c800: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
c810: 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
c820: 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20  r==OE_Ignore || 
c830: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
c840: 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
c850: 20 20 20 20 69 70 6b 54 6f 70 20 3d 20 73 71 6c      ipkTop = sql
c860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
c870: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
c880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c8a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
c8b0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
c8c0: 20 6e 65 77 20 72 6f 77 69 64 20 61 6c 72 65 61   new rowid alrea
c8d0: 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  dy exists in the
c8e0: 20 74 61 62 6c 65 2e 20 20 53 6b 69 70 0a 20 20   table.  Skip.  
c8f0: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
c900: 6e 67 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67 69  ng conflict logi
c910: 63 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  c if it does not
c920: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
c930: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c940: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74  _NotExists, iDat
c950: 61 43 75 72 2c 20 61 64 64 72 52 6f 77 69 64 4f  aCur, addrRowidO
c960: 6b 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b 0a  k, regNewData);.
c970: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
c980: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  (v);..    /* Gen
c990: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
c9a0: 64 65 61 6c 73 20 77 69 74 68 20 61 20 72 6f 77  deals with a row
c9b0: 69 64 20 63 6f 6c 6c 69 73 69 6f 6e 20 2a 2f 0a  id collision */.
c9c0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72      switch( onEr
c9d0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 64 65 66  ror ){.      def
c9e0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
c9f0: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
ca00: 72 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46  rt;.        /* F
ca10: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
ca20: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
ca30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
ca40: 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20  e OE_Rollback:. 
ca50: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f       case OE_Abo
ca60: 72 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  rt:.      case O
ca70: 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20  E_Fail: {.      
ca80: 20 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f    sqlite3RowidCo
ca90: 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
caa0: 20 6f 6e 45 72 72 6f 72 2c 20 70 54 61 62 29 3b   onError, pTab);
cab0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
cac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
cad0: 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 7b  se OE_Replace: {
cae0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
caf0: 68 65 72 65 20 61 72 65 20 44 45 4c 45 54 45 20  here are DELETE 
cb00: 74 72 69 67 67 65 72 73 20 6f 6e 20 74 68 69 73  triggers on this
cb10: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 20   table and the. 
cb20: 20 20 20 20 20 20 20 2a 2a 20 72 65 63 75 72 73         ** recurs
cb30: 69 76 65 2d 74 72 69 67 67 65 72 73 20 66 6c 61  ive-triggers fla
cb40: 67 20 69 73 20 73 65 74 2c 20 63 61 6c 6c 20 47  g is set, call G
cb50: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
cb60: 28 29 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  () to.        **
cb70: 20 72 65 6d 6f 76 65 20 74 68 65 20 63 6f 6e 66   remove the conf
cb80: 6c 69 63 74 69 6e 67 20 72 6f 77 20 66 72 6f 6d  licting row from
cb90: 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 69 73   the table. This
cba0: 20 77 69 6c 6c 20 66 69 72 65 0a 20 20 20 20 20   will fire.     
cbb0: 20 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65     ** the trigge
cbc0: 72 73 20 61 6e 64 20 72 65 6d 6f 76 65 20 62 6f  rs and remove bo
cbd0: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  th the table and
cbe0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e   index b-tree en
cbf0: 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
cc00: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  *.        ** Oth
cc10: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
cc20: 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73   are no triggers
cc30: 20 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76   or the recursiv
cc40: 65 2d 74 72 69 67 67 65 72 73 0a 20 20 20 20 20  e-triggers.     
cc50: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 6e 6f     ** flag is no
cc60: 74 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 74  t set, but the t
cc70: 61 62 6c 65 20 68 61 73 20 6f 6e 65 20 6f 72 20  able has one or 
cc80: 6d 6f 72 65 20 69 6e 64 65 78 65 73 2c 20 63 61  more indexes, ca
cc90: 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 47  ll .        ** G
cca0: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
ccb0: 65 6c 65 74 65 28 29 2e 20 54 68 69 73 20 72 65  elete(). This re
ccc0: 6d 6f 76 65 73 20 74 68 65 20 69 6e 64 65 78 20  moves the index 
ccd0: 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73 20 0a  b-tree entries .
cce0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 2e          ** only.
ccf0: 20 54 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65   The table b-tre
cd00: 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
cd10: 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
cd20: 6e 65 77 20 65 6e 74 72 79 20 0a 20 20 20 20 20  new entry .     
cd30: 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 69 73     ** when it is
cd40: 20 69 6e 73 65 72 74 65 64 2e 20 20 0a 20 20 20   inserted.  .   
cd50: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
cd60: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 47 65 6e  ** If either Gen
cd70: 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 29  erateRowDelete()
cd80: 20 6f 72 20 47 65 6e 65 72 61 74 65 52 6f 77 49   or GenerateRowI
cd90: 6e 64 65 78 44 65 6c 65 74 65 28 29 20 69 73 20  ndexDelete() is 
cda0: 63 61 6c 6c 65 64 2c 0a 20 20 20 20 20 20 20 20  called,.        
cdb0: 2a 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 20 4d  ** also invoke M
cdc0: 75 6c 74 69 57 72 69 74 65 28 29 20 74 6f 20 69  ultiWrite() to i
cdd0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 69  ndicate that thi
cde0: 73 20 56 44 42 45 20 6d 61 79 20 72 65 71 75 69  s VDBE may requi
cdf0: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  re.        ** st
ce00: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
ce10: 20 28 69 66 20 74 68 65 20 73 74 61 74 65 6d 65   (if the stateme
ce20: 6e 74 20 69 73 20 61 62 6f 72 74 65 64 20 61 66  nt is aborted af
ce30: 74 65 72 20 74 68 65 20 64 65 6c 65 74 65 0a 20  ter the delete. 
ce40: 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 73 20         ** takes 
ce50: 70 6c 61 63 65 29 2e 20 45 61 72 6c 69 65 72 20  place). Earlier 
ce60: 76 65 72 73 69 6f 6e 73 20 63 61 6c 6c 65 64 20  versions called 
ce70: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
ce80: 65 28 29 20 72 65 67 61 72 64 6c 65 73 73 2c 0a  e() regardless,.
ce90: 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 62          ** but b
cea0: 65 69 6e 67 20 6d 6f 72 65 20 73 65 6c 65 63 74  eing more select
ceb0: 69 76 65 20 68 65 72 65 20 61 6c 6c 6f 77 73 20  ive here allows 
cec0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 3a  statements like:
ced0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
cee0: 20 20 20 20 2a 2a 20 20 20 52 45 50 4c 41 43 45      **   REPLACE
cef0: 20 49 4e 54 4f 20 74 28 72 6f 77 69 64 29 20 56   INTO t(rowid) V
cf00: 41 4c 55 45 53 28 24 6e 65 77 72 6f 77 69 64 29  ALUES($newrowid)
cf10: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
cf20: 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 77 69      ** to run wi
cf30: 74 68 6f 75 74 20 61 20 73 74 61 74 65 6d 65 6e  thout a statemen
cf40: 74 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  t journal if the
cf50: 72 65 20 61 72 65 20 6e 6f 20 69 6e 64 65 78 65  re are no indexe
cf60: 73 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s on the.       
cf70: 20 2a 2a 20 74 61 62 6c 65 2e 0a 20 20 20 20 20   ** table..     
cf80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 72     */.        Tr
cf90: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
cfa0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
cfb0: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
cfc0: 45 5f 52 65 63 54 72 69 67 67 65 72 73 20 29 7b  E_RecTriggers ){
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
cfe0: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
cff0: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
d000: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45  e, pTab, TK_DELE
d010: 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 0, 0);.     
d020: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d030: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71 6c   pTrigger || sql
d040: 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 70  ite3FkRequired(p
d050: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
d060: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
d070: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
d080: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
d090: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
d0a0: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50  rateRowDelete(pP
d0b0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 54 72 69  arse, pTab, pTri
d0c0: 67 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c 20  gger, iDataCur, 
d0d0: 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20  iIdxCur,.       
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4e              regN
d100: 65 77 44 61 74 61 2c 20 31 2c 20 30 2c 20 4f 45  ewData, 1, 0, OE
d110: 5f 52 65 70 6c 61 63 65 2c 20 31 2c 20 2d 31 29  _Replace, 1, -1)
d120: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d130: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d140: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
d150: 48 4f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 69  HOOK.          i
d160: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
d170: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d180: 20 2f 2a 20 54 68 69 73 20 4f 50 5f 44 65 6c 65   /* This OP_Dele
d190: 74 65 20 6f 70 63 6f 64 65 20 66 69 72 65 73 20  te opcode fires 
d1a0: 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68  the pre-update-h
d1b0: 6f 6f 6b 20 6f 6e 6c 79 2e 20 49 74 20 64 6f 65  ook only. It doe
d1c0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
d1d0: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 20   not modify the 
d1e0: 62 2d 74 72 65 65 2e 20 49 74 20 69 73 20 6d 6f  b-tree. It is mo
d1f0: 72 65 20 65 66 66 69 63 69 65 6e 74 20 74 6f 20  re efficient to 
d200: 6c 65 74 20 74 68 65 20 63 6f 6d 69 6e 67 0a 20  let the coming. 
d210: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 50             ** OP
d220: 5f 49 6e 73 65 72 74 20 72 65 70 6c 61 63 65 20  _Insert replace 
d230: 74 68 65 20 65 78 69 73 74 69 6e 67 20 65 6e 74  the existing ent
d240: 72 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f  ry than it is to
d250: 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
d260: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74          ** exist
d270: 69 6e 67 20 65 6e 74 72 79 20 61 6e 64 20 74 68  ing entry and th
d280: 65 6e 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20  en insert a new 
d290: 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  one. */.        
d2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d2b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp2(v, OP_Dele
d2c0: 74 65 2c 20 69 44 61 74 61 43 75 72 2c 20 4f 50  te, iDataCur, OP
d2d0: 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 3b 0a 20 20  FLAG_ISNOOP);.  
d2e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d2f0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
d300: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 54 61   -1, (char *)pTa
d310: 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20  b, P4_TABLE);.  
d320: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
d330: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
d340: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
d350: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d360: 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 29  ( pTab->pIndex )
d370: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
d380: 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
d390: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
d3b0: 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65  rateRowIndexDele
d3c0: 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  te(pParse, pTab,
d3d0: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
d3e0: 75 72 2c 30 2c 2d 31 29 3b 0a 20 20 20 20 20 20  ur,0,-1);.      
d3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d400: 20 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c          seenRepl
d410: 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
d420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d430: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
d440: 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  nore: {.        
d450: 2f 2a 61 73 73 65 72 74 28 20 73 65 65 6e 52 65  /*assert( seenRe
d460: 70 6c 61 63 65 3d 3d 30 20 29 3b 2a 2f 0a 20 20  place==0 );*/.  
d470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d480: 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72 65 44  eGoto(v, ignoreD
d490: 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  est);.        br
d4a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d4b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
d4c0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d4d0: 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b 29 3b 0a  , addrRowidOk);.
d4e0: 20 20 20 20 69 66 28 20 69 70 6b 54 6f 70 20 29      if( ipkTop )
d4f0: 7b 0a 20 20 20 20 20 20 69 70 6b 42 6f 74 74 6f  {.      ipkBotto
d500: 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  m = sqlite3VdbeA
d510: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
d520: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d530: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d540: 69 70 6b 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  ipkTop);.    }. 
d550: 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c   }..  /* Test al
d560: 6c 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  l UNIQUE constra
d570: 69 6e 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  ints by creating
d580: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
d590: 68 20 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e  h UNIQUE.  ** in
d5a0: 64 65 78 20 61 6e 64 20 6d 61 6b 69 6e 67 20 73  dex and making s
d5b0: 75 72 65 20 74 68 61 74 20 64 75 70 6c 69 63 61  ure that duplica
d5c0: 74 65 20 65 6e 74 72 69 65 73 20 64 6f 20 6e 6f  te entries do no
d5d0: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
d5e0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
d5f0: 65 20 72 65 76 69 73 65 64 20 72 65 63 6f 72 64  e revised record
d600: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 69 6e 64   entries for ind
d610: 69 63 65 73 20 61 73 20 77 65 20 67 6f 2e 0a 20  ices as we go.. 
d620: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
d630: 6f 70 20 61 6c 73 6f 20 68 61 6e 64 6c 65 73 20  op also handles 
d640: 74 68 65 20 63 61 73 65 20 6f 66 20 74 68 65 20  the case of the 
d650: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
d660: 78 20 66 6f 72 20 61 0a 20 20 2a 2a 20 57 49 54  x for a.  ** WIT
d670: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d680: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 78 3d  ..  */.  for(ix=
d690: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
d6a0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
d6b0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 78  =pIdx->pNext, ix
d6c0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  ++){.    int reg
d6d0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx;          /*
d6e0: 20 52 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   Range of regist
d6f0: 65 72 73 20 68 6f 6c 64 20 63 6f 6e 65 6e 74 20  ers hold conent 
d700: 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20  for pIdx */.    
d710: 69 6e 74 20 72 65 67 52 3b 20 20 20 20 20 20 20  int regR;       
d720: 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66       /* Range of
d730: 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
d740: 6e 67 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 50  ng conflicting P
d750: 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 68  K */.    int iTh
d760: 69 73 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a  isCur;        /*
d770: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73   Cursor for this
d780: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f   UNIQUE index */
d790: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 55 6e 69  .    int addrUni
d7a0: 71 75 65 4f 6b 3b 20 20 20 20 2f 2a 20 4a 75 6d  queOk;    /* Jum
d7b0: 70 20 68 65 72 65 20 69 66 20 74 68 65 20 55 4e  p here if the UN
d7c0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
d7d0: 69 73 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a  is satisfied */.
d7e0: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
d7f0: 5b 69 78 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  [ix]==0 ) contin
d800: 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20 69 6e 64  ue;  /* Skip ind
d810: 69 63 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ices that do not
d820: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 69   change */.    i
d830: 66 28 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65  f( bAffinityDone
d840: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
d850: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
d860: 79 28 76 2c 20 70 54 61 62 2c 20 72 65 67 4e 65  y(v, pTab, regNe
d870: 77 44 61 74 61 2b 31 29 3b 0a 20 20 20 20 20 20  wData+1);.      
d880: 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20  bAffinityDone = 
d890: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 68  1;.    }.    iTh
d8a0: 69 73 43 75 72 20 3d 20 69 49 64 78 43 75 72 2b  isCur = iIdxCur+
d8b0: 69 78 3b 0a 20 20 20 20 61 64 64 72 55 6e 69 71  ix;.    addrUniq
d8c0: 75 65 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  ueOk = sqlite3Vd
d8d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
d8e0: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 72  .    /* Skip par
d8f0: 74 69 61 6c 20 69 6e 64 69 63 65 73 20 66 6f 72  tial indices for
d900: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
d910: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 74   clause is not t
d920: 72 75 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rue */.    if( p
d930: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
d940: 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  re ){.      sqli
d950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d960: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 61 52 65   OP_Null, 0, aRe
d970: 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20 20  gIdx[ix]);.     
d980: 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 20   pParse->ckBase 
d990: 3d 20 72 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a  = regNewData+1;.
d9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d9b0: 72 49 66 46 61 6c 73 65 44 75 70 28 70 50 61 72  rIfFalseDup(pPar
d9c0: 73 65 2c 20 70 49 64 78 2d 3e 70 50 61 72 74 49  se, pIdx->pPartI
d9d0: 64 78 57 68 65 72 65 2c 20 61 64 64 72 55 6e 69  dxWhere, addrUni
d9e0: 71 75 65 4f 6b 2c 0a 20 20 20 20 20 20 20 20 20  queOk,.         
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46     SQLITE_JUMPIF
da10: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 50 61  NULL);.      pPa
da20: 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 30 3b  rse->ckBase = 0;
da30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
da40: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
da50: 6f 72 20 74 68 69 73 20 69 6e 64 65 78 20 65 6e  or this index en
da60: 74 72 79 20 61 73 20 69 74 20 73 68 6f 75 6c 64  try as it should
da70: 20 61 70 70 65 61 72 20 61 66 74 65 72 0a 20 20   appear after.  
da80: 20 20 2a 2a 20 74 68 65 20 69 6e 73 65 72 74 20    ** the insert 
da90: 6f 72 20 75 70 64 61 74 65 2e 20 20 53 74 6f 72  or update.  Stor
daa0: 65 20 74 68 61 74 20 72 65 63 6f 72 64 20 69 6e  e that record in
dab0: 20 74 68 65 20 61 52 65 67 49 64 78 5b 69 78 5d   the aRegIdx[ix]
dac0: 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 2a 2f   register.    */
dad0: 0a 20 20 20 20 72 65 67 49 64 78 20 3d 20 73 71  .    regIdx = sq
dae0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
daf0: 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  e(pParse, pIdx->
db00: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 66 6f  nColumn);.    fo
db10: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
db20: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
db30: 20 20 20 20 69 6e 74 20 69 46 69 65 6c 64 20 3d      int iField =
db40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
db50: 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b  i];.      int x;
db60: 0a 20 20 20 20 20 20 69 66 28 20 69 46 69 65 6c  .      if( iFiel
db70: 64 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20  d==XN_EXPR ){.  
db80: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b        pParse->ck
db90: 42 61 73 65 20 3d 20 72 65 67 4e 65 77 44 61 74  Base = regNewDat
dba0: 61 2b 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  a+1;.        sql
dbb0: 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
dbc0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
dbd0: 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45  ColExpr->a[i].pE
dbe0: 78 70 72 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a  xpr, regIdx+i);.
dbf0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
dc00: 63 6b 42 61 73 65 20 3d 20 30 3b 0a 20 20 20 20  ckBase = 0;.    
dc10: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
dc20: 28 76 2c 20 22 25 73 20 63 6f 6c 75 6d 6e 20 25  (v, "%s column %
dc30: 64 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  d", pIdx->zName,
dc40: 20 69 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   i));.      }els
dc50: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  e{.        if( i
dc60: 46 69 65 6c 64 3d 3d 58 4e 5f 52 4f 57 49 44 20  Field==XN_ROWID 
dc70: 7c 7c 20 69 46 69 65 6c 64 3d 3d 70 54 61 62 2d  || iField==pTab-
dc80: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
dc90: 20 20 20 20 69 66 28 20 72 65 67 52 6f 77 69 64      if( regRowid
dca0: 3d 3d 72 65 67 49 64 78 2b 69 20 29 20 63 6f 6e  ==regIdx+i ) con
dcb0: 74 69 6e 75 65 3b 20 2f 2a 20 52 4f 57 49 44 20  tinue; /* ROWID 
dcc0: 61 6c 72 65 61 64 79 20 69 6e 20 72 65 67 49 64  already in regId
dcd0: 78 2b 69 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x+i */.         
dce0: 20 78 20 3d 20 72 65 67 4e 65 77 44 61 74 61 3b   x = regNewData;
dcf0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f  .          regRo
dd00: 77 69 64 20 3d 20 20 70 49 64 78 2d 3e 70 50 61  wid =  pIdx->pPa
dd10: 72 74 49 64 78 57 68 65 72 65 20 3f 20 2d 31 20  rtIdxWhere ? -1 
dd20: 3a 20 72 65 67 49 64 78 2b 69 3b 0a 20 20 20 20  : regIdx+i;.    
dd30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dd40: 20 20 20 20 20 78 20 3d 20 69 46 69 65 6c 64 20       x = iField 
dd50: 2b 20 72 65 67 4e 65 77 44 61 74 61 20 2b 20 31  + regNewData + 1
dd60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dd80: 64 64 4f 70 32 28 76 2c 20 69 46 69 65 6c 64 3c  ddOp2(v, iField<
dd90: 30 20 3f 20 4f 50 5f 49 6e 74 43 6f 70 79 20 3a  0 ? OP_IntCopy :
dda0: 20 4f 50 5f 53 43 6f 70 79 2c 20 78 2c 20 72 65   OP_SCopy, x, re
ddb0: 67 49 64 78 2b 69 29 3b 0a 20 20 20 20 20 20 20  gIdx+i);.       
ddc0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
ddd0: 20 22 25 73 22 2c 20 69 46 69 65 6c 64 3c 30 20   "%s", iField<0 
dde0: 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 54 61 62  ? "rowid" : pTab
ddf0: 2d 3e 61 43 6f 6c 5b 69 46 69 65 6c 64 5d 2e 7a  ->aCol[iField].z
de00: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
de10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
de20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
de30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
de40: 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  gIdx, pIdx->nCol
de50: 75 6d 6e 2c 20 61 52 65 67 49 64 78 5b 69 78 5d  umn, aRegIdx[ix]
de60: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
de70: 6e 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c  nt((v, "for %s",
de80: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
de90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
dea0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
deb0: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 49 64  ge(pParse, regId
dec0: 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  x, pIdx->nColumn
ded0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 61 6e  );..    /* In an
dee0: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
def0: 6e 2c 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  n, if this index
df00: 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
df10: 4b 45 59 20 69 6e 64 65 78 20 0a 20 20 20 20 2a  KEY index .    *
df20: 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  * of a WITHOUT R
df30: 4f 57 49 44 20 74 61 62 6c 65 20 61 6e 64 20 74  OWID table and t
df40: 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
df50: 20 63 68 61 6e 67 65 20 74 68 65 0a 20 20 20 20   change the.    
df60: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  ** primary key, 
df70: 74 68 65 6e 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f  then no collisio
df80: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 20 20  n is possible.  
df90: 54 68 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65  The collision de
dfa0: 74 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c  tection.    ** l
dfb0: 6f 67 69 63 20 62 65 6c 6f 77 20 63 61 6e 20 61  ogic below can a
dfc0: 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 2a  ll be skipped. *
dfd0: 2f 0a 20 20 20 20 69 66 28 20 69 73 55 70 64 61  /.    if( isUpda
dfe0: 74 65 20 26 26 20 70 50 6b 3d 3d 70 49 64 78 20  te && pPk==pIdx 
dff0: 26 26 20 70 6b 43 68 6e 67 3d 3d 30 20 29 7b 0a  && pkChng==0 ){.
e000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e010: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e020: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a   addrUniqueOk);.
e030: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e040: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
e050: 6e 64 20 6f 75 74 20 77 68 61 74 20 61 63 74 69  nd out what acti
e060: 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61  on to take in ca
e070: 73 65 20 74 68 65 72 65 20 69 73 20 61 20 75 6e  se there is a un
e080: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
e090: 74 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72  t */.    onError
e0a0: 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   = pIdx->onError
e0b0: 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  ;.    if( onErro
e0c0: 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 20 0a 20  r==OE_None ){ . 
e0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
e0e0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
e0f0: 72 73 65 2c 20 72 65 67 49 64 78 2c 20 70 49 64  rse, regIdx, pId
e100: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  x->nColumn);.   
e110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e120: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
e130: 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20  drUniqueOk);.   
e140: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
e150: 20 70 49 64 78 20 69 73 20 6e 6f 74 20 61 20 55   pIdx is not a U
e160: 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20  NIQUE index */. 
e170: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 76 65     }.    if( ove
e180: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
e190: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
e1a0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69  onError = overri
e1b0: 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  deError;.    }el
e1c0: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
e1d0: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
e1e0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
e1f0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
e200: 20 20 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20    .    /* Check 
e210: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 6e 65  to see if the ne
e220: 77 20 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69  w index entry wi
e230: 6c 6c 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  ll be unique */.
e240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e250: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
e260: 6f 43 6f 6e 66 6c 69 63 74 2c 20 69 54 68 69 73  oConflict, iThis
e270: 43 75 72 2c 20 61 64 64 72 55 6e 69 71 75 65 4f  Cur, addrUniqueO
e280: 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
e290: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 49              regI
e2a0: 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  dx, pIdx->nKeyCo
e2b0: 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
e2c0: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  (v);..    /* Gen
e2d0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
e2e0: 6e 64 6c 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  ndle collisions 
e2f0: 2a 2f 0a 20 20 20 20 72 65 67 52 20 3d 20 28 70  */.    regR = (p
e300: 49 64 78 3d 3d 70 50 6b 29 20 3f 20 72 65 67 49  Idx==pPk) ? regI
e310: 64 78 20 3a 20 73 71 6c 69 74 65 33 47 65 74 54  dx : sqlite3GetT
e320: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
e330: 20 6e 50 6b 46 69 65 6c 64 29 3b 0a 20 20 20 20   nPkField);.    
e340: 69 66 28 20 69 73 55 70 64 61 74 65 20 7c 7c 20  if( isUpdate || 
e350: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
e360: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ace ){.      if(
e370: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
e380: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e3a0: 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 54 68  OP_IdxRowid, iTh
e3b0: 69 73 43 75 72 2c 20 72 65 67 52 29 3b 0a 20 20  isCur, regR);.  
e3c0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
e3d0: 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 72 6f  t only if the ro
e3e0: 77 69 64 20 6f 66 20 74 68 65 20 65 78 69 73 74  wid of the exist
e3f0: 69 6e 67 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  ing index entry.
e400: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 64 69          ** is di
e410: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 6f 6c 64  fferent from old
e420: 2d 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 20 20  -rowid */.      
e430: 20 20 69 66 28 20 69 73 55 70 64 61 74 65 20 29    if( isUpdate )
e440: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e450: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e460: 20 4f 50 5f 45 71 2c 20 72 65 67 52 2c 20 61 64   OP_Eq, regR, ad
e470: 64 72 55 6e 69 71 75 65 4f 6b 2c 20 72 65 67 4f  drUniqueOk, regO
e480: 6c 64 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  ldData);.       
e490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e4a0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
e4b0: 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
e4c0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
e4d0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
e4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4f0: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
e500: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
e510: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
e520: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
e530: 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 61  he index entry a
e540: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
e550: 6f 72 65 20 69 74 20 69 6e 20 72 65 67 69 73 74  ore it in regist
e560: 65 72 73 20 72 65 67 52 2e 2e 72 65 67 52 2b 6e  ers regR..regR+n
e570: 50 6b 2d 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  Pk-1 */.        
e580: 69 66 28 20 70 49 64 78 21 3d 70 50 6b 20 29 7b  if( pIdx!=pPk ){
e590: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
e5a0: 3d 30 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; i<pPk->nKeyC
e5b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
e5d0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  k->aiColumn[i]>=
e5e0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
e5f0: 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
e600: 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
e610: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e620: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
e630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e640: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
e650: 54 68 69 73 43 75 72 2c 20 78 2c 20 72 65 67 52  ThisCur, x, regR
e660: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
e670: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e680: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
e690: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
e6c0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61  aiColumn[i]].zNa
e6d0: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
e6e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
e6f0: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
e700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
e710: 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   If currently pr
e720: 6f 63 65 73 73 69 6e 67 20 74 68 65 20 50 52 49  ocessing the PRI
e730: 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 20 57 49  MARY KEY of a WI
e740: 54 48 4f 55 54 20 52 4f 57 49 44 20 0a 20 20 20  THOUT ROWID .   
e750: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c         ** table,
e760: 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69   only conflict i
e770: 66 20 74 68 65 20 6e 65 77 20 50 52 49 4d 41 52  f the new PRIMAR
e780: 59 20 4b 45 59 20 76 61 6c 75 65 73 20 61 72 65  Y KEY values are
e790: 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 20 20   actually.      
e7a0: 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74      ** different
e7b0: 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 20   from the old.. 
e7c0: 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
e7d0: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 55        ** For a U
e7e0: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 6f 6e 6c  NIQUE index, onl
e7f0: 79 20 63 6f 6e 66 6c 69 63 74 20 69 66 20 74 68  y conflict if th
e800: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61  e PRIMARY KEY va
e810: 6c 75 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lues.          *
e820: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 65 64  * of the matched
e830: 20 69 6e 64 65 78 20 72 6f 77 20 61 72 65 20 64   index row are d
e840: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
e850: 65 20 6f 72 69 67 69 6e 61 6c 20 50 52 49 4d 41  e original PRIMA
e860: 52 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  RY.          ** 
e870: 4b 45 59 20 76 61 6c 75 65 73 20 6f 66 20 74 68  KEY values of th
e880: 69 73 20 72 6f 77 20 62 65 66 6f 72 65 20 74 68  is row before th
e890: 65 20 75 70 64 61 74 65 2e 20 20 2a 2f 0a 20 20  e update.  */.  
e8a0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
e8b0: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
e8c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e8d0: 2b 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  +pPk->nKeyCol;. 
e8e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
e8f0: 3d 20 4f 50 5f 4e 65 3b 0a 20 20 20 20 20 20 20  = OP_Ne;.       
e900: 20 20 20 69 6e 74 20 72 65 67 43 6d 70 20 3d 20     int regCmp = 
e910: 28 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  (IsPrimaryKeyInd
e920: 65 78 28 70 49 64 78 29 20 3f 20 72 65 67 49 64  ex(pIdx) ? regId
e930: 78 20 3a 20 72 65 67 52 29 3b 0a 20 20 0a 20 20  x : regR);.  .  
e940: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e950: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
e960: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e970: 20 20 20 63 68 61 72 20 2a 70 34 20 3d 20 28 63     char *p4 = (c
e980: 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61  har*)sqlite3Loca
e990: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
e9a0: 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  , pPk->azColl[i]
e9b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
e9c0: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
e9d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
e9e0: 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b   assert( x>=0 );
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
ea00: 20 69 3d 3d 28 70 50 6b 2d 3e 6e 4b 65 79 43 6f   i==(pPk->nKeyCo
ea10: 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l-1) ){.        
ea20: 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d        addrJump =
ea30: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 3b 0a 20   addrUniqueOk;. 
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 20               op 
ea50: 3d 20 4f 50 5f 45 71 3b 0a 20 20 20 20 20 20 20  = OP_Eq;.       
ea60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ea70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ea80: 64 4f 70 34 28 76 2c 20 6f 70 2c 20 0a 20 20 20  dOp4(v, op, .   
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
eaa0: 4f 6c 64 44 61 74 61 2b 31 2b 78 2c 20 61 64 64  OldData+1+x, add
eab0: 72 4a 75 6d 70 2c 20 72 65 67 43 6d 70 2b 69 2c  rJump, regCmp+i,
eac0: 20 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 0a   p4, P4_COLLSEQ.
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
eae0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eaf0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
eb00: 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c  , SQLITE_NOTNULL
eb10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
eb20: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
eb30: 20 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20   op==OP_Eq);.   
eb40: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
eb50: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
eb60: 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  P_Ne);.         
eb70: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
eb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
eb90: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
eba0: 20 74 68 61 74 20 65 78 65 63 75 74 65 73 20 69   that executes i
ebb0: 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20  f the new index 
ebc0: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 75 6e 69  entry is not uni
ebd0: 71 75 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  que */.    asser
ebe0: 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  t( onError==OE_R
ebf0: 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72  ollback || onErr
ec00: 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20  or==OE_Abort || 
ec10: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c  onError==OE_Fail
ec20: 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72  .        || onEr
ec30: 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c  ror==OE_Ignore |
ec40: 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  | onError==OE_Re
ec50: 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69  place );.    swi
ec60: 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a  tch( onError ){.
ec70: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
ec80: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61  llback:.      ca
ec90: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20  se OE_Abort:.   
eca0: 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
ecb0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
ecc0: 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
ecd0: 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72  nt(pParse, onErr
ece0: 6f 72 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  or, pIdx);.     
ecf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ed00: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  }.      case OE_
ed10: 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20  Ignore: {.      
ed20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
ed30: 6f 28 76 2c 20 69 67 6e 6f 72 65 44 65 73 74 29  o(v, ignoreDest)
ed40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ed50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
ed60: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
ed70: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
ed80: 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ger = 0;.       
ed90: 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72   assert( onError
eda0: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a  ==OE_Replace );.
edb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
edc0: 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65  ultiWrite(pParse
edd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
ede0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
edf0: 52 65 63 54 72 69 67 67 65 72 73 20 29 7b 0a 20  RecTriggers ){. 
ee00: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
ee10: 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
ee20: 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c  ersExist(pParse,
ee30: 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45   pTab, TK_DELETE
ee40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
ee50: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
ee60: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
ee70: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
ee80: 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74  , pTrigger, iDat
ee90: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
eea0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 2c             regR,
eeb0: 20 6e 50 6b 46 69 65 6c 64 2c 20 30 2c 20 4f 45   nPkField, 0, OE
eec0: 5f 52 65 70 6c 61 63 65 2c 0a 20 20 20 20 20 20  _Replace,.      
eed0: 20 20 20 20 20 20 28 70 49 64 78 3d 3d 70 50 6b        (pIdx==pPk
eee0: 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c   ? ONEPASS_SINGL
eef0: 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4f 46 46 29  E : ONEPASS_OFF)
ef00: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , -1);.        s
ef10: 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a  eenReplace = 1;.
ef20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ef40: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ef50: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
ef60: 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 73  UniqueOk);.    s
ef70: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ef80: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
ef90: 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f  egIdx, pIdx->nCo
efa0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20 72  lumn);.    if( r
efb0: 65 67 52 21 3d 72 65 67 49 64 78 20 29 20 73 71  egR!=regIdx ) sq
efc0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
efd0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
efe0: 67 52 2c 20 6e 50 6b 46 69 65 6c 64 29 3b 0a 20  gR, nPkField);. 
eff0: 20 7d 0a 20 20 69 66 28 20 69 70 6b 54 6f 70 20   }.  if( ipkTop 
f000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f010: 62 65 47 6f 74 6f 28 76 2c 20 69 70 6b 54 6f 70  beGoto(v, ipkTop
f020: 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
f030: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f040: 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a 20 20 7d 0a  ipkBottom);.  }.
f050: 20 20 0a 20 20 2a 70 62 4d 61 79 52 65 70 6c 61    .  *pbMayRepla
f060: 63 65 20 3d 20 73 65 65 6e 52 65 70 6c 61 63 65  ce = seenReplace
f070: 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  ;.  VdbeModuleCo
f080: 6d 6d 65 6e 74 28 28 76 2c 20 22 45 4e 44 3a 20  mment((v, "END: 
f090: 47 65 6e 43 6e 73 74 43 6b 73 28 25 64 29 22 2c  GenCnstCks(%d)",
f0a0: 20 73 65 65 6e 52 65 70 6c 61 63 65 29 29 3b 0a   seenReplace));.
f0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
f0c0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
f0d0: 63 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20 74  code to finish t
f0e0: 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44  he INSERT or UPD
f0f0: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  ATE operation.**
f100: 20 74 68 61 74 20 77 61 73 20 73 74 61 72 74 65   that was starte
f110: 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c  d by a prior cal
f120: 6c 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65  l to sqlite3Gene
f130: 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
f140: 65 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65  ecks..** A conse
f150: 63 75 74 69 76 65 20 72 61 6e 67 65 20 6f 66 20  cutive range of 
f160: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
f170: 6e 67 20 61 74 20 72 65 67 4e 65 77 44 61 74 61  ng at regNewData
f180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a   contains the.**
f190: 20 72 6f 77 69 64 20 61 6e 64 20 74 68 65 20 63   rowid and the c
f1a0: 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 69 6e 73  ontent to be ins
f1b0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erted..**.** The
f1c0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
f1d0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
f1e0: 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
f1f0: 20 74 68 65 20 66 69 72 73 74 20 73 69 78 0a 2a   the first six.*
f200: 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 73  * arguments to s
f210: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
f220: 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 2e 0a  nstraintChecks..
f230: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
f240: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
f250: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f260: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
f270: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
f280: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
f290: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 74 61         /* the ta
f2a0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
f2b0: 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20  e are inserting 
f2c0: 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75  */.  int iDataCu
f2d0: 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73  r,       /* Curs
f2e0: 6f 72 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  or of the canoni
f2f0: 63 61 6c 20 64 61 74 61 20 73 6f 75 72 63 65 20  cal data source 
f300: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72  */.  int iIdxCur
f310: 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ,        /* Firs
f320: 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a  t index cursor *
f330: 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44 61  /.  int regNewDa
f340: 74 61 2c 20 20 20 20 20 2f 2a 20 52 61 6e 67 65  ta,     /* Range
f350: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
f360: 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c 20 20   int *aRegIdx,  
f370: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
f380: 20 75 73 65 64 20 62 79 20 65 61 63 68 20 69 6e   used by each in
f390: 64 65 78 2e 20 20 30 20 66 6f 72 20 75 6e 75 73  dex.  0 for unus
f3a0: 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ed indices */.  
f3b0: 69 6e 74 20 69 73 55 70 64 61 74 65 2c 20 20 20  int isUpdate,   
f3c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
f3d0: 55 50 44 41 54 45 2c 20 46 61 6c 73 65 20 66 6f  UPDATE, False fo
f3e0: 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69 6e  r INSERT */.  in
f3f0: 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20  t appendBias,   
f400: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
f410: 73 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62  s is likely to b
f420: 65 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e an append */. 
f430: 20 69 6e 74 20 75 73 65 53 65 65 6b 52 65 73 75   int useSeekResu
f440: 6c 74 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  lt   /* True to 
f450: 73 65 74 20 74 68 65 20 55 53 45 53 45 45 4b 52  set the USESEEKR
f460: 45 53 55 4c 54 20 66 6c 61 67 20 6f 6e 20 4f 50  ESULT flag on OP
f470: 5f 5b 49 64 78 5d 49 6e 73 65 72 74 20 2a 2f 0a  _[Idx]Insert */.
f480: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  ){.  Vdbe *v;   
f490: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70           /* Prep
f4a0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
f4b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
f4c0: 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  on */.  Index *p
f4d0: 49 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  Idx;        /* A
f4e0: 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 69 6e  n index being in
f4f0: 73 65 72 74 65 64 20 6f 72 20 75 70 64 61 74 65  serted or update
f500: 64 20 2a 2f 0a 20 20 75 38 20 70 69 6b 5f 66 6c  d */.  u8 pik_fl
f510: 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 66 6c  ags;       /* fl
f520: 61 67 20 76 61 6c 75 65 73 20 70 61 73 73 65 64  ag values passed
f530: 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69 6e   to the btree in
f540: 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sert */.  int re
f550: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a  gData;        /*
f560: 20 43 6f 6e 74 65 6e 74 20 72 65 67 69 73 74 65   Content registe
f570: 72 73 20 28 61 66 74 65 72 20 74 68 65 20 72 6f  rs (after the ro
f580: 77 69 64 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65  wid) */.  int re
f590: 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  gRec;         /*
f5a0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
f5b0: 67 20 61 73 73 65 6d 62 6c 65 64 20 72 65 63 6f  g assembled reco
f5c0: 72 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  rd for the table
f5d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
f5f0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
f600: 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20  8 bAffinityDone 
f610: 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
f620: 4f 50 5f 41 66 66 69 6e 69 74 79 20 68 61 73 20  OP_Affinity has 
f630: 62 65 65 6e 20 72 75 6e 20 61 6c 72 65 61 64 79  been run already
f640: 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74   */..  v = sqlit
f650: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f660: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
f670: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f680: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
f690: 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c  );  /* This tabl
f6a0: 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20  e is not a VIEW 
f6b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  */.  for(i=0, pI
f6c0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f6d0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f6e0: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
f6f0: 20 20 20 69 66 28 20 61 52 65 67 49 64 78 5b 69     if( aRegIdx[i
f700: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
f710: 0a 20 20 20 20 62 41 66 66 69 6e 69 74 79 44 6f  .    bAffinityDo
f720: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ne = 1;.    if( 
f730: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
f740: 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ere ){.      sql
f750: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f760: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 61 52 65  , OP_IsNull, aRe
f770: 67 49 64 78 5b 69 5d 2c 20 73 71 6c 69 74 65 33  gIdx[i], sqlite3
f780: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f790: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  v)+2);.      Vdb
f7a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f7b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
f7c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f7d0: 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 43  IdxInsert, iIdxC
f7e0: 75 72 2b 69 2c 20 61 52 65 67 49 64 78 5b 69 5d  ur+i, aRegIdx[i]
f7f0: 29 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  );.    pik_flags
f800: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 75 73   = 0;.    if( us
f810: 65 53 65 65 6b 52 65 73 75 6c 74 20 29 20 70 69  eSeekResult ) pi
f820: 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47  k_flags = OPFLAG
f830: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a  _USESEEKRESULT;.
f840: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
f850: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
f860: 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  && !HasRowid(pTa
f870: 62 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  b) ){.      asse
f880: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
f890: 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ed==0 );.      p
f8a0: 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c  ik_flags |= OPFL
f8b0: 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20  AG_NCHANGE;.    
f8c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
f8d0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 69 6b  eChangeP5(v, pik
f8e0: 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69  _flags);.  }.  i
f8f0: 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
f900: 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72  b) ) return;.  r
f910: 65 67 44 61 74 61 20 3d 20 72 65 67 4e 65 77 44  egData = regNewD
f920: 61 74 61 20 2b 20 31 3b 0a 20 20 72 65 67 52 65  ata + 1;.  regRe
f930: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
f940: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
f950: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f960: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
f970: 6f 72 64 2c 20 72 65 67 44 61 74 61 2c 20 70 54  ord, regData, pT
f980: 61 62 2d 3e 6e 43 6f 6c 2c 20 72 65 67 52 65 63  ab->nCol, regRec
f990: 29 3b 0a 20 20 69 66 28 20 21 62 41 66 66 69 6e  );.  if( !bAffin
f9a0: 69 74 79 44 6f 6e 65 20 29 20 73 71 6c 69 74 65  ityDone ) sqlite
f9b0: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
f9c0: 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 73 71  , pTab, 0);.  sq
f9d0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
f9e0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
f9f0: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 70 54  rse, regData, pT
fa00: 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  ab->nCol);.  if(
fa10: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20   pParse->nested 
fa20: 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  ){.    pik_flags
fa30: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
fa40: 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 4f     pik_flags = O
fa50: 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20  PFLAG_NCHANGE;. 
fa60: 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20     pik_flags |= 
fa70: 28 69 73 55 70 64 61 74 65 3f 4f 50 46 4c 41 47  (isUpdate?OPFLAG
fa80: 5f 49 53 55 50 44 41 54 45 3a 4f 50 46 4c 41 47  _ISUPDATE:OPFLAG
fa90: 5f 4c 41 53 54 52 4f 57 49 44 29 3b 0a 20 20 7d  _LASTROWID);.  }
faa0: 0a 20 20 69 66 28 20 61 70 70 65 6e 64 42 69 61  .  if( appendBia
fab0: 73 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  s ){.    pik_fla
fac0: 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 41 50 50  gs |= OPFLAG_APP
fad0: 45 4e 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  END;.  }.  if( u
fae0: 73 65 53 65 65 6b 52 65 73 75 6c 74 20 29 7b 0a  seSeekResult ){.
faf0: 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d      pik_flags |=
fb00: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
fb10: 45 53 55 4c 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  ESULT;.  }.  sql
fb20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fb30: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 44 61  , OP_Insert, iDa
fb40: 74 61 43 75 72 2c 20 72 65 67 52 65 63 2c 20 72  taCur, regRec, r
fb50: 65 67 4e 65 77 44 61 74 61 29 3b 0a 20 20 69 66  egNewData);.  if
fb60: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
fb70: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
fb80: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
fb90: 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 54 61 62  -1, (char *)pTab
fba0: 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 7d  , P4_TABLE);.  }
fbb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
fbc0: 61 6e 67 65 50 35 28 76 2c 20 70 69 6b 5f 66 6c  angeP5(v, pik_fl
fbd0: 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
fbe0: 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
fbf0: 66 6f 72 20 74 68 65 20 70 54 61 62 20 74 61 62  for the pTab tab
fc00: 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 69  le and all its i
fc10: 6e 64 69 63 65 73 20 61 6e 64 20 67 65 6e 65 72  ndices and gener
fc20: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6f  ate.** code to o
fc30: 70 65 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  pen and initiali
fc40: 7a 65 64 20 74 68 6f 73 65 20 63 75 72 73 6f 72  zed those cursor
fc50: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  s..**.** The cur
fc60: 73 6f 72 20 66 6f 72 20 74 68 65 20 6f 62 6a 65  sor for the obje
fc70: 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ct that contains
fc80: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 64 61   the complete da
fc90: 74 61 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  ta (normally.** 
fca0: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
fcb0: 2c 20 62 75 74 20 74 68 65 20 50 52 49 4d 41 52  , but the PRIMAR
fcc0: 59 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20 74  Y KEY index in t
fcd0: 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  he case of a WIT
fce0: 48 4f 55 54 0a 2a 2a 20 52 4f 57 49 44 20 74 61  HOUT.** ROWID ta
fcf0: 62 6c 65 29 20 69 73 20 72 65 74 75 72 6e 65 64  ble) is returned
fd00: 20 69 6e 20 2a 70 69 44 61 74 61 43 75 72 2e 20   in *piDataCur. 
fd10: 20 54 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   The first index
fd20: 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 72 65   cursor is.** re
fd30: 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 49 64 78  turned in *piIdx
fd40: 43 75 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  Cur.  The number
fd50: 20 6f 66 20 69 6e 64 69 63 65 73 20 69 73 20 72   of indices is r
fd60: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  eturned..**.** U
fd70: 73 65 20 69 42 61 73 65 20 61 73 20 74 68 65 20  se iBase as the 
fd80: 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 65 69  first cursor (ei
fd90: 74 68 65 72 20 74 68 65 20 2a 70 69 44 61 74 61  ther the *piData
fda0: 43 75 72 20 66 6f 72 20 72 6f 77 69 64 20 74 61  Cur for rowid ta
fdb0: 62 6c 65 73 0a 2a 2a 20 6f 72 20 74 68 65 20 66  bles.** or the f
fdc0: 69 72 73 74 20 69 6e 64 65 78 20 66 6f 72 20 57  irst index for W
fdd0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
fde0: 6c 65 73 29 20 69 66 20 69 74 20 69 73 20 6e 6f  les) if it is no
fdf0: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 49  n-negative..** I
fe00: 66 20 69 42 61 73 65 20 69 73 20 6e 65 67 61 74  f iBase is negat
fe10: 69 76 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  ive, then alloca
fe20: 74 65 20 74 68 65 20 6e 65 78 74 20 61 76 61 69  te the next avai
fe30: 6c 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  lable cursor..**
fe40: 0a 2a 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20  .** For a rowid 
fe50: 74 61 62 6c 65 2c 20 2a 70 69 44 61 74 61 43 75  table, *piDataCu
fe60: 72 20 77 69 6c 6c 20 62 65 20 65 78 61 63 74 6c  r will be exactl
fe70: 79 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20  y one less than 
fe80: 2a 70 69 49 64 78 43 75 72 2e 0a 2a 2a 20 46 6f  *piIdxCur..** Fo
fe90: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
fea0: 44 20 74 61 62 6c 65 2c 20 2a 70 69 44 61 74 61  D table, *piData
feb0: 43 75 72 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65  Cur will be some
fec0: 77 68 65 72 65 20 69 6e 20 74 68 65 20 72 61 6e  where in the ran
fed0: 67 65 0a 2a 2a 20 6f 66 20 2a 70 69 49 64 78 43  ge.** of *piIdxC
fee0: 75 72 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  urs, depending o
fef0: 6e 20 77 68 65 72 65 20 74 68 65 20 50 52 49 4d  n where the PRIM
ff00: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 61 70  ARY KEY index ap
ff10: 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pears on the.** 
ff20: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73  pTab->pIndex lis
ff30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62  t..**.** If pTab
ff40: 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
ff50: 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ble, then this r
ff60: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ff70: 70 20 61 6e 64 20 74 68 65 0a 2a 2a 20 2a 70 69  p and the.** *pi
ff80: 44 61 74 61 43 75 72 20 61 6e 64 20 2a 70 69 49  DataCur and *piI
ff90: 64 78 43 75 72 20 76 61 6c 75 65 73 20 61 72 65  dxCur values are
ffa0: 20 6c 65 66 74 20 75 6e 69 6e 69 74 69 61 6c 69   left uninitiali
ffb0: 7a 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zed..*/.int sqli
ffc0: 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49  te3OpenTableAndI
ffd0: 6e 64 69 63 65 73 28 0a 20 20 50 61 72 73 65 20  ndices(.  Parse 
ffe0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
fff0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10000 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
10010 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
10020 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  be opened */.  i
10030 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
10040 2f 2a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f  /* OP_OpenRead o
10050 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 2a  r OP_OpenWrite *
10060 2f 0a 20 20 75 38 20 70 35 2c 20 20 20 20 20 20  /.  u8 p5,      
10070 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
10080 20 66 6f 72 20 4f 50 5f 4f 70 65 6e 2a 20 6f 70   for OP_Open* op
10090 63 6f 64 65 73 20 28 65 78 63 65 70 74 20 6f 6e  codes (except on
100a0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 29 20   WITHOUT ROWID) 
100b0 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
100c0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
100d0 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  s for the table 
100e0 63 75 72 73 6f 72 2c 20 69 66 20 74 68 65 72 65  cursor, if there
100f0 20 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20   is one */.  u8 
10100 2a 61 54 6f 4f 70 65 6e 2c 20 20 20 20 20 2f 2a  *aToOpen,     /*
10110 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 3a 20 62 6f   If not NULL: bo
10120 6f 6c 65 61 6e 20 66 6f 72 20 65 61 63 68 20 74  olean for each t
10130 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 2a  able and index *
10140 2f 0a 20 20 69 6e 74 20 2a 70 69 44 61 74 61 43  /.  int *piDataC
10150 75 72 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ur,  /* Write th
10160 65 20 64 61 74 61 62 61 73 65 20 73 6f 75 72 63  e database sourc
10170 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
10180 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
10190 69 49 64 78 43 75 72 20 20 20 20 2f 2a 20 57 72  iIdxCur    /* Wr
101a0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 69 6e  ite the first in
101b0 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
101c0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
101d0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 44 62 3b  nt i;.  int iDb;
101e0 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 3b  .  int iDataCur;
101f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
10200 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
10210 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70 65  sert( op==OP_Ope
10220 6e 52 65 61 64 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  nRead || op==OP_
10230 4f 70 65 6e 57 72 69 74 65 20 29 3b 0a 20 20 61  OpenWrite );.  a
10240 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70  ssert( op==OP_Op
10250 65 6e 57 72 69 74 65 20 7c 7c 20 70 35 3d 3d 30  enWrite || p5==0
10260 20 29 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74   );.  if( IsVirt
10270 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10280 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
10290 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
102a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
102b0 4c 65 61 76 65 20 74 68 65 20 6f 75 74 70 75 74  Leave the output
102c0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
102d0 73 20 2a 70 69 44 61 74 61 43 75 72 20 61 6e 64  s *piDataCur and
102e0 20 2a 70 69 49 64 78 43 75 72 20 75 6e 69 6e 69   *piIdxCur unini
102f0 74 69 61 6c 69 7a 65 64 20 73 6f 20 74 68 61 74  tialized so that
10300 20 76 61 6c 67 72 69 6e 64 0a 20 20 20 20 2a 2a   valgrind.    **
10310 20 63 61 6e 20 64 65 74 65 63 74 20 69 66 20 74   can detect if t
10320 68 65 79 20 61 72 65 20 75 73 65 64 20 62 79 20  hey are used by 
10330 6d 69 73 74 61 6b 65 20 69 6e 20 74 68 65 20 63  mistake in the c
10340 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  aller. */.    re
10350 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 44  turn 0;.  }.  iD
10360 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
10370 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
10380 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
10390 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  ma);.  v = sqlit
103a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
103b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
103c0 30 20 29 3b 0a 20 20 69 66 28 20 69 42 61 73 65  0 );.  if( iBase
103d0 3c 30 20 29 20 69 42 61 73 65 20 3d 20 70 50 61  <0 ) iBase = pPa
103e0 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 69 44 61  rse->nTab;.  iDa
103f0 74 61 43 75 72 20 3d 20 69 42 61 73 65 2b 2b 3b  taCur = iBase++;
10400 0a 20 20 69 66 28 20 70 69 44 61 74 61 43 75 72  .  if( piDataCur
10410 20 29 20 2a 70 69 44 61 74 61 43 75 72 20 3d 20   ) *piDataCur = 
10420 69 44 61 74 61 43 75 72 3b 0a 20 20 69 66 28 20  iDataCur;.  if( 
10430 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
10440 26 20 28 61 54 6f 4f 70 65 6e 3d 3d 30 20 7c 7c  & (aToOpen==0 ||
10450 20 61 54 6f 4f 70 65 6e 5b 30 5d 29 20 29 7b 0a   aToOpen[0]) ){.
10460 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
10470 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 61  able(pParse, iDa
10480 74 61 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62  taCur, iDb, pTab
10490 2c 20 6f 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , op);.  }else{.
104a0 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
104b0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
104c0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 6f 70  , pTab->tnum, op
104d0 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  ==OP_OpenWrite, 
104e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
104f0 7d 0a 20 20 69 66 28 20 70 69 49 64 78 43 75 72  }.  if( piIdxCur
10500 20 29 20 2a 70 69 49 64 78 43 75 72 20 3d 20 69   ) *piIdxCur = i
10510 42 61 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Base;.  for(i=0,
10520 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
10530 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10540 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29  Idx->pNext, i++)
10550 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
10560 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a 20 20 20  r = iBase++;.   
10570 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
10580 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
10590 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
105a0 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
105b0 65 78 28 70 49 64 78 29 20 26 26 20 21 48 61 73  ex(pIdx) && !Has
105c0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
105d0 20 20 20 20 20 69 66 28 20 70 69 44 61 74 61 43       if( piDataC
105e0 75 72 20 29 20 2a 70 69 44 61 74 61 43 75 72 20  ur ) *piDataCur 
105f0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
10600 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p5 = 0;.    }. 
10610 20 20 20 69 66 28 20 61 54 6f 4f 70 65 6e 3d 3d     if( aToOpen==
10620 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 69 2b 31  0 || aToOpen[i+1
10630 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
10640 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10650 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 70 49 64  op, iIdxCur, pId
10660 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
10670 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10680 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
10690 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
106a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
106b0 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
106c0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
106d0 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
106e0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
106f0 20 7d 0a 20 20 69 66 28 20 69 42 61 73 65 3e 70   }.  if( iBase>p
10700 50 61 72 73 65 2d 3e 6e 54 61 62 20 29 20 70 50  Parse->nTab ) pP
10710 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 42 61  arse->nTab = iBa
10720 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  se;.  return i;.
10730 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
10740 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65  E_TEST./*.** The
10750 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
10760 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
10770 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
10780 65 72 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 66  er the.** transf
10790 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
107a0 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20 69  is used.  This i
107b0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
107c0 6e 67 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 6f  ng.** purposes o
107d0 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65 20 73 75  nly - to make su
107e0 72 65 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  re the transfer 
107f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 65 61  optimization rea
10800 6c 6c 79 0a 2a 2a 20 69 73 20 68 61 70 70 65 6e  lly.** is happen
10810 69 6e 67 20 77 68 65 6e 20 69 74 20 69 73 20 73  ing when it is s
10820 75 70 70 6f 73 65 64 20 74 6f 2e 0a 2a 2f 0a 69  upposed to..*/.i
10830 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
10840 70 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  pt_count;.#endif
10850 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
10860 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
10870 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50  ITE_OMIT_XFER_OP
10880 54 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  T./*.** Check to
10890 20 73 65 65 20 69 66 20 69 6e 64 65 78 20 70 53   see if index pS
108a0 72 63 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  rc is compatible
108b0 20 61 73 20 61 20 73 6f 75 72 63 65 20 6f 66 20   as a source of 
108c0 64 61 74 61 0a 2a 2a 20 66 6f 72 20 69 6e 64 65  data.** for inde
108d0 78 20 70 44 65 73 74 20 69 6e 20 61 6e 20 69 6e  x pDest in an in
108e0 73 65 72 74 20 74 72 61 6e 73 66 65 72 20 6f 70  sert transfer op
108f0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
10900 20 72 75 6c 65 73 0a 2a 2a 20 66 6f 72 20 61 20   rules.** for a 
10910 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 64 65 78  compatible index
10920 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 54  :.**.**    *   T
10930 68 65 20 69 6e 64 65 78 20 69 73 20 6f 76 65 72  he index is over
10940 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
10950 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a   columns.**    *
10960 20 20 20 54 68 65 20 73 61 6d 65 20 44 45 53 43     The same DESC
10970 20 61 6e 64 20 41 53 43 20 6d 61 72 6b 69 6e 67   and ASC marking
10980 73 20 6f 63 63 75 72 73 20 6f 6e 20 61 6c 6c 20  s occurs on all 
10990 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20  columns.**    * 
109a0 20 20 54 68 65 20 73 61 6d 65 20 6f 6e 45 72 72    The same onErr
109b0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 28 4f  or processing (O
109c0 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
109d0 72 65 2c 20 65 74 63 29 0a 2a 2a 20 20 20 20 2a  re, etc).**    *
109e0 20 20 20 54 68 65 20 73 61 6d 65 20 63 6f 6c 6c     The same coll
109f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
10a00 6e 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  n each column.**
10a10 20 20 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65      *   The inde
10a20 78 20 68 61 73 20 74 68 65 20 65 78 61 63 74 20  x has the exact 
10a30 73 61 6d 65 20 57 48 45 52 45 20 63 6c 61 75 73  same WHERE claus
10a40 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
10a50 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e  xferCompatibleIn
10a60 64 65 78 28 49 6e 64 65 78 20 2a 70 44 65 73 74  dex(Index *pDest
10a70 2c 20 49 6e 64 65 78 20 2a 70 53 72 63 29 7b 0a  , Index *pSrc){.
10a80 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
10a90 74 28 20 70 44 65 73 74 20 26 26 20 70 53 72 63  t( pDest && pSrc
10aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
10ab0 65 73 74 2d 3e 70 54 61 62 6c 65 21 3d 70 53 72  est->pTable!=pSr
10ac0 63 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20 69  c->pTable );.  i
10ad0 66 28 20 70 44 65 73 74 2d 3e 6e 4b 65 79 43 6f  f( pDest->nKeyCo
10ae0 6c 21 3d 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c  l!=pSrc->nKeyCol
10af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10b00 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74  ;   /* Different
10b10 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
10b20 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ns */.  }.  if( 
10b30 70 44 65 73 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pDest->onError!=
10b40 70 53 72 63 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  pSrc->onError ){
10b50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
10b60 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f   /* Different co
10b70 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
10b80 6e 20 73 74 72 61 74 65 67 69 65 73 20 2a 2f 0a  n strategies */.
10b90 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
10ba0 3c 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pSrc->nKeyCol; 
10bb0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53  i++){.    if( pS
10bc0 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21  rc->aiColumn[i]!
10bd0 3d 70 44 65 73 74 2d 3e 61 69 43 6f 6c 75 6d 6e  =pDest->aiColumn
10be0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  [i] ){.      ret
10bf0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
10c00 65 72 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  erent columns in
10c10 64 65 78 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20  dexed */.    }. 
10c20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 69 43     if( pSrc->aiC
10c30 6f 6c 75 6d 6e 5b 69 5d 3d 3d 58 4e 5f 45 58 50  olumn[i]==XN_EXP
10c40 52 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  R ){.      asser
10c50 74 28 20 70 53 72 63 2d 3e 61 43 6f 6c 45 78 70  t( pSrc->aColExp
10c60 72 21 3d 30 20 26 26 20 70 44 65 73 74 2d 3e 61  r!=0 && pDest->a
10c70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
10c80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
10c90 78 70 72 43 6f 6d 70 61 72 65 28 70 53 72 63 2d  xprCompare(pSrc-
10ca0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e  >aColExpr->a[i].
10cb0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cd0 20 20 20 20 70 44 65 73 74 2d 3e 61 43 6f 6c 45      pDest->aColE
10ce0 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  xpr->a[i].pExpr,
10cf0 20 2d 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   -1)!=0 ){.     
10d00 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
10d10 2a 20 44 69 66 66 65 72 65 6e 74 20 65 78 70 72  * Different expr
10d20 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 69  essions in the i
10d30 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ndex */.      }.
10d40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
10d50 72 63 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  rc->aSortOrder[i
10d60 5d 21 3d 70 44 65 73 74 2d 3e 61 53 6f 72 74 4f  ]!=pDest->aSortO
10d70 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
10d80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10d90 44 69 66 66 65 72 65 6e 74 20 73 6f 72 74 20 6f  Different sort o
10da0 72 64 65 72 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  rders */.    }. 
10db0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
10dc0 74 72 69 63 6d 70 28 70 53 72 63 2d 3e 61 7a 43  tricmp(pSrc->azC
10dd0 6f 6c 6c 5b 69 5d 2c 70 44 65 73 74 2d 3e 61 7a  oll[i],pDest->az
10de0 43 6f 6c 6c 5b 69 5d 29 21 3d 30 20 29 7b 0a 20  Coll[i])!=0 ){. 
10df0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
10e00 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f   /* Different co
10e10 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
10e20 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
10e30 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10e40 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e 70 50  Compare(pSrc->pP
10e50 61 72 74 49 64 78 57 68 65 72 65 2c 20 70 44 65  artIdxWhere, pDe
10e60 73 74 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  st->pPartIdxWher
10e70 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  e, -1) ){.    re
10e80 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 44  turn 0;     /* D
10e90 69 66 66 65 72 65 6e 74 20 57 48 45 52 45 20 63  ifferent WHERE c
10ea0 6c 61 75 73 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20  lauses */.  }.. 
10eb0 20 2f 2a 20 49 66 20 6e 6f 20 74 65 73 74 20 61   /* If no test a
10ec0 62 6f 76 65 20 66 61 69 6c 73 20 74 68 65 6e 20  bove fails then 
10ed0 74 68 65 20 69 6e 64 69 63 65 73 20 6d 75 73 74  the indices must
10ee0 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 2a   be compatible *
10ef0 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
10f00 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
10f10 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
10f20 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 49 4e 53 45  mization on INSE
10f30 52 54 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  RTs of the form.
10f40 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54  **.**     INSERT
10f50 20 49 4e 54 4f 20 74 61 62 31 20 53 45 4c 45 43   INTO tab1 SELEC
10f60 54 20 2a 20 46 52 4f 4d 20 74 61 62 32 3b 0a 2a  T * FROM tab2;.*
10f70 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20 6f 70  *.** The xfer op
10f80 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 61 6e 73  timization trans
10f90 66 65 72 73 20 72 61 77 20 72 65 63 6f 72 64 73  fers raw records
10fa0 20 66 72 6f 6d 20 74 61 62 32 20 6f 76 65 72 20   from tab2 over 
10fb0 74 6f 20 74 61 62 31 2e 20 20 0a 2a 2a 20 43 6f  to tab1.  .** Co
10fc0 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 64 65  lumns are not de
10fd0 63 6f 64 65 64 20 61 6e 64 20 72 65 61 73 73 65  coded and reasse
10fe0 6d 62 6c 65 64 2c 20 77 68 69 63 68 20 67 72 65  mbled, which gre
10ff0 61 74 6c 79 20 69 6d 70 72 6f 76 65 73 0a 2a 2a  atly improves.**
11000 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 52   performance.  R
11010 61 77 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  aw index records
11020 20 61 72 65 20 74 72 61 6e 73 66 65 72 72 65 64   are transferred
11030 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
11040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72  ..**.** The xfer
11050 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
11060 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
11070 69 66 20 74 61 62 31 20 61 6e 64 20 74 61 62 32  if tab1 and tab2
11080 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e   are compatible.
11090 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6c 6f  .** There are lo
110a0 74 73 20 6f 66 20 72 75 6c 65 73 20 66 6f 72 20  ts of rules for 
110b0 64 65 74 65 72 6d 69 6e 69 6e 67 20 63 6f 6d 70  determining comp
110c0 61 74 69 62 69 6c 69 74 79 20 2d 20 73 65 65 20  atibility - see 
110d0 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 65 6d 62 65  comments.** embe
110e0 64 64 65 64 20 69 6e 20 74 68 65 20 63 6f 64 65  dded in the code
110f0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a   for details..**
11100 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11110 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66   returns TRUE if
11120 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
11130 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
11140 74 6f 20 62 65 20 75 73 65 64 2e 0a 2a 2a 20 53  to be used..** S
11150 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 78 66 65  ometimes the xfe
11160 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  r optimization w
11170 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66  ill only work if
11180 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
11190 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 65 6d 70   table.** is emp
111a0 74 79 20 2d 20 61 20 66 61 63 74 6f 72 20 74 68  ty - a factor th
111b0 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 64  at can only be d
111c0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
111d0 2d 74 69 6d 65 2e 20 20 49 6e 20 74 68 61 74 0a  -time.  In that.
111e0 2a 2a 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  ** case, this ro
111f0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
11200 63 6f 64 65 20 66 6f 72 20 74 68 65 20 78 66 65  code for the xfe
11210 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62  r optimization b
11220 75 74 20 61 6c 73 6f 0a 2a 2a 20 64 6f 65 73 20  ut also.** does 
11230 61 20 74 65 73 74 20 74 6f 20 73 65 65 20 69 66  a test to see if
11240 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
11250 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20   table is empty 
11260 61 6e 64 20 6a 75 6d 70 73 20 6f 76 65 72 20 74  and jumps over t
11270 68 65 0a 2a 2a 20 78 66 65 72 20 6f 70 74 69 6d  he.** xfer optim
11280 69 7a 61 74 69 6f 6e 20 63 6f 64 65 20 69 66 20  ization code if 
11290 74 68 65 20 74 65 73 74 20 66 61 69 6c 73 2e 20  the test fails. 
112a0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
112b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
112c0 65 74 75 72 6e 73 20 46 41 4c 53 45 20 73 6f 20  eturns FALSE so 
112d0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
112e0 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 67 6f 20  will know to go 
112f0 61 68 65 61 64 20 61 6e 64 20 67 65 6e 65 72 61  ahead and genera
11300 74 65 0a 2a 2a 20 61 6e 20 75 6e 6f 70 74 69 6d  te.** an unoptim
11310 69 7a 65 64 20 74 72 61 6e 73 66 65 72 2e 20 20  ized transfer.  
11320 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
11330 6f 20 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20  o returns FALSE 
11340 69 66 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 6e  if there.** is n
11350 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
11360 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  e xfer optimizat
11370 69 6f 6e 20 63 61 6e 20 62 65 20 61 70 70 6c 69  ion can be appli
11380 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  ed..**.** This o
11390 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 70  ptimization is p
113a0 61 72 74 69 63 75 6c 61 72 6c 79 20 75 73 65 66  articularly usef
113b0 75 6c 20 61 74 20 6d 61 6b 69 6e 67 20 56 41 43  ul at making VAC
113c0 55 55 4d 20 72 75 6e 20 66 61 73 74 65 72 2e 0a  UUM run faster..
113d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66  */.static int xf
113e0 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 0a  erOptimization(.
113f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11400 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
11410 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
11420 61 62 6c 65 20 2a 70 44 65 73 74 2c 20 20 20 20  able *pDest,    
11430 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
11440 65 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  e we are inserti
11450 6e 67 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c  ng into */.  Sel
11460 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
11470 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
11480 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20  tatement to use 
11490 61 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  as the data sour
114a0 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ce */.  int onEr
114b0 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
114c0 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20 63   How to handle c
114d0 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72 73  onstraint errors
114e0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 44 65 73   */.  int iDbDes
114f0 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t           /* T
11500 68 65 20 64 61 74 61 62 61 73 65 20 6f 66 20 70  he database of p
11510 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Dest */.){.  sql
11520 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11530 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73  e->db;.  ExprLis
11540 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
11550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11560 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
11570 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 54  he SELECT */.  T
11580 61 62 6c 65 20 2a 70 53 72 63 3b 20 20 20 20 20  able *pSrc;     
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20  /* The table in 
115b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
115c0 6f 66 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 49  of SELECT */.  I
115d0 6e 64 65 78 20 2a 70 53 72 63 49 64 78 2c 20 2a  ndex *pSrcIdx, *
115e0 70 44 65 73 74 49 64 78 3b 20 20 20 20 20 20 20  pDestIdx;       
115f0 2f 2a 20 53 6f 75 72 63 65 20 61 6e 64 20 64 65  /* Source and de
11600 73 74 69 6e 61 74 69 6f 6e 20 69 6e 64 69 63 65  stination indice
11610 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
11620 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
11630 6d 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c  m;      /* An el
11640 65 6d 65 6e 74 20 6f 66 20 70 53 65 6c 65 63 74  ement of pSelect
11650 2d 3e 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  ->pSrc */.  int 
11660 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11680 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11690 20 20 69 6e 74 20 69 44 62 53 72 63 3b 20 20 20    int iDbSrc;   
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
116c0 73 65 20 6f 66 20 70 53 72 63 20 2a 2f 0a 20 20  se of pSrc */.  
116d0 69 6e 74 20 69 53 72 63 2c 20 69 44 65 73 74 3b  int iSrc, iDest;
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 2f 2a 20 43 75 72 73 6f 72 73 20 66 72 6f 6d   /* Cursors from
11700 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74   source and dest
11710 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ination */.  int
11720 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 20 20   addr1, addr2;  
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11740 20 4c 6f 6f 70 20 61 64 64 72 65 73 73 65 73 20   Loop addresses 
11750 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 44 65  */.  int emptyDe
11760 73 74 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  stTest = 0;     
11770 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11780 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70   of test for emp
11790 74 79 20 70 44 65 73 74 20 2a 2f 0a 20 20 69 6e  ty pDest */.  in
117a0 74 20 65 6d 70 74 79 53 72 63 54 65 73 74 20 3d  t emptySrcTest =
117b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
117c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 65 73  * Address of tes
117d0 74 20 66 6f 72 20 65 6d 70 74 79 20 70 53 72 63  t for empty pSrc
117e0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
11810 42 45 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  BE we are buildi
11820 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ng */.  int regA
11830 75 74 6f 69 6e 63 3b 20 20 20 20 20 20 20 20 20  utoinc;         
11840 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
11850 72 79 20 72 65 67 69 73 74 65 72 20 75 73 65 64  ry register used
11860 20 62 79 20 41 55 54 4f 49 4e 43 20 2a 2f 0a 20   by AUTOINC */. 
11870 20 69 6e 74 20 64 65 73 74 48 61 73 55 6e 69 71   int destHasUniq
11880 75 65 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  ueIdx = 0;      
11890 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 44 65    /* True if pDe
118a0 73 74 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  st has a UNIQUE 
118b0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
118c0 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64  egData, regRowid
118d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
118e0 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
118f0 20 64 61 74 61 20 61 6e 64 20 72 6f 77 69 64 20   data and rowid 
11900 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  */..  if( pSelec
11910 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
11920 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 75 73 74 20  rn 0;   /* Must 
11930 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 20  be of the form  
11940 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20  INSERT INTO ... 
11950 53 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a 20 20  SELECT ... */.  
11960 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
11970 70 57 69 74 68 20 7c 7c 20 70 53 65 6c 65 63 74  pWith || pSelect
11980 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 2f  ->pWith ){.    /
11990 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
119a0 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
119b0 20 71 75 65 72 79 20 69 66 20 74 68 65 72 65 20   query if there 
119c0 61 72 65 20 61 6e 20 57 49 54 48 20 63 6c 61 75  are an WITH clau
119d0 73 65 73 0a 20 20 20 20 2a 2a 20 61 74 74 61 63  ses.    ** attac
119e0 68 65 64 20 74 6f 20 69 74 2e 20 50 72 6f 63 65  hed to it. Proce
119f0 65 64 69 6e 67 20 6d 61 79 20 67 65 6e 65 72 61  eding may genera
11a00 74 65 20 61 20 66 61 6c 73 65 20 22 6e 6f 20 73  te a false "no s
11a10 75 63 68 20 74 61 62 6c 65 3a 20 78 78 78 22 0a  uch table: xxx".
11a20 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20      ** error if 
11a30 70 53 65 6c 65 63 74 20 72 65 61 64 73 20 66 72  pSelect reads fr
11a40 6f 6d 20 61 20 43 54 45 20 6e 61 6d 65 64 20 22  om a CTE named "
11a50 78 78 78 22 2e 20 20 2a 2f 0a 20 20 20 20 72 65  xxx".  */.    re
11a60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
11a70 28 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  ( sqlite3Trigger
11a80 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 44 65  List(pParse, pDe
11a90 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
11aa0 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d  n 0;   /* tab1 m
11ab0 75 73 74 20 6e 6f 74 20 68 61 76 65 20 74 72 69  ust not have tri
11ac0 67 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 23 69 66  ggers */.  }.#if
11ad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11ae0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11af0 69 66 28 20 70 44 65 73 74 2d 3e 74 61 62 46 6c  if( pDest->tabFl
11b00 61 67 73 20 26 20 54 46 5f 56 69 72 74 75 61 6c  ags & TF_Virtual
11b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11b20 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75 73 74  ;   /* tab1 must
11b30 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74 75 61   not be a virtua
11b40 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23  l table */.  }.#
11b50 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 6e 45 72  endif.  if( onEr
11b60 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
11b70 29 7b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  ){.    if( pDest
11b80 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 20 6f 6e 45  ->iPKey>=0 ) onE
11b90 72 72 6f 72 20 3d 20 70 44 65 73 74 2d 3e 6b 65  rror = pDest->ke
11ba0 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f  yConf;.    if( o
11bb0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
11bc0 6c 74 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f  lt ) onError = O
11bd0 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61  E_Abort;.  }.  a
11be0 73 73 65 72 74 28 70 53 65 6c 65 63 74 2d 3e 70  ssert(pSelect->p
11bf0 53 72 63 29 3b 20 20 20 2f 2a 20 61 6c 6c 6f 63  Src);   /* alloc
11c00 61 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  ated even if the
11c10 72 65 20 69 73 20 6e 6f 20 46 52 4f 4d 20 63 6c  re is no FROM cl
11c20 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
11c30 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  elect->pSrc->nSr
11c40 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=1 ){.    retu
11c50 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20  rn 0;   /* FROM 
11c60 63 6c 61 75 73 65 20 6d 75 73 74 20 68 61 76 65  clause must have
11c70 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 74 65 72   exactly one ter
11c80 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  m */.  }.  if( p
11c90 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61 5b  Select->pSrc->a[
11ca0 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  0].pSelect ){.  
11cb0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
11cc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 61 6e   FROM clause can
11cd0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 75  not contain a su
11ce0 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  bquery */.  }.  
11cf0 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 57 68  if( pSelect->pWh
11d00 65 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ere ){.    retur
11d10 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
11d20 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
11d30 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
11d40 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
11d50 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
11d60 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
11d70 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74  * SELECT may not
11d80 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
11d90 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a  Y clause */.  }.
11da0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6e 65 65 64    /* Do not need
11db0 20 74 6f 20 74 65 73 74 20 66 6f 72 20 61 20 48   to test for a H
11dc0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 49  AVING clause.  I
11dd0 66 20 48 41 56 49 4e 47 20 69 73 20 70 72 65 73  f HAVING is pres
11de0 65 6e 74 20 62 75 74 0a 20 20 2a 2a 20 74 68 65  ent but.  ** the
11df0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
11e00 59 2c 20 77 65 20 77 69 6c 6c 20 67 65 74 20 61  Y, we will get a
11e10 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66  n error. */.  if
11e20 28 20 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f 75  ( pSelect->pGrou
11e30 70 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pBy ){.    retur
11e40 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
11e50 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
11e60 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
11e70 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  */.  }.  if( pSe
11e80 6c 65 63 74 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  lect->pLimit ){.
11e90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11ea0 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
11eb0 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
11ec0 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 61  lause */.  }.  a
11ed0 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e  ssert( pSelect->
11ee0 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 2f  pOffset==0 );  /
11ef0 2a 20 4d 75 73 74 20 62 65 20 73 6f 20 69 66 20  * Must be so if 
11f00 70 4c 69 6d 69 74 3d 3d 30 20 2a 2f 0a 20 20 69  pLimit==0 */.  i
11f10 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
11f20 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
11f30 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20   0;   /* SELECT 
11f40 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
11f50 70 6f 75 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  pound query */. 
11f60 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
11f70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
11f80 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
11f90 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53  return 0;   /* S
11fa0 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62 65  ELECT may not be
11fb0 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 7d   DISTINCT */.  }
11fc0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
11fd0 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  ect->pEList;.  a
11fe0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
11ff0 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
12000 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
12010 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
12020 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
12030 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
12040 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  y one column */.
12050 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
12060 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12070 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
12080 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
12090 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 7b  !=TK_ASTERISK ){
120a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
120b0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
120c0 65 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  et must be the s
120d0 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20  pecial operator 
120e0 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  "*" */.  }..  /*
120f0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 77   At this point w
12100 65 20 68 61 76 65 20 65 73 74 61 62 6c 69 73 68  e have establish
12110 65 64 20 74 68 61 74 20 74 68 65 20 73 74 61 74  ed that the stat
12120 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 0a  ement is of the.
12130 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 73 79 6e    ** correct syn
12140 74 61 63 74 69 63 20 66 6f 72 6d 20 74 6f 20 70  tactic form to p
12150 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
12160 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
12170 20 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20 68 61    Now.  ** we ha
12180 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20  ve to check the 
12190 73 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a 2f 0a  semantics..  */.
121a0 20 20 70 49 74 65 6d 20 3d 20 70 53 65 6c 65 63    pItem = pSelec
121b0 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20 70 53  t->pSrc->a;.  pS
121c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  rc = sqlite3Loca
121d0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
121e0 73 65 2c 20 30 2c 20 70 49 74 65 6d 29 3b 0a 20  se, 0, pItem);. 
121f0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
12200 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12210 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 64  /* FROM clause d
12220 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
12230 61 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  a real table */.
12240 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 3d 3d    }.  if( pSrc==
12250 70 44 65 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pDest ){.    ret
12260 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31  urn 0;   /* tab1
12270 20 61 6e 64 20 74 61 62 32 20 6d 61 79 20 6e 6f   and tab2 may no
12280 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 74 61  t be the same ta
12290 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ble */.  }.  if(
122a0 20 48 61 73 52 6f 77 69 64 28 70 44 65 73 74 29   HasRowid(pDest)
122b0 21 3d 48 61 73 52 6f 77 69 64 28 70 53 72 63 29  !=HasRowid(pSrc)
122c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
122d0 3b 20 20 20 2f 2a 20 73 6f 75 72 63 65 20 61 6e  ;   /* source an
122e0 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  d destination mu
122f0 73 74 20 62 6f 74 68 20 62 65 20 57 49 54 48 4f  st both be WITHO
12300 55 54 20 52 4f 57 49 44 20 6f 72 20 6e 6f 74 20  UT ROWID or not 
12310 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  */.  }.#ifndef S
12320 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12330 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 53  ALTABLE.  if( pS
12340 72 63 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  rc->tabFlags & T
12350 46 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  F_Virtual ){.   
12360 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
12370 74 61 62 32 20 6d 75 73 74 20 6e 6f 74 20 62 65  tab2 must not be
12380 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
12390 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   */.  }.#endif. 
123a0 20 69 66 28 20 70 53 72 63 2d 3e 70 53 65 6c 65   if( pSrc->pSele
123b0 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
123c0 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d 61   0;   /* tab2 ma
123d0 79 20 6e 6f 74 20 62 65 20 61 20 76 69 65 77 20  y not be a view 
123e0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  */.  }.  if( pDe
123f0 73 74 2d 3e 6e 43 6f 6c 21 3d 70 53 72 63 2d 3e  st->nCol!=pSrc->
12400 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  nCol ){.    retu
12410 72 6e 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  rn 0;   /* Numbe
12420 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6d 75 73  r of columns mus
12430 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 69 6e  t be the same in
12440 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 2a   tab1 and tab2 *
12450 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  /.  }.  if( pDes
12460 74 2d 3e 69 50 4b 65 79 21 3d 70 53 72 63 2d 3e  t->iPKey!=pSrc->
12470 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  iPKey ){.    ret
12480 75 72 6e 20 30 3b 20 20 20 2f 2a 20 42 6f 74 68  urn 0;   /* Both
12490 20 74 61 62 6c 65 73 20 6d 75 73 74 20 68 61 76   tables must hav
124a0 65 20 74 68 65 20 73 61 6d 65 20 49 4e 54 45 47  e the same INTEG
124b0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
124c0 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  /.  }.  for(i=0;
124d0 20 69 3c 70 44 65 73 74 2d 3e 6e 43 6f 6c 3b 20   i<pDest->nCol; 
124e0 69 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  i++){.    Column
124f0 20 2a 70 44 65 73 74 43 6f 6c 20 3d 20 26 70 44   *pDestCol = &pD
12500 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  est->aCol[i];.  
12510 20 20 43 6f 6c 75 6d 6e 20 2a 70 53 72 63 43 6f    Column *pSrcCo
12520 6c 20 3d 20 26 70 53 72 63 2d 3e 61 43 6f 6c 5b  l = &pSrc->aCol[
12530 69 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  i];.#ifdef SQLIT
12540 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f  E_ENABLE_HIDDEN_
12550 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 69 66 28 20  COLUMNS.    if( 
12560 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
12570 49 54 45 5f 56 61 63 75 75 6d 29 3d 3d 30 20 0a  ITE_Vacuum)==0 .
12580 20 20 20 20 20 26 26 20 28 70 44 65 73 74 43 6f       && (pDestCo
12590 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 20 70 53  l->colFlags | pS
125a0 72 63 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 29  rcCol->colFlags)
125b0 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
125c0 4e 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  N .    ){.      
125d0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
125e0 4e 65 69 74 68 65 72 20 74 61 62 6c 65 20 6d 61  Neither table ma
125f0 79 20 68 61 76 65 20 5f 5f 68 69 64 64 65 6e 5f  y have __hidden_
12600 5f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  _ columns */.   
12610 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
12620 28 20 70 44 65 73 74 43 6f 6c 2d 3e 61 66 66 69  ( pDestCol->affi
12630 6e 69 74 79 21 3d 70 53 72 63 43 6f 6c 2d 3e 61  nity!=pSrcCol->a
12640 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
12650 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
12660 20 41 66 66 69 6e 69 74 79 20 6d 75 73 74 20 62   Affinity must b
12670 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c  e the same on al
12680 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  l columns */.   
12690 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
126a0 65 33 5f 73 74 72 69 63 6d 70 28 70 44 65 73 74  e3_stricmp(pDest
126b0 43 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20 70 53 72 63  Col->zColl, pSrc
126c0 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 21 3d 30 20 29  Col->zColl)!=0 )
126d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
126e0 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e  ;    /* Collatin
126f0 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  g sequence must 
12700 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20 61  be the same on a
12710 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ll columns */.  
12720 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 73    }.    if( pDes
12730 74 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 26 26  tCol->notNull &&
12740 20 21 70 53 72 63 43 6f 6c 2d 3e 6e 6f 74 4e 75   !pSrcCol->notNu
12750 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
12760 72 6e 20 30 3b 20 20 20 20 2f 2a 20 74 61 62 32  rn 0;    /* tab2
12770 20 6d 75 73 74 20 62 65 20 4e 4f 54 20 4e 55 4c   must be NOT NUL
12780 4c 20 69 66 20 74 61 62 31 20 69 73 20 2a 2f 0a  L if tab1 is */.
12790 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 65 66      }.    /* Def
127a0 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f 72 20  ault values for 
127b0 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
127c0 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 6e 65  quent columns ne
127d0 65 64 20 74 6f 20 6d 61 74 63 68 2e 20 2a 2f 0a  ed to match. */.
127e0 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
127f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
12800 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20  stCol->pDflt==0 
12810 7c 7c 20 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66  || pDestCol->pDf
12820 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20  lt->op==TK_SPAN 
12830 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12840 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 3d   pSrcCol->pDflt=
12850 3d 30 20 7c 7c 20 70 53 72 63 43 6f 6c 2d 3e 70  =0 || pSrcCol->p
12860 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
12870 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  N );.      if( (
12880 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 3d  pDestCol->pDflt=
12890 3d 30 29 21 3d 28 70 53 72 63 43 6f 6c 2d 3e 70  =0)!=(pSrcCol->p
128a0 44 66 6c 74 3d 3d 30 29 20 0a 20 20 20 20 20 20  Dflt==0) .      
128b0 20 7c 7c 20 28 70 44 65 73 74 43 6f 6c 2d 3e 70   || (pDestCol->p
128c0 44 66 6c 74 20 26 26 20 73 74 72 63 6d 70 28 70  Dflt && strcmp(p
128d0 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  DestCol->pDflt->
128e0 75 2e 7a 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20  u.zToken,.      
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12910 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 2d   pSrcCol->pDflt-
12920 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 29 0a 20  >u.zToken)!=0). 
12930 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12940 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
12950 44 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 6d  Default values m
12960 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
12970 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
12980 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
12990 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44 65 73 74  .  }.  for(pDest
129a0 49 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65  Idx=pDest->pInde
129b0 78 3b 20 70 44 65 73 74 49 64 78 3b 20 70 44 65  x; pDestIdx; pDe
129c0 73 74 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e  stIdx=pDestIdx->
129d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
129e0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 44  IsUniqueIndex(pD
129f0 65 73 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20  estIdx) ){.     
12a00 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64   destHasUniqueId
12a10 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  x = 1;.    }.   
12a20 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70 53 72   for(pSrcIdx=pSr
12a30 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53 72 63 49  c->pIndex; pSrcI
12a40 64 78 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63  dx; pSrcIdx=pSrc
12a50 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12a60 20 20 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61     if( xferCompa
12a70 74 69 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74  tibleIndex(pDest
12a80 49 64 78 2c 20 70 53 72 63 49 64 78 29 20 29 20  Idx, pSrcIdx) ) 
12a90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12aa0 20 69 66 28 20 70 53 72 63 49 64 78 3d 3d 30 20   if( pSrcIdx==0 
12ab0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12ac0 30 3b 20 20 20 20 2f 2a 20 70 44 65 73 74 49 64  0;    /* pDestId
12ad0 78 20 68 61 73 20 6e 6f 20 63 6f 72 72 65 73 70  x has no corresp
12ae0 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  onding index in 
12af0 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  pSrc */.    }.  
12b00 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12b10 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 69 66  _OMIT_CHECK.  if
12b20 28 20 70 44 65 73 74 2d 3e 70 43 68 65 63 6b 20  ( pDest->pCheck 
12b30 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
12b40 73 74 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e  stCompare(pSrc->
12b50 70 43 68 65 63 6b 2c 70 44 65 73 74 2d 3e 70 43  pCheck,pDest->pC
12b60 68 65 63 6b 2c 2d 31 29 20 29 7b 0a 20 20 20 20  heck,-1) ){.    
12b70 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
12b80 61 62 6c 65 73 20 68 61 76 65 20 64 69 66 66 65  ables have diffe
12b90 72 65 6e 74 20 43 48 45 43 4b 20 63 6f 6e 73 74  rent CHECK const
12ba0 72 61 69 6e 74 73 2e 20 20 54 69 63 6b 65 74 20  raints.  Ticket 
12bb0 23 32 32 35 32 20 2a 2f 0a 20 20 7d 0a 23 65 6e  #2252 */.  }.#en
12bc0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
12bd0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
12be0 4b 45 59 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  KEY.  /* Disallo
12bf0 77 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f  w the transfer o
12c00 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74  ptimization if t
12c10 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
12c20 61 62 6c 65 20 63 6f 6e 73 74 61 69 6e 73 0a 20  able constains. 
12c30 20 2a 2a 20 61 6e 79 20 66 6f 72 65 69 67 6e 20   ** any foreign 
12c40 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  key constraints.
12c50 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 72    This is more r
12c60 65 73 74 72 69 63 74 69 76 65 20 74 68 61 6e 20  estrictive than 
12c70 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2a 20  necessary..  ** 
12c80 42 75 74 20 74 68 65 20 6d 61 69 6e 20 62 65 6e  But the main ben
12c90 65 66 69 63 69 61 72 79 20 6f 66 20 74 68 65 20  eficiary of the 
12ca0 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a  transfer optimiz
12cb0 61 74 69 6f 6e 20 69 73 20 74 68 65 20 56 41 43  ation is the VAC
12cc0 55 55 4d 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  UUM .  ** comman
12cd0 64 2c 20 61 6e 64 20 74 68 65 20 56 41 43 55 55  d, and the VACUU
12ce0 4d 20 63 6f 6d 6d 61 6e 64 20 64 69 73 61 62 6c  M command disabl
12cf0 65 73 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  es foreign key c
12d00 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 53 6f 0a  onstraints.  So.
12d10 20 20 2a 2a 20 74 68 65 20 65 78 74 72 61 20 63    ** the extra c
12d20 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 6d  omplication to m
12d30 61 6b 65 20 74 68 69 73 20 72 75 6c 65 20 6c 65  ake this rule le
12d40 73 73 20 72 65 73 74 72 69 63 74 69 76 65 20 69  ss restrictive i
12d50 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 2a 2a 20  s probably.  ** 
12d60 6e 6f 74 20 77 6f 72 74 68 20 74 68 65 20 65 66  not worth the ef
12d70 66 6f 72 74 2e 20 20 54 69 63 6b 65 74 20 5b 36  fort.  Ticket [6
12d80 32 38 34 64 66 38 39 64 65 62 64 66 61 36 31 64  284df89debdfa61d
12d90 62 38 30 37 33 65 30 36 32 39 30 38 61 66 30 63  b8073e062908af0c
12da0 39 62 36 31 31 38 65 5d 0a 20 20 2a 2f 0a 20 20  9b6118e].  */.  
12db0 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
12dc0 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
12dd0 65 79 73 29 21 3d 30 20 26 26 20 70 44 65 73 74  eys)!=0 && pDest
12de0 2d 3e 70 46 4b 65 79 21 3d 30 20 29 7b 0a 20 20  ->pFKey!=0 ){.  
12df0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12e00 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 64 62  #endif.  if( (db
12e10 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
12e20 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29  _CountRows)!=0 )
12e30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
12e40 20 2f 2a 20 78 66 65 72 20 6f 70 74 20 64 6f 65   /* xfer opt doe
12e50 73 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  s not play well 
12e60 77 69 74 68 20 50 52 41 47 4d 41 20 63 6f 75 6e  with PRAGMA coun
12e70 74 5f 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 7d  t_changes */.  }
12e80 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
12e90 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
12ea0 61 6e 73 20 74 68 61 74 20 74 68 65 20 78 66 65  ans that the xfe
12eb0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  r optimization i
12ec0 73 20 61 74 0a 20 20 2a 2a 20 6c 65 61 73 74 20  s at.  ** least 
12ed0 61 20 70 6f 73 73 69 62 69 6c 69 74 79 2c 20 74  a possibility, t
12ee0 68 6f 75 67 68 20 69 74 20 6d 69 67 68 74 20 6f  hough it might o
12ef0 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74 68 65 20  nly work if the 
12f00 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a  destination.  **
12f10 20 74 61 62 6c 65 20 28 74 61 62 31 29 20 69 73   table (tab1) is
12f20 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
12f30 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
12f40 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
12f50 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
12f60 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69 44  t++;.#endif.  iD
12f70 62 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63  bSrc = sqlite3Sc
12f80 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
12f90 70 53 72 63 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pSrc->pSchema);.
12fa0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12fb0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12fc0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
12fd0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
12fe0 69 44 62 53 72 63 29 3b 0a 20 20 69 53 72 63 20  iDbSrc);.  iSrc 
12ff0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13000 3b 0a 20 20 69 44 65 73 74 20 3d 20 70 50 61 72  ;.  iDest = pPar
13010 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 72 65  se->nTab++;.  re
13020 67 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 49  gAutoinc = autoI
13030 6e 63 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  ncBegin(pParse, 
13040 69 44 62 44 65 73 74 2c 20 70 44 65 73 74 29 3b  iDbDest, pDest);
13050 0a 20 20 72 65 67 44 61 74 61 20 3d 20 73 71 6c  .  regData = sql
13060 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
13070 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77  Parse);.  regRow
13080 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
13090 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
130a0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
130b0 6c 65 28 70 50 61 72 73 65 2c 20 69 44 65 73 74  le(pParse, iDest
130c0 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74  , iDbDest, pDest
130d0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b  , OP_OpenWrite);
130e0 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
130f0 77 69 64 28 70 44 65 73 74 29 20 7c 7c 20 64 65  wid(pDest) || de
13100 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 29  stHasUniqueIdx )
13110 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
13120 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75  gs & SQLITE_Vacu
13130 75 6d 29 3d 3d 30 20 26 26 20 28 0a 20 20 20 20  um)==0 && (.    
13140 20 20 28 70 44 65 73 74 2d 3e 69 50 4b 65 79 3c    (pDest->iPKey<
13150 30 20 26 26 20 70 44 65 73 74 2d 3e 70 49 6e 64  0 && pDest->pInd
13160 65 78 21 3d 30 29 20 20 20 20 20 20 20 20 20 20  ex!=0)          
13170 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 7c 7c 20  /* (1) */.   || 
13180 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78  destHasUniqueIdx
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131b0 20 28 32 29 20 2a 2f 0a 20 20 20 7c 7c 20 28 6f   (2) */.   || (o
131c0 6e 45 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72 74  nError!=OE_Abort
131d0 20 26 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f   && onError!=OE_
131e0 52 6f 6c 6c 62 61 63 6b 29 20 20 20 2f 2a 20 28  Rollback)   /* (
131f0 33 29 20 2a 2f 0a 20 20 29 29 7b 0a 20 20 20 20  3) */.  )){.    
13200 2f 2a 20 49 6e 20 73 6f 6d 65 20 63 69 72 63 75  /* In some circu
13210 6d 73 74 61 6e 63 65 73 2c 20 77 65 20 61 72 65  mstances, we are
13220 20 61 62 6c 65 20 74 6f 20 72 75 6e 20 74 68 65   able to run the
13230 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
13240 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 69  on.    ** only i
13250 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
13260 6e 20 74 61 62 6c 65 20 69 73 20 69 6e 69 74 69  n table is initi
13270 61 6c 6c 79 20 65 6d 70 74 79 2e 20 55 6e 6c 65  ally empty. Unle
13280 73 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ss the.    ** SQ
13290 4c 49 54 45 5f 56 61 63 75 75 6d 20 66 6c 61 67  LITE_Vacuum flag
132a0 20 69 73 20 73 65 74 2c 20 74 68 69 73 20 62 6c   is set, this bl
132b0 6f 63 6b 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ock generates co
132c0 64 65 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  de to make.    *
132d0 2a 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 61  * that determina
132e0 74 69 6f 6e 2e 20 49 66 20 53 51 4c 49 54 45 5f  tion. If SQLITE_
132f0 56 61 63 75 75 6d 20 69 73 20 73 65 74 2c 20 74  Vacuum is set, t
13300 68 65 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74  hen the destinat
13310 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ion.    ** table
13320 20 69 73 20 61 6c 77 61 79 73 20 65 6d 70 74 79   is always empty
13330 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13340 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72  Conditions under
13350 20 77 68 69 63 68 20 74 68 65 20 64 65 73 74 69   which the desti
13360 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  nation must be e
13370 6d 70 74 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mpty:.    **.   
13380 20 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73   ** (1) There is
13390 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
133a0 41 52 59 20 4b 45 59 20 62 75 74 20 74 68 65 72  ARY KEY but ther
133b0 65 20 61 72 65 20 69 6e 64 69 63 65 73 2e 0a 20  e are indices.. 
133c0 20 20 20 2a 2a 20 20 20 20 20 28 49 66 20 74 68     **     (If th
133d0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
133e0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 65   not initially e
133f0 6d 70 74 79 2c 20 74 68 65 20 72 6f 77 69 64 20  mpty, the rowid 
13400 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 20 20  fields.    **   
13410 20 20 6f 66 20 69 6e 64 65 78 20 65 6e 74 72 69    of index entri
13420 65 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  es might need to
13430 20 63 68 61 6e 67 65 2e 29 0a 20 20 20 20 2a 2a   change.).    **
13440 0a 20 20 20 20 2a 2a 20 28 32 29 20 54 68 65 20  .    ** (2) The 
13450 64 65 73 74 69 6e 61 74 69 6f 6e 20 68 61 73 20  destination has 
13460 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
13470 20 28 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d   (The xfer optim
13480 69 7a 61 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ization .    ** 
13490 20 20 20 20 69 73 20 75 6e 61 62 6c 65 20 74 6f      is unable to
134a0 20 74 65 73 74 20 75 6e 69 71 75 65 6e 65 73 73   test uniqueness
134b0 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
134c0 20 28 33 29 20 6f 6e 45 72 72 6f 72 20 69 73 20   (3) onError is 
134d0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
134e0 74 68 61 6e 20 4f 45 5f 41 62 6f 72 74 20 61 6e  than OE_Abort an
134f0 64 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 0a 20  d OE_Rollback.. 
13500 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 31 20     */.    addr1 
13510 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13520 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
13530 2c 20 69 44 65 73 74 2c 20 30 29 3b 20 56 64 62  , iDest, 0); Vdb
13540 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13550 20 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20    emptyDestTest 
13560 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13570 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
13580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13590 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
135a0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48 61  1);.  }.  if( Ha
135b0 73 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a  sRowid(pSrc) ){.
135c0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
135d0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53 72  able(pParse, iSr
135e0 63 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63 2c  c, iDbSrc, pSrc,
135f0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
13600 20 20 20 65 6d 70 74 79 53 72 63 54 65 73 74 20     emptySrcTest 
13610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13620 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
13630 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62 65  , iSrc, 0); Vdbe
13640 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13650 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b 65   if( pDest->iPKe
13660 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  y>=0 ){.      ad
13670 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
13680 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
13690 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52 6f  wid, iSrc, regRo
136a0 77 69 64 29 3b 0a 20 20 20 20 20 20 61 64 64 72  wid);.      addr
136b0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
136c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
136d0 78 69 73 74 73 2c 20 69 44 65 73 74 2c 20 30 2c  xists, iDest, 0,
136e0 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
136f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
13700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13710 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
13720 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c  pParse, onError,
13730 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73   pDest);.      s
13740 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13750 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
13760 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70 28      autoIncStep(
13770 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f 69  pParse, regAutoi
13780 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  nc, regRowid);. 
13790 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65     }else if( pDe
137a0 73 74 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 7b  st->pIndex==0 ){
137b0 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
137c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
137d0 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
137e0 20 69 44 65 73 74 2c 20 72 65 67 52 6f 77 69 64   iDest, regRowid
137f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13800 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
13810 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13820 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63 2c   OP_Rowid, iSrc,
13830 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
13840 20 20 61 73 73 65 72 74 28 20 28 70 44 65 73 74    assert( (pDest
13850 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
13860 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3d 3d  Autoincrement)==
13870 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
13880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13890 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
138a0 69 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b 0a  iSrc, regData);.
138b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
138c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp4(v, OP_Inse
138d0 72 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61  rt, iDest, regDa
138e0 74 61 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20  ta, regRowid,.  
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 73 74      (char*)pDest
13910 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20  , P4_TABLE);.   
13920 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13930 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 4e  geP5(v, OPFLAG_N
13940 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47 5f 4c 41  CHANGE|OPFLAG_LA
13950 53 54 52 4f 57 49 44 7c 4f 50 46 4c 41 47 5f 41  STROWID|OPFLAG_A
13960 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69  PPEND);.    sqli
13970 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13980 20 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63 2c 20   OP_Next, iSrc, 
13990 61 64 64 72 31 29 3b 20 56 64 62 65 43 6f 76 65  addr1); VdbeCove
139a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
139b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
139c0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63  , OP_Close, iSrc
139d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
139e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
139f0 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20  P_Close, iDest, 
13a00 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
13a10 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
13a20 6b 28 70 50 61 72 73 65 2c 20 69 44 62 44 65 73  k(pParse, iDbDes
13a30 74 2c 20 70 44 65 73 74 2d 3e 74 6e 75 6d 2c 20  t, pDest->tnum, 
13a40 31 2c 20 70 44 65 73 74 2d 3e 7a 4e 61 6d 65 29  1, pDest->zName)
13a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
13a60 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
13a70 44 62 53 72 63 2c 20 70 53 72 63 2d 3e 74 6e 75  DbSrc, pSrc->tnu
13a80 6d 2c 20 30 2c 20 70 53 72 63 2d 3e 7a 4e 61 6d  m, 0, pSrc->zNam
13a90 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44  e);.  }.  for(pD
13aa0 65 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70 49  estIdx=pDest->pI
13ab0 6e 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b 20  ndex; pDestIdx; 
13ac0 70 44 65 73 74 49 64 78 3d 70 44 65 73 74 49 64  pDestIdx=pDestId
13ad0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 75  x->pNext){.    u
13ae0 38 20 69 64 78 49 6e 73 46 6c 61 67 73 20 3d 20  8 idxInsFlags = 
13af0 30 3b 0a 20 20 20 20 66 6f 72 28 70 53 72 63 49  0;.    for(pSrcI
13b00 64 78 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b  dx=pSrc->pIndex;
13b10 20 41 4c 57 41 59 53 28 70 53 72 63 49 64 78 29   ALWAYS(pSrcIdx)
13b20 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63 49 64  ; pSrcIdx=pSrcId
13b30 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
13b40 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74 69   if( xferCompati
13b50 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49 64  bleIndex(pDestId
13b60 78 2c 20 70 53 72 63 49 64 78 29 20 29 20 62 72  x, pSrcIdx) ) br
13b70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
13b80 73 73 65 72 74 28 20 70 53 72 63 49 64 78 20 29  ssert( pSrcIdx )
13b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13ba0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
13bb0 65 6e 52 65 61 64 2c 20 69 53 72 63 2c 20 70 53  enRead, iSrc, pS
13bc0 72 63 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  rcIdx->tnum, iDb
13bd0 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Src);.    sqlite
13be0 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
13bf0 6f 28 70 50 61 72 73 65 2c 20 70 53 72 63 49 64  o(pParse, pSrcId
13c00 78 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  x);.    VdbeComm
13c10 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 53  ent((v, "%s", pS
13c20 72 63 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  rcIdx->zName));.
13c30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13c40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
13c50 57 72 69 74 65 2c 20 69 44 65 73 74 2c 20 70 44  Write, iDest, pD
13c60 65 73 74 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  estIdx->tnum, iD
13c70 62 44 65 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  bDest);.    sqli
13c80 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
13c90 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 44 65 73  nfo(pParse, pDes
13ca0 74 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  tIdx);.    sqlit
13cb0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
13cc0 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  , OPFLAG_BULKCSR
13cd0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
13ce0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 44 65  nt((v, "%s", pDe
13cf0 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  stIdx->zName));.
13d00 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
13d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13d20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 53 72 63   OP_Rewind, iSrc
13d30 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
13d40 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
13d50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13d60 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 53 72 63 2c  OP_RowKey, iSrc,
13d70 20 72 65 67 44 61 74 61 29 3b 0a 20 20 20 20 69   regData);.    i
13d80 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
13d90 51 4c 49 54 45 5f 56 61 63 75 75 6d 20 29 7b 0a  QLITE_Vacuum ){.
13da0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 49 4e        /* This IN
13db0 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 69 73 20  SERT command is 
13dc0 70 61 72 74 20 6f 66 20 61 20 56 41 43 55 55 4d  part of a VACUUM
13dd0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 77 68 69 63   operation, whic
13de0 68 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 20  h guarantees.   
13df0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64     ** that the d
13e00 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
13e10 20 69 73 20 65 6d 70 74 79 2e 20 49 66 20 61 6c   is empty. If al
13e20 6c 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  l indexed column
13e30 73 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  s use.      ** c
13e40 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13e50 65 20 42 49 4e 41 52 59 2c 20 74 68 65 6e 20 69  e BINARY, then i
13e60 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 73  t can also be as
13e70 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 20  sumed that the. 
13e80 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69       ** index wi
13e90 6c 6c 20 62 65 20 70 6f 70 75 6c 61 74 65 64 20  ll be populated 
13ea0 62 79 20 69 6e 73 65 72 74 69 6e 67 20 6b 65 79  by inserting key
13eb0 73 20 69 6e 20 73 74 72 69 63 74 6c 79 20 73 6f  s in strictly so
13ec0 72 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rted .      ** o
13ed0 72 64 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  rder. In this ca
13ee0 73 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73  se, instead of s
13ef0 65 65 6b 69 6e 67 20 77 69 74 68 69 6e 20 74 68  eeking within th
13f00 65 20 62 2d 74 72 65 65 20 61 73 20 70 61 72 74  e b-tree as part
13f10 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 76 65  .      ** of eve
13f20 72 79 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 20  ry OP_IdxInsert 
13f30 6f 70 63 6f 64 65 2c 20 61 6e 20 4f 50 5f 4c 61  opcode, an OP_La
13f40 73 74 20 69 73 20 61 64 64 65 64 20 62 65 66 6f  st is added befo
13f50 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  re the.      ** 
13f60 4f 50 5f 49 64 78 49 6e 73 65 72 74 20 74 6f 20  OP_IdxInsert to 
13f70 73 65 65 6b 20 74 6f 20 74 68 65 20 70 6f 69 6e  seek to the poin
13f80 74 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  t within the b-t
13f90 72 65 65 20 77 68 65 72 65 20 65 61 63 68 20 6b  ree where each k
13fa0 65 79 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  ey .      ** sho
13fb0 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
13fc0 20 54 68 69 73 20 69 73 20 66 61 73 74 65 72 2e   This is faster.
13fd0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13fe0 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
13ff0 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73   indexed columns
14000 20 75 73 65 20 61 20 63 6f 6c 6c 61 74 69 6f 6e   use a collation
14010 20 73 65 71 75 65 6e 63 65 20 6f 74 68 65 72 20   sequence other 
14020 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 42 49  than.      ** BI
14030 4e 41 52 59 2c 20 74 68 69 73 20 6f 70 74 69 6d  NARY, this optim
14040 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62  ization is disab
14050 6c 65 64 2e 20 54 68 69 73 20 69 73 20 62 65 63  led. This is bec
14060 61 75 73 65 20 74 68 65 20 75 73 65 72 20 0a 20  ause the user . 
14070 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 63 68       ** might ch
14080 61 6e 67 65 20 74 68 65 20 64 65 66 69 6e 69 74  ange the definit
14090 69 6f 6e 20 6f 66 20 61 20 63 6f 6c 6c 61 74 69  ion of a collati
140a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 6e 64 20  on sequence and 
140b0 74 68 65 6e 20 72 75 6e 0a 20 20 20 20 20 20 2a  then run.      *
140c0 2a 20 61 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  * a VACUUM comma
140d0 6e 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  nd. In that case
140e0 20 6b 65 79 73 20 6d 61 79 20 6e 6f 74 20 62 65   keys may not be
140f0 20 77 72 69 74 74 65 6e 20 69 6e 20 73 74 72 69   written in stri
14100 63 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 73 6f  ctly.      ** so
14110 72 74 65 64 20 6f 72 64 65 72 2e 20 20 2a 2f 0a  rted order.  */.
14120 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
14130 3c 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c 75 6d  <pSrcIdx->nColum
14140 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
14150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
14160 6c 6c 20 3d 20 70 53 72 63 49 64 78 2d 3e 61 7a  ll = pSrcIdx->az
14170 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
14180 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14190 5f 73 74 72 69 63 6d 70 28 73 71 6c 69 74 65 33  _stricmp(sqlite3
141a0 53 74 72 42 49 4e 41 52 59 2c 20 7a 43 6f 6c 6c  StrBINARY, zColl
141b0 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
141c0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
141d0 74 65 33 53 74 72 42 49 4e 41 52 59 3d 3d 7a 43  te3StrBINARY==zC
141e0 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  oll );.        i
141f0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
14200 6d 70 28 73 71 6c 69 74 65 33 53 74 72 42 49 4e  mp(sqlite3StrBIN
14210 41 52 59 2c 20 7a 43 6f 6c 6c 29 20 29 20 62 72  ARY, zColl) ) br
14220 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
14230 20 20 20 69 66 28 20 69 3d 3d 70 53 72 63 49 64     if( i==pSrcId
14240 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
14250 20 20 20 20 20 20 69 64 78 49 6e 73 46 6c 61 67        idxInsFlag
14260 73 20 3d 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  s = OPFLAG_USESE
14270 45 4b 52 45 53 55 4c 54 3b 0a 20 20 20 20 20 20  EKRESULT;.      
14280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14290 4f 70 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op3(v, OP_Last, 
142a0 69 44 65 73 74 2c 20 30 2c 20 2d 31 29 3b 0a 20  iDest, 0, -1);. 
142b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
142c0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
142d0 53 72 63 29 20 26 26 20 70 44 65 73 74 49 64 78  Src) && pDestIdx
142e0 2d 3e 69 64 78 54 79 70 65 3d 3d 32 20 29 7b 0a  ->idxType==2 ){.
142f0 20 20 20 20 20 20 69 64 78 49 6e 73 46 6c 61 67        idxInsFlag
14300 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41  s |= OPFLAG_NCHA
14310 4e 47 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  NGE;.    }.    s
14320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14330 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
14340 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61 74 61  , iDest, regData
14350 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
14360 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
14370 20 69 64 78 49 6e 73 46 6c 61 67 73 29 3b 0a 20   idxInsFlags);. 
14380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14390 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
143a0 20 69 53 72 63 2c 20 61 64 64 72 31 2b 31 29 3b   iSrc, addr1+1);
143b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
143c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
143d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
143e0 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
143f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14400 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30 29  _Close, iSrc, 0)
14410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
14430 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a  ose, iDest, 0);.
14440 20 20 7d 0a 20 20 69 66 28 20 65 6d 70 74 79 53    }.  if( emptyS
14450 72 63 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  rcTest ) sqlite3
14460 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14470 65 6d 70 74 79 53 72 63 54 65 73 74 29 3b 0a 20  emptySrcTest);. 
14480 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14490 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
144a0 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
144b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
144c0 67 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  g(pParse, regDat
144d0 61 29 3b 0a 20 20 69 66 28 20 65 6d 70 74 79 44  a);.  if( emptyD
144e0 65 73 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  estTest ){.    s
144f0 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
14500 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29 3b 0a  entEnd(pParse);.
14510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
14530 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
14540 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14550 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d 70 74  JumpHere(v, empt
14560 79 44 65 73 74 54 65 73 74 29 3b 0a 20 20 20 20  yDestTest);.    
14570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14580 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
14590 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  Dest, 0);.    re
145a0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
145b0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
145c0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
145d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f  QLITE_OMIT_XFER_
145e0 4f 50 54 20 2a 2f 0a                             OPT */.