/ Hex Artifact Content
Login

Artifact 7af46a3be2656f5e13791464625d93d6b07b8612:


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 3b 20 20 20 20 20 20 20 20 20  t i, j;         
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 2c 20 70 49 64 78     for(i=0, pIdx
6e60: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 69  =pTab->pIndex; i
6e70: 3c 6e 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78  <nIdx; pIdx=pIdx
6e80: 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  ->pNext, i++){. 
6e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
6ea0: 78 20 29 3b 0a 20 20 20 20 20 20 61 52 65 67 49  x );.      aRegI
6eb0: 64 78 5b 69 5d 20 3d 20 2b 2b 70 50 61 72 73 65  dx[i] = ++pParse
6ec0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
6ed0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 49  arse->nMem += pI
6ee0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
6ef0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69   }.  }..  /* Thi
6f00: 73 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66 20  s is the top of 
6f10: 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72 74 69  the main inserti
6f20: 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 66 28  on loop */.  if(
6f30: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b   useTempTable ){
6f40: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
6f50: 63 6b 20 63 6f 64 65 73 20 74 68 65 20 74 6f 70  ck codes the top
6f60: 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20   of loop only.  
6f70: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f  The complete loo
6f80: 70 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  p is the.    ** 
6f90: 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64 6f  following pseudo
6fa0: 63 6f 64 65 20 28 74 65 6d 70 6c 61 74 65 20 34  code (template 4
6fb0: 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ):.    **.    **
6fc0: 20 20 20 20 20 20 20 20 20 72 65 77 69 6e 64 20           rewind 
6fd0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 69 66 20 65  temp table, if e
6fe0: 6d 70 74 79 20 67 6f 74 6f 20 44 0a 20 20 20 20  mpty goto D.    
6ff0: 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20  **      C: loop 
7000: 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74  over rows of int
7010: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a  ermediate table.
7020: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
7030: 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73   transfer values
7040: 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61   form intermedia
7050: 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74  te table into <t
7060: 61 62 6c 65 3e 0a 20 20 20 20 2a 2a 20 20 20 20  able>.    **    
7070: 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 20 20       end loop.  
7080: 20 20 2a 2a 20 20 20 20 20 20 44 3a 20 2e 2e 2e    **      D: ...
7090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72  .    */.    addr
70a0: 49 6e 73 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  InsTop = sqlite3
70b0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
70c0: 5f 52 65 77 69 6e 64 2c 20 73 72 63 54 61 62 29  _Rewind, srcTab)
70d0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
70e0: 29 3b 0a 20 20 20 20 61 64 64 72 43 6f 6e 74 20  );.    addrCont 
70f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
7100: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
7110: 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63 74  else if( pSelect
7120: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7130: 62 6c 6f 63 6b 20 63 6f 64 65 73 20 74 68 65 20  block codes the 
7140: 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79  top of loop only
7150: 2e 20 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  .  The complete 
7160: 6c 6f 6f 70 20 69 73 20 74 68 65 0a 20 20 20 20  loop is the.    
7170: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65  ** following pse
7180: 75 64 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61 74  udocode (templat
7190: 65 20 33 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e 3):.    **.   
71a0: 20 2a 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c   **      C: yiel
71b0: 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f  d X, at EOF goto
71c0: 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   D.    **       
71d0: 20 20 69 6e 73 65 72 74 20 74 68 65 20 73 65 6c    insert the sel
71e0: 65 63 74 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  ect result into 
71f0: 3c 74 61 62 6c 65 3e 20 66 72 6f 6d 20 52 2e 2e  <table> from R..
7200: 52 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  R+n.    **      
7210: 20 20 20 67 6f 74 6f 20 43 0a 20 20 20 20 2a 2a     goto C.    **
7220: 20 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20        D: ....   
7230: 20 2a 2f 0a 20 20 20 20 61 64 64 72 49 6e 73 54   */.    addrInsT
7240: 6f 70 20 3d 20 61 64 64 72 43 6f 6e 74 20 3d 20  op = addrCont = 
7250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7260: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64  1(v, OP_Yield, d
7270: 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
7280: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7290: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 75 6e  );.  }..  /* Run
72a0: 20 74 68 65 20 42 45 46 4f 52 45 20 61 6e 64 20   the BEFORE and 
72b0: 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67  INSTEAD OF trigg
72c0: 65 72 73 2c 20 69 66 20 74 68 65 72 65 20 61 72  ers, if there ar
72d0: 65 20 61 6e 79 0a 20 20 2a 2f 0a 20 20 65 6e 64  e any.  */.  end
72e0: 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
72f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
7300: 3b 0a 20 20 69 66 28 20 74 6d 61 73 6b 20 26 20  ;.  if( tmask & 
7310: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 29  TRIGGER_BEFORE )
7320: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c  {.    int regCol
7330: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  s = sqlite3GetTe
7340: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7350: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 0a  pTab->nCol+1);..
7360: 20 20 20 20 2f 2a 20 62 75 69 6c 64 20 74 68 65      /* build the
7370: 20 4e 45 57 2e 2a 20 72 65 66 65 72 65 6e 63 65   NEW.* reference
7380: 20 72 6f 77 2e 20 20 4e 6f 74 65 20 74 68 61 74   row.  Note that
7390: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
73a0: 49 4e 54 45 47 45 52 0a 20 20 20 20 2a 2a 20 50  INTEGER.    ** P
73b0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 74 6f 20  RIMARY KEY into 
73c0: 77 68 69 63 68 20 61 20 4e 55 4c 4c 20 69 73 20  which a NULL is 
73d0: 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 2c 20  being inserted, 
73e0: 74 68 61 74 20 4e 55 4c 4c 20 77 69 6c 6c 20 62  that NULL will b
73f0: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61  e.    ** transla
7400: 74 65 64 20 69 6e 74 6f 20 61 20 75 6e 69 71 75  ted into a uniqu
7410: 65 20 49 44 20 66 6f 72 20 74 68 65 20 72 6f 77  e ID for the row
7420: 2e 20 20 42 75 74 20 6f 6e 20 61 20 42 45 46 4f  .  But on a BEFO
7430: 52 45 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20  RE trigger,.    
7440: 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ** we do not kno
7450: 77 20 77 68 61 74 20 74 68 65 20 75 6e 69 71 75  w what the uniqu
7460: 65 20 49 44 20 77 69 6c 6c 20 62 65 20 28 62 65  e ID will be (be
7470: 63 61 75 73 65 20 74 68 65 20 69 6e 73 65 72 74  cause the insert
7480: 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
7490: 68 61 70 70 65 6e 65 64 20 79 65 74 29 20 73 6f  happened yet) so
74a0: 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61   we substitute a
74b0: 20 72 6f 77 69 64 20 6f 66 20 2d 31 0a 20 20 20   rowid of -1.   
74c0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 70 6b 43   */.    if( ipkC
74d0: 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
74e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
74f0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
7500: 2c 20 2d 31 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  , -1, regCols);.
7510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7520: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20   int addr1;.    
7530: 20 20 61 73 73 65 72 74 28 20 21 77 69 74 68 6f    assert( !witho
7540: 75 74 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  utRowid );.     
7550: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
7560: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
7570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7580: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
7590: 54 61 62 2c 20 69 70 6b 43 6f 6c 75 6d 6e 2c 20  Tab, ipkColumn, 
75a0: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  regCols);.      
75b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
75c0: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 3d 3d  ssert( pSelect==
75d0: 30 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69  0 );  /* Otherwi
75e0: 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  se useTempTable 
75f0: 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20  is true */.     
7600: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
7610: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  de(pParse, pList
7620: 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70  ->a[ipkColumn].p
7630: 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  Expr, regCols);.
7640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
7650: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
7660: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
7670: 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29 3b  tNull, regCols);
7680: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7690: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
76a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
76b0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67  Integer, -1, reg
76c0: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
76d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
76e0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
76f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7700: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
7710: 49 6e 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20 56  Int, regCols); V
7720: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7730: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
7740: 6e 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67 65  nnot have trigge
7750: 72 73 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20  rs on a virtual 
7760: 74 61 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72  table. If it wer
7770: 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20  e possible,.    
7780: 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f  ** this block wo
7790: 75 6c 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f  uld have to acco
77a0: 75 6e 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63  unt for hidden c
77b0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
77c0: 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
77d0: 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20  tual(pTab) );.. 
77e0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
77f0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61   new column data
7800: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7810: 69 3d 6a 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e  i=j=0; i<pTab->n
7820: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
7830: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a   if( pColumn ){.
7840: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7850: 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   j<pColumn->nId;
7860: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
7870: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b   if( pColumn->a[
7880: 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65 61  j].idx==i ) brea
7890: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
78a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
78b0: 21 75 73 65 54 65 6d 70 54 61 62 6c 65 20 26 26  !useTempTable &&
78c0: 20 21 70 4c 69 73 74 29 20 7c 7c 20 28 70 43 6f   !pList) || (pCo
78d0: 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75  lumn && j>=pColu
78e0: 6d 6e 2d 3e 6e 49 64 29 0a 20 20 20 20 20 20 20  mn->nId).       
78f0: 20 20 20 20 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e       || (pColumn
7900: 3d 3d 30 20 26 26 20 49 73 4f 72 64 69 6e 61 72  ==0 && IsOrdinar
7910: 79 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  yHiddenColumn(&p
7920: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 29 20 29  Tab->aCol[i])) )
7930: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7940: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
7950: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
7960: 70 44 66 6c 74 2c 20 72 65 67 43 6f 6c 73 2b 69  pDflt, regCols+i
7970: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
7980: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
7990: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
79a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
79b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
79c0: 54 61 62 2c 20 6a 2c 20 72 65 67 43 6f 6c 73 2b  Tab, j, regCols+
79d0: 69 2b 31 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c  i+1); .      }el
79e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
79f0: 72 74 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29  rt( pSelect==0 )
7a00: 3b 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 75  ; /* Otherwise u
7a10: 73 65 54 65 6d 70 54 61 62 6c 65 20 69 73 20 74  seTempTable is t
7a20: 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  rue */.        s
7a30: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e  qlite3ExprCodeAn
7a40: 64 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  dCache(pParse, p
7a50: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
7a60: 2c 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 0a  , regCols+i+1);.
7a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7a80: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
7a90: 21 49 73 4f 72 64 69 6e 61 72 79 48 69 64 64 65  !IsOrdinaryHidde
7aa0: 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
7ab0: 43 6f 6c 5b 69 5d 29 20 29 20 6a 2b 2b 3b 0a 20  Col[i]) ) j++;. 
7ac0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
7ad0: 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
7ae0: 54 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68  T on a view with
7af0: 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49   an INSTEAD OF I
7b00: 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20  NSERT trigger,. 
7b10: 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74     ** do not att
7b20: 65 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73  empt any convers
7b30: 69 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65  ions before asse
7b40: 6d 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72  mbling the recor
7b50: 64 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  d..    ** If thi
7b60: 73 20 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c  s is a real tabl
7b70: 65 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65  e, attempt conve
7b80: 72 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72  rsions as requir
7b90: 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
7ba0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66   table column af
7bb0: 66 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f  finities..    */
7bc0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
7bd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7be0: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
7bf0: 2c 20 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2b  , pTab, regCols+
7c00: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
7c10: 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72  * Fire BEFORE or
7c20: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
7c30: 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  gers */.    sqli
7c40: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
7c50: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
7c60: 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  er, TK_INSERT, 0
7c70: 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  , TRIGGER_BEFORE
7c80: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c  , .        pTab,
7c90: 20 72 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e 6e   regCols-pTab->n
7ca0: 43 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c 20  Col-1, onError, 
7cb0: 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20  endOfLoop);..   
7cc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7cd0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7ce0: 20 72 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d 3e   regCols, pTab->
7cf0: 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  nCol+1);.  }..  
7d00: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
7d10: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
7d20: 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
7d30: 20 69 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f 66   into a range of
7d40: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20  .  ** registers 
7d50: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67  beginning at reg
7d60: 49 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  Ins..  */.  if( 
7d70: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69  !isView ){.    i
7d80: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
7d90: 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
7da0: 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20  he row that the 
7db0: 56 55 70 64 61 74 65 20 6f 70 63 6f 64 65 20 77  VUpdate opcode w
7dc0: 69 6c 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e 65  ill delete: none
7dd0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
7de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7df0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 6e  P_Null, 0, regIn
7e00: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
7e10: 28 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20 29  ( ipkColumn>=0 )
7e20: 7b 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 54  {.      if( useT
7e30: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
7e40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
7e60: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43  mn, srcTab, ipkC
7e70: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29  olumn, regRowid)
7e80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7e90: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
7ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7eb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
7ec0: 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  y, regFromSelect
7ed0: 2b 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52  +ipkColumn, regR
7ee0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
7ef0: 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
7f00: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
7f10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7f20: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
7f30: 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78  a[ipkColumn].pEx
7f40: 70 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  pr, regRowid);. 
7f50: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
7f60: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
7f70: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66   -1);.        if
7f80: 28 20 41 4c 57 41 59 53 28 70 4f 70 29 20 26 26  ( ALWAYS(pOp) &&
7f90: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
7fa0: 5f 4e 75 6c 6c 20 26 26 20 21 49 73 56 69 72 74  _Null && !IsVirt
7fb0: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
7fc0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61         appendFla
7fd0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  g = 1;.         
7fe0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
7ff0: 50 5f 4e 65 77 52 6f 77 69 64 3b 0a 20 20 20 20  P_NewRowid;.    
8000: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
8010: 69 44 61 74 61 43 75 72 3b 0a 20 20 20 20 20 20  iDataCur;.      
8020: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
8030: 67 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  gRowid;.        
8040: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 72 65 67 41    pOp->p3 = regA
8050: 75 74 6f 69 6e 63 3b 0a 20 20 20 20 20 20 20 20  utoinc;.        
8060: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8070: 2f 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  /* If the PRIMAR
8080: 59 20 4b 45 59 20 65 78 70 72 65 73 73 69 6f 6e  Y KEY expression
8090: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 75   is NULL, then u
80a0: 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 0a 20  se OP_NewRowid. 
80b0: 20 20 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65 72       ** to gener
80c0: 61 74 65 20 61 20 75 6e 69 71 75 65 20 70 72 69  ate a unique pri
80d0: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 2e 0a  mary key value..
80e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
80f0: 66 28 20 21 61 70 70 65 6e 64 46 6c 61 67 20 29  f( !appendFlag )
8100: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
8110: 64 72 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dr1;.        if(
8120: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
8130: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
8140: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
8150: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
8160: 6f 74 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 69 64  otNull, regRowid
8170: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
8180: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
8190: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
81a0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
81b0: 69 44 61 74 61 43 75 72 2c 20 72 65 67 52 6f 77  iDataCur, regRow
81c0: 69 64 2c 20 72 65 67 41 75 74 6f 69 6e 63 29 3b  id, regAutoinc);
81d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
81e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
81f0: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
8200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8210: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
8220: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
8230: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r(v);.          
8240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8250: 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
8260: 72 65 67 52 6f 77 69 64 2c 20 61 64 64 72 31 2b  regRowid, addr1+
8270: 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
8280: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (v);.        }. 
8290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
82a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
82b0: 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f 77  ustBeInt, regRow
82c0: 69 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  id); VdbeCoverag
82d0: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
82e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
82f0: 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 77  rtual(pTab) || w
8300: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
8310: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8320: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
8330: 6c 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  l, 0, regRowid);
8340: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8350: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8360: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op3(v, OP_NewRow
8370: 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65  id, iDataCur, re
8380: 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f 69  gRowid, regAutoi
8390: 6e 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e  nc);.      appen
83a0: 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d  dFlag = 1;.    }
83b0: 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70  .    autoIncStep
83c0: 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f  (pParse, regAuto
83d0: 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  inc, regRowid);.
83e0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
83f0: 64 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  data for all col
8400: 75 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77 20  umns of the new 
8410: 65 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e 67  entry, beginning
8420: 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
8430: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a 20   first column.. 
8440: 20 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64 64 65     */.    nHidde
8450: 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  n = 0;.    for(i
8460: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
8470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
8480: 74 20 69 52 65 67 53 74 6f 72 65 20 3d 20 72 65  t iRegStore = re
8490: 67 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20 20 20  gRowid+1+i;.    
84a0: 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69    if( i==pTab->i
84b0: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
84c0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
84d0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
84e0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69  ARY KEY column i
84f0: 73 20 61 6c 77 61 79 73 20 61 20 4e 55 4c 4c 2e  s always a NULL.
8500: 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  .        ** When
8510: 65 76 65 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e  ever this column
8520: 20 69 73 20 72 65 61 64 2c 20 74 68 65 20 72 6f   is read, the ro
8530: 77 69 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73  wid will be subs
8540: 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
8550: 2a 2a 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ** in its place.
8560: 20 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20 74 68    Hence, fill th
8570: 69 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61  is column with a
8580: 20 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a 20   NULL to avoid. 
8590: 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67         ** taking
85a0: 20 75 70 20 64 61 74 61 20 73 70 61 63 65 20 77   up data space w
85b0: 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ith information 
85c0: 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
85d0: 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20 20  be used..       
85e0: 20 2a 2a 20 41 73 20 74 68 65 72 65 20 6d 61 79   ** As there may
85f0: 20 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f 70 69   be shallow copi
8600: 65 73 20 6f 66 20 74 68 69 73 20 76 61 6c 75 65  es of this value
8610: 2c 20 6d 61 6b 65 20 69 74 20 61 20 73 6f 66 74  , make it a soft
8620: 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20  -NULL */.       
8630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8640: 70 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e 75 6c  p1(v, OP_SoftNul
8650: 6c 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20  l, iRegStore);. 
8660: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8680: 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  f( pColumn==0 ){
8690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48  .        if( IsH
86a0: 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
86b0: 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  b->aCol[i]) ){. 
86c0: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b           j = -1;
86d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64 64  .          nHidd
86e0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  en++;.        }e
86f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
8700: 20 3d 20 69 20 2d 20 6e 48 69 64 64 65 6e 3b 0a   = i - nHidden;.
8710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
8730: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d  or(j=0; j<pColum
8740: 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20  n->nId; j++){.  
8750: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
8760: 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69  umn->a[j].idx==i
8770: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8780: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8790: 20 20 69 66 28 20 6a 3c 30 20 7c 7c 20 6e 43 6f    if( j<0 || nCo
87a0: 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28 70 43 6f 6c  lumn==0 || (pCol
87b0: 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d  umn && j>=pColum
87c0: 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20 20 20 20 20  n->nId) ){.     
87d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
87e0: 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50 61  deFactorable(pPa
87f0: 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  rse, pTab->aCol[
8800: 69 5d 2e 70 44 66 6c 74 2c 20 69 52 65 67 53 74  i].pDflt, iRegSt
8810: 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ore);.      }els
8820: 65 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62  e if( useTempTab
8830: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
8840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8850: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
8860: 63 54 61 62 2c 20 6a 2c 20 69 52 65 67 53 74 6f  cTab, j, iRegSto
8870: 72 65 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  re); .      }els
8880: 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b  e if( pSelect ){
8890: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67  .        if( reg
88a0: 46 72 6f 6d 53 65 6c 65 63 74 21 3d 72 65 67 44  FromSelect!=regD
88b0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
88c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
88d0: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
88e0: 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b 6a 2c  regFromSelect+j,
88f0: 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20   iRegStore);.   
8900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8910: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8920: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8930: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  se, pList->a[j].
8940: 70 45 78 70 72 2c 20 69 52 65 67 53 74 6f 72 65  pExpr, iRegStore
8950: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8960: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
8970: 65 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  e code to check 
8980: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20  constraints and 
8990: 67 65 6e 65 72 61 74 65 20 69 6e 64 65 78 20 6b  generate index k
89a0: 65 79 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  eys and.    ** d
89b0: 6f 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 2e  o the insertion.
89c0: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
89d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
89e0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
89f0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
8a00: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
8a10: 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
8a20: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
8a30: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
8a40: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71   pTab);.      sq
8a50: 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72 69  lite3VtabMakeWri
8a60: 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  table(pParse, pT
8a70: 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ab);.      sqlit
8a80: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
8a90: 4f 50 5f 56 55 70 64 61 74 65 2c 20 31 2c 20 70  OP_VUpdate, 1, p
8aa0: 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c 20 72 65 67  Tab->nCol+2, reg
8ab0: 49 6e 73 2c 20 70 56 54 61 62 2c 20 50 34 5f 56  Ins, pVTab, P4_V
8ac0: 54 41 42 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TAB);.      sqli
8ad0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
8ae0: 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  v, onError==OE_D
8af0: 65 66 61 75 6c 74 20 3f 20 4f 45 5f 41 62 6f 72  efault ? OE_Abor
8b00: 74 20 3a 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20  t : onError);.  
8b10: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
8b20: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ort(pParse);.   
8b30: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
8b40: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73    {.      int is
8b50: 52 65 70 6c 61 63 65 3b 20 20 20 20 2f 2a 20 53  Replace;    /* S
8b60: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 63 6f  et to true if co
8b70: 6e 73 74 72 61 69 6e 74 73 20 6d 61 79 20 63 61  nstraints may ca
8b80: 75 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a 2f  use a replace */
8b90: 0a 20 20 20 20 20 20 69 6e 74 20 62 55 73 65 53  .      int bUseS
8ba0: 65 65 6b 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  eek;     /* True
8bb0: 20 74 6f 20 75 73 65 20 4f 50 46 4c 41 47 5f 53   to use OPFLAG_S
8bc0: 45 45 4b 52 45 53 55 4c 54 20 2a 2f 0a 20 20 20  EEKRESULT */.   
8bd0: 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
8be0: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
8bf0: 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ks(pParse, pTab,
8c00: 20 61 52 65 67 49 64 78 2c 20 69 44 61 74 61 43   aRegIdx, iDataC
8c10: 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20  ur, iIdxCur,.   
8c20: 20 20 20 20 20 20 20 72 65 67 49 6e 73 2c 20 30         regIns, 0
8c30: 2c 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 2c 20  , ipkColumn>=0, 
8c40: 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f  onError, endOfLo
8c50: 6f 70 2c 20 26 69 73 52 65 70 6c 61 63 65 2c 20  op, &isReplace, 
8c60: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
8c70: 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b 28   sqlite3FkCheck(
8c80: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
8c90: 20 72 65 67 49 6e 73 2c 20 30 2c 20 30 29 3b 0a   regIns, 0, 0);.
8ca0: 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
8cb0: 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
8cc0: 52 45 53 55 4c 54 20 66 6c 61 67 20 69 66 20 65  RESULT flag if e
8cd0: 69 74 68 65 72 20 28 61 29 20 74 68 65 72 65 20  ither (a) there 
8ce0: 61 72 65 20 6e 6f 20 52 45 50 4c 41 43 45 0a 20  are no REPLACE. 
8cf0: 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
8d00: 6e 74 73 20 6f 72 20 28 62 29 20 74 68 65 72 65  nts or (b) there
8d10: 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73   are no triggers
8d20: 20 61 6e 64 20 74 68 69 73 20 74 61 62 6c 65 20   and this table 
8d30: 69 73 20 6e 6f 74 20 61 0a 20 20 20 20 20 20 2a  is not a.      *
8d40: 2a 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 69  * parent table i
8d50: 6e 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  n a foreign key 
8d60: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 49 74 20 69  constraint. It i
8d70: 73 20 73 61 66 65 20 74 6f 20 73 65 74 20 74 68  s safe to set th
8d80: 65 0a 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20  e.      ** flag 
8d90: 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 63 61  in the second ca
8da0: 73 65 20 61 73 20 69 66 20 61 6e 79 20 52 45 50  se as if any REP
8db0: 4c 41 43 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  LACE constraint 
8dc0: 69 73 20 68 69 74 2c 20 61 6e 0a 20 20 20 20 20  is hit, an.     
8dd0: 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65 20 6f 72   ** OP_Delete or
8de0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 20 69 6e   OP_IdxDelete in
8df0: 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
8e00: 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 65 61  e executed on ea
8e10: 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  ch .      ** cur
8e20: 73 6f 72 20 74 68 61 74 20 69 73 20 64 69 73 74  sor that is dist
8e30: 75 72 62 65 64 2e 20 41 6e 64 20 74 68 65 73 65  urbed. And these
8e40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 62 6f   instructions bo
8e50: 74 68 20 63 6c 65 61 72 20 74 68 65 0a 20 20 20  th clear the.   
8e60: 20 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72     ** VdbeCursor
8e70: 2e 73 65 65 6b 52 65 73 75 6c 74 20 76 61 72 69  .seekResult vari
8e80: 61 62 6c 65 2c 20 64 69 73 61 62 6c 69 6e 67 20  able, disabling 
8e90: 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  the OPFLAG_USESE
8ea0: 45 4b 52 45 53 55 4c 54 0a 20 20 20 20 20 20 2a  EKRESULT.      *
8eb0: 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e  * functionality.
8ec0: 20 20 2a 2f 0a 20 20 20 20 20 20 62 55 73 65 53    */.      bUseS
8ed0: 65 65 6b 20 3d 20 28 69 73 52 65 70 6c 61 63 65  eek = (isReplace
8ee0: 3d 3d 30 20 7c 7c 20 28 70 54 72 69 67 67 65 72  ==0 || (pTrigger
8ef0: 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20  ==0 &&.         
8f00: 20 28 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53   ((db->flags & S
8f10: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
8f20: 73 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  s)==0 || sqlite3
8f30: 46 6b 52 65 66 65 72 65 6e 63 65 73 28 70 54 61  FkReferences(pTa
8f40: 62 29 3d 3d 30 29 0a 20 20 20 20 20 20 29 29 3b  b)==0).      ));
8f50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
8f60: 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28  mpleteInsertion(
8f70: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
8f80: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c  ataCur, iIdxCur,
8f90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 49 6e  .          regIn
8fa0: 73 2c 20 61 52 65 67 49 64 78 2c 20 30 2c 20 61  s, aRegIdx, 0, a
8fb0: 70 70 65 6e 64 46 6c 61 67 2c 20 62 55 73 65 53  ppendFlag, bUseS
8fc0: 65 65 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  eek.      );.   
8fd0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
8fe0: 61 74 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ate the count of
8ff0: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 69   rows that are i
9000: 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69  nserted.  */.  i
9010: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
9020: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
9030: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
9040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9050: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 52   OP_AddImm, regR
9060: 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 7d  owCount, 1);.  }
9070: 0a 0a 20 20 69 66 28 20 70 54 72 69 67 67 65 72  ..  if( pTrigger
9080: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20   ){.    /* Code 
9090: 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20 2a  AFTER triggers *
90a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  /.    sqlite3Cod
90b0: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
90c0: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 54 4b  se, pTrigger, TK
90d0: 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54 52 49 47  _INSERT, 0, TRIG
90e0: 47 45 52 5f 41 46 54 45 52 2c 20 0a 20 20 20 20  GER_AFTER, .    
90f0: 20 20 20 20 70 54 61 62 2c 20 72 65 67 44 61 74      pTab, regDat
9100: 61 2d 32 2d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  a-2-pTab->nCol, 
9110: 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f  onError, endOfLo
9120: 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  op);.  }..  /* T
9130: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
9140: 20 6d 61 69 6e 20 69 6e 73 65 72 74 69 6f 6e 20   main insertion 
9150: 6c 6f 6f 70 2c 20 69 66 20 74 68 65 20 64 61 74  loop, if the dat
9160: 61 20 73 6f 75 72 63 65 0a 20 20 2a 2a 20 69 73  a source.  ** is
9170: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
9180: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
9190: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
91a0: 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70  bel(v, endOfLoop
91b0: 29 3b 0a 20 20 69 66 28 20 75 73 65 54 65 6d 70  );.  if( useTemp
91c0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c  Table ){.    sql
91d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
91e0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 72 63 54 61  , OP_Next, srcTa
91f0: 62 2c 20 61 64 64 72 43 6f 6e 74 29 3b 20 56 64  b, addrCont); Vd
9200: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
9220: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
9230: 73 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  sTop);.    sqlit
9240: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
9250: 4f 50 5f 43 6c 6f 73 65 2c 20 73 72 63 54 61 62  OP_Close, srcTab
9260: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
9270: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
9280: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
9290: 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20   addrCont);.    
92a0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
92b0: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 54 6f  ere(v, addrInsTo
92c0: 70 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f  p);.  }..insert_
92d0: 65 6e 64 3a 0a 20 20 2f 2a 20 55 70 64 61 74 65  end:.  /* Update
92e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
92f0: 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73 74  ence table by st
9300: 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  oring the conten
9310: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61  t of the.  ** ma
9320: 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e  ximum rowid coun
9330: 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f 72  ter values recor
9340: 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  ded while insert
9350: 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75  ing into.  ** au
9360: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c  toincrement tabl
9370: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
9380: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
9390: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
93a0: 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20  ggerTab==0 ){.  
93b0: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63    sqlite3Autoinc
93c0: 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65  rementEnd(pParse
93d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
93e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
93f0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 73 65  ber of rows inse
9400: 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 72 6f  rted. If this ro
9410: 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67  utine is .  ** g
9420: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 62  enerating code b
9430: 65 63 61 75 73 65 20 6f 66 20 61 20 63 61 6c 6c  ecause of a call
9440: 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73 74 65   to sqlite3Neste
9450: 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74  dParse(), do not
9460: 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  .  ** invoke the
9470: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
9480: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  on..  */.  if( (
9490: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
94a0: 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26 20 21  _CountRows) && !
94b0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
94c0: 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  & !pParse->pTrig
94d0: 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 73 71  gerTab ){.    sq
94e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
94f0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
9500: 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29   regRowCount, 1)
9510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9520: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
9530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9540: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
9550: 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  0, COLNAME_NAME,
9560: 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22   "rows inserted"
9570: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9580: 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 63 6c  ;.  }..insert_cl
9590: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
95a0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
95b0: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73  , pTabList);.  s
95c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
95d0: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
95e0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
95f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
9600: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  ct);.  sqlite3Id
9610: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
9620: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74  Column);.  sqlit
9630: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 52 65  e3DbFree(db, aRe
9640: 67 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d 61 6b  gIdx);.}../* Mak
9650: 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22 20  e sure "isView" 
9660: 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f 73  and other macros
9670: 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20 61   defined above a
9680: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74  re undefined. Ot
9690: 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 79 20  herwise.** they 
96a0: 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77 69  may interfere wi
96b0: 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f  th compilation o
96c0: 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  f other function
96d0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a 2a  s in this file.*
96e0: 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65 72  * (or in another
96f0: 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20 66   file, if this f
9700: 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72 74  ile becomes part
9710: 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   of the amalgama
9720: 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64 65  tion).  */.#ifde
9730: 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65 66  f isView. #undef
9740: 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a 23   isView.#endif.#
9750: 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a 20  ifdef pTrigger. 
9760: 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72 0a  #undef pTrigger.
9770: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 74 6d  #endif.#ifdef tm
9780: 61 73 6b 0a 20 23 75 6e 64 65 66 20 74 6d 61 73  ask. #undef tmas
9790: 6b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  k.#endif../*.** 
97a0: 4d 65 61 6e 69 6e 67 73 20 6f 66 20 62 69 74 73  Meanings of bits
97b0: 20 69 6e 20 6f 66 20 70 57 61 6c 6b 65 72 2d 3e   in of pWalker->
97c0: 65 43 6f 64 65 20 66 6f 72 20 63 68 65 63 6b 43  eCode for checkC
97d0: 6f 6e 73 74 72 61 69 6e 74 55 6e 63 68 61 6e 67  onstraintUnchang
97e0: 65 64 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ed().*/.#define 
97f0: 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e  CKCNSTRNT_COLUMN
9800: 20 20 20 30 78 30 31 20 20 20 20 2f 2a 20 43 48     0x01    /* CH
9810: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 75  ECK constraint u
9820: 73 65 73 20 61 20 63 68 61 6e 67 69 6e 67 20 63  ses a changing c
9830: 6f 6c 75 6d 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  olumn */.#define
9840: 20 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44   CKCNSTRNT_ROWID
9850: 20 20 20 20 30 78 30 32 20 20 20 20 2f 2a 20 43      0x02    /* C
9860: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
9870: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 52  references the R
9880: 4f 57 49 44 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73  OWID */../* This
9890: 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 20 63   is the Walker c
98a0: 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 63 68 65  allback from che
98b0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e 63 68  ckConstraintUnch
98c0: 61 6e 67 65 64 28 29 2e 20 20 53 65 74 0a 2a 2a  anged().  Set.**
98d0: 20 62 69 74 20 30 78 30 31 20 6f 66 20 70 57 61   bit 0x01 of pWa
98e0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 66 0a 2a  lker->eCode if.*
98f0: 2a 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  * pWalker->eCode
9900: 20 74 6f 20 30 20 69 66 20 74 68 69 73 20 65 78   to 0 if this ex
9910: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
9920: 66 65 72 65 6e 63 65 73 20 61 6e 79 20 6f 66 20  ferences any of 
9930: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74  the.** columns t
9940: 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 6d 6f  hat are being mo
9950: 64 69 66 65 64 20 62 79 20 61 6e 20 55 50 44 41  difed by an UPDA
9960: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  TE statement..*/
9970: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
9980: 6b 43 6f 6e 73 74 72 61 69 6e 74 45 78 70 72 4e  kConstraintExprN
9990: 6f 64 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ode(Walker *pWal
99a0: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
99b0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ){.  if( pExpr->
99c0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
99d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
99e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 7c  pr->iColumn>=0 |
99f0: 7c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  | pExpr->iColumn
9a00: 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ==-1 );.    if( 
9a10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
9a20: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
9a30: 57 61 6c 6b 65 72 2d 3e 75 2e 61 69 43 6f 6c 5b  Walker->u.aiCol[
9a40: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3e  pExpr->iColumn]>
9a50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  =0 ){.        pW
9a60: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 7c 3d 20  alker->eCode |= 
9a70: 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e  CKCNSTRNT_COLUMN
9a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9a90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 61 6c 6b  lse{.      pWalk
9aa0: 65 72 2d 3e 65 43 6f 64 65 20 7c 3d 20 43 4b 43  er->eCode |= CKC
9ab0: 4e 53 54 52 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  NSTRNT_ROWID;.  
9ac0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9ad0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
9ae0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
9af0: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
9b00: 69 6e 74 20 6f 6e 20 61 20 72 6f 77 20 74 68 61  int on a row tha
9b10: 74 20 69 73 20 62 65 69 6e 67 20 55 50 44 41 54  t is being UPDAT
9b20: 45 2d 65 64 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  E-ed.  The.** on
9b30: 6c 79 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ly columns that 
9b40: 61 72 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20  are modified by 
9b50: 74 68 65 20 55 50 44 41 54 45 20 61 72 65 20 74  the UPDATE are t
9b60: 68 6f 73 65 20 66 6f 72 20 77 68 69 63 68 0a 2a  hose for which.*
9b70: 2a 20 61 69 43 68 6e 67 5b 69 5d 3e 3d 30 2c 20  * aiChng[i]>=0, 
9b80: 61 6e 64 20 61 6c 73 6f 20 74 68 65 20 52 4f 57  and also the ROW
9b90: 49 44 20 69 73 20 6d 6f 64 69 66 69 65 64 20 69  ID is modified i
9ba0: 66 20 63 68 6e 67 52 6f 77 69 64 20 69 73 20 74  f chngRowid is t
9bb0: 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  rue..**.** Retur
9bc0: 6e 20 74 72 75 65 20 69 66 20 43 48 45 43 4b 20  n true if CHECK 
9bd0: 63 6f 6e 73 74 72 61 69 6e 74 20 70 45 78 70 72  constraint pExpr
9be0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e   does not use an
9bf0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e  y of the.** chan
9c00: 67 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 28 6f 72  ging columns (or
9c10: 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 69 74   the rowid if it
9c20: 20 69 73 20 63 68 61 6e 67 69 6e 67 29 2e 20 20   is changing).  
9c30: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
9c40: 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  ** return true i
9c50: 66 20 74 68 69 73 20 43 48 45 43 4b 20 63 6f 6e  f this CHECK con
9c60: 73 74 72 61 69 6e 74 20 63 61 6e 20 62 65 20 73  straint can be s
9c70: 6b 69 70 70 65 64 20 77 68 65 6e 20 76 61 6c 69  kipped when vali
9c80: 64 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 65  dating.** the ne
9c90: 77 20 72 6f 77 20 69 6e 20 74 68 65 20 55 50 44  w row in the UPD
9ca0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ATE statement..*
9cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
9cc0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e 63 68  ckConstraintUnch
9cd0: 61 6e 67 65 64 28 45 78 70 72 20 2a 70 45 78 70  anged(Expr *pExp
9ce0: 72 2c 20 69 6e 74 20 2a 61 69 43 68 6e 67 2c 20  r, int *aiChng, 
9cf0: 69 6e 74 20 63 68 6e 67 52 6f 77 69 64 29 7b 0a  int chngRowid){.
9d00: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
9d10: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
9d20: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
9d30: 65 20 3d 20 30 3b 0a 20 20 77 2e 78 45 78 70 72  e = 0;.  w.xExpr
9d40: 43 61 6c 6c 62 61 63 6b 20 3d 20 63 68 65 63 6b  Callback = check
9d50: 43 6f 6e 73 74 72 61 69 6e 74 45 78 70 72 4e 6f  ConstraintExprNo
9d60: 64 65 3b 0a 20 20 77 2e 75 2e 61 69 43 6f 6c 20  de;.  w.u.aiCol 
9d70: 3d 20 61 69 43 68 6e 67 3b 0a 20 20 73 71 6c 69  = aiChng;.  sqli
9d80: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
9d90: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 21 63  pExpr);.  if( !c
9da0: 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  hngRowid ){.    
9db0: 74 65 73 74 63 61 73 65 28 20 28 77 2e 65 43 6f  testcase( (w.eCo
9dc0: 64 65 20 26 20 43 4b 43 4e 53 54 52 4e 54 5f 52  de & CKCNSTRNT_R
9dd0: 4f 57 49 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  OWID)!=0 );.    
9de0: 77 2e 65 43 6f 64 65 20 26 3d 20 7e 43 4b 43 4e  w.eCode &= ~CKCN
9df0: 53 54 52 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  STRNT_ROWID;.  }
9e00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 2e 65  .  testcase( w.e
9e10: 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 74 65 73  Code==0 );.  tes
9e20: 74 63 61 73 65 28 20 77 2e 65 43 6f 64 65 3d 3d  tcase( w.eCode==
9e30: 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e  CKCNSTRNT_COLUMN
9e40: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9e50: 77 2e 65 43 6f 64 65 3d 3d 43 4b 43 4e 53 54 52  w.eCode==CKCNSTR
9e60: 4e 54 5f 52 4f 57 49 44 20 29 3b 0a 20 20 74 65  NT_ROWID );.  te
9e70: 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64 65 3d  stcase( w.eCode=
9e80: 3d 28 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49  =(CKCNSTRNT_ROWI
9e90: 44 7c 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55  D|CKCNSTRNT_COLU
9ea0: 4d 4e 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MN) );.  return 
9eb0: 21 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  !w.eCode;.}../*.
9ec0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9ed0: 20 74 6f 20 64 6f 20 63 6f 6e 73 74 72 61 69 6e   to do constrain
9ee0: 74 20 63 68 65 63 6b 73 20 70 72 69 6f 72 20 74  t checks prior t
9ef0: 6f 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 61  o an INSERT or a
9f00: 6e 20 55 50 44 41 54 45 0a 2a 2a 20 6f 6e 20 74  n UPDATE.** on t
9f10: 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a  able pTab..**.**
9f20: 20 54 68 65 20 72 65 67 4e 65 77 44 61 74 61 20   The regNewData 
9f30: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
9f40: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
9f50: 69 6e 20 61 20 72 61 6e 67 65 20 74 68 61 74 20  in a range that 
9f60: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
9f70: 64 61 74 61 20 74 6f 20 62 65 20 69 6e 73 65 72  data to be inser
9f80: 74 65 64 20 6f 72 20 74 68 65 20 64 61 74 61 20  ted or the data 
9f90: 61 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65  after the update
9fa0: 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  .  There will be
9fb0: 0a 2a 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  .** pTab->nCol+1
9fc0: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74 68   registers in th
9fd0: 69 73 20 72 61 6e 67 65 2e 20 20 54 68 65 20 66  is range.  The f
9fe0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 28 74  irst register (t
9ff0: 68 65 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 72  he one.** that r
a000: 65 67 4e 65 77 44 61 74 61 20 70 6f 69 6e 74 73  egNewData points
a010: 20 74 6f 29 20 77 69 6c 6c 20 63 6f 6e 74 61 69   to) will contai
a020: 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 2c  n the new rowid,
a030: 20 6f 72 20 4e 55 4c 4c 20 69 6e 20 74 68 65 0a   or NULL in the.
a040: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  ** case of a WIT
a050: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
a060: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 72 65  .  The second re
a070: 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
a080: 6e 67 65 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74  nge will.** cont
a090: 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ain the content 
a0a0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 61 62  of the first tab
a0b0: 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  le column.  The 
a0c0: 74 68 69 72 64 20 72 65 67 69 73 74 65 72 20 77  third register w
a0d0: 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  ill.** contain t
a0e0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
a0f0: 65 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 63  e second table c
a100: 6f 6c 75 6d 6e 2e 20 20 41 6e 64 20 73 6f 20 66  olumn.  And so f
a110: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  orth..**.** The 
a120: 72 65 67 4f 6c 64 44 61 74 61 20 70 61 72 61 6d  regOldData param
a130: 65 74 65 72 20 69 73 20 73 69 6d 69 6c 61 72 20  eter is similar 
a140: 74 6f 20 72 65 67 4e 65 77 44 61 74 61 20 65 78  to regNewData ex
a150: 63 65 70 74 20 74 68 61 74 20 69 74 20 63 6f 6e  cept that it con
a160: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74  tains.** the dat
a170: 61 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 55 50  a prior to an UP
a180: 44 41 54 45 20 72 61 74 68 65 72 20 74 68 61 6e  DATE rather than
a190: 20 61 66 74 65 72 77 61 72 64 73 2e 20 20 72 65   afterwards.  re
a1a0: 67 4f 6c 64 44 61 74 61 20 69 73 20 7a 65 72 6f  gOldData is zero
a1b0: 0a 2a 2a 20 66 6f 72 20 61 6e 20 49 4e 53 45 52  .** for an INSER
a1c0: 54 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  T.  This routine
a1d0: 20 63 61 6e 20 64 69 73 74 69 6e 67 75 69 73 68   can distinguish
a1e0: 20 62 65 74 77 65 65 6e 20 55 50 44 41 54 45 20   between UPDATE 
a1f0: 61 6e 64 20 49 4e 53 45 52 54 20 62 79 0a 2a 2a  and INSERT by.**
a200: 20 63 68 65 63 6b 69 6e 67 20 72 65 67 4f 6c 64   checking regOld
a210: 44 61 74 61 20 66 6f 72 20 7a 65 72 6f 2e 0a 2a  Data for zero..*
a220: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 55 50 44 41  *.** For an UPDA
a230: 54 45 2c 20 74 68 65 20 70 6b 43 68 6e 67 20 62  TE, the pkChng b
a240: 6f 6f 6c 65 61 6e 20 69 73 20 74 72 75 65 20 69  oolean is true i
a250: 66 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61  f the true prima
a260: 72 79 20 6b 65 79 20 28 74 68 65 0a 2a 2a 20 72  ry key (the.** r
a270: 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 72 6d 61  owid for a norma
a280: 6c 20 74 61 62 6c 65 20 6f 72 20 74 68 65 20 50  l table or the P
a290: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 61  RIMARY KEY for a
a2a0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
a2b0: 61 62 6c 65 29 0a 2a 2a 20 6d 69 67 68 74 20 62  able).** might b
a2c0: 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  e modified by th
a2d0: 65 20 55 50 44 41 54 45 2e 20 20 49 66 20 70 6b  e UPDATE.  If pk
a2e0: 43 68 6e 67 20 69 73 20 66 61 6c 73 65 2c 20 74  Chng is false, t
a2f0: 68 65 6e 20 74 68 65 20 6b 65 79 20 6f 66 0a 2a  hen the key of.*
a300: 2a 20 74 68 65 20 69 44 61 74 61 43 75 72 20 63  * the iDataCur c
a310: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 69 73 20  ontent table is 
a320: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
a330: 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 74 68   unchanged by th
a340: 65 20 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20  e UPDATE..**.** 
a350: 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 2c 20 74  For an INSERT, t
a360: 68 65 20 70 6b 43 68 6e 67 20 62 6f 6f 6c 65 61  he pkChng boolea
a370: 6e 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  n indicates whet
a380: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
a390: 6f 77 69 64 0a 2a 2a 20 77 61 73 20 65 78 70 6c  owid.** was expl
a3a0: 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
a3b0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
a3c0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
a3d0: 2e 20 20 49 66 20 70 6b 43 68 6e 67 0a 2a 2a 20  .  If pkChng.** 
a3e0: 69 73 20 7a 65 72 6f 2c 20 69 74 20 6d 65 61 6e  is zero, it mean
a3f0: 73 20 74 68 61 74 20 74 68 65 20 65 69 74 68 65  s that the eithe
a400: 72 20 72 6f 77 69 64 20 69 73 20 63 6f 6d 70 75  r rowid is compu
a410: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
a420: 79 20 6f 72 0a 2a 2a 20 74 68 61 74 20 74 68 65  y or.** that the
a430: 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
a440: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
a450: 61 6e 64 20 68 61 73 20 6e 6f 20 72 6f 77 69 64  and has no rowid
a460: 2e 20 20 4f 6e 20 61 6e 20 49 4e 53 45 52 54 2c  .  On an INSERT,
a470: 0a 2a 2a 20 70 6b 43 68 6e 67 20 77 69 6c 6c 20  .** pkChng will 
a480: 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66 20  only be true if 
a490: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
a4a0: 6d 65 6e 74 20 70 72 6f 76 69 64 65 73 20 61 6e  ment provides an
a4b0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75   integer.** valu
a4c0: 65 20 66 6f 72 20 65 69 74 68 65 72 20 74 68 65  e for either the
a4d0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 72   rowid column or
a4e0: 20 69 74 73 20 49 4e 54 45 47 45 52 20 50 52 49   its INTEGER PRI
a4f0: 4d 41 52 59 20 4b 45 59 20 61 6c 69 61 73 2e 0a  MARY KEY alias..
a500: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
a510: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69 73  enerated by this
a520: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 73 74   routine will st
a530: 6f 72 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e  ore new index en
a540: 74 72 69 65 73 20 69 6e 74 6f 0a 2a 2a 20 72 65  tries into.** re
a550: 67 69 73 74 65 72 73 20 69 64 65 6e 74 69 66 69  gisters identifi
a560: 65 64 20 62 79 20 61 52 65 67 49 64 78 5b 5d 2e  ed by aRegIdx[].
a570: 20 20 4e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79    No index entry
a580: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 0a   is created for.
a590: 2a 2a 20 69 6e 64 69 63 65 73 20 77 68 65 72 65  ** indices where
a5a0: 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 2e 20   aRegIdx[i]==0. 
a5b0: 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 69 6e   The order of in
a5c0: 64 69 63 65 73 20 69 6e 20 61 52 65 67 49 64 78  dices in aRegIdx
a5d0: 5b 5d 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  [] is.** the sam
a5e0: 65 20 61 73 20 74 68 65 20 6f 72 64 65 72 20 6f  e as the order o
a5f0: 66 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  f indices on the
a600: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a610: 69 6e 64 69 63 65 73 0a 2a 2a 20 61 74 20 70 54  indices.** at pT
a620: 61 62 2d 3e 70 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  ab->pIndex..**.*
a630: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
a640: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f  t have already o
a650: 70 65 6e 65 64 20 77 72 69 74 65 61 62 6c 65 20  pened writeable 
a660: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 6d  cursors on the m
a670: 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  ain.** table and
a680: 20 61 6c 6c 20 61 70 70 6c 69 63 61 62 6c 65 20   all applicable 
a690: 69 6e 64 69 63 65 73 20 28 74 68 61 74 20 69 73  indices (that is
a6a0: 20 74 6f 20 73 61 79 2c 20 61 6c 6c 20 69 6e 64   to say, all ind
a6b0: 69 63 65 73 20 66 6f 72 20 77 68 69 63 68 0a 2a  ices for which.*
a6c0: 2a 20 61 52 65 67 49 64 78 5b 5d 20 69 73 20 6e  * aRegIdx[] is n
a6d0: 6f 74 20 7a 65 72 6f 29 2e 20 20 69 44 61 74 61  ot zero).  iData
a6e0: 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  Cur is the curso
a6f0: 72 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74  r for the main t
a700: 61 62 6c 65 20 77 68 65 6e 0a 2a 2a 20 69 6e 73  able when.** ins
a710: 65 72 74 69 6e 67 20 6f 72 20 75 70 64 61 74 69  erting or updati
a720: 6e 67 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  ng a rowid table
a730: 2c 20 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20  , or the cursor 
a740: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
a750: 4b 45 59 0a 2a 2a 20 69 6e 64 65 78 20 77 68 65  KEY.** index whe
a760: 6e 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 61  n operating on a
a770: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
a780: 61 62 6c 65 2e 20 20 69 49 64 78 43 75 72 20 69  able.  iIdxCur i
a790: 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  s the cursor.** 
a7a0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 69 6e  for the first in
a7b0: 64 65 78 20 69 6e 20 74 68 65 20 70 54 61 62 2d  dex in the pTab-
a7c0: 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e 20 20 43  >pIndex list.  C
a7d0: 75 72 73 6f 72 73 20 66 6f 72 20 6f 74 68 65 72  ursors for other
a7e0: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61 72 65 20   indices.** are 
a7f0: 61 74 20 69 49 64 78 43 75 72 2b 4e 20 66 6f 72  at iIdxCur+N for
a800: 20 74 68 65 20 4e 2d 74 68 20 65 6c 65 6d 65 6e   the N-th elemen
a810: 74 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e 70  t of the pTab->p
a820: 49 6e 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  Index list..**.*
a830: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
a840: 6c 73 6f 20 67 65 6e 65 72 61 74 65 73 20 63 6f  lso generates co
a850: 64 65 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73  de to check cons
a860: 74 72 61 69 6e 74 73 2e 20 20 4e 4f 54 20 4e 55  traints.  NOT NU
a870: 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b 2c 20 61 6e  LL,.** CHECK, an
a880: 64 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  d UNIQUE constra
a890: 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 63 68 65  ints are all che
a8a0: 63 6b 65 64 2e 20 20 49 66 20 61 20 63 6f 6e 73  cked.  If a cons
a8b0: 74 72 61 69 6e 74 20 66 61 69 6c 73 2c 0a 2a 2a  traint fails,.**
a8c0: 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70   then the approp
a8d0: 72 69 61 74 65 20 61 63 74 69 6f 6e 20 69 73 20  riate action is 
a8e0: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 72  performed.  Ther
a8f0: 65 20 61 72 65 20 66 69 76 65 20 70 6f 73 73 69  e are five possi
a900: 62 6c 65 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a 20  ble.** actions: 
a910: 52 4f 4c 4c 42 41 43 4b 2c 20 41 42 4f 52 54 2c  ROLLBACK, ABORT,
a920: 20 46 41 49 4c 2c 20 52 45 50 4c 41 43 45 2c 20   FAIL, REPLACE, 
a930: 61 6e 64 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a 2a  and IGNORE..**.*
a940: 2a 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  *  Constraint ty
a950: 70 65 20 20 41 63 74 69 6f 6e 20 20 20 20 20 20  pe  Action      
a960: 20 57 68 61 74 20 48 61 70 70 65 6e 73 0a 2a 2a   What Happens.**
a970: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
a980: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -  ----------   
a990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e 79  --------.**  any
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 4f                RO
a9d0: 4c 4c 42 41 43 4b 20 20 20 20 20 54 68 65 20 63  LLBACK     The c
a9e0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
a9f0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
aa00: 6b 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  k and.**        
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
aa30: 73 74 65 70 28 29 20 72 65 74 75 72 6e 73 20 69  step() returns i
aa40: 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20  mmediately with 
aa50: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 20      return code 
aa80: 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  of SQLITE_CONSTR
aa90: 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79  AINT..**.**  any
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 42                AB
aab0: 4f 52 54 20 20 20 20 20 20 20 20 42 61 63 6b 20  ORT        Back 
aac0: 6f 75 74 20 63 68 61 6e 67 65 73 20 66 72 6f 6d  out changes from
aad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6d   the current com
aae0: 6d 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  mand.**         
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab00: 20 20 20 20 20 20 20 6f 6e 6c 79 20 28 64 6f 20         only (do 
ab10: 6e 6f 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  not do a complet
ab20: 65 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 6e  e rollback) then
ab30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 63 61 75 73 65 20 73 71 6c 69 74 65 33     cause sqlite3
ab60: 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74 75 72  _step() to retur
ab70: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f 4e 53  with SQLITE_CONS
abb0: 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61  TRAINT..**.**  a
abc0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
abd0: 46 41 49 4c 20 20 20 20 20 20 20 20 20 53 71 6c  FAIL         Sql
abe0: 69 74 65 33 5f 73 74 65 70 28 29 20 72 65 74 75  ite3_step() retu
abf0: 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  rns immediately 
ac00: 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20  with a.**       
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ac30: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43  code of SQLITE_C
ac40: 4f 4e 53 54 52 41 49 4e 54 2e 20 20 54 68 65 0a  ONSTRAINT.  The.
ac50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73    transaction is
ac80: 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b   not rolled back
ac90: 20 61 6e 64 20 61 6e 79 0a 2a 2a 20 20 20 20 20   and any.**     
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67             chang
acc0: 65 73 20 74 6f 20 70 72 69 6f 72 20 72 6f 77 73  es to prior rows
acd0: 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a   are retained..*
ace0: 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20  *.**  any       
acf0: 20 20 20 20 20 20 20 49 47 4e 4f 52 45 20 20 20         IGNORE   
ad00: 20 20 20 20 54 68 65 20 61 74 74 65 6d 70 74 20      The attempt 
ad10: 69 6e 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64  in insert or upd
ad20: 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ate the current.
ad30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 72 6f 77 20 69 73 20 73 6b 69 70 70 65 64    row is skipped
ad60: 2c 20 77 69 74 68 6f 75 74 20 74 68 72 6f 77 69  , without throwi
ad70: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  ng an error..** 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
ada0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 69 6e  rocessing contin
adb0: 75 65 73 20 77 69 74 68 20 74 68 65 20 6e 65 78  ues with the nex
adc0: 74 20 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20  t row..**       
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 28 54 68 65 72 65 20           (There 
adf0: 69 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  is an immediate 
ae00: 6a 75 6d 70 20 74 6f 20 69 67 6e 6f 72 65 44 65  jump to ignoreDe
ae10: 73 74 2e 29 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20  st.).**.**  NOT 
ae20: 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 52 45 50  NULL         REP
ae30: 4c 41 43 45 20 20 20 20 20 20 54 68 65 20 4e 55  LACE      The NU
ae40: 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 70 6c  LL value is repl
ae50: 61 63 65 20 62 79 20 74 68 65 20 64 65 66 61 75  ace by the defau
ae60: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 76 61 6c 75 65 20 66 6f 72 20 74       value for t
ae90: 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20  hat column.  If 
aea0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
aeb0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65      is NULL, the
aee0: 20 61 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73   action is the s
aef0: 61 6d 65 20 61 73 20 41 42 4f 52 54 2e 0a 2a 2a  ame as ABORT..**
af00: 0a 2a 2a 20 20 55 4e 49 51 55 45 20 20 20 20 20  .**  UNIQUE     
af10: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
af20: 20 20 20 54 68 65 20 6f 74 68 65 72 20 72 6f 77     The other row
af30: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
af40: 77 69 74 68 20 74 68 65 20 72 6f 77 0a 2a 2a 20  with the row.** 
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
af70: 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69 73  eing inserted is
af80: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
af90: 20 43 48 45 43 4b 20 20 20 20 20 20 20 20 20 20   CHECK          
afa0: 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 49    REPLACE      I
afb0: 6c 6c 65 67 61 6c 2e 20 20 54 68 65 20 72 65 73  llegal.  The res
afc0: 75 6c 74 73 20 69 6e 20 61 6e 20 65 78 63 65 70  ults in an excep
afd0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63  tion..**.** Whic
afe0: 68 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  h action to take
aff0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
b000: 79 20 74 68 65 20 6f 76 65 72 72 69 64 65 45 72  y the overrideEr
b010: 72 6f 72 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ror parameter..*
b020: 2a 20 4f 72 20 69 66 20 6f 76 65 72 72 69 64 65  * Or if override
b030: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
b040: 74 2c 20 74 68 65 6e 20 74 68 65 20 70 50 61 72  t, then the pPar
b050: 73 65 2d 3e 6f 6e 45 72 72 6f 72 20 70 61 72 61  se->onError para
b060: 6d 65 74 65 72 0a 2a 2a 20 69 73 20 75 73 65 64  meter.** is used
b070: 2e 20 20 4f 72 20 69 66 20 70 50 61 72 73 65 2d  .  Or if pParse-
b080: 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
b090: 61 75 6c 74 20 74 68 65 6e 20 74 68 65 20 6f 6e  ault then the on
b0a0: 45 72 72 6f 72 20 76 61 6c 75 65 0a 2a 2a 20 66  Error value.** f
b0b0: 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
b0c0: 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  t is used..*/.vo
b0d0: 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  id sqlite3Genera
b0e0: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
b0f0: 6b 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ks(.  Parse *pPa
b100: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
b110: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
b120: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
b130: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
b140: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
b150: 73 65 72 74 65 64 20 6f 72 20 75 70 64 61 74 65  serted or update
b160: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67  d */.  int *aReg
b170: 49 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20 55  Idx,        /* U
b180: 73 65 20 72 65 67 69 73 74 65 72 20 61 52 65 67  se register aReg
b190: 49 64 78 5b 69 5d 20 66 6f 72 20 69 6e 64 65 78  Idx[i] for index
b1a0: 20 69 2e 20 20 30 20 66 6f 72 20 75 6e 75 73 65   i.  0 for unuse
b1b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61  d */.  int iData
b1c0: 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur,        /* C
b1d0: 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 63 75  anonical data cu
b1e0: 72 73 6f 72 20 28 6d 61 69 6e 20 74 61 62 6c 65  rsor (main table
b1f0: 20 6f 72 20 50 4b 20 69 6e 64 65 78 29 20 2a 2f   or PK index) */
b200: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20  .  int iIdxCur, 
b210: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b220: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
b230: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44 61 74  .  int regNewDat
b240: 61 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  a,      /* First
b250: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 72   register in a r
b260: 61 6e 67 65 20 68 6f 6c 64 69 6e 67 20 76 61 6c  ange holding val
b270: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  ues to insert */
b280: 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 44 61 74  .  int regOldDat
b290: 61 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  a,      /* Previ
b2a0: 6f 75 73 20 63 6f 6e 74 65 6e 74 2e 20 20 30 20  ous content.  0 
b2b0: 66 6f 72 20 49 4e 53 45 52 54 73 20 2a 2f 0a 20  for INSERTs */. 
b2c0: 20 75 38 20 70 6b 43 68 6e 67 2c 20 20 20 20 20   u8 pkChng,     
b2d0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
b2e0: 6f 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f  o if the rowid o
b2f0: 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 68  r PRIMARY KEY ch
b300: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76  anged */.  u8 ov
b310: 65 72 72 69 64 65 45 72 72 6f 72 2c 20 20 20 20  errideError,    
b320: 2f 2a 20 4f 76 65 72 72 69 64 65 20 6f 6e 45 72  /* Override onEr
b330: 72 6f 72 20 74 6f 20 74 68 69 73 20 69 66 20 6e  ror to this if n
b340: 6f 74 20 4f 45 5f 44 65 66 61 75 6c 74 20 2a 2f  ot OE_Default */
b350: 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65 44 65 73  .  int ignoreDes
b360: 74 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  t,      /* Jump 
b370: 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 6f 6e  to this label on
b380: 20 61 6e 20 4f 45 5f 49 67 6e 6f 72 65 20 72 65   an OE_Ignore re
b390: 73 6f 6c 75 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  solution */.  in
b3a0: 74 20 2a 70 62 4d 61 79 52 65 70 6c 61 63 65 2c  t *pbMayReplace,
b3b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
b3c0: 6f 20 74 72 75 65 20 69 66 20 63 6f 6e 73 74 72  o true if constr
b3d0: 61 69 6e 74 20 6d 61 79 20 63 61 75 73 65 20 61  aint may cause a
b3e0: 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e   replace */.  in
b3f0: 74 20 2a 61 69 43 68 6e 67 20 20 20 20 20 20 20  t *aiChng       
b400: 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 69 20 69     /* column i i
b410: 73 20 75 6e 63 68 61 6e 67 65 64 20 69 66 20 61  s unchanged if a
b420: 69 43 68 6e 67 5b 69 5d 3c 30 20 2a 2f 0a 29 7b  iChng[i]<0 */.){
b430: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
b440: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
b450: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 74 69 6f  under construtio
b460: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
b470: 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  dx;         /* P
b480: 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6f 66  ointer to one of
b490: 20 74 68 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a   the indices */.
b4a0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
b4b0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 52  ;      /* The PR
b4c0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
b4d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b4e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
b4f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b500: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
b520: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b530: 69 6e 74 20 69 78 3b 20 20 20 20 20 20 20 20 20  int ix;         
b540: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 6f       /* Index lo
b550: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b560: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
b570: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b580: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  f columns */.  i
b590: 6e 74 20 6f 6e 45 72 72 6f 72 3b 20 20 20 20 20  nt onError;     
b5a0: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
b5b0: 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74  resolution strat
b5c0: 65 67 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  egy */.  int add
b5d0: 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r1;           /*
b5e0: 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70   Address of jump
b5f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
b600: 20 20 69 6e 74 20 73 65 65 6e 52 65 70 6c 61 63    int seenReplac
b610: 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  e = 0; /* True i
b620: 66 20 52 45 50 4c 41 43 45 20 69 73 20 75 73 65  f REPLACE is use
b630: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 49 4e 54  d to resolve INT
b640: 20 50 4b 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   PK conflict */.
b650: 20 20 69 6e 74 20 6e 50 6b 46 69 65 6c 64 3b 20    int nPkField; 
b660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b670: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 50 52   of fields in PR
b680: 49 4d 41 52 59 20 4b 45 59 2e 20 31 20 66 6f 72  IMARY KEY. 1 for
b690: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
b6a0: 0a 20 20 69 6e 74 20 69 70 6b 54 6f 70 20 3d 20  .  int ipkTop = 
b6b0: 30 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  0;      /* Top o
b6c0: 66 20 74 68 65 20 72 6f 77 69 64 20 63 68 61 6e  f the rowid chan
b6d0: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ge constraint ch
b6e0: 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b  eck */.  int ipk
b6f0: 42 6f 74 74 6f 6d 20 3d 20 30 3b 20 20 20 2f 2a  Bottom = 0;   /*
b700: 20 42 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 72   Bottom of the r
b710: 6f 77 69 64 20 63 68 61 6e 67 65 20 63 6f 6e 73  owid change cons
b720: 74 72 61 69 6e 74 20 63 68 65 63 6b 20 2a 2f 0a  traint check */.
b730: 20 20 75 38 20 69 73 55 70 64 61 74 65 3b 20 20    u8 isUpdate;  
b740: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b750: 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
b760: 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ATE operation */
b770: 0a 20 20 75 38 20 62 41 66 66 69 6e 69 74 79 44  .  u8 bAffinityD
b780: 6f 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75  one = 0;  /* Tru
b790: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
b7a0: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 20 68  nity operation h
b7b0: 61 73 20 62 65 65 6e 20 72 75 6e 20 2a 2f 0a 0a  as been run */..
b7c0: 20 20 69 73 55 70 64 61 74 65 20 3d 20 72 65 67    isUpdate = reg
b7d0: 4f 6c 64 44 61 74 61 21 3d 30 3b 0a 20 20 64 62  OldData!=0;.  db
b7e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b7f0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
b800: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
b810: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
b820: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
b830: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a  Select==0 );  /*
b840: 20 54 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e   This table is n
b850: 6f 74 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 6e  ot a VIEW */.  n
b860: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
b870: 3b 0a 20 20 0a 20 20 2f 2a 20 70 50 6b 20 69 73  ;.  .  /* pPk is
b880: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
b890: 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
b8a0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
b8b0: 61 6e 64 20 4e 55 4c 4c 20 66 6f 72 0a 20 20 2a  and NULL for.  *
b8c0: 2a 20 6e 6f 72 6d 61 6c 20 72 6f 77 69 64 20 74  * normal rowid t
b8d0: 61 62 6c 65 73 2e 20 20 6e 50 6b 46 69 65 6c 64  ables.  nPkField
b8e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b8f0: 66 20 6b 65 79 20 66 69 65 6c 64 73 20 69 6e 20  f key fields in 
b900: 74 68 65 20 0a 20 20 2a 2a 20 70 50 6b 20 69 6e  the .  ** pPk in
b910: 64 65 78 20 6f 72 20 31 20 66 6f 72 20 61 20 72  dex or 1 for a r
b920: 6f 77 69 64 20 74 61 62 6c 65 2e 20 20 49 6e 20  owid table.  In 
b930: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 50 6b  other words, nPk
b940: 46 69 65 6c 64 20 69 73 20 74 68 65 0a 20 20 2a  Field is the.  *
b950: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  * number of fiel
b960: 64 73 20 69 6e 20 74 68 65 20 74 72 75 65 20 70  ds in the true p
b970: 72 69 6d 61 72 79 20 6b 65 79 20 6f 66 20 74 68  rimary key of th
b980: 65 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  e table. */.  if
b990: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
b9a0: 20 29 7b 0a 20 20 20 20 70 50 6b 20 3d 20 30 3b   ){.    pPk = 0;
b9b0: 0a 20 20 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20  .    nPkField = 
b9c0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b9d0: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
b9e0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
b9f0: 62 29 3b 0a 20 20 20 20 6e 50 6b 46 69 65 6c 64  b);.    nPkField
ba00: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
ba10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  .  }..  /* Recor
ba20: 64 20 74 68 61 74 20 74 68 69 73 20 6d 6f 64 75  d that this modu
ba30: 6c 65 20 68 61 73 20 73 74 61 72 74 65 64 20 2a  le has started *
ba40: 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
ba50: 6d 6d 65 6e 74 28 28 76 2c 20 22 42 45 47 49 4e  mment((v, "BEGIN
ba60: 3a 20 47 65 6e 43 6e 73 74 43 6b 73 28 25 64 2c  : GenCnstCks(%d,
ba70: 25 64 2c 25 64 2c 25 64 2c 25 64 29 22 2c 0a 20  %d,%d,%d,%d)",. 
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 69 44 61 74 61 43 75 72 2c 20 69 49      iDataCur, iI
baa0: 64 78 43 75 72 2c 20 72 65 67 4e 65 77 44 61 74  dxCur, regNewDat
bab0: 61 2c 20 72 65 67 4f 6c 64 44 61 74 61 2c 20 70  a, regOldData, p
bac0: 6b 43 68 6e 67 29 29 3b 0a 0a 20 20 2f 2a 20 54  kChng));..  /* T
bad0: 65 73 74 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c  est all NOT NULL
bae0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
baf0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
bb00: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
bb10: 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b  if( i==pTab->iPK
bb20: 65 79 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74  ey ){.      cont
bb30: 69 6e 75 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  inue;        /* 
bb40: 52 4f 57 49 44 20 69 73 20 6e 65 76 65 72 20 4e  ROWID is never N
bb50: 55 4c 4c 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ULL */.    }.   
bb60: 20 69 66 28 20 61 69 43 68 6e 67 20 26 26 20 61   if( aiChng && a
bb70: 69 43 68 6e 67 5b 69 5d 3c 30 20 29 7b 0a 20 20  iChng[i]<0 ){.  
bb80: 20 20 20 20 2f 2a 20 44 6f 6e 27 74 20 62 6f 74      /* Don't bot
bb90: 68 65 72 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  her checking for
bba0: 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 20 63 6f 6c   NOT NULL on col
bbb0: 75 6d 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  umns that do not
bbc0: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20   change */.     
bbd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
bbe0: 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70  .    onError = p
bbf0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
bc00: 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20 6f 6e  Null;.    if( on
bc10: 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29  Error==OE_None )
bc20: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54   continue;  /* T
bc30: 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c  his column is al
bc40: 6c 6f 77 65 64 20 74 6f 20 62 65 20 4e 55 4c 4c  lowed to be NULL
bc50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 76 65 72   */.    if( over
bc60: 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65  rideError!=OE_De
bc70: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f  fault ){.      o
bc80: 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64  nError = overrid
bc90: 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  eError;.    }els
bca0: 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f  e if( onError==O
bcb0: 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
bcc0: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f     onError = OE_
bcd0: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
bce0: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
bcf0: 5f 52 65 70 6c 61 63 65 20 26 26 20 70 54 61 62  _Replace && pTab
bd00: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 3d  ->aCol[i].pDflt=
bd10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72  =0 ){.      onEr
bd20: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
bd30: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
bd40: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f  ( onError==OE_Ro
bd50: 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f  llback || onErro
bd60: 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f  r==OE_Abort || o
bd70: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a  nError==OE_Fail.
bd80: 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72          || onErr
bd90: 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c  or==OE_Ignore ||
bda0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
bdb0: 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69 74  lace );.    swit
bdc0: 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ch( onError ){. 
bdd0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f       case OE_Abo
bde0: 72 74 3a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rt:.        sqli
bdf0: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
be00: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se);.        /* 
be10: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
be20: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
be30: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61  llback:.      ca
be40: 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20  se OE_Fail: {.  
be50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67        char *zMsg
be60: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
be70: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
be80: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
bec0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
bed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
bee0: 76 2c 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  v, OP_HaltIfNull
bef0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
bf00: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 2c 20 6f 6e 45  INT_NOTNULL, onE
bf10: 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rror,.          
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 72 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b  regNewData+1+i);
bf40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf50: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
bf60: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
bf70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bf80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
bf90: 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 4e  , P5_ConstraintN
bfa0: 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  otNull);.       
bfb0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
bfc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
bfd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
bfe0: 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b  ase OE_Ignore: {
bff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c000: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c010: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 4e 65 77 44  _IsNull, regNewD
c020: 61 74 61 2b 31 2b 69 2c 20 69 67 6e 6f 72 65 44  ata+1+i, ignoreD
c030: 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  est);.        Vd
c040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c050: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c060: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
c070: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
c080: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
c090: 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20  OE_Replace );.  
c0a0: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
c0b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c0c0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
c0d0: 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a  egNewData+1+i);.
c0e0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
c0f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c110: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ode(pParse, pTab
c120: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c  ->aCol[i].pDflt,
c130: 20 72 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 29   regNewData+1+i)
c140: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c150: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c160: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 20   addr1);.       
c170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c180: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c190: 54 65 73 74 20 61 6c 6c 20 43 48 45 43 4b 20 63  Test all CHECK c
c1a0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
c1b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c1c0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 69 66 28 20  MIT_CHECK.  if( 
c1d0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 26 26 20  pTab->pCheck && 
c1e0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
c1f0: 49 54 45 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73  ITE_IgnoreChecks
c200: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  )==0 ){.    Expr
c210: 4c 69 73 74 20 2a 70 43 68 65 63 6b 20 3d 20 70  List *pCheck = p
c220: 54 61 62 2d 3e 70 43 68 65 63 6b 3b 0a 20 20 20  Tab->pCheck;.   
c230: 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 20   pParse->ckBase 
c240: 3d 20 72 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a  = regNewData+1;.
c250: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
c260: 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f  errideError!=OE_
c270: 44 65 66 61 75 6c 74 20 3f 20 6f 76 65 72 72 69  Default ? overri
c280: 64 65 45 72 72 6f 72 20 3a 20 4f 45 5f 41 62 6f  deError : OE_Abo
c290: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  rt;.    for(i=0;
c2a0: 20 69 3c 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72   i<pCheck->nExpr
c2b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
c2c0: 74 20 61 6c 6c 4f 6b 3b 0a 20 20 20 20 20 20 45  t allOk;.      E
c2d0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 68  xpr *pExpr = pCh
c2e0: 65 63 6b 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  eck->a[i].pExpr;
c2f0: 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 68 6e  .      if( aiChn
c300: 67 20 26 26 20 63 68 65 63 6b 43 6f 6e 73 74 72  g && checkConstr
c310: 61 69 6e 74 55 6e 63 68 61 6e 67 65 64 28 70 45  aintUnchanged(pE
c320: 78 70 72 2c 20 61 69 43 68 6e 67 2c 20 70 6b 43  xpr, aiChng, pkC
c330: 68 6e 67 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  hng) ) continue;
c340: 0a 20 20 20 20 20 20 61 6c 6c 4f 6b 20 3d 20 73  .      allOk = s
c350: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
c360: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
c370: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
c380: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
c390: 6c 6c 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  llOk, SQLITE_JUM
c3a0: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
c3b0: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
c3c0: 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
c3d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
c3e0: 6f 28 76 2c 20 69 67 6e 6f 72 65 44 65 73 74 29  o(v, ignoreDest)
c3f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c400: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
c410: 6d 65 20 3d 20 70 43 68 65 63 6b 2d 3e 61 5b 69  me = pCheck->a[i
c420: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
c430: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c440: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  zName = pTab->zN
c450: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
c460: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
c470: 6c 61 63 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d  lace ) onError =
c480: 20 4f 45 5f 41 62 6f 72 74 3b 20 2f 2a 20 49 4d   OE_Abort; /* IM
c490: 50 3a 20 52 2d 31 35 35 36 39 2d 36 33 36 32 35  P: R-15569-63625
c4a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
c4b0: 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
c4c0: 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
c4d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
c4e0: 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 6f 6e 45 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c   onError, zName,
c510: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20   P4_TRANSIENT,. 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f               P5_
c540: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 29  ConstraintCheck)
c550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c560: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
c570: 76 65 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b  veLabel(v, allOk
c580: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
c590: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
c5a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
c5b0: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 72  K) */..  /* If r
c5c0: 6f 77 69 64 20 69 73 20 63 68 61 6e 67 69 6e 67  owid is changing
c5d0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
c5e0: 6e 65 77 20 72 6f 77 69 64 20 64 6f 65 73 20 6e  new rowid does n
c5f0: 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ot previously.  
c600: 2a 2a 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ** exist in the 
c610: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
c620: 28 20 70 6b 43 68 6e 67 20 26 26 20 70 50 6b 3d  ( pkChng && pPk=
c630: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
c640: 64 72 52 6f 77 69 64 4f 6b 20 3d 20 73 71 6c 69  drRowidOk = sqli
c650: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
c660: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  (v);..    /* Fig
c670: 75 72 65 20 6f 75 74 20 77 68 61 74 20 61 63 74  ure out what act
c680: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20 63  ion to take in c
c690: 61 73 65 20 6f 66 20 61 20 72 6f 77 69 64 20 63  ase of a rowid c
c6a0: 6f 6c 6c 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  ollision */.    
c6b0: 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e  onError = pTab->
c6c0: 6b 65 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28  keyConf;.    if(
c6d0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d   overrideError!=
c6e0: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
c6f0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
c700: 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20  errideError;.   
c710: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72   }else if( onErr
c720: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
c730: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
c740: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
c750: 7d 0a 0a 20 20 20 20 69 66 28 20 69 73 55 70 64  }..    if( isUpd
c760: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ate ){.      /* 
c770: 70 6b 43 68 6e 67 21 3d 30 20 64 6f 65 73 20 6e  pkChng!=0 does n
c780: 6f 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ot mean that the
c790: 20 72 6f 77 69 64 20 68 61 73 20 63 68 61 6e 67   rowid has chang
c7a0: 65 64 2c 20 6f 6e 6c 79 20 74 68 61 74 0a 20 20  ed, only that.  
c7b0: 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
c7c0: 68 61 76 65 20 63 68 61 6e 67 65 64 2e 20 20 53  have changed.  S
c7d0: 6b 69 70 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  kip the conflict
c7e0: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 69 66 20   logic below if 
c7f0: 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20 20  the rowid.      
c800: 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  ** is unchanged.
c810: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
c820: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c830: 50 5f 45 71 2c 20 72 65 67 4e 65 77 44 61 74 61  P_Eq, regNewData
c840: 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72  , addrRowidOk, r
c850: 65 67 4f 6c 64 44 61 74 61 29 3b 0a 20 20 20 20  egOldData);.    
c860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c870: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
c880: 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
c890: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c8a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
c8b0: 66 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 74  f the response t
c8c0: 6f 20 61 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69  o a rowid confli
c8d0: 63 74 20 69 73 20 52 45 50 4c 41 43 45 20 62 75  ct is REPLACE bu
c8e0: 74 20 74 68 65 20 72 65 73 70 6f 6e 73 65 0a 20  t the response. 
c8f0: 20 20 20 2a 2a 20 74 6f 20 73 6f 6d 65 20 6f 74     ** to some ot
c900: 68 65 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  her UNIQUE const
c910: 72 61 69 6e 74 20 69 73 20 46 41 49 4c 20 6f 72  raint is FAIL or
c920: 20 49 47 4e 4f 52 45 2c 20 74 68 65 6e 20 77 65   IGNORE, then we
c930: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
c940: 64 65 66 65 72 20 74 68 65 20 72 75 6e 6e 69 6e  defer the runnin
c950: 67 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63  g of the rowid c
c960: 6f 6e 66 6c 69 63 74 20 63 68 65 63 6b 69 6e 67  onflict checking
c970: 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 20 20 20   until after.   
c980: 20 2a 2a 20 74 68 65 20 55 4e 49 51 55 45 20 63   ** the UNIQUE c
c990: 6f 6e 73 74 72 61 69 6e 74 73 20 68 61 76 65 20  onstraints have 
c9a0: 72 75 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  run..    */.    
c9b0: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
c9c0: 52 65 70 6c 61 63 65 20 26 26 20 6f 76 65 72 72  Replace && overr
c9d0: 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  ideError!=OE_Rep
c9e0: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  lace ){.      fo
c9f0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ca00: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
ca10: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
ca20: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
ca30: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f  onError==OE_Igno
ca40: 72 65 20 7c 7c 20 70 49 64 78 2d 3e 6f 6e 45 72  re || pIdx->onEr
ca50: 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ror==OE_Fail ){.
ca60: 20 20 20 20 20 20 20 20 20 20 69 70 6b 54 6f 70            ipkTop
ca70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ca80: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
ca90: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
caa0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
cab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
cac0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
cad0: 69 66 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64  if the new rowid
cae0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
caf0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 53  in the table.  S
cb00: 6b 69 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  kip.    ** the f
cb10: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 66 6c 69 63  ollowing conflic
cb20: 74 20 6c 6f 67 69 63 20 69 66 20 69 74 20 64 6f  t logic if it do
cb30: 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 73  es not. */.    s
cb40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cb50: 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
cb60: 2c 20 69 44 61 74 61 43 75 72 2c 20 61 64 64 72  , iDataCur, addr
cb70: 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4e 65 77 44  RowidOk, regNewD
cb80: 61 74 61 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ata);.    VdbeCo
cb90: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
cba0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
cbb0: 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
cbc0: 20 61 20 72 6f 77 69 64 20 63 6f 6c 6c 69 73 69   a rowid collisi
cbd0: 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  on */.    switch
cbe0: 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ( onError ){.   
cbf0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
cc00: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20        onError = 
cc10: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
cc20: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
cc30: 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73  nto the next cas
cc40: 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  e */.      }.   
cc50: 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
cc60: 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ack:.      case 
cc70: 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20  OE_Abort:.      
cc80: 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a  case OE_Fail: {.
cc90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
cca0: 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 70  owidConstraint(p
ccb0: 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  Parse, onError, 
ccc0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 62  pTab);.        b
ccd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
cce0: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c      case OE_Repl
ccf0: 61 63 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  ace: {.        /
cd00: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 44  * If there are D
cd10: 45 4c 45 54 45 20 74 72 69 67 67 65 72 73 20 6f  ELETE triggers o
cd20: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 61 6e 64  n this table and
cd30: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
cd40: 72 65 63 75 72 73 69 76 65 2d 74 72 69 67 67 65  recursive-trigge
cd50: 72 73 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  rs flag is set, 
cd60: 63 61 6c 6c 20 47 65 6e 65 72 61 74 65 52 6f 77  call GenerateRow
cd70: 44 65 6c 65 74 65 28 29 20 74 6f 0a 20 20 20 20  Delete() to.    
cd80: 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68      ** remove th
cd90: 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  e conflicting ro
cda0: 77 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  w from the table
cdb0: 2e 20 54 68 69 73 20 77 69 6c 6c 20 66 69 72 65  . This will fire
cdc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
cdd0: 74 72 69 67 67 65 72 73 20 61 6e 64 20 72 65 6d  triggers and rem
cde0: 6f 76 65 20 62 6f 74 68 20 74 68 65 20 74 61 62  ove both the tab
cdf0: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 62 2d 74  le and index b-t
ce00: 72 65 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  ree entries..   
ce10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
ce20: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
ce30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
ce40: 69 67 67 65 72 73 20 6f 72 20 74 68 65 20 72 65  iggers or the re
ce50: 63 75 72 73 69 76 65 2d 74 72 69 67 67 65 72 73  cursive-triggers
ce60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6c 61 67  .        ** flag
ce70: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 62 75 74   is not set, but
ce80: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6f   the table has o
ce90: 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78  ne or more index
cea0: 65 73 2c 20 63 61 6c 6c 20 0a 20 20 20 20 20 20  es, call .      
ceb0: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 52 6f 77    ** GenerateRow
cec0: 49 6e 64 65 78 44 65 6c 65 74 65 28 29 2e 20 54  IndexDelete(). T
ced0: 68 69 73 20 72 65 6d 6f 76 65 73 20 74 68 65 20  his removes the 
cee0: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e 74  index b-tree ent
cef0: 72 69 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ries .        **
cf00: 20 6f 6e 6c 79 2e 20 54 68 65 20 74 61 62 6c 65   only. The table
cf10: 20 62 2d 74 72 65 65 20 65 6e 74 72 79 20 77 69   b-tree entry wi
cf20: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  ll be replaced b
cf30: 79 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  y the new entry 
cf40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
cf50: 20 69 74 20 69 73 20 69 6e 73 65 72 74 65 64 2e   it is inserted.
cf60: 20 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20    .        **.  
cf70: 20 20 20 20 20 20 2a 2a 20 49 66 20 65 69 74 68        ** If eith
cf80: 65 72 20 47 65 6e 65 72 61 74 65 52 6f 77 44 65  er GenerateRowDe
cf90: 6c 65 74 65 28 29 20 6f 72 20 47 65 6e 65 72 61  lete() or Genera
cfa0: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
cfb0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
cfc0: 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 69 6e        ** also in
cfd0: 76 6f 6b 65 20 4d 75 6c 74 69 57 72 69 74 65 28  voke MultiWrite(
cfe0: 29 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  ) to indicate th
cff0: 61 74 20 74 68 69 73 20 56 44 42 45 20 6d 61 79  at this VDBE may
d000: 20 72 65 71 75 69 72 65 0a 20 20 20 20 20 20 20   require.       
d010: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 6f   ** statement ro
d020: 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 20 73  llback (if the s
d030: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 62 6f 72  tatement is abor
d040: 74 65 64 20 61 66 74 65 72 20 74 68 65 20 64 65  ted after the de
d050: 6c 65 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  lete.        ** 
d060: 74 61 6b 65 73 20 70 6c 61 63 65 29 2e 20 45 61  takes place). Ea
d070: 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 63  rlier versions c
d080: 61 6c 6c 65 64 20 73 71 6c 69 74 65 33 4d 75 6c  alled sqlite3Mul
d090: 74 69 57 72 69 74 65 28 29 20 72 65 67 61 72 64  tiWrite() regard
d0a0: 6c 65 73 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  less,.        **
d0b0: 20 62 75 74 20 62 65 69 6e 67 20 6d 6f 72 65 20   but being more 
d0c0: 73 65 6c 65 63 74 69 76 65 20 68 65 72 65 20 61  selective here a
d0d0: 6c 6c 6f 77 73 20 73 74 61 74 65 6d 65 6e 74 73  llows statements
d0e0: 20 6c 69 6b 65 3a 0a 20 20 20 20 20 20 20 20 2a   like:.        *
d0f0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 52  *.        **   R
d100: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 28 72 6f  EPLACE INTO t(ro
d110: 77 69 64 29 20 56 41 4c 55 45 53 28 24 6e 65 77  wid) VALUES($new
d120: 72 6f 77 69 64 29 0a 20 20 20 20 20 20 20 20 2a  rowid).        *
d130: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  *.        ** to 
d140: 72 75 6e 20 77 69 74 68 6f 75 74 20 61 20 73 74  run without a st
d150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d160: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
d170: 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 20  indexes on the. 
d180: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e         ** table.
d190: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d1a0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
d1b0: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  igger = 0;.     
d1c0: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
d1d0: 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67  &SQLITE_RecTrigg
d1e0: 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ers ){.         
d1f0: 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
d200: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74  te3TriggersExist
d210: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54  (pParse, pTab, T
d220: 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b  K_DELETE, 0, 0);
d230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d240: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 20     if( pTrigger 
d250: 7c 7c 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75  || sqlite3FkRequ
d260: 69 72 65 64 28 70 50 61 72 73 65 2c 20 70 54 61  ired(pParse, pTa
d270: 62 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  b, 0, 0) ){.    
d280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 6c        sqlite3Mul
d290: 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
d2a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d2b0: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
d2c0: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
d2d0: 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74  , pTrigger, iDat
d2e0: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 20 72 65 67 4e 65 77 44 61 74 61 2c 20 31 2c    regNewData, 1,
d320: 20 30 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20   0, OE_Replace, 
d330: 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  1, -1);.        
d340: 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
d350: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
d360: 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 20  PDATE_HOOK.     
d370: 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
d380: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
d390: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 4f         /* This O
d3a0: 50 5f 44 65 6c 65 74 65 20 6f 70 63 6f 64 65 20  P_Delete opcode 
d3b0: 66 69 72 65 73 20 74 68 65 20 70 72 65 2d 75 70  fires the pre-up
d3c0: 64 61 74 65 2d 68 6f 6f 6b 20 6f 6e 6c 79 2e 20  date-hook only. 
d3d0: 49 74 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  It does.        
d3e0: 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 6f 64 69 66      ** not modif
d3f0: 79 20 74 68 65 20 62 2d 74 72 65 65 2e 20 49 74  y the b-tree. It
d400: 20 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65   is more efficie
d410: 6e 74 20 74 6f 20 6c 65 74 20 74 68 65 20 63 6f  nt to let the co
d420: 6d 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  ming.           
d430: 20 2a 2a 20 4f 50 5f 49 6e 73 65 72 74 20 72 65   ** OP_Insert re
d440: 70 6c 61 63 65 20 74 68 65 20 65 78 69 73 74 69  place the existi
d450: 6e 67 20 65 6e 74 72 79 20 74 68 61 6e 20 69 74  ng entry than it
d460: 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
d470: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
d480: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
d490: 61 6e 64 20 74 68 65 6e 20 69 6e 73 65 72 74 20  and then insert 
d4a0: 61 20 6e 65 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20  a new one. */.  
d4b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d4d0: 50 5f 44 65 6c 65 74 65 2c 20 69 44 61 74 61 43  P_Delete, iDataC
d4e0: 75 72 2c 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f  ur, OPFLAG_ISNOO
d4f0: 50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  P);.            
d500: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
d510: 64 50 34 28 76 2c 20 70 54 61 62 2c 20 50 34 5f  dP4(v, pTab, P4_
d520: 54 41 42 4c 45 29 3b 0a 20 20 20 20 20 20 20 20  TABLE);.        
d530: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
d540: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
d550: 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20  PDATE_HOOK */.  
d560: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
d570: 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ->pIndex ){.    
d580: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
d590: 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65  ultiWrite(pParse
d5a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d5b0: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
d5c0: 77 49 6e 64 65 78 44 65 6c 65 74 65 28 70 50 61  wIndexDelete(pPa
d5d0: 72 73 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61  rse, pTab, iData
d5e0: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 30 2c 2d  Cur, iIdxCur,0,-
d5f0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
d600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d610: 20 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20    seenReplace = 
d620: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
d630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d640: 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
d650: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 61 73 73 65  {.        /*asse
d660: 72 74 28 20 73 65 65 6e 52 65 70 6c 61 63 65 3d  rt( seenReplace=
d670: 3d 30 20 29 3b 2a 2f 0a 20 20 20 20 20 20 20 20  =0 );*/.        
d680: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
d690: 76 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a  v, ignoreDest);.
d6a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d6b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
d6d0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
d6e0: 52 6f 77 69 64 4f 6b 29 3b 0a 20 20 20 20 69 66  RowidOk);.    if
d6f0: 28 20 69 70 6b 54 6f 70 20 29 7b 0a 20 20 20 20  ( ipkTop ){.    
d700: 20 20 69 70 6b 42 6f 74 74 6f 6d 20 3d 20 73 71    ipkBottom = sq
d710: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d720: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
d730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d740: 6d 70 48 65 72 65 28 76 2c 20 69 70 6b 54 6f 70  mpHere(v, ipkTop
d750: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d760: 2f 2a 20 54 65 73 74 20 61 6c 6c 20 55 4e 49 51  /* Test all UNIQ
d770: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62  UE constraints b
d780: 79 20 63 72 65 61 74 69 6e 67 20 65 6e 74 72 69  y creating entri
d790: 65 73 20 66 6f 72 20 65 61 63 68 20 55 4e 49 51  es for each UNIQ
d7a0: 55 45 0a 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e  UE.  ** index an
d7b0: 64 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  d making sure th
d7c0: 61 74 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74  at duplicate ent
d7d0: 72 69 65 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65  ries do not alre
d7e0: 61 64 79 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  ady exist..  ** 
d7f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 76 69  Compute the revi
d800: 73 65 64 20 72 65 63 6f 72 64 20 65 6e 74 72 69  sed record entri
d810: 65 73 20 66 6f 72 20 69 6e 64 69 63 65 73 20 61  es for indices a
d820: 73 20 77 65 20 67 6f 2e 0a 20 20 2a 2a 0a 20 20  s we go..  **.  
d830: 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
d840: 6f 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 61  o handles the ca
d850: 73 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  se of the PRIMAR
d860: 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
d870: 61 0a 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52  a.  ** WITHOUT R
d880: 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  OWID table..  */
d890: 0a 20 20 66 6f 72 28 69 78 3d 30 2c 20 70 49 64  .  for(ix=0, pId
d8a0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d8b0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d8c0: 3e 70 4e 65 78 74 2c 20 69 78 2b 2b 29 7b 0a 20  >pNext, ix++){. 
d8d0: 20 20 20 69 6e 74 20 72 65 67 49 64 78 3b 20 20     int regIdx;  
d8e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
d8f0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 6f   of registers ho
d900: 6c 64 20 63 6f 6e 65 6e 74 20 66 6f 72 20 70 49  ld conent for pI
d910: 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  dx */.    int re
d920: 67 52 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gR;            /
d930: 2a 20 52 61 6e 67 65 20 6f 66 20 72 65 67 69 73  * Range of regis
d940: 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ters holding con
d950: 66 6c 69 63 74 69 6e 67 20 50 4b 20 2a 2f 0a 20  flicting PK */. 
d960: 20 20 20 69 6e 74 20 69 54 68 69 73 43 75 72 3b     int iThisCur;
d970: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
d980: 72 20 66 6f 72 20 74 68 69 73 20 55 4e 49 51 55  r for this UNIQU
d990: 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  E index */.    i
d9a0: 6e 74 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 3b  nt addrUniqueOk;
d9b0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
d9c0: 20 69 66 20 74 68 65 20 55 4e 49 51 55 45 20 63   if the UNIQUE c
d9d0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61 74  onstraint is sat
d9e0: 69 73 66 69 65 64 20 2a 2f 0a 0a 20 20 20 20 69  isfied */..    i
d9f0: 66 28 20 61 52 65 67 49 64 78 5b 69 78 5d 3d 3d  f( aRegIdx[ix]==
da00: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
da10: 2a 20 53 6b 69 70 20 69 6e 64 69 63 65 73 20 74  * Skip indices t
da20: 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  hat do not chang
da30: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 41 66  e */.    if( bAf
da40: 66 69 6e 69 74 79 44 6f 6e 65 3d 3d 30 20 29 7b  finityDone==0 ){
da50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
da60: 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
da70: 54 61 62 2c 20 72 65 67 4e 65 77 44 61 74 61 2b  Tab, regNewData+
da80: 31 29 3b 0a 20 20 20 20 20 20 62 41 66 66 69 6e  1);.      bAffin
da90: 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  ityDone = 1;.   
daa0: 20 7d 0a 20 20 20 20 69 54 68 69 73 43 75 72 20   }.    iThisCur 
dab0: 3d 20 69 49 64 78 43 75 72 2b 69 78 3b 0a 20 20  = iIdxCur+ix;.  
dac0: 20 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 20 3d    addrUniqueOk =
dad0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
dae0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
daf0: 2a 20 53 6b 69 70 20 70 61 72 74 69 61 6c 20 69  * Skip partial i
db00: 6e 64 69 63 65 73 20 66 6f 72 20 77 68 69 63 68  ndices for which
db10: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
db20: 65 20 69 73 20 6e 6f 74 20 74 72 75 65 20 2a 2f  e is not true */
db30: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70  .    if( pIdx->p
db40: 50 61 72 74 49 64 78 57 68 65 72 65 20 29 7b 0a  PartIdxWhere ){.
db50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
db60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
db70: 6c 6c 2c 20 30 2c 20 61 52 65 67 49 64 78 5b 69  ll, 0, aRegIdx[i
db80: 78 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  x]);.      pPars
db90: 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72 65 67 4e  e->ckBase = regN
dba0: 65 77 44 61 74 61 2b 31 3b 0a 20 20 20 20 20 20  ewData+1;.      
dbb0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
dbc0: 73 65 44 75 70 28 70 50 61 72 73 65 2c 20 70 49  seDup(pParse, pI
dbd0: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
dbe0: 65 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c  e, addrUniqueOk,
dbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
dc10: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
dc20: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
dc30: 6b 42 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 7d  kBase = 0;.    }
dc40: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
dc50: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 69  a record for thi
dc60: 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20 61 73  s index entry as
dc70: 20 69 74 20 73 68 6f 75 6c 64 20 61 70 70 65 61   it should appea
dc80: 72 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74  r after.    ** t
dc90: 68 65 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64  he insert or upd
dca0: 61 74 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74  ate.  Store that
dcb0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 61   record in the a
dcc0: 52 65 67 49 64 78 5b 69 78 5d 20 72 65 67 69 73  RegIdx[ix] regis
dcd0: 74 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ter.    */.    r
dce0: 65 67 49 64 78 20 3d 20 61 52 65 67 49 64 78 5b  egIdx = aRegIdx[
dcf0: 69 78 5d 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69  ix]+1;.    for(i
dd00: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
dd10: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
dd20: 20 69 6e 74 20 69 46 69 65 6c 64 20 3d 20 70 49   int iField = pI
dd30: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
dd40: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
dd50: 20 20 20 20 69 66 28 20 69 46 69 65 6c 64 3d 3d      if( iField==
dd60: 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20  XN_EXPR ){.     
dd70: 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73     pParse->ckBas
dd80: 65 20 3d 20 72 65 67 4e 65 77 44 61 74 61 2b 31  e = regNewData+1
dd90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dda0: 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50  3ExprCodeCopy(pP
ddb0: 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c  arse, pIdx->aCol
ddc0: 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Expr->a[i].pExpr
ddd0: 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20 20  , regIdx+i);.   
dde0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 42       pParse->ckB
ddf0: 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ase = 0;.       
de00: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
de10: 20 22 25 73 20 63 6f 6c 75 6d 6e 20 25 64 22 2c   "%s column %d",
de20: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 69 29   pIdx->zName, i)
de30: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
de40: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 69 65          if( iFie
de50: 6c 64 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  ld==XN_ROWID || 
de60: 69 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 69 50  iField==pTab->iP
de70: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
de80: 20 78 20 3d 20 72 65 67 4e 65 77 44 61 74 61 3b   x = regNewData;
de90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dea0: 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 69 46            x = iF
deb0: 69 65 6c 64 20 2b 20 72 65 67 4e 65 77 44 61 74  ield + regNewDat
dec0: 61 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  a + 1;.        }
ded0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dee0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 69 46  VdbeAddOp2(v, iF
def0: 69 65 6c 64 3c 30 20 3f 20 4f 50 5f 49 6e 74 43  ield<0 ? OP_IntC
df00: 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 2c 20  opy : OP_SCopy, 
df10: 78 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20  x, regIdx+i);.  
df20: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
df30: 74 28 28 76 2c 20 22 25 73 22 2c 20 69 46 69 65  t((v, "%s", iFie
df40: 6c 64 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  ld<0 ? "rowid" :
df50: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 46 69 65   pTab->aCol[iFie
df60: 6c 64 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ld].zName));.   
df70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
df80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
df90: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
dfa0: 64 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d  d, regIdx, pIdx-
dfb0: 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 52 65 67 49 64  >nColumn, aRegId
dfc0: 78 5b 69 78 5d 29 3b 0a 20 20 20 20 56 64 62 65  x[ix]);.    Vdbe
dfd0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
dfe0: 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
dff0: 65 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20  e));..    /* In 
e000: 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72 61 74  an UPDATE operat
e010: 69 6f 6e 2c 20 69 66 20 74 68 69 73 20 69 6e 64  ion, if this ind
e020: 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41 52  ex is the PRIMAR
e030: 59 20 4b 45 59 20 69 6e 64 65 78 20 0a 20 20 20  Y KEY index .   
e040: 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
e050: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61 6e 64   ROWID table and
e060: 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
e070: 6e 6f 20 63 68 61 6e 67 65 20 74 68 65 0a 20 20  no change the.  
e080: 20 20 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79    ** primary key
e090: 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 6c 6c 69 73  , then no collis
e0a0: 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e  ion is possible.
e0b0: 20 20 54 68 65 20 63 6f 6c 6c 69 73 69 6f 6e 20    The collision 
e0c0: 64 65 74 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  detection.    **
e0d0: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 63 61 6e   logic below can
e0e0: 20 61 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e   all be skipped.
e0f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 55 70   */.    if( isUp
e100: 64 61 74 65 20 26 26 20 70 50 6b 3d 3d 70 49 64  date && pPk==pId
e110: 78 20 26 26 20 70 6b 43 68 6e 67 3d 3d 30 20 29  x && pkChng==0 )
e120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e130: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e140: 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29  v, addrUniqueOk)
e150: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
e160: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e170: 46 69 6e 64 20 6f 75 74 20 77 68 61 74 20 61 63  Find out what ac
e180: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20  tion to take in 
e190: 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61 20  case there is a 
e1a0: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
e1b0: 69 63 74 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72  ict */.    onErr
e1c0: 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72  or = pIdx->onErr
e1d0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72  or;.    if( onEr
e1e0: 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 20  ror==OE_None ){ 
e1f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e200: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
e210: 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b  , addrUniqueOk);
e220: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
e230: 20 20 2f 2a 20 70 49 64 78 20 69 73 20 6e 6f 74    /* pIdx is not
e240: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20   a UNIQUE index 
e250: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
e260: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d   overrideError!=
e270: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
e280: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
e290: 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20  errideError;.   
e2a0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72   }else if( onErr
e2b0: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
e2c0: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
e2d0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
e2e0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6c 6c 69 73  }..    /* Collis
e2f0: 69 6f 6e 20 64 65 74 65 63 74 69 6f 6e 20 6d 61  ion detection ma
e300: 79 20 62 65 20 6f 6d 69 74 74 65 64 20 69 66 20  y be omitted if 
e310: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
e320: 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
e330: 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20     **   (1) The 
e340: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
e350: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ion algorithm is
e360: 20 52 45 50 4c 41 43 45 0a 20 20 20 20 2a 2a 20   REPLACE.    ** 
e370: 20 20 28 32 29 20 54 68 65 20 74 61 62 6c 65 20    (2) The table 
e380: 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  is a WITHOUT ROW
e390: 49 44 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  ID table.    ** 
e3a0: 20 20 28 33 29 20 54 68 65 72 65 20 61 72 65 20    (3) There are 
e3b0: 6e 6f 20 73 65 63 6f 6e 64 61 72 79 20 69 6e 64  no secondary ind
e3c0: 65 78 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  exes on the tabl
e3d0: 65 0a 20 20 20 20 2a 2a 20 20 20 28 34 29 20 4e  e.    **   (4) N
e3e0: 6f 20 64 65 6c 65 74 65 20 74 72 69 67 67 65 72  o delete trigger
e3f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 66 69 72  s need to be fir
e400: 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ed if there is a
e410: 20 63 6f 6e 66 6c 69 63 74 0a 20 20 20 20 2a 2a   conflict.    **
e420: 20 20 20 28 35 29 20 4e 6f 20 46 4b 20 63 6f 6e     (5) No FK con
e430: 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 73  straint counters
e440: 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
e450: 74 65 64 20 69 66 20 61 20 63 6f 6e 66 6c 69 63  ted if a conflic
e460: 74 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  t occurs..    */
e470: 20 0a 20 20 20 20 69 66 28 20 28 69 78 3d 3d 30   .    if( (ix==0
e480: 20 26 26 20 70 49 64 78 2d 3e 70 4e 65 78 74 3d   && pIdx->pNext=
e490: 3d 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20  =0)             
e4a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
e4b0: 6f 6e 20 33 20 2a 2f 0a 20 20 20 20 20 26 26 20  on 3 */.     && 
e4c0: 70 50 6b 3d 3d 70 49 64 78 20 20 20 20 20 20 20  pPk==pIdx       
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e4f0: 6f 6e 64 69 74 69 6f 6e 20 32 20 2a 2f 0a 20 20  ondition 2 */.  
e500: 20 20 20 26 26 20 6f 6e 45 72 72 6f 72 3d 3d 4f     && onError==O
e510: 45 5f 52 65 70 6c 61 63 65 20 20 20 20 20 20 20  E_Replace       
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 31    /* Condition 1
e540: 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 20 30 3d   */.     && ( 0=
e550: 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  =(db->flags&SQLI
e560: 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 29 20  TE_RecTriggers) 
e570: 7c 7c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69  ||      /* Condi
e580: 74 69 6f 6e 20 34 20 2a 2f 0a 20 20 20 20 20 20  tion 4 */.      
e590: 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 54 72      0==sqlite3Tr
e5a0: 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72  iggersExist(pPar
e5b0: 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c  se, pTab, TK_DEL
e5c0: 45 54 45 2c 20 30 2c 20 30 29 29 0a 20 20 20 20  ETE, 0, 0)).    
e5d0: 20 26 26 20 28 20 30 3d 3d 28 64 62 2d 3e 66 6c   && ( 0==(db->fl
e5e0: 61 67 73 26 53 51 4c 49 54 45 5f 46 6f 72 65 69  ags&SQLITE_Forei
e5f0: 67 6e 4b 65 79 73 29 20 7c 7c 20 20 20 20 20 20  gnKeys) ||      
e600: 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 35 20 2a  /* Condition 5 *
e610: 2f 0a 20 20 20 20 20 20 20 20 20 28 30 3d 3d 70  /.         (0==p
e620: 54 61 62 2d 3e 70 46 4b 65 79 20 26 26 20 30 3d  Tab->pFKey && 0=
e630: 3d 73 71 6c 69 74 65 33 46 6b 52 65 66 65 72 65  =sqlite3FkRefere
e640: 6e 63 65 73 28 70 54 61 62 29 29 29 0a 20 20 20  nces(pTab))).   
e650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e660: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e670: 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f  l(v, addrUniqueO
e680: 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  k);.      contin
e690: 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
e6a0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e6b0: 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20  f the new index 
e6c0: 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 75 6e  entry will be un
e6d0: 69 71 75 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ique */.    sqli
e6e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
e6f0: 28 76 2c 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63  (v, OP_NoConflic
e700: 74 2c 20 69 54 68 69 73 43 75 72 2c 20 61 64 64  t, iThisCur, add
e710: 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20 20  rUniqueOk,.     
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 72 65 67 49 64 78 2c 20 70 49 64 78      regIdx, pIdx
e740: 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
e750: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
e760: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
e770: 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6c  de to handle col
e780: 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 72  lisions */.    r
e790: 65 67 52 20 3d 20 28 70 49 64 78 3d 3d 70 50 6b  egR = (pIdx==pPk
e7a0: 29 20 3f 20 72 65 67 49 64 78 20 3a 20 73 71 6c  ) ? regIdx : sql
e7b0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
e7c0: 28 70 50 61 72 73 65 2c 20 6e 50 6b 46 69 65 6c  (pParse, nPkFiel
e7d0: 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 55 70  d);.    if( isUp
e7e0: 64 61 74 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d  date || onError=
e7f0: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
e800: 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69       if( HasRowi
e810: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
e820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e830: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f  dOp2(v, OP_IdxRo
e840: 77 69 64 2c 20 69 54 68 69 73 43 75 72 2c 20 72  wid, iThisCur, r
e850: 65 67 52 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  egR);.        /*
e860: 20 43 6f 6e 66 6c 69 63 74 20 6f 6e 6c 79 20 69   Conflict only i
e870: 66 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  f the rowid of t
e880: 68 65 20 65 78 69 73 74 69 6e 67 20 69 6e 64 65  he existing inde
e890: 78 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20 20  x entry.        
e8a0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
e8b0: 66 72 6f 6d 20 6f 6c 64 2d 72 6f 77 69 64 20 2a  from old-rowid *
e8c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
e8d0: 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Update ){.      
e8e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e8f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
e900: 72 65 67 52 2c 20 61 64 64 72 55 6e 69 71 75 65  regR, addrUnique
e910: 4f 6b 2c 20 72 65 67 4f 6c 64 44 61 74 61 29 3b  Ok, regOldData);
e920: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
e940: 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c  , SQLITE_NOTNULL
e950: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
e960: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
e970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
e990: 20 78 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   x;.        /* E
e9a0: 78 74 72 61 63 74 20 74 68 65 20 50 52 49 4d 41  xtract the PRIMA
e9b0: 52 59 20 4b 45 59 20 66 72 6f 6d 20 74 68 65 20  RY KEY from the 
e9c0: 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
e9d0: 20 65 6e 74 72 79 20 61 6e 64 0a 20 20 20 20 20   entry and.     
e9e0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
e9f0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 52  n registers regR
ea00: 2e 2e 72 65 67 52 2b 6e 50 6b 2d 31 20 2a 2f 0a  ..regR+nPk-1 */.
ea10: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
ea20: 21 3d 70 50 6b 20 29 7b 0a 20 20 20 20 20 20 20  !=pPk ){.       
ea30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
ea40: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  k->nKeyCol; i++)
ea50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
ea60: 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f 6c  sert( pPk->aiCol
ea70: 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20  umn[i]>=0 );.   
ea80: 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71 6c           x = sql
ea90: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
eaa0: 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69 43  x(pIdx, pPk->aiC
eab0: 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  olumn[i]);.     
eac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ead0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
eae0: 6f 6c 75 6d 6e 2c 20 69 54 68 69 73 43 75 72 2c  olumn, iThisCur,
eaf0: 20 78 2c 20 72 65 67 52 2b 69 29 3b 0a 20 20 20   x, regR+i);.   
eb00: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
eb10: 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73 22  ment((v, "%s.%s"
eb20: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
eb50: 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  ol[pPk->aiColumn
eb60: 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20  [i]].zName));.  
eb70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb80: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
eb90: 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  isUpdate ){.    
eba0: 20 20 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72        /* If curr
ebb0: 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
ebc0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ebd0: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
ebe0: 57 49 44 20 0a 20 20 20 20 20 20 20 20 20 20 2a  WID .          *
ebf0: 2a 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 63 6f  * table, only co
ec00: 6e 66 6c 69 63 74 20 69 66 20 74 68 65 20 6e 65  nflict if the ne
ec10: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61  w PRIMARY KEY va
ec20: 6c 75 65 73 20 61 72 65 20 61 63 74 75 61 6c 6c  lues are actuall
ec30: 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  y.          ** d
ec40: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
ec50: 65 20 6f 6c 64 2e 0a 20 20 20 20 20 20 20 20 20  e old..         
ec60: 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
ec70: 20 46 6f 72 20 61 20 55 4e 49 51 55 45 20 69 6e   For a UNIQUE in
ec80: 64 65 78 2c 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69  dex, only confli
ec90: 63 74 20 69 66 20 74 68 65 20 50 52 49 4d 41 52  ct if the PRIMAR
eca0: 59 20 4b 45 59 20 76 61 6c 75 65 73 0a 20 20 20  Y KEY values.   
ecb0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
ecc0: 20 6d 61 74 63 68 65 64 20 69 6e 64 65 78 20 72   matched index r
ecd0: 6f 77 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ow are different
ece0: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
ecf0: 61 6c 20 50 52 49 4d 41 52 59 0a 20 20 20 20 20  al PRIMARY.     
ed00: 20 20 20 20 20 2a 2a 20 4b 45 59 20 76 61 6c 75       ** KEY valu
ed10: 65 73 20 6f 66 20 74 68 69 73 20 72 6f 77 20 62  es of this row b
ed20: 65 66 6f 72 65 20 74 68 65 20 75 70 64 61 74 65  efore the update
ed30: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
ed40: 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 73  int addrJump = s
ed50: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
ed60: 74 41 64 64 72 28 76 29 2b 70 50 6b 2d 3e 6e 4b  tAddr(v)+pPk->nK
ed70: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  eyCol;.         
ed80: 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b   int op = OP_Ne;
ed90: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
eda0: 65 67 43 6d 70 20 3d 20 28 49 73 50 72 69 6d 61  egCmp = (IsPrima
edb0: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
edc0: 20 3f 20 72 65 67 49 64 78 20 3a 20 72 65 67 52   ? regIdx : regR
edd0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  );.  .          
ede0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e  for(i=0; i<pPk->
edf0: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
ee00: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
ee10: 2a 70 34 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  *p4 = (char*)sql
ee20: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
ee30: 71 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 61  q(pParse, pPk->a
ee40: 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  zColl[i]);.     
ee50: 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e         x = pPk->
ee60: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
ee70: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ee80: 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   x>=0 );.       
ee90: 20 20 20 20 20 69 66 28 20 69 3d 3d 28 70 50 6b       if( i==(pPk
eea0: 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a  ->nKeyCol-1) ){.
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
eec0: 64 72 4a 75 6d 70 20 3d 20 61 64 64 72 55 6e 69  drJump = addrUni
eed0: 71 75 65 4f 6b 3b 0a 20 20 20 20 20 20 20 20 20  queOk;.         
eee0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
eef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ef00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ef10: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ef20: 6f 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  op, .           
ef30: 20 20 20 20 20 72 65 67 4f 6c 64 44 61 74 61 2b       regOldData+
ef40: 31 2b 78 2c 20 61 64 64 72 4a 75 6d 70 2c 20 72  1+x, addrJump, r
ef50: 65 67 43 6d 70 2b 69 2c 20 70 34 2c 20 50 34 5f  egCmp+i, p4, P4_
ef60: 43 4f 4c 4c 53 45 51 0a 20 20 20 20 20 20 20 20  COLLSEQ.        
ef70: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
ef80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ef90: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
efa0: 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
efb0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
efc0: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
efd0: 45 71 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Eq);.           
efe0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
eff0: 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  v, op==OP_Ne);. 
f000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f010: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f020: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
f030: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 78  ate code that ex
f040: 65 63 75 74 65 73 20 69 66 20 74 68 65 20 6e 65  ecutes if the ne
f050: 77 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  w index entry is
f060: 20 6e 6f 74 20 75 6e 69 71 75 65 20 2a 2f 0a 20   not unique */. 
f070: 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72     assert( onErr
f080: 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  or==OE_Rollback 
f090: 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  || onError==OE_A
f0a0: 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d  bort || onError=
f0b0: 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
f0c0: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
f0d0: 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72 6f  Ignore || onErro
f0e0: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b  r==OE_Replace );
f0f0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45  .    switch( onE
f100: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 63 61  rror ){.      ca
f110: 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a  se OE_Rollback:.
f120: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62        case OE_Ab
f130: 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ort:.      case 
f140: 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20  OE_Fail: {.     
f150: 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65     sqlite3Unique
f160: 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
f170: 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 49 64 78  e, onError, pIdx
f180: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f1a0: 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20  case OE_Ignore: 
f1b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f1c0: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e  3VdbeGoto(v, ign
f1d0: 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20  oreDest);.      
f1e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f1f0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
f200: 7b 0a 20 20 20 20 20 20 20 20 54 72 69 67 67 65  {.        Trigge
f210: 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b  r *pTrigger = 0;
f220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f230: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
f240: 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20  lace );.        
f250: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
f260: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
f270: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
f280: 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67  &SQLITE_RecTrigg
f290: 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ers ){.         
f2a0: 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
f2b0: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74  te3TriggersExist
f2c0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54  (pParse, pTab, T
f2d0: 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b  K_DELETE, 0, 0);
f2e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2f0: 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
f300: 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61 72  teRowDelete(pPar
f310: 73 65 2c 20 70 54 61 62 2c 20 70 54 72 69 67 67  se, pTab, pTrigg
f320: 65 72 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  er, iDataCur, iI
f330: 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
f340: 20 20 20 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c     regR, nPkFiel
f350: 64 2c 20 30 2c 20 4f 45 5f 52 65 70 6c 61 63 65  d, 0, OE_Replace
f360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70  ,.            (p
f370: 49 64 78 3d 3d 70 50 6b 20 3f 20 4f 4e 45 50 41  Idx==pPk ? ONEPA
f380: 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45 50  SS_SINGLE : ONEP
f390: 41 53 53 5f 4f 46 46 29 2c 20 2d 31 29 3b 0a 20  ASS_OFF), -1);. 
f3a0: 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61         seenRepla
f3b0: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
f3c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f3d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f3e0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f3f0: 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b  (v, addrUniqueOk
f400: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 67 52 21  );.    if( regR!
f410: 3d 72 65 67 49 64 78 20 29 20 73 71 6c 69 74 65  =regIdx ) sqlite
f420: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
f430: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 2c 20  e(pParse, regR, 
f440: 6e 50 6b 46 69 65 6c 64 29 3b 0a 20 20 7d 0a 20  nPkField);.  }. 
f450: 20 69 66 28 20 69 70 6b 54 6f 70 20 29 7b 0a 20   if( ipkTop ){. 
f460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
f470: 74 6f 28 76 2c 20 69 70 6b 54 6f 70 2b 31 29 3b  to(v, ipkTop+1);
f480: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f490: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 70 6b 42  JumpHere(v, ipkB
f4a0: 6f 74 74 6f 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20  ottom);.  }.  . 
f4b0: 20 2a 70 62 4d 61 79 52 65 70 6c 61 63 65 20 3d   *pbMayReplace =
f4c0: 20 73 65 65 6e 52 65 70 6c 61 63 65 3b 0a 20 20   seenReplace;.  
f4d0: 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
f4e0: 74 28 28 76 2c 20 22 45 4e 44 3a 20 47 65 6e 43  t((v, "END: GenC
f4f0: 6e 73 74 43 6b 73 28 25 64 29 22 2c 20 73 65 65  nstCks(%d)", see
f500: 6e 52 65 70 6c 61 63 65 29 29 3b 0a 7d 0a 0a 2f  nReplace));.}../
f510: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f520: 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
f530: 20 74 6f 20 66 69 6e 69 73 68 20 74 68 65 20 49   to finish the I
f540: 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
f550: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 74 68 61  operation.** tha
f560: 74 20 77 61 73 20 73 74 61 72 74 65 64 20 62 79  t was started by
f570: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
f580: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
f590: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
f5a0: 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65 63 75 74 69  ..** A consecuti
f5b0: 76 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  ve range of regi
f5c0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
f5d0: 74 20 72 65 67 4e 65 77 44 61 74 61 20 63 6f 6e  t regNewData con
f5e0: 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 77  tains the.** row
f5f0: 69 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  id and the conte
f600: 6e 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  nt to be inserte
f610: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  d..**.** The arg
f620: 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 72  uments to this r
f630: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
f640: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
f650: 20 66 69 72 73 74 20 73 69 78 0a 2a 2a 20 61 72   first six.** ar
f660: 67 75 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69 74  guments to sqlit
f670: 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
f680: 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a 76  aintChecks..*/.v
f690: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c  oid sqlite3Compl
f6a0: 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20  eteInsertion(.  
f6b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f6c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
f6d0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
f6e0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
f6f0: 20 20 20 2f 2a 20 74 68 65 20 74 61 62 6c 65 20     /* the table 
f700: 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
f710: 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20  e inserting */. 
f720: 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 20   int iDataCur,  
f730: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
f740: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
f750: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
f760: 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20 20   int iIdxCur,   
f770: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
f780: 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  dex cursor */.  
f790: 69 6e 74 20 72 65 67 4e 65 77 44 61 74 61 2c 20  int regNewData, 
f7a0: 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20      /* Range of 
f7b0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
f7c0: 20 2a 61 52 65 67 49 64 78 2c 20 20 20 20 20 20   *aRegIdx,      
f7d0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65   /* Register use
f7e0: 64 20 62 79 20 65 61 63 68 20 69 6e 64 65 78 2e  d by each index.
f7f0: 20 20 30 20 66 6f 72 20 75 6e 75 73 65 64 20 69    0 for unused i
f800: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
f810: 69 73 55 70 64 61 74 65 2c 20 20 20 20 20 20 20  isUpdate,       
f820: 2f 2a 20 54 72 75 65 20 66 6f 72 20 55 50 44 41  /* True for UPDA
f830: 54 45 2c 20 46 61 6c 73 65 20 66 6f 72 20 49 4e  TE, False for IN
f840: 53 45 52 54 20 2a 2f 0a 20 20 69 6e 74 20 61 70  SERT */.  int ap
f850: 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 2f 2a  pendBias,     /*
f860: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
f870: 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e   likely to be an
f880: 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
f890: 20 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20 20   useSeekResult  
f8a0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
f8b0: 74 68 65 20 55 53 45 53 45 45 4b 52 45 53 55 4c  the USESEEKRESUL
f8c0: 54 20 66 6c 61 67 20 6f 6e 20 4f 50 5f 5b 49 64  T flag on OP_[Id
f8d0: 78 5d 49 6e 73 65 72 74 20 2a 2f 0a 29 7b 0a 20  x]Insert */.){. 
f8e0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
f8f0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
f900: 20 73 74 61 74 65 6d 65 6e 74 73 20 75 6e 64 65   statements unde
f910: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
f920: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
f930: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
f940: 64 65 78 20 62 65 69 6e 67 20 69 6e 73 65 72 74  dex being insert
f950: 65 64 20 6f 72 20 75 70 64 61 74 65 64 20 2a 2f  ed or updated */
f960: 0a 20 20 75 38 20 70 69 6b 5f 66 6c 61 67 73 3b  .  u8 pik_flags;
f970: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 20 76         /* flag v
f980: 61 6c 75 65 73 20 70 61 73 73 65 64 20 74 6f 20  alues passed to 
f990: 74 68 65 20 62 74 72 65 65 20 69 6e 73 65 72 74  the btree insert
f9a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
f9b0: 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  a;        /* Con
f9c0: 74 65 6e 74 20 72 65 67 69 73 74 65 72 73 20 28  tent registers (
f9d0: 61 66 74 65 72 20 74 68 65 20 72 6f 77 69 64 29  after the rowid)
f9e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
f9f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ;         /* Reg
fa00: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
fa10: 73 65 6d 62 6c 65 64 20 72 65 63 6f 72 64 20 66  sembled record f
fa20: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
fa30: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
fa40: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fa50: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 62 41  unter */.  u8 bA
fa60: 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20 30 3b  ffinityDone = 0;
fa70: 20 2f 2a 20 54 72 75 65 20 69 66 20 4f 50 5f 41   /* True if OP_A
fa80: 66 66 69 6e 69 74 79 20 68 61 73 20 62 65 65 6e  ffinity has been
fa90: 20 72 75 6e 20 61 6c 72 65 61 64 79 20 2a 2f 0a   run already */.
faa0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
fab0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fac0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
fad0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
fae0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
faf0: 2f 2a 20 54 68 69 73 20 74 61 62 6c 65 20 69 73  /* This table is
fb00: 20 6e 6f 74 20 61 20 56 49 45 57 20 2a 2f 0a 20   not a VIEW */. 
fb10: 20 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70   for(i=0, pIdx=p
fb20: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
fb30: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
fb40: 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ext, i++){.    i
fb50: 66 28 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30  f( aRegIdx[i]==0
fb60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fb70: 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d   bAffinityDone =
fb80: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   1;.    if( pIdx
fb90: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
fba0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fbb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fbc0: 5f 49 73 4e 75 6c 6c 2c 20 61 52 65 67 49 64 78  _IsNull, aRegIdx
fbd0: 5b 69 5d 2c 20 73 71 6c 69 74 65 33 56 64 62 65  [i], sqlite3Vdbe
fbe0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
fbf0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
fc00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
fc10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc20: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
fc30: 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 43 75  dxInsert, iIdxCu
fc40: 72 2b 69 2c 20 61 52 65 67 49 64 78 5b 69 5d 2c  r+i, aRegIdx[i],
fc50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fc60: 20 20 20 20 20 20 20 20 20 20 61 52 65 67 49 64            aRegId
fc70: 78 5b 69 5d 2b 31 2c 0a 20 20 20 20 20 20 20 20  x[i]+1,.        
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
fca0: 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ll ? pIdx->nKeyC
fcb0: 6f 6c 3a 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ol: pIdx->nColum
fcc0: 6e 29 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67  n);.    pik_flag
fcd0: 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 75  s = 0;.    if( u
fce0: 73 65 53 65 65 6b 52 65 73 75 6c 74 20 29 20 70  seSeekResult ) p
fcf0: 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c 41  ik_flags = OPFLA
fd00: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b  G_USESEEKRESULT;
fd10: 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
fd20: 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
fd30: 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54   && !HasRowid(pT
fd40: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ab) ){.      ass
fd50: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73  ert( pParse->nes
fd60: 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
fd70: 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46  pik_flags |= OPF
fd80: 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20  LAG_NCHANGE;.   
fd90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
fda0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 69  beChangeP5(v, pi
fdb0: 6b 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  k_flags);.  }.  
fdc0: 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
fdd0: 61 62 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ab) ) return;.  
fde0: 72 65 67 44 61 74 61 20 3d 20 72 65 67 4e 65 77  regData = regNew
fdf0: 44 61 74 61 20 2b 20 31 3b 0a 20 20 72 65 67 52  Data + 1;.  regR
fe00: 65 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ec = sqlite3GetT
fe10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
fe20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe30: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
fe40: 63 6f 72 64 2c 20 72 65 67 44 61 74 61 2c 20 70  cord, regData, p
fe50: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 72 65 67 52 65  Tab->nCol, regRe
fe60: 63 29 3b 0a 20 20 69 66 28 20 21 62 41 66 66 69  c);.  if( !bAffi
fe70: 6e 69 74 79 44 6f 6e 65 20 29 7b 0a 20 20 20 20  nityDone ){.    
fe80: 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
fe90: 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 30 29  nity(v, pTab, 0)
fea0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
feb0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
fec0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
fed0: 44 61 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Data, pTab->nCol
fee0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
fef0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20  rse->nested ){. 
ff00: 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 30     pik_flags = 0
ff10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ff20: 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c 41  ik_flags = OPFLA
ff30: 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 70  G_NCHANGE;.    p
ff40: 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 28 69 73 55  ik_flags |= (isU
ff50: 70 64 61 74 65 3f 4f 50 46 4c 41 47 5f 49 53 55  pdate?OPFLAG_ISU
ff60: 50 44 41 54 45 3a 4f 50 46 4c 41 47 5f 4c 41 53  PDATE:OPFLAG_LAS
ff70: 54 52 4f 57 49 44 29 3b 0a 20 20 7d 0a 20 20 69  TROWID);.  }.  i
ff80: 66 28 20 61 70 70 65 6e 64 42 69 61 73 20 29 7b  f( appendBias ){
ff90: 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c  .    pik_flags |
ffa0: 3d 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 3b  = OPFLAG_APPEND;
ffb0: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 53 65  .  }.  if( useSe
ffc0: 65 6b 52 65 73 75 6c 74 20 29 7b 0a 20 20 20 20  ekResult ){.    
ffd0: 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46  pik_flags |= OPF
ffe0: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
fff0: 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
10000 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10010 5f 49 6e 73 65 72 74 2c 20 69 44 61 74 61 43 75  _Insert, iDataCu
10020 72 2c 20 72 65 67 52 65 63 2c 20 72 65 67 4e 65  r, regRec, regNe
10030 77 44 61 74 61 29 3b 0a 20 20 69 66 28 20 21 70  wData);.  if( !p
10040 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b  Parse->nested ){
10050 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10060 41 70 70 65 6e 64 50 34 28 76 2c 20 70 54 61 62  AppendP4(v, pTab
10070 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 7d  , P4_TABLE);.  }
10080 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
10090 61 6e 67 65 50 35 28 76 2c 20 70 69 6b 5f 66 6c  angeP5(v, pik_fl
100a0 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
100b0 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
100c0 66 6f 72 20 74 68 65 20 70 54 61 62 20 74 61 62  for the pTab tab
100d0 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 69  le and all its i
100e0 6e 64 69 63 65 73 20 61 6e 64 20 67 65 6e 65 72  ndices and gener
100f0 61 74 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6f  ate.** code to o
10100 70 65 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  pen and initiali
10110 7a 65 64 20 74 68 6f 73 65 20 63 75 72 73 6f 72  zed those cursor
10120 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72  s..**.** The cur
10130 73 6f 72 20 66 6f 72 20 74 68 65 20 6f 62 6a 65  sor for the obje
10140 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ct that contains
10150 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 64 61   the complete da
10160 74 61 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  ta (normally.** 
10170 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
10180 2c 20 62 75 74 20 74 68 65 20 50 52 49 4d 41 52  , but the PRIMAR
10190 59 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20 74  Y KEY index in t
101a0 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  he case of a WIT
101b0 48 4f 55 54 0a 2a 2a 20 52 4f 57 49 44 20 74 61  HOUT.** ROWID ta
101c0 62 6c 65 29 20 69 73 20 72 65 74 75 72 6e 65 64  ble) is returned
101d0 20 69 6e 20 2a 70 69 44 61 74 61 43 75 72 2e 20   in *piDataCur. 
101e0 20 54 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   The first index
101f0 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 72 65   cursor is.** re
10200 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 49 64 78  turned in *piIdx
10210 43 75 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  Cur.  The number
10220 20 6f 66 20 69 6e 64 69 63 65 73 20 69 73 20 72   of indices is r
10230 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  eturned..**.** U
10240 73 65 20 69 42 61 73 65 20 61 73 20 74 68 65 20  se iBase as the 
10250 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 65 69  first cursor (ei
10260 74 68 65 72 20 74 68 65 20 2a 70 69 44 61 74 61  ther the *piData
10270 43 75 72 20 66 6f 72 20 72 6f 77 69 64 20 74 61  Cur for rowid ta
10280 62 6c 65 73 0a 2a 2a 20 6f 72 20 74 68 65 20 66  bles.** or the f
10290 69 72 73 74 20 69 6e 64 65 78 20 66 6f 72 20 57  irst index for W
102a0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
102b0 6c 65 73 29 20 69 66 20 69 74 20 69 73 20 6e 6f  les) if it is no
102c0 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 49  n-negative..** I
102d0 66 20 69 42 61 73 65 20 69 73 20 6e 65 67 61 74  f iBase is negat
102e0 69 76 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  ive, then alloca
102f0 74 65 20 74 68 65 20 6e 65 78 74 20 61 76 61 69  te the next avai
10300 6c 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  lable cursor..**
10310 0a 2a 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20  .** For a rowid 
10320 74 61 62 6c 65 2c 20 2a 70 69 44 61 74 61 43 75  table, *piDataCu
10330 72 20 77 69 6c 6c 20 62 65 20 65 78 61 63 74 6c  r will be exactl
10340 79 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20  y one less than 
10350 2a 70 69 49 64 78 43 75 72 2e 0a 2a 2a 20 46 6f  *piIdxCur..** Fo
10360 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
10370 44 20 74 61 62 6c 65 2c 20 2a 70 69 44 61 74 61  D table, *piData
10380 43 75 72 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65  Cur will be some
10390 77 68 65 72 65 20 69 6e 20 74 68 65 20 72 61 6e  where in the ran
103a0 67 65 0a 2a 2a 20 6f 66 20 2a 70 69 49 64 78 43  ge.** of *piIdxC
103b0 75 72 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  urs, depending o
103c0 6e 20 77 68 65 72 65 20 74 68 65 20 50 52 49 4d  n where the PRIM
103d0 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 61 70  ARY KEY index ap
103e0 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  pears on the.** 
103f0 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73  pTab->pIndex lis
10400 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62  t..**.** If pTab
10410 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
10420 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ble, then this r
10430 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
10440 70 20 61 6e 64 20 74 68 65 0a 2a 2a 20 2a 70 69  p and the.** *pi
10450 44 61 74 61 43 75 72 20 61 6e 64 20 2a 70 69 49  DataCur and *piI
10460 64 78 43 75 72 20 76 61 6c 75 65 73 20 61 72 65  dxCur values are
10470 20 6c 65 66 74 20 75 6e 69 6e 69 74 69 61 6c 69   left uninitiali
10480 7a 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zed..*/.int sqli
10490 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49  te3OpenTableAndI
104a0 6e 64 69 63 65 73 28 0a 20 20 50 61 72 73 65 20  ndices(.  Parse 
104b0 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
104c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
104d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
104e0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
104f0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  be opened */.  i
10500 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
10510 2f 2a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f  /* OP_OpenRead o
10520 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 2a  r OP_OpenWrite *
10530 2f 0a 20 20 75 38 20 70 35 2c 20 20 20 20 20 20  /.  u8 p5,      
10540 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65       /* P5 value
10550 20 66 6f 72 20 4f 50 5f 4f 70 65 6e 2a 20 6f 70   for OP_Open* op
10560 63 6f 64 65 73 20 28 65 78 63 65 70 74 20 6f 6e  codes (except on
10570 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 29 20   WITHOUT ROWID) 
10580 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20  */.  int iBase, 
10590 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
105a0 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  s for the table 
105b0 63 75 72 73 6f 72 2c 20 69 66 20 74 68 65 72 65  cursor, if there
105c0 20 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20   is one */.  u8 
105d0 2a 61 54 6f 4f 70 65 6e 2c 20 20 20 20 20 2f 2a  *aToOpen,     /*
105e0 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 3a 20 62 6f   If not NULL: bo
105f0 6f 6c 65 61 6e 20 66 6f 72 20 65 61 63 68 20 74  olean for each t
10600 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 2a  able and index *
10610 2f 0a 20 20 69 6e 74 20 2a 70 69 44 61 74 61 43  /.  int *piDataC
10620 75 72 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ur,  /* Write th
10630 65 20 64 61 74 61 62 61 73 65 20 73 6f 75 72 63  e database sourc
10640 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
10650 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
10660 69 49 64 78 43 75 72 20 20 20 20 2f 2a 20 57 72  iIdxCur    /* Wr
10670 69 74 65 20 74 68 65 20 66 69 72 73 74 20 69 6e  ite the first in
10680 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
10690 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
106a0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 44 62 3b  nt i;.  int iDb;
106b0 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 3b  .  int iDataCur;
106c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
106d0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
106e0 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70 65  sert( op==OP_Ope
106f0 6e 52 65 61 64 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  nRead || op==OP_
10700 4f 70 65 6e 57 72 69 74 65 20 29 3b 0a 20 20 61  OpenWrite );.  a
10710 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70  ssert( op==OP_Op
10720 65 6e 57 72 69 74 65 20 7c 7c 20 70 35 3d 3d 30  enWrite || p5==0
10730 20 29 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74   );.  if( IsVirt
10740 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
10750 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
10760 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
10770 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
10780 4c 65 61 76 65 20 74 68 65 20 6f 75 74 70 75 74  Leave the output
10790 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
107a0 73 20 2a 70 69 44 61 74 61 43 75 72 20 61 6e 64  s *piDataCur and
107b0 20 2a 70 69 49 64 78 43 75 72 20 75 6e 69 6e 69   *piIdxCur unini
107c0 74 69 61 6c 69 7a 65 64 20 73 6f 20 74 68 61 74  tialized so that
107d0 20 76 61 6c 67 72 69 6e 64 0a 20 20 20 20 2a 2a   valgrind.    **
107e0 20 63 61 6e 20 64 65 74 65 63 74 20 69 66 20 74   can detect if t
107f0 68 65 79 20 61 72 65 20 75 73 65 64 20 62 79 20  hey are used by 
10800 6d 69 73 74 61 6b 65 20 69 6e 20 74 68 65 20 63  mistake in the c
10810 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65  aller. */.    re
10820 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 44  turn 0;.  }.  iD
10830 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
10840 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
10850 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
10860 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  ma);.  v = sqlit
10870 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
10890 30 20 29 3b 0a 20 20 69 66 28 20 69 42 61 73 65  0 );.  if( iBase
108a0 3c 30 20 29 20 69 42 61 73 65 20 3d 20 70 50 61  <0 ) iBase = pPa
108b0 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 69 44 61  rse->nTab;.  iDa
108c0 74 61 43 75 72 20 3d 20 69 42 61 73 65 2b 2b 3b  taCur = iBase++;
108d0 0a 20 20 69 66 28 20 70 69 44 61 74 61 43 75 72  .  if( piDataCur
108e0 20 29 20 2a 70 69 44 61 74 61 43 75 72 20 3d 20   ) *piDataCur = 
108f0 69 44 61 74 61 43 75 72 3b 0a 20 20 69 66 28 20  iDataCur;.  if( 
10900 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
10910 26 20 28 61 54 6f 4f 70 65 6e 3d 3d 30 20 7c 7c  & (aToOpen==0 ||
10920 20 61 54 6f 4f 70 65 6e 5b 30 5d 29 20 29 7b 0a   aToOpen[0]) ){.
10930 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
10940 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 61  able(pParse, iDa
10950 74 61 43 75 72 2c 20 69 44 62 2c 20 70 54 61 62  taCur, iDb, pTab
10960 2c 20 6f 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , op);.  }else{.
10970 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
10980 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
10990 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 6f 70  , pTab->tnum, op
109a0 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  ==OP_OpenWrite, 
109b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
109c0 7d 0a 20 20 69 66 28 20 70 69 49 64 78 43 75 72  }.  if( piIdxCur
109d0 20 29 20 2a 70 69 49 64 78 43 75 72 20 3d 20 69   ) *piIdxCur = i
109e0 42 61 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Base;.  for(i=0,
109f0 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
10a00 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10a10 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29  Idx->pNext, i++)
10a20 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  {.    int iIdxCu
10a30 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a 20 20 20  r = iBase++;.   
10a40 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
10a50 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
10a60 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
10a70 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
10a80 65 78 28 70 49 64 78 29 20 26 26 20 21 48 61 73  ex(pIdx) && !Has
10a90 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
10aa0 20 20 20 20 20 69 66 28 20 70 69 44 61 74 61 43       if( piDataC
10ab0 75 72 20 29 20 2a 70 69 44 61 74 61 43 75 72 20  ur ) *piDataCur 
10ac0 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
10ad0 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   p5 = 0;.    }. 
10ae0 20 20 20 69 66 28 20 61 54 6f 4f 70 65 6e 3d 3d     if( aToOpen==
10af0 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 69 2b 31  0 || aToOpen[i+1
10b00 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
10b10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10b20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 70 49 64  op, iIdxCur, pId
10b30 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
10b40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b50 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
10b60 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  rse, pIdx);.    
10b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10b80 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
10b90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10ba0 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
10bb0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
10bc0 20 7d 0a 20 20 69 66 28 20 69 42 61 73 65 3e 70   }.  if( iBase>p
10bd0 50 61 72 73 65 2d 3e 6e 54 61 62 20 29 20 70 50  Parse->nTab ) pP
10be0 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 42 61  arse->nTab = iBa
10bf0 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  se;.  return i;.
10c00 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
10c10 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65  E_TEST./*.** The
10c20 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
10c30 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
10c40 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
10c50 65 72 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 66  er the.** transf
10c60 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
10c70 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20 69  is used.  This i
10c80 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
10c90 6e 67 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 6f  ng.** purposes o
10ca0 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65 20 73 75  nly - to make su
10cb0 72 65 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  re the transfer 
10cc0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 65 61  optimization rea
10cd0 6c 6c 79 0a 2a 2a 20 69 73 20 68 61 70 70 65 6e  lly.** is happen
10ce0 69 6e 67 20 77 68 65 6e 20 69 74 20 69 73 20 73  ing when it is s
10cf0 75 70 70 6f 73 65 64 20 74 6f 2e 0a 2a 2f 0a 69  upposed to..*/.i
10d00 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
10d10 70 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  pt_count;.#endif
10d20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
10d30 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
10d40 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50  ITE_OMIT_XFER_OP
10d50 54 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  T./*.** Check to
10d60 20 73 65 65 20 69 66 20 69 6e 64 65 78 20 70 53   see if index pS
10d70 72 63 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  rc is compatible
10d80 20 61 73 20 61 20 73 6f 75 72 63 65 20 6f 66 20   as a source of 
10d90 64 61 74 61 0a 2a 2a 20 66 6f 72 20 69 6e 64 65  data.** for inde
10da0 78 20 70 44 65 73 74 20 69 6e 20 61 6e 20 69 6e  x pDest in an in
10db0 73 65 72 74 20 74 72 61 6e 73 66 65 72 20 6f 70  sert transfer op
10dc0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
10dd0 20 72 75 6c 65 73 0a 2a 2a 20 66 6f 72 20 61 20   rules.** for a 
10de0 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 64 65 78  compatible index
10df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 54  :.**.**    *   T
10e00 68 65 20 69 6e 64 65 78 20 69 73 20 6f 76 65 72  he index is over
10e10 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
10e20 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a   columns.**    *
10e30 20 20 20 54 68 65 20 73 61 6d 65 20 44 45 53 43     The same DESC
10e40 20 61 6e 64 20 41 53 43 20 6d 61 72 6b 69 6e 67   and ASC marking
10e50 73 20 6f 63 63 75 72 73 20 6f 6e 20 61 6c 6c 20  s occurs on all 
10e60 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20  columns.**    * 
10e70 20 20 54 68 65 20 73 61 6d 65 20 6f 6e 45 72 72    The same onErr
10e80 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 28 4f  or processing (O
10e90 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
10ea0 72 65 2c 20 65 74 63 29 0a 2a 2a 20 20 20 20 2a  re, etc).**    *
10eb0 20 20 20 54 68 65 20 73 61 6d 65 20 63 6f 6c 6c     The same coll
10ec0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
10ed0 6e 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a  n each column.**
10ee0 20 20 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65      *   The inde
10ef0 78 20 68 61 73 20 74 68 65 20 65 78 61 63 74 20  x has the exact 
10f00 73 61 6d 65 20 57 48 45 52 45 20 63 6c 61 75 73  same WHERE claus
10f10 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
10f20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e  xferCompatibleIn
10f30 64 65 78 28 49 6e 64 65 78 20 2a 70 44 65 73 74  dex(Index *pDest
10f40 2c 20 49 6e 64 65 78 20 2a 70 53 72 63 29 7b 0a  , Index *pSrc){.
10f50 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
10f60 74 28 20 70 44 65 73 74 20 26 26 20 70 53 72 63  t( pDest && pSrc
10f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
10f80 65 73 74 2d 3e 70 54 61 62 6c 65 21 3d 70 53 72  est->pTable!=pSr
10f90 63 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20 69  c->pTable );.  i
10fa0 66 28 20 70 44 65 73 74 2d 3e 6e 4b 65 79 43 6f  f( pDest->nKeyCo
10fb0 6c 21 3d 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c  l!=pSrc->nKeyCol
10fc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10fd0 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74  ;   /* Different
10fe0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
10ff0 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ns */.  }.  if( 
11000 70 44 65 73 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pDest->onError!=
11010 70 53 72 63 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  pSrc->onError ){
11020 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
11030 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f   /* Different co
11040 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
11050 6e 20 73 74 72 61 74 65 67 69 65 73 20 2a 2f 0a  n strategies */.
11060 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
11070 3c 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pSrc->nKeyCol; 
11080 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53  i++){.    if( pS
11090 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21  rc->aiColumn[i]!
110a0 3d 70 44 65 73 74 2d 3e 61 69 43 6f 6c 75 6d 6e  =pDest->aiColumn
110b0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  [i] ){.      ret
110c0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
110d0 65 72 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  erent columns in
110e0 64 65 78 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20  dexed */.    }. 
110f0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 69 43     if( pSrc->aiC
11100 6f 6c 75 6d 6e 5b 69 5d 3d 3d 58 4e 5f 45 58 50  olumn[i]==XN_EXP
11110 52 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  R ){.      asser
11120 74 28 20 70 53 72 63 2d 3e 61 43 6f 6c 45 78 70  t( pSrc->aColExp
11130 72 21 3d 30 20 26 26 20 70 44 65 73 74 2d 3e 61  r!=0 && pDest->a
11140 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
11150 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11160 78 70 72 43 6f 6d 70 61 72 65 28 70 53 72 63 2d  xprCompare(pSrc-
11170 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e  >aColExpr->a[i].
11180 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 70 44 65 73 74 2d 3e 61 43 6f 6c 45      pDest->aColE
111b0 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  xpr->a[i].pExpr,
111c0 20 2d 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   -1)!=0 ){.     
111d0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
111e0 2a 20 44 69 66 66 65 72 65 6e 74 20 65 78 70 72  * Different expr
111f0 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 69  essions in the i
11200 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ndex */.      }.
11210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
11220 72 63 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  rc->aSortOrder[i
11230 5d 21 3d 70 44 65 73 74 2d 3e 61 53 6f 72 74 4f  ]!=pDest->aSortO
11240 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
11250 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
11260 44 69 66 66 65 72 65 6e 74 20 73 6f 72 74 20 6f  Different sort o
11270 72 64 65 72 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  rders */.    }. 
11280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
11290 74 72 69 63 6d 70 28 70 53 72 63 2d 3e 61 7a 43  tricmp(pSrc->azC
112a0 6f 6c 6c 5b 69 5d 2c 70 44 65 73 74 2d 3e 61 7a  oll[i],pDest->az
112b0 43 6f 6c 6c 5b 69 5d 29 21 3d 30 20 29 7b 0a 20  Coll[i])!=0 ){. 
112c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
112d0 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f   /* Different co
112e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
112f0 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
11300 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
11310 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e 70 50  Compare(pSrc->pP
11320 61 72 74 49 64 78 57 68 65 72 65 2c 20 70 44 65  artIdxWhere, pDe
11330 73 74 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  st->pPartIdxWher
11340 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  e, -1) ){.    re
11350 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 44  turn 0;     /* D
11360 69 66 66 65 72 65 6e 74 20 57 48 45 52 45 20 63  ifferent WHERE c
11370 6c 61 75 73 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20  lauses */.  }.. 
11380 20 2f 2a 20 49 66 20 6e 6f 20 74 65 73 74 20 61   /* If no test a
11390 62 6f 76 65 20 66 61 69 6c 73 20 74 68 65 6e 20  bove fails then 
113a0 74 68 65 20 69 6e 64 69 63 65 73 20 6d 75 73 74  the indices must
113b0 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 2a   be compatible *
113c0 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
113d0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
113e0 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
113f0 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 49 4e 53 45  mization on INSE
11400 52 54 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  RTs of the form.
11410 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54  **.**     INSERT
11420 20 49 4e 54 4f 20 74 61 62 31 20 53 45 4c 45 43   INTO tab1 SELEC
11430 54 20 2a 20 46 52 4f 4d 20 74 61 62 32 3b 0a 2a  T * FROM tab2;.*
11440 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20 6f 70  *.** The xfer op
11450 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 61 6e 73  timization trans
11460 66 65 72 73 20 72 61 77 20 72 65 63 6f 72 64 73  fers raw records
11470 20 66 72 6f 6d 20 74 61 62 32 20 6f 76 65 72 20   from tab2 over 
11480 74 6f 20 74 61 62 31 2e 20 20 0a 2a 2a 20 43 6f  to tab1.  .** Co
11490 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 64 65  lumns are not de
114a0 63 6f 64 65 64 20 61 6e 64 20 72 65 61 73 73 65  coded and reasse
114b0 6d 62 6c 65 64 2c 20 77 68 69 63 68 20 67 72 65  mbled, which gre
114c0 61 74 6c 79 20 69 6d 70 72 6f 76 65 73 0a 2a 2a  atly improves.**
114d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 52   performance.  R
114e0 61 77 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  aw index records
114f0 20 61 72 65 20 74 72 61 6e 73 66 65 72 72 65 64   are transferred
11500 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
11510 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72  ..**.** The xfer
11520 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
11530 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
11540 69 66 20 74 61 62 31 20 61 6e 64 20 74 61 62 32  if tab1 and tab2
11550 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e   are compatible.
11560 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6c 6f  .** There are lo
11570 74 73 20 6f 66 20 72 75 6c 65 73 20 66 6f 72 20  ts of rules for 
11580 64 65 74 65 72 6d 69 6e 69 6e 67 20 63 6f 6d 70  determining comp
11590 61 74 69 62 69 6c 69 74 79 20 2d 20 73 65 65 20  atibility - see 
115a0 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 65 6d 62 65  comments.** embe
115b0 64 64 65 64 20 69 6e 20 74 68 65 20 63 6f 64 65  dded in the code
115c0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a   for details..**
115d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
115e0 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66   returns TRUE if
115f0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
11600 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  n is guaranteed 
11610 74 6f 20 62 65 20 75 73 65 64 2e 0a 2a 2a 20 53  to be used..** S
11620 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 78 66 65  ometimes the xfe
11630 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  r optimization w
11640 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66  ill only work if
11650 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
11660 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 65 6d 70   table.** is emp
11670 74 79 20 2d 20 61 20 66 61 63 74 6f 72 20 74 68  ty - a factor th
11680 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 64  at can only be d
11690 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
116a0 2d 74 69 6d 65 2e 20 20 49 6e 20 74 68 61 74 0a  -time.  In that.
116b0 2a 2a 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  ** case, this ro
116c0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
116d0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 78 66 65  code for the xfe
116e0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62  r optimization b
116f0 75 74 20 61 6c 73 6f 0a 2a 2a 20 64 6f 65 73 20  ut also.** does 
11700 61 20 74 65 73 74 20 74 6f 20 73 65 65 20 69 66  a test to see if
11710 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
11720 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20   table is empty 
11730 61 6e 64 20 6a 75 6d 70 73 20 6f 76 65 72 20 74  and jumps over t
11740 68 65 0a 2a 2a 20 78 66 65 72 20 6f 70 74 69 6d  he.** xfer optim
11750 69 7a 61 74 69 6f 6e 20 63 6f 64 65 20 69 66 20  ization code if 
11760 74 68 65 20 74 65 73 74 20 66 61 69 6c 73 2e 20  the test fails. 
11770 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
11780 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
11790 65 74 75 72 6e 73 20 46 41 4c 53 45 20 73 6f 20  eturns FALSE so 
117a0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
117b0 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 67 6f 20  will know to go 
117c0 61 68 65 61 64 20 61 6e 64 20 67 65 6e 65 72 61  ahead and genera
117d0 74 65 0a 2a 2a 20 61 6e 20 75 6e 6f 70 74 69 6d  te.** an unoptim
117e0 69 7a 65 64 20 74 72 61 6e 73 66 65 72 2e 20 20  ized transfer.  
117f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
11800 6f 20 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20  o returns FALSE 
11810 69 66 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 6e  if there.** is n
11820 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
11830 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  e xfer optimizat
11840 69 6f 6e 20 63 61 6e 20 62 65 20 61 70 70 6c 69  ion can be appli
11850 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  ed..**.** This o
11860 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 70  ptimization is p
11870 61 72 74 69 63 75 6c 61 72 6c 79 20 75 73 65 66  articularly usef
11880 75 6c 20 61 74 20 6d 61 6b 69 6e 67 20 56 41 43  ul at making VAC
11890 55 55 4d 20 72 75 6e 20 66 61 73 74 65 72 2e 0a  UUM run faster..
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66  */.static int xf
118b0 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 0a  erOptimization(.
118c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
118d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
118e0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
118f0 61 62 6c 65 20 2a 70 44 65 73 74 2c 20 20 20 20  able *pDest,    
11900 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
11910 65 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  e we are inserti
11920 6e 67 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c  ng into */.  Sel
11930 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
11940 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
11950 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20  tatement to use 
11960 61 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  as the data sour
11970 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ce */.  int onEr
11980 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
11990 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20 63   How to handle c
119a0 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72 73  onstraint errors
119b0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 44 65 73   */.  int iDbDes
119c0 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t           /* T
119d0 68 65 20 64 61 74 61 62 61 73 65 20 6f 66 20 70  he database of p
119e0 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  Dest */.){.  sql
119f0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11a00 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73  e->db;.  ExprLis
11a10 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
11a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11a30 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
11a40 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 54  he SELECT */.  T
11a50 61 62 6c 65 20 2a 70 53 72 63 3b 20 20 20 20 20  able *pSrc;     
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20  /* The table in 
11a80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
11a90 6f 66 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 49  of SELECT */.  I
11aa0 6e 64 65 78 20 2a 70 53 72 63 49 64 78 2c 20 2a  ndex *pSrcIdx, *
11ab0 70 44 65 73 74 49 64 78 3b 20 20 20 20 20 20 20  pDestIdx;       
11ac0 2f 2a 20 53 6f 75 72 63 65 20 61 6e 64 20 64 65  /* Source and de
11ad0 73 74 69 6e 61 74 69 6f 6e 20 69 6e 64 69 63 65  stination indice
11ae0 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
11af0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
11b00 6d 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c  m;      /* An el
11b10 65 6d 65 6e 74 20 6f 66 20 70 53 65 6c 65 63 74  ement of pSelect
11b20 2d 3e 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20  ->pSrc */.  int 
11b30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
11b60 20 20 69 6e 74 20 69 44 62 53 72 63 3b 20 20 20    int iDbSrc;   
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
11b90 73 65 20 6f 66 20 70 53 72 63 20 2a 2f 0a 20 20  se of pSrc */.  
11ba0 69 6e 74 20 69 53 72 63 2c 20 69 44 65 73 74 3b  int iSrc, iDest;
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 2f 2a 20 43 75 72 73 6f 72 73 20 66 72 6f 6d   /* Cursors from
11bd0 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74   source and dest
11be0 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ination */.  int
11bf0 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 20 20   addr1, addr2;  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c10 20 4c 6f 6f 70 20 61 64 64 72 65 73 73 65 73 20   Loop addresses 
11c20 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 44 65  */.  int emptyDe
11c30 73 74 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20  stTest = 0;     
11c40 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11c50 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70   of test for emp
11c60 74 79 20 70 44 65 73 74 20 2a 2f 0a 20 20 69 6e  ty pDest */.  in
11c70 74 20 65 6d 70 74 79 53 72 63 54 65 73 74 20 3d  t emptySrcTest =
11c80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
11c90 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 65 73  * Address of tes
11ca0 74 20 66 6f 72 20 65 6d 70 74 79 20 70 53 72 63  t for empty pSrc
11cb0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
11ce0 42 45 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  BE we are buildi
11cf0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ng */.  int regA
11d00 75 74 6f 69 6e 63 3b 20 20 20 20 20 20 20 20 20  utoinc;         
11d10 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
11d20 72 79 20 72 65 67 69 73 74 65 72 20 75 73 65 64  ry register used
11d30 20 62 79 20 41 55 54 4f 49 4e 43 20 2a 2f 0a 20   by AUTOINC */. 
11d40 20 69 6e 74 20 64 65 73 74 48 61 73 55 6e 69 71   int destHasUniq
11d50 75 65 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  ueIdx = 0;      
11d60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 44 65    /* True if pDe
11d70 73 74 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  st has a UNIQUE 
11d80 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
11d90 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64  egData, regRowid
11da0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
11db0 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
11dc0 20 64 61 74 61 20 61 6e 64 20 72 6f 77 69 64 20   data and rowid 
11dd0 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  */..  if( pSelec
11de0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
11df0 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 75 73 74 20  rn 0;   /* Must 
11e00 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 20  be of the form  
11e10 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20  INSERT INTO ... 
11e20 53 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a 20 20  SELECT ... */.  
11e30 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
11e40 70 57 69 74 68 20 7c 7c 20 70 53 65 6c 65 63 74  pWith || pSelect
11e50 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 2f  ->pWith ){.    /
11e60 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
11e70 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
11e80 20 71 75 65 72 79 20 69 66 20 74 68 65 72 65 20   query if there 
11e90 61 72 65 20 61 6e 20 57 49 54 48 20 63 6c 61 75  are an WITH clau
11ea0 73 65 73 0a 20 20 20 20 2a 2a 20 61 74 74 61 63  ses.    ** attac
11eb0 68 65 64 20 74 6f 20 69 74 2e 20 50 72 6f 63 65  hed to it. Proce
11ec0 65 64 69 6e 67 20 6d 61 79 20 67 65 6e 65 72 61  eding may genera
11ed0 74 65 20 61 20 66 61 6c 73 65 20 22 6e 6f 20 73  te a false "no s
11ee0 75 63 68 20 74 61 62 6c 65 3a 20 78 78 78 22 0a  uch table: xxx".
11ef0 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20      ** error if 
11f00 70 53 65 6c 65 63 74 20 72 65 61 64 73 20 66 72  pSelect reads fr
11f10 6f 6d 20 61 20 43 54 45 20 6e 61 6d 65 64 20 22  om a CTE named "
11f20 78 78 78 22 2e 20 20 2a 2f 0a 20 20 20 20 72 65  xxx".  */.    re
11f30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
11f40 28 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  ( sqlite3Trigger
11f50 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 44 65  List(pParse, pDe
11f60 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
11f70 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d  n 0;   /* tab1 m
11f80 75 73 74 20 6e 6f 74 20 68 61 76 65 20 74 72 69  ust not have tri
11f90 67 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 23 69 66  ggers */.  }.#if
11fa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11fb0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11fc0 69 66 28 20 70 44 65 73 74 2d 3e 74 61 62 46 6c  if( pDest->tabFl
11fd0 61 67 73 20 26 20 54 46 5f 56 69 72 74 75 61 6c  ags & TF_Virtual
11fe0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
11ff0 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75 73 74  ;   /* tab1 must
12000 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74 75 61   not be a virtua
12010 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23  l table */.  }.#
12020 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 6e 45 72  endif.  if( onEr
12030 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
12040 29 7b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  ){.    if( pDest
12050 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 20 6f 6e 45  ->iPKey>=0 ) onE
12060 72 72 6f 72 20 3d 20 70 44 65 73 74 2d 3e 6b 65  rror = pDest->ke
12070 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f  yConf;.    if( o
12080 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
12090 6c 74 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f  lt ) onError = O
120a0 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61  E_Abort;.  }.  a
120b0 73 73 65 72 74 28 70 53 65 6c 65 63 74 2d 3e 70  ssert(pSelect->p
120c0 53 72 63 29 3b 20 20 20 2f 2a 20 61 6c 6c 6f 63  Src);   /* alloc
120d0 61 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  ated even if the
120e0 72 65 20 69 73 20 6e 6f 20 46 52 4f 4d 20 63 6c  re is no FROM cl
120f0 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
12100 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 6e 53 72  elect->pSrc->nSr
12110 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=1 ){.    retu
12120 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20  rn 0;   /* FROM 
12130 63 6c 61 75 73 65 20 6d 75 73 74 20 68 61 76 65  clause must have
12140 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 74 65 72   exactly one ter
12150 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  m */.  }.  if( p
12160 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61 5b  Select->pSrc->a[
12170 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  0].pSelect ){.  
12180 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
12190 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 61 6e   FROM clause can
121a0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73 75  not contain a su
121b0 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  bquery */.  }.  
121c0 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 57 68  if( pSelect->pWh
121d0 65 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ere ){.    retur
121e0 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
121f0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
12200 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
12210 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
12220 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
12230 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
12240 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74  * SELECT may not
12250 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
12260 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a  Y clause */.  }.
12270 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6e 65 65 64    /* Do not need
12280 20 74 6f 20 74 65 73 74 20 66 6f 72 20 61 20 48   to test for a H
12290 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 49  AVING clause.  I
122a0 66 20 48 41 56 49 4e 47 20 69 73 20 70 72 65 73  f HAVING is pres
122b0 65 6e 74 20 62 75 74 0a 20 20 2a 2a 20 74 68 65  ent but.  ** the
122c0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
122d0 59 2c 20 77 65 20 77 69 6c 6c 20 67 65 74 20 61  Y, we will get a
122e0 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66  n error. */.  if
122f0 28 20 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f 75  ( pSelect->pGrou
12300 70 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pBy ){.    retur
12310 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
12320 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
12330 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
12340 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  */.  }.  if( pSe
12350 6c 65 63 74 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  lect->pLimit ){.
12360 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12370 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
12380 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
12390 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 61  lause */.  }.  a
123a0 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e  ssert( pSelect->
123b0 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 2f  pOffset==0 );  /
123c0 2a 20 4d 75 73 74 20 62 65 20 73 6f 20 69 66 20  * Must be so if 
123d0 70 4c 69 6d 69 74 3d 3d 30 20 2a 2f 0a 20 20 69  pLimit==0 */.  i
123e0 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
123f0 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
12400 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20   0;   /* SELECT 
12410 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
12420 70 6f 75 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  pound query */. 
12430 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
12440 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12450 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
12460 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53  return 0;   /* S
12470 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62 65  ELECT may not be
12480 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 7d   DISTINCT */.  }
12490 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
124a0 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  ect->pEList;.  a
124b0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
124c0 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
124d0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
124e0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
124f0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
12500 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
12510 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  y one column */.
12520 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 45    }.  assert( pE
12530 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12540 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   );.  if( pEList
12550 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
12560 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 7b  !=TK_ASTERISK ){
12570 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
12580 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
12590 65 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  et must be the s
125a0 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20  pecial operator 
125b0 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  "*" */.  }..  /*
125c0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 77   At this point w
125d0 65 20 68 61 76 65 20 65 73 74 61 62 6c 69 73 68  e have establish
125e0 65 64 20 74 68 61 74 20 74 68 65 20 73 74 61 74  ed that the stat
125f0 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 0a  ement is of the.
12600 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 73 79 6e    ** correct syn
12610 74 61 63 74 69 63 20 66 6f 72 6d 20 74 6f 20 70  tactic form to p
12620 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
12630 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
12640 20 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20 68 61    Now.  ** we ha
12650 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20  ve to check the 
12660 73 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a 2f 0a  semantics..  */.
12670 20 20 70 49 74 65 6d 20 3d 20 70 53 65 6c 65 63    pItem = pSelec
12680 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20 70 53  t->pSrc->a;.  pS
12690 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  rc = sqlite3Loca
126a0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
126b0 73 65 2c 20 30 2c 20 70 49 74 65 6d 29 3b 0a 20  se, 0, pItem);. 
126c0 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a   if( pSrc==0 ){.
126d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
126e0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 64  /* FROM clause d
126f0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
12700 61 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  a real table */.
12710 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 3d 3d    }.  if( pSrc==
12720 70 44 65 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pDest ){.    ret
12730 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31  urn 0;   /* tab1
12740 20 61 6e 64 20 74 61 62 32 20 6d 61 79 20 6e 6f   and tab2 may no
12750 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 74 61  t be the same ta
12760 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ble */.  }.  if(
12770 20 48 61 73 52 6f 77 69 64 28 70 44 65 73 74 29   HasRowid(pDest)
12780 21 3d 48 61 73 52 6f 77 69 64 28 70 53 72 63 29  !=HasRowid(pSrc)
12790 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
127a0 3b 20 20 20 2f 2a 20 73 6f 75 72 63 65 20 61 6e  ;   /* source an
127b0 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  d destination mu
127c0 73 74 20 62 6f 74 68 20 62 65 20 57 49 54 48 4f  st both be WITHO
127d0 55 54 20 52 4f 57 49 44 20 6f 72 20 6e 6f 74 20  UT ROWID or not 
127e0 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  */.  }.#ifndef S
127f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12800 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 53  ALTABLE.  if( pS
12810 72 63 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  rc->tabFlags & T
12820 46 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  F_Virtual ){.   
12830 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
12840 74 61 62 32 20 6d 75 73 74 20 6e 6f 74 20 62 65  tab2 must not be
12850 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
12860 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   */.  }.#endif. 
12870 20 69 66 28 20 70 53 72 63 2d 3e 70 53 65 6c 65   if( pSrc->pSele
12880 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ct ){.    return
12890 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d 61   0;   /* tab2 ma
128a0 79 20 6e 6f 74 20 62 65 20 61 20 76 69 65 77 20  y not be a view 
128b0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  */.  }.  if( pDe
128c0 73 74 2d 3e 6e 43 6f 6c 21 3d 70 53 72 63 2d 3e  st->nCol!=pSrc->
128d0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  nCol ){.    retu
128e0 72 6e 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  rn 0;   /* Numbe
128f0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6d 75 73  r of columns mus
12900 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 69 6e  t be the same in
12910 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 2a   tab1 and tab2 *
12920 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  /.  }.  if( pDes
12930 74 2d 3e 69 50 4b 65 79 21 3d 70 53 72 63 2d 3e  t->iPKey!=pSrc->
12940 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  iPKey ){.    ret
12950 75 72 6e 20 30 3b 20 20 20 2f 2a 20 42 6f 74 68  urn 0;   /* Both
12960 20 74 61 62 6c 65 73 20 6d 75 73 74 20 68 61 76   tables must hav
12970 65 20 74 68 65 20 73 61 6d 65 20 49 4e 54 45 47  e the same INTEG
12980 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
12990 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  /.  }.  for(i=0;
129a0 20 69 3c 70 44 65 73 74 2d 3e 6e 43 6f 6c 3b 20   i<pDest->nCol; 
129b0 69 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  i++){.    Column
129c0 20 2a 70 44 65 73 74 43 6f 6c 20 3d 20 26 70 44   *pDestCol = &pD
129d0 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  est->aCol[i];.  
129e0 20 20 43 6f 6c 75 6d 6e 20 2a 70 53 72 63 43 6f    Column *pSrcCo
129f0 6c 20 3d 20 26 70 53 72 63 2d 3e 61 43 6f 6c 5b  l = &pSrc->aCol[
12a00 69 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  i];.#ifdef SQLIT
12a10 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f  E_ENABLE_HIDDEN_
12a20 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 69 66 28 20  COLUMNS.    if( 
12a30 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
12a40 49 54 45 5f 56 61 63 75 75 6d 29 3d 3d 30 20 0a  ITE_Vacuum)==0 .
12a50 20 20 20 20 20 26 26 20 28 70 44 65 73 74 43 6f       && (pDestCo
12a60 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 20 70 53  l->colFlags | pS
12a70 72 63 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 29  rcCol->colFlags)
12a80 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
12a90 4e 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  N .    ){.      
12aa0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
12ab0 4e 65 69 74 68 65 72 20 74 61 62 6c 65 20 6d 61  Neither table ma
12ac0 79 20 68 61 76 65 20 5f 5f 68 69 64 64 65 6e 5f  y have __hidden_
12ad0 5f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  _ columns */.   
12ae0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
12af0 28 20 70 44 65 73 74 43 6f 6c 2d 3e 61 66 66 69  ( pDestCol->affi
12b00 6e 69 74 79 21 3d 70 53 72 63 43 6f 6c 2d 3e 61  nity!=pSrcCol->a
12b10 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
12b20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
12b30 20 41 66 66 69 6e 69 74 79 20 6d 75 73 74 20 62   Affinity must b
12b40 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c  e the same on al
12b50 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  l columns */.   
12b60 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
12b70 65 33 5f 73 74 72 69 63 6d 70 28 70 44 65 73 74  e3_stricmp(pDest
12b80 43 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20 70 53 72 63  Col->zColl, pSrc
12b90 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 21 3d 30 20 29  Col->zColl)!=0 )
12ba0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
12bb0 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e  ;    /* Collatin
12bc0 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  g sequence must 
12bd0 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20 61  be the same on a
12be0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ll columns */.  
12bf0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65 73    }.    if( pDes
12c00 74 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 26 26  tCol->notNull &&
12c10 20 21 70 53 72 63 43 6f 6c 2d 3e 6e 6f 74 4e 75   !pSrcCol->notNu
12c20 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
12c30 72 6e 20 30 3b 20 20 20 20 2f 2a 20 74 61 62 32  rn 0;    /* tab2
12c40 20 6d 75 73 74 20 62 65 20 4e 4f 54 20 4e 55 4c   must be NOT NUL
12c50 4c 20 69 66 20 74 61 62 31 20 69 73 20 2a 2f 0a  L if tab1 is */.
12c60 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 65 66      }.    /* Def
12c70 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f 72 20  ault values for 
12c80 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73 65  second and subse
12c90 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 6e 65  quent columns ne
12ca0 65 64 20 74 6f 20 6d 61 74 63 68 2e 20 2a 2f 0a  ed to match. */.
12cb0 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
12cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
12cd0 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20  stCol->pDflt==0 
12ce0 7c 7c 20 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66  || pDestCol->pDf
12cf0 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20  lt->op==TK_SPAN 
12d00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12d10 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 3d   pSrcCol->pDflt=
12d20 3d 30 20 7c 7c 20 70 53 72 63 43 6f 6c 2d 3e 70  =0 || pSrcCol->p
12d30 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
12d40 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  N );.      if( (
12d50 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 3d  pDestCol->pDflt=
12d60 3d 30 29 21 3d 28 70 53 72 63 43 6f 6c 2d 3e 70  =0)!=(pSrcCol->p
12d70 44 66 6c 74 3d 3d 30 29 20 0a 20 20 20 20 20 20  Dflt==0) .      
12d80 20 7c 7c 20 28 70 44 65 73 74 43 6f 6c 2d 3e 70   || (pDestCol->p
12d90 44 66 6c 74 20 26 26 20 73 74 72 63 6d 70 28 70  Dflt && strcmp(p
12da0 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e  DestCol->pDflt->
12db0 75 2e 7a 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20  u.zToken,.      
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 2d   pSrcCol->pDflt-
12df0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 29 0a 20  >u.zToken)!=0). 
12e00 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
12e10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
12e20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 6d  Default values m
12e30 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
12e40 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
12e50 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
12e60 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44 65 73 74  .  }.  for(pDest
12e70 49 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65  Idx=pDest->pInde
12e80 78 3b 20 70 44 65 73 74 49 64 78 3b 20 70 44 65  x; pDestIdx; pDe
12e90 73 74 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e  stIdx=pDestIdx->
12ea0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
12eb0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 44  IsUniqueIndex(pD
12ec0 65 73 74 49 64 78 29 20 29 7b 0a 20 20 20 20 20  estIdx) ){.     
12ed0 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64   destHasUniqueId
12ee0 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  x = 1;.    }.   
12ef0 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70 53 72   for(pSrcIdx=pSr
12f00 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53 72 63 49  c->pIndex; pSrcI
12f10 64 78 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63  dx; pSrcIdx=pSrc
12f20 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12f30 20 20 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61     if( xferCompa
12f40 74 69 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74  tibleIndex(pDest
12f50 49 64 78 2c 20 70 53 72 63 49 64 78 29 20 29 20  Idx, pSrcIdx) ) 
12f60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12f70 20 69 66 28 20 70 53 72 63 49 64 78 3d 3d 30 20   if( pSrcIdx==0 
12f80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12f90 30 3b 20 20 20 20 2f 2a 20 70 44 65 73 74 49 64  0;    /* pDestId
12fa0 78 20 68 61 73 20 6e 6f 20 63 6f 72 72 65 73 70  x has no corresp
12fb0 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  onding index in 
12fc0 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  pSrc */.    }.  
12fd0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12fe0 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 69 66  _OMIT_CHECK.  if
12ff0 28 20 70 44 65 73 74 2d 3e 70 43 68 65 63 6b 20  ( pDest->pCheck 
13000 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
13010 73 74 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e  stCompare(pSrc->
13020 70 43 68 65 63 6b 2c 70 44 65 73 74 2d 3e 70 43  pCheck,pDest->pC
13030 68 65 63 6b 2c 2d 31 29 20 29 7b 0a 20 20 20 20  heck,-1) ){.    
13040 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
13050 61 62 6c 65 73 20 68 61 76 65 20 64 69 66 66 65  ables have diffe
13060 72 65 6e 74 20 43 48 45 43 4b 20 63 6f 6e 73 74  rent CHECK const
13070 72 61 69 6e 74 73 2e 20 20 54 69 63 6b 65 74 20  raints.  Ticket 
13080 23 32 32 35 32 20 2a 2f 0a 20 20 7d 0a 23 65 6e  #2252 */.  }.#en
13090 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
130a0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
130b0 4b 45 59 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  KEY.  /* Disallo
130c0 77 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f  w the transfer o
130d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74  ptimization if t
130e0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
130f0 61 62 6c 65 20 63 6f 6e 73 74 61 69 6e 73 0a 20  able constains. 
13100 20 2a 2a 20 61 6e 79 20 66 6f 72 65 69 67 6e 20   ** any foreign 
13110 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  key constraints.
13120 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 72    This is more r
13130 65 73 74 72 69 63 74 69 76 65 20 74 68 61 6e 20  estrictive than 
13140 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2a 20  necessary..  ** 
13150 42 75 74 20 74 68 65 20 6d 61 69 6e 20 62 65 6e  But the main ben
13160 65 66 69 63 69 61 72 79 20 6f 66 20 74 68 65 20  eficiary of the 
13170 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a  transfer optimiz
13180 61 74 69 6f 6e 20 69 73 20 74 68 65 20 56 41 43  ation is the VAC
13190 55 55 4d 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  UUM .  ** comman
131a0 64 2c 20 61 6e 64 20 74 68 65 20 56 41 43 55 55  d, and the VACUU
131b0 4d 20 63 6f 6d 6d 61 6e 64 20 64 69 73 61 62 6c  M command disabl
131c0 65 73 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  es foreign key c
131d0 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 53 6f 0a  onstraints.  So.
131e0 20 20 2a 2a 20 74 68 65 20 65 78 74 72 61 20 63    ** the extra c
131f0 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 6d  omplication to m
13200 61 6b 65 20 74 68 69 73 20 72 75 6c 65 20 6c 65  ake this rule le
13210 73 73 20 72 65 73 74 72 69 63 74 69 76 65 20 69  ss restrictive i
13220 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 2a 2a 20  s probably.  ** 
13230 6e 6f 74 20 77 6f 72 74 68 20 74 68 65 20 65 66  not worth the ef
13240 66 6f 72 74 2e 20 20 54 69 63 6b 65 74 20 5b 36  fort.  Ticket [6
13250 32 38 34 64 66 38 39 64 65 62 64 66 61 36 31 64  284df89debdfa61d
13260 62 38 30 37 33 65 30 36 32 39 30 38 61 66 30 63  b8073e062908af0c
13270 39 62 36 31 31 38 65 5d 0a 20 20 2a 2f 0a 20 20  9b6118e].  */.  
13280 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
13290 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
132a0 65 79 73 29 21 3d 30 20 26 26 20 70 44 65 73 74  eys)!=0 && pDest
132b0 2d 3e 70 46 4b 65 79 21 3d 30 20 29 7b 0a 20 20  ->pFKey!=0 ){.  
132c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
132d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 64 62  #endif.  if( (db
132e0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
132f0 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29  _CountRows)!=0 )
13300 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
13310 20 2f 2a 20 78 66 65 72 20 6f 70 74 20 64 6f 65   /* xfer opt doe
13320 73 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  s not play well 
13330 77 69 74 68 20 50 52 41 47 4d 41 20 63 6f 75 6e  with PRAGMA coun
13340 74 5f 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 7d  t_changes */.  }
13350 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
13360 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
13370 61 6e 73 20 74 68 61 74 20 74 68 65 20 78 66 65  ans that the xfe
13380 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  r optimization i
13390 73 20 61 74 0a 20 20 2a 2a 20 6c 65 61 73 74 20  s at.  ** least 
133a0 61 20 70 6f 73 73 69 62 69 6c 69 74 79 2c 20 74  a possibility, t
133b0 68 6f 75 67 68 20 69 74 20 6d 69 67 68 74 20 6f  hough it might o
133c0 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74 68 65 20  nly work if the 
133d0 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a  destination.  **
133e0 20 74 61 62 6c 65 20 28 74 61 62 31 29 20 69 73   table (tab1) is
133f0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
13400 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
13410 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
13420 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
13430 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69 44  t++;.#endif.  iD
13440 62 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 63  bSrc = sqlite3Sc
13450 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
13460 70 53 72 63 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pSrc->pSchema);.
13470 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13480 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13490 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
134a0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
134b0 69 44 62 53 72 63 29 3b 0a 20 20 69 53 72 63 20  iDbSrc);.  iSrc 
134c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
134d0 3b 0a 20 20 69 44 65 73 74 20 3d 20 70 50 61 72  ;.  iDest = pPar
134e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 72 65  se->nTab++;.  re
134f0 67 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 49  gAutoinc = autoI
13500 6e 63 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  ncBegin(pParse, 
13510 69 44 62 44 65 73 74 2c 20 70 44 65 73 74 29 3b  iDbDest, pDest);
13520 0a 20 20 72 65 67 44 61 74 61 20 3d 20 73 71 6c  .  regData = sql
13530 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
13540 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77  Parse);.  regRow
13550 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
13560 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
13570 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
13580 6c 65 28 70 50 61 72 73 65 2c 20 69 44 65 73 74  le(pParse, iDest
13590 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74  , iDbDest, pDest
135a0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b  , OP_OpenWrite);
135b0 0a 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f  .  assert( HasRo
135c0 77 69 64 28 70 44 65 73 74 29 20 7c 7c 20 64 65  wid(pDest) || de
135d0 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 29  stHasUniqueIdx )
135e0 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
135f0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75  gs & SQLITE_Vacu
13600 75 6d 29 3d 3d 30 20 26 26 20 28 0a 20 20 20 20  um)==0 && (.    
13610 20 20 28 70 44 65 73 74 2d 3e 69 50 4b 65 79 3c    (pDest->iPKey<
13620 30 20 26 26 20 70 44 65 73 74 2d 3e 70 49 6e 64  0 && pDest->pInd
13630 65 78 21 3d 30 29 20 20 20 20 20 20 20 20 20 20  ex!=0)          
13640 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 7c 7c 20  /* (1) */.   || 
13650 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78  destHasUniqueIdx
13660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13680 20 28 32 29 20 2a 2f 0a 20 20 20 7c 7c 20 28 6f   (2) */.   || (o
13690 6e 45 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72 74  nError!=OE_Abort
136a0 20 26 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f   && onError!=OE_
136b0 52 6f 6c 6c 62 61 63 6b 29 20 20 20 2f 2a 20 28  Rollback)   /* (
136c0 33 29 20 2a 2f 0a 20 20 29 29 7b 0a 20 20 20 20  3) */.  )){.    
136d0 2f 2a 20 49 6e 20 73 6f 6d 65 20 63 69 72 63 75  /* In some circu
136e0 6d 73 74 61 6e 63 65 73 2c 20 77 65 20 61 72 65  mstances, we are
136f0 20 61 62 6c 65 20 74 6f 20 72 75 6e 20 74 68 65   able to run the
13700 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
13710 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 69  on.    ** only i
13720 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
13730 6e 20 74 61 62 6c 65 20 69 73 20 69 6e 69 74 69  n table is initi
13740 61 6c 6c 79 20 65 6d 70 74 79 2e 20 55 6e 6c 65  ally empty. Unle
13750 73 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ss the.    ** SQ
13760 4c 49 54 45 5f 56 61 63 75 75 6d 20 66 6c 61 67  LITE_Vacuum flag
13770 20 69 73 20 73 65 74 2c 20 74 68 69 73 20 62 6c   is set, this bl
13780 6f 63 6b 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ock generates co
13790 64 65 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  de to make.    *
137a0 2a 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 61  * that determina
137b0 74 69 6f 6e 2e 20 49 66 20 53 51 4c 49 54 45 5f  tion. If SQLITE_
137c0 56 61 63 75 75 6d 20 69 73 20 73 65 74 2c 20 74  Vacuum is set, t
137d0 68 65 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74  hen the destinat
137e0 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ion.    ** table
137f0 20 69 73 20 61 6c 77 61 79 73 20 65 6d 70 74 79   is always empty
13800 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13810 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72  Conditions under
13820 20 77 68 69 63 68 20 74 68 65 20 64 65 73 74 69   which the desti
13830 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  nation must be e
13840 6d 70 74 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mpty:.    **.   
13850 20 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73   ** (1) There is
13860 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
13870 41 52 59 20 4b 45 59 20 62 75 74 20 74 68 65 72  ARY KEY but ther
13880 65 20 61 72 65 20 69 6e 64 69 63 65 73 2e 0a 20  e are indices.. 
13890 20 20 20 2a 2a 20 20 20 20 20 28 49 66 20 74 68     **     (If th
138a0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
138b0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 65   not initially e
138c0 6d 70 74 79 2c 20 74 68 65 20 72 6f 77 69 64 20  mpty, the rowid 
138d0 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 20 20  fields.    **   
138e0 20 20 6f 66 20 69 6e 64 65 78 20 65 6e 74 72 69    of index entri
138f0 65 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  es might need to
13900 20 63 68 61 6e 67 65 2e 29 0a 20 20 20 20 2a 2a   change.).    **
13910 0a 20 20 20 20 2a 2a 20 28 32 29 20 54 68 65 20  .    ** (2) The 
13920 64 65 73 74 69 6e 61 74 69 6f 6e 20 68 61 73 20  destination has 
13930 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
13940 20 28 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d   (The xfer optim
13950 69 7a 61 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ization .    ** 
13960 20 20 20 20 69 73 20 75 6e 61 62 6c 65 20 74 6f      is unable to
13970 20 74 65 73 74 20 75 6e 69 71 75 65 6e 65 73 73   test uniqueness
13980 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
13990 20 28 33 29 20 6f 6e 45 72 72 6f 72 20 69 73 20   (3) onError is 
139a0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
139b0 74 68 61 6e 20 4f 45 5f 41 62 6f 72 74 20 61 6e  than OE_Abort an
139c0 64 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 0a 20  d OE_Rollback.. 
139d0 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 31 20     */.    addr1 
139e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
139f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
13a00 2c 20 69 44 65 73 74 2c 20 30 29 3b 20 56 64 62  , iDest, 0); Vdb
13a10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13a20 20 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20    emptyDestTest 
13a30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13a40 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
13a50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13a60 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
13a70 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48 61  1);.  }.  if( Ha
13a80 73 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a  sRowid(pSrc) ){.
13a90 20 20 20 20 75 38 20 69 6e 73 46 6c 61 67 73 3b      u8 insFlags;
13aa0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
13ab0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53  Table(pParse, iS
13ac0 72 63 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63  rc, iDbSrc, pSrc
13ad0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
13ae0 20 20 20 20 65 6d 70 74 79 53 72 63 54 65 73 74      emptySrcTest
13af0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13b00 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
13b10 64 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62  d, iSrc, 0); Vdb
13b20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13b30 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b    if( pDest->iPK
13b40 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ey>=0 ){.      a
13b50 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
13b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13b70 6f 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52  owid, iSrc, regR
13b80 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 64 64  owid);.      add
13b90 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
13ba0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
13bb0 45 78 69 73 74 73 2c 20 69 44 65 73 74 2c 20 30  Exists, iDest, 0
13bc0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
13bd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
13be0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
13bf0 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
13c00 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72  (pParse, onError
13c10 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  , pDest);.      
13c20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13c30 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
13c40 20 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70       autoIncStep
13c50 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f  (pParse, regAuto
13c60 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  inc, regRowid);.
13c70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44      }else if( pD
13c80 65 73 74 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29  est->pIndex==0 )
13c90 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  {.      addr1 = 
13ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13cb0 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
13cc0 2c 20 69 44 65 73 74 2c 20 72 65 67 52 6f 77 69  , iDest, regRowi
13cd0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
13ce0 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
13cf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13d00 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63  , OP_Rowid, iSrc
13d10 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
13d20 20 20 20 61 73 73 65 72 74 28 20 28 70 44 65 73     assert( (pDes
13d30 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  t->tabFlags & TF
13d40 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3d  _Autoincrement)=
13d50 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
13d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
13d80 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b   iSrc, regData);
13d90 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  .    if( db->fla
13da0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75  gs & SQLITE_Vacu
13db0 75 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  um ){.      sqli
13dc0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13dd0 20 4f 50 5f 4c 61 73 74 2c 20 69 44 65 73 74 2c   OP_Last, iDest,
13de0 20 30 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69   0, -1);.      i
13df0 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47  nsFlags = OPFLAG
13e00 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47 5f  _NCHANGE|OPFLAG_
13e10 4c 41 53 54 52 4f 57 49 44 7c 0a 20 20 20 20 20  LASTROWID|.     
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 4f 50 46 4c 41 47 5f 41 50 50        OPFLAG_APP
13e40 45 4e 44 7c 4f 50 46 4c 41 47 5f 55 53 45 53 45  END|OPFLAG_USESE
13e50 45 4b 52 45 53 55 4c 54 3b 0a 20 20 20 20 7d 65  EKRESULT;.    }e
13e60 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 73 46 6c  lse{.      insFl
13e70 61 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43 48  ags = OPFLAG_NCH
13e80 41 4e 47 45 7c 4f 50 46 4c 41 47 5f 4c 41 53 54  ANGE|OPFLAG_LAST
13e90 52 4f 57 49 44 7c 4f 50 46 4c 41 47 5f 41 50 50  ROWID|OPFLAG_APP
13ea0 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  END;.    }.    s
13eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13ec0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
13ed0 44 65 73 74 2c 20 72 65 67 44 61 74 61 2c 20 72  Dest, regData, r
13ee0 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20  egRowid,.       
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13f00 63 68 61 72 2a 29 70 44 65 73 74 2c 20 50 34 5f  char*)pDest, P4_
13f10 54 41 42 4c 45 29 3b 0a 20 20 20 20 73 71 6c 69  TABLE);.    sqli
13f20 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
13f30 76 2c 20 69 6e 73 46 6c 61 67 73 29 3b 0a 20 20  v, insFlags);.  
13f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13f50 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
13f60 69 53 72 63 2c 20 61 64 64 72 31 29 3b 20 56 64  iSrc, addr1); Vd
13f70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
13f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13f90 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
13fa0 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20 20 20  , iSrc, 0);.    
13fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13fc0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
13fd0 44 65 73 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Dest, 0);.  }els
13fe0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  e{.    sqlite3Ta
13ff0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
14000 69 44 62 44 65 73 74 2c 20 70 44 65 73 74 2d 3e  iDbDest, pDest->
14010 74 6e 75 6d 2c 20 31 2c 20 70 44 65 73 74 2d 3e  tnum, 1, pDest->
14020 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
14030 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
14040 72 73 65 2c 20 69 44 62 53 72 63 2c 20 70 53 72  rse, iDbSrc, pSr
14050 63 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 53 72 63  c->tnum, 0, pSrc
14060 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
14070 66 6f 72 28 70 44 65 73 74 49 64 78 3d 70 44 65  for(pDestIdx=pDe
14080 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65 73  st->pIndex; pDes
14090 74 49 64 78 3b 20 70 44 65 73 74 49 64 78 3d 70  tIdx; pDestIdx=p
140a0 44 65 73 74 49 64 78 2d 3e 70 4e 65 78 74 29 7b  DestIdx->pNext){
140b0 0a 20 20 20 20 75 38 20 69 64 78 49 6e 73 46 6c  .    u8 idxInsFl
140c0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ags = 0;.    for
140d0 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e 70  (pSrcIdx=pSrc->p
140e0 49 6e 64 65 78 3b 20 41 4c 57 41 59 53 28 70 53  Index; ALWAYS(pS
140f0 72 63 49 64 78 29 3b 20 70 53 72 63 49 64 78 3d  rcIdx); pSrcIdx=
14100 70 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b  pSrcIdx->pNext){
14110 0a 20 20 20 20 20 20 69 66 28 20 78 66 65 72 43  .      if( xferC
14120 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70  ompatibleIndex(p
14130 44 65 73 74 49 64 78 2c 20 70 53 72 63 49 64 78  DestIdx, pSrcIdx
14140 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
14150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
14160 63 49 64 78 20 29 3b 0a 20 20 20 20 73 71 6c 69  cIdx );.    sqli
14170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14180 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 53   OP_OpenRead, iS
14190 72 63 2c 20 70 53 72 63 49 64 78 2d 3e 74 6e 75  rc, pSrcIdx->tnu
141a0 6d 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 20 20  m, iDbSrc);.    
141b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
141c0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
141d0 70 53 72 63 49 64 78 29 3b 0a 20 20 20 20 56 64  pSrcIdx);.    Vd
141e0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
141f0 73 22 2c 20 70 53 72 63 49 64 78 2d 3e 7a 4e 61  s", pSrcIdx->zNa
14200 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  me));.    sqlite
14210 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14220 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 44 65  P_OpenWrite, iDe
14230 73 74 2c 20 70 44 65 73 74 49 64 78 2d 3e 74 6e  st, pDestIdx->tn
14240 75 6d 2c 20 69 44 62 44 65 73 74 29 3b 0a 20 20  um, iDbDest);.  
14250 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
14260 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
14270 2c 20 70 44 65 73 74 49 64 78 29 3b 0a 20 20 20  , pDestIdx);.   
14280 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
14290 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
142a0 55 4c 4b 43 53 52 29 3b 0a 20 20 20 20 56 64 62  ULKCSR);.    Vdb
142b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
142c0 22 2c 20 70 44 65 73 74 49 64 78 2d 3e 7a 4e 61  ", pDestIdx->zNa
142d0 6d 65 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  me));.    addr1 
142e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
142f0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14300 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62 65  , iSrc, 0); Vdbe
14310 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14330 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
14340 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29  , iSrc, regData)
14350 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
14360 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63  ags & SQLITE_Vac
14370 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
14380 54 68 69 73 20 49 4e 53 45 52 54 20 63 6f 6d 6d  This INSERT comm
14390 61 6e 64 20 69 73 20 70 61 72 74 20 6f 66 20 61  and is part of a
143a0 20 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69 6f   VACUUM operatio
143b0 6e 2c 20 77 68 69 63 68 20 67 75 61 72 61 6e 74  n, which guarant
143c0 65 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ees.      ** tha
143d0 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  t the destinatio
143e0 6e 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  n table is empty
143f0 2e 20 49 66 20 61 6c 6c 20 69 6e 64 65 78 65 64  . If all indexed
14400 20 63 6f 6c 75 6d 6e 73 20 75 73 65 0a 20 20 20   columns use.   
14410 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
14420 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2c  sequence BINARY,
14430 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73   then it can als
14440 6f 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  o be assumed tha
14450 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  t the.      ** i
14460 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 70 6f 70  ndex will be pop
14470 75 6c 61 74 65 64 20 62 79 20 69 6e 73 65 72 74  ulated by insert
14480 69 6e 67 20 6b 65 79 73 20 69 6e 20 73 74 72 69  ing keys in stri
14490 63 74 6c 79 20 73 6f 72 74 65 64 20 0a 20 20 20  ctly sorted .   
144a0 20 20 20 2a 2a 20 6f 72 64 65 72 2e 20 49 6e 20     ** order. In 
144b0 74 68 69 73 20 63 61 73 65 2c 20 69 6e 73 74 65  this case, inste
144c0 61 64 20 6f 66 20 73 65 65 6b 69 6e 67 20 77 69  ad of seeking wi
144d0 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
144e0 61 73 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a  as part.      **
144f0 20 6f 66 20 65 76 65 72 79 20 4f 50 5f 49 64 78   of every OP_Idx
14500 49 6e 73 65 72 74 20 6f 70 63 6f 64 65 2c 20 61  Insert opcode, a
14510 6e 20 4f 50 5f 4c 61 73 74 20 69 73 20 61 64 64  n OP_Last is add
14520 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ed before the.  
14530 20 20 20 20 2a 2a 20 4f 50 5f 49 64 78 49 6e 73      ** OP_IdxIns
14540 65 72 74 20 74 6f 20 73 65 65 6b 20 74 6f 20 74  ert to seek to t
14550 68 65 20 70 6f 69 6e 74 20 77 69 74 68 69 6e 20  he point within 
14560 74 68 65 20 62 2d 74 72 65 65 20 77 68 65 72 65  the b-tree where
14570 20 65 61 63 68 20 6b 65 79 20 0a 20 20 20 20 20   each key .     
14580 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 69 6e   ** should be in
14590 73 65 72 74 65 64 2e 20 54 68 69 73 20 69 73 20  serted. This is 
145a0 66 61 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a  faster..      **
145b0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  .      ** If any
145c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   of the indexed 
145d0 63 6f 6c 75 6d 6e 73 20 75 73 65 20 61 20 63 6f  columns use a co
145e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
145f0 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20   other than.    
14600 20 20 2a 2a 20 42 49 4e 41 52 59 2c 20 74 68 69    ** BINARY, thi
14610 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
14620 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 69 73  s disabled. This
14630 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
14640 75 73 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6d  user .      ** m
14650 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
14660 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20  definition of a 
14670 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14680 63 65 20 61 6e 64 20 74 68 65 6e 20 72 75 6e 0a  ce and then run.
14690 20 20 20 20 20 20 2a 2a 20 61 20 56 41 43 55 55        ** a VACUU
146a0 4d 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68  M command. In th
146b0 61 74 20 63 61 73 65 20 6b 65 79 73 20 6d 61 79  at case keys may
146c0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
146d0 69 6e 20 73 74 72 69 63 74 6c 79 0a 20 20 20 20  in strictly.    
146e0 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
146f0 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  r.  */.      for
14700 28 69 3d 30 3b 20 69 3c 70 53 72 63 49 64 78 2d  (i=0; i<pSrcIdx-
14710 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
14720 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14730 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 53 72 63  ar *zColl = pSrc
14740 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
14750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14760 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
14770 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
14780 2c 20 7a 43 6f 6c 6c 29 21 3d 30 0a 20 20 20 20  , zColl)!=0.    
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  || sqlite3StrBIN
147b0 41 52 59 3d 3d 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ARY==zColl );.  
147c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
147d0 33 5f 73 74 72 69 63 6d 70 28 73 71 6c 69 74 65  3_stricmp(sqlite
147e0 33 53 74 72 42 49 4e 41 52 59 2c 20 7a 43 6f 6c  3StrBINARY, zCol
147f0 6c 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  l) ) break;.    
14800 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
14810 3d 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c 75 6d  =pSrcIdx->nColum
14820 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78  n ){.        idx
14830 49 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41  InsFlags = OPFLA
14840 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b  G_USESEEKRESULT;
14850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14860 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14870 5f 4c 61 73 74 2c 20 69 44 65 73 74 2c 20 30 2c  _Last, iDest, 0,
14880 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
14890 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
148a0 52 6f 77 69 64 28 70 53 72 63 29 20 26 26 20 70  Rowid(pSrc) && p
148b0 44 65 73 74 49 64 78 2d 3e 69 64 78 54 79 70 65  DestIdx->idxType
148c0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 64 78  ==2 ){.      idx
148d0 49 6e 73 46 6c 61 67 73 20 7c 3d 20 4f 50 46 4c  InsFlags |= OPFL
148e0 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20  AG_NCHANGE;.    
148f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
14910 78 49 6e 73 65 72 74 2c 20 69 44 65 73 74 2c 20  xInsert, iDest, 
14920 72 65 67 44 61 74 61 29 3b 0a 20 20 20 20 73 71  regData);.    sq
14930 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14940 35 28 76 2c 20 69 64 78 49 6e 73 46 6c 61 67 73  5(v, idxInsFlags
14950 7c 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b  |OPFLAG_APPEND);
14960 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
14980 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31 2b 31  t, iSrc, addr1+1
14990 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
149a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
149b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
149c0 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
149d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
149e0 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20  OP_Close, iSrc, 
149f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
14a00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14a10 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29  Close, iDest, 0)
14a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6d 70 74  ;.  }.  if( empt
14a30 79 53 72 63 54 65 73 74 20 29 20 73 71 6c 69 74  ySrcTest ) sqlit
14a40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14a50 2c 20 65 6d 70 74 79 53 72 63 54 65 73 74 29 3b  , emptySrcTest);
14a60 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
14a70 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
14a80 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71   regRowid);.  sq
14a90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14aa0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 44  Reg(pParse, regD
14ab0 61 74 61 29 3b 0a 20 20 69 66 28 20 65 6d 70 74  ata);.  if( empt
14ac0 79 44 65 73 74 54 65 73 74 20 29 7b 0a 20 20 20  yDestTest ){.   
14ad0 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72   sqlite3Autoincr
14ae0 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29  ementEnd(pParse)
14af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14b00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61  eAddOp2(v, OP_Ha
14b10 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  lt, SQLITE_OK, 0
14b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14b30 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d  beJumpHere(v, em
14b40 70 74 79 44 65 73 74 54 65 73 74 29 3b 0a 20 20  ptyDestTest);.  
14b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b60 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14b70 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20   iDest, 0);.    
14b80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
14b90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
14ba0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
14bb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45   SQLITE_OMIT_XFE
14bc0 52 5f 4f 50 54 20 2a 2f 0a                       R_OPT */.