/ Hex Artifact Content
Login

Artifact bcacf6a0d277f8fa0e4f9ffecda544a2330ca4478f904cd89564c2dd86d0b16b:


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 46 6f 75 72 20 63 6f 6e 73  .**.** Four cons
1ac0: 65 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72  ecutive register
1ad0: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 3a  s are allocated:
1ae0: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
1af0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 54  e name of the pT
1b00: 61 62 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28  ab table..**   (
1b10: 32 29 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  2)  The maximum 
1b20: 52 4f 57 49 44 20 6f 66 20 70 54 61 62 2e 0a 2a  ROWID of pTab..*
1b30: 2a 20 20 20 28 33 29 20 20 54 68 65 20 72 6f 77  *   (3)  The row
1b40: 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65 71  id in sqlite_seq
1b50: 75 65 6e 63 65 20 6f 66 20 70 54 61 62 0a 2a 2a  uence of pTab.**
1b60: 20 20 20 28 34 29 20 20 54 68 65 20 6f 72 69 67     (4)  The orig
1b70: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68  inal value of th
1b80: 65 20 6d 61 78 20 52 4f 57 49 44 20 69 6e 20 70  e max ROWID in p
1b90: 54 61 62 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  Tab, or NULL if 
1ba0: 6e 6f 6e 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 32  none.**.** The 2
1bb0: 6e 64 20 72 65 67 69 73 74 65 72 20 69 73 20 74  nd register is t
1bc0: 68 65 20 6f 6e 65 20 74 68 61 74 20 69 73 20 72  he one that is r
1bd0: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 69  eturned.  That i
1be0: 73 20 61 6c 6c 20 74 68 65 0a 2a 2a 20 69 6e 73  s all the.** ins
1bf0: 65 72 74 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  ert routine need
1c00: 73 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 2e  s to know about.
1c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1c20: 75 74 6f 49 6e 63 42 65 67 69 6e 28 0a 20 20 50  utoIncBegin(.  P
1c30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1c50: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
1c60: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db,            /
1c70: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
1c80: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1c90: 70 54 61 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20  pTab */.  Table 
1ca0: 2a 70 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a  *pTab         /*
1cb0: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
1cc0: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 2a 2f 0a  e writing to */.
1cd0: 29 7b 0a 20 20 69 6e 74 20 6d 65 6d 49 64 20 3d  ){.  int memId =
1ce0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69   0;      /* Regi
1cf0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6d 61 78  ster holding max
1d00: 69 6d 75 6d 20 72 6f 77 69 64 20 2a 2f 0a 20 20  imum rowid */.  
1d10: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1d20: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1d30: 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  hema!=0 );.  if(
1d40: 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1d50: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
1d60: 65 6e 74 29 21 3d 30 0a 20 20 20 26 26 20 28 70  ent)!=0.   && (p
1d70: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 44 62 46 6c  Parse->db->mDbFl
1d80: 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63  ags & DBFLAG_Vac
1d90: 75 75 6d 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  uum)==0.  ){.   
1da0: 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1db0: 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1dc0: 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1dd0: 3b 0a 20 20 20 20 41 75 74 6f 69 6e 63 49 6e 66  ;.    AutoincInf
1de0: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 20 20 54 61  o *pInfo;.    Ta
1df0: 62 6c 65 20 2a 70 53 65 71 54 61 62 20 3d 20 70  ble *pSeqTab = p
1e00: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
1e10: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db].pSchema->pSe
1e20: 71 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  qTab;..    /* Ve
1e30: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 71  rify that the sq
1e40: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
1e50: 62 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ble exists and i
1e60: 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 0a 20 20  s an ordinary.  
1e70: 20 20 2a 2a 20 72 6f 77 69 64 20 74 61 62 6c 65    ** rowid table
1e80: 20 77 69 74 68 20 65 78 61 63 74 6c 79 20 74 77   with exactly tw
1e90: 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  o columns..    *
1ea0: 2a 20 54 69 63 6b 65 74 20 64 38 64 63 32 62 33  * Ticket d8dc2b3
1eb0: 61 35 38 63 64 35 64 63 32 39 31 38 61 31 64 34  a58cd5dc2918a1d4
1ec0: 61 63 62 20 32 30 31 38 2d 30 35 2d 32 33 20 2a  acb 2018-05-23 *
1ed0: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 71 54 61  /.    if( pSeqTa
1ee0: 62 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 21 48 61  b==0.     || !Ha
1ef0: 73 52 6f 77 69 64 28 70 53 65 71 54 61 62 29 0a  sRowid(pSeqTab).
1f00: 20 20 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61       || IsVirtua
1f10: 6c 28 70 53 65 71 54 61 62 29 0a 20 20 20 20 20  l(pSeqTab).     
1f20: 7c 7c 20 70 53 65 71 54 61 62 2d 3e 6e 43 6f 6c  || pSeqTab->nCol
1f30: 21 3d 32 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=2.    ){.     
1f40: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1f50: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1f60: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1f70: 50 54 5f 53 45 51 55 45 4e 43 45 3b 0a 20 20 20  PT_SEQUENCE;.   
1f80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1f90: 20 7d 0a 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20   }..    pInfo = 
1fa0: 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63  pToplevel->pAinc
1fb0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e  ;.    while( pIn
1fc0: 66 6f 20 26 26 20 70 49 6e 66 6f 2d 3e 70 54 61  fo && pInfo->pTa
1fd0: 62 21 3d 70 54 61 62 20 29 7b 20 70 49 6e 66 6f  b!=pTab ){ pInfo
1fe0: 20 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65 78 74 3b   = pInfo->pNext;
1ff0: 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f   }.    if( pInfo
2000: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  ==0 ){.      pIn
2010: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
2020: 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
2030: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49  ->db, sizeof(*pI
2040: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
2050: 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75   pInfo==0 ) retu
2060: 72 6e 20 30 3b 0a 20 20 20 20 20 20 70 49 6e 66  rn 0;.      pInf
2070: 6f 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70 6c  o->pNext = pTopl
2080: 65 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20 20  evel->pAinc;.   
2090: 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41     pToplevel->pA
20a0: 69 6e 63 20 3d 20 70 49 6e 66 6f 3b 0a 20 20 20  inc = pInfo;.   
20b0: 20 20 20 70 49 6e 66 6f 2d 3e 70 54 61 62 20 3d     pInfo->pTab =
20c0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 70 49 6e   pTab;.      pIn
20d0: 66 6f 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  fo->iDb = iDb;. 
20e0: 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
20f0: 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20  nMem++;         
2100: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
2110: 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6e 61 6d  ster to hold nam
2120: 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20  e of table */.  
2130: 20 20 20 20 70 49 6e 66 6f 2d 3e 72 65 67 43 74      pInfo->regCt
2140: 72 20 3d 20 2b 2b 70 54 6f 70 6c 65 76 65 6c 2d  r = ++pToplevel-
2150: 3e 6e 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78 20 72  >nMem;  /* Max r
2160: 6f 77 69 64 20 72 65 67 69 73 74 65 72 20 2a 2f  owid register */
2170: 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
2180: 2d 3e 6e 4d 65 6d 20 2b 3d 32 3b 20 20 20 20 20  ->nMem +=2;     
2190: 20 20 2f 2a 20 52 6f 77 69 64 20 69 6e 20 73 71    /* Rowid in sq
21a0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 2b 20  lite_sequence + 
21b0: 6f 72 69 67 20 6d 61 78 20 76 61 6c 20 2a 2f 0a  orig max val */.
21c0: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 49 64 20      }.    memId 
21d0: 3d 20 70 49 6e 66 6f 2d 3e 72 65 67 43 74 72 3b  = pInfo->regCtr;
21e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 65  .  }.  return me
21f0: 6d 49 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  mId;.}../*.** Th
2200: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2210: 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 77  ates code that w
2220: 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  ill initialize a
2230: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 67  ll of the.** reg
2240: 69 73 74 65 72 20 75 73 65 64 20 62 79 20 74 68  ister used by th
2250: 65 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  e autoincrement 
2260: 74 72 61 63 6b 65 72 2e 20 20 0a 2a 2f 0a 76 6f  tracker.  .*/.vo
2270: 69 64 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e  id sqlite3Autoin
2280: 63 72 65 6d 65 6e 74 42 65 67 69 6e 28 50 61 72  crementBegin(Par
2290: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 41  se *pParse){.  A
22a0: 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 3b 20 20  utoincInfo *p;  
22b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
22c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
22d0: 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  n AUTOINCREMENT 
22e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
22f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
2300: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2310: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2320: 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
2330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2340: 74 61 62 61 73 65 20 6f 6e 6c 79 20 61 75 74 6f  tabase only auto
2350: 69 6e 63 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  inc table */.  i
2360: 6e 74 20 6d 65 6d 49 64 3b 20 20 20 20 20 20 20  nt memId;       
2370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
2380: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6d 61  ister holding ma
2390: 78 20 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62  x rowid */.  Vdb
23a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
23b0: 56 64 62 65 3b 20 20 20 2f 2a 20 56 44 42 45 20  Vdbe;   /* VDBE 
23c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
23d0: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  on */..  /* This
23e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
23f0: 72 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  r called during 
2400: 74 72 69 67 67 65 72 2d 67 65 6e 65 72 61 74 69  trigger-generati
2410: 6f 6e 2e 20 20 49 74 20 69 73 0a 20 20 2a 2a 20  on.  It is.  ** 
2420: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
2430: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 2a   the top-level *
2440: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2450: 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3d  se->pTriggerTab=
2460: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2470: 73 71 6c 69 74 65 33 49 73 54 6f 70 6c 65 76 65  sqlite3IsTopleve
2480: 6c 28 70 50 61 72 73 65 29 20 29 3b 0a 0a 20 20  l(pParse) );..  
2490: 61 73 73 65 72 74 28 20 76 20 29 3b 20 20 20 2f  assert( v );   /
24a0: 2a 20 57 65 20 66 61 69 6c 65 64 20 6c 6f 6e 67  * We failed long
24b0: 20 61 67 6f 20 69 66 20 74 68 69 73 20 69 73 20   ago if this is 
24c0: 6e 6f 74 20 73 6f 20 2a 2f 0a 20 20 66 6f 72 28  not so */.  for(
24d0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  p = pParse->pAin
24e0: 63 3b 20 70 3b 20 70 20 3d 20 70 2d 3e 70 4e 65  c; p; p = p->pNe
24f0: 78 74 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  xt){.    static 
2500: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
2510: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
2520: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
2530: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
2540: 73 74 20 61 75 74 6f 49 6e 63 5b 5d 20 3d 20 7b  st autoInc[] = {
2550: 0a 20 20 20 20 20 20 2f 2a 20 30 20 20 2a 2f 20  .      /* 0  */ 
2560: 7b 4f 50 5f 4e 75 6c 6c 2c 20 20 20 20 30 2c 20  {OP_Null,    0, 
2570: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a   0, 0},.      /*
2580: 20 31 20 20 2a 2f 20 7b 4f 50 5f 52 65 77 69 6e   1  */ {OP_Rewin
2590: 64 2c 20 20 30 2c 20 31 30 2c 20 30 7d 2c 0a 20  d,  0, 10, 0},. 
25a0: 20 20 20 20 20 2f 2a 20 32 20 20 2a 2f 20 7b 4f       /* 2  */ {O
25b0: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 30 2c 20 20 30  P_Column,  0,  0
25c0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 33  , 0},.      /* 3
25d0: 20 20 2a 2f 20 7b 4f 50 5f 4e 65 2c 20 20 20 20    */ {OP_Ne,    
25e0: 20 20 30 2c 20 20 39 2c 20 30 7d 2c 0a 20 20 20    0,  9, 0},.   
25f0: 20 20 20 2f 2a 20 34 20 20 2a 2f 20 7b 4f 50 5f     /* 4  */ {OP_
2600: 52 6f 77 69 64 2c 20 20 20 30 2c 20 20 30 2c 20  Rowid,   0,  0, 
2610: 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 35 20 20  0},.      /* 5  
2620: 2a 2f 20 7b 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20  */ {OP_Column,  
2630: 30 2c 20 20 31 2c 20 30 7d 2c 0a 20 20 20 20 20  0,  1, 0},.     
2640: 20 2f 2a 20 36 20 20 2a 2f 20 7b 4f 50 5f 41 64   /* 6  */ {OP_Ad
2650: 64 49 6d 6d 2c 20 20 30 2c 20 20 30 2c 20 30 7d  dImm,  0,  0, 0}
2660: 2c 0a 20 20 20 20 20 20 2f 2a 20 37 20 20 2a 2f  ,.      /* 7  */
2670: 20 7b 4f 50 5f 43 6f 70 79 2c 20 20 20 20 30 2c   {OP_Copy,    0,
2680: 20 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f    0, 0},.      /
2690: 2a 20 38 20 20 2a 2f 20 7b 4f 50 5f 47 6f 74 6f  * 8  */ {OP_Goto
26a0: 2c 20 20 20 20 30 2c 20 31 31 2c 20 30 7d 2c 0a  ,    0, 11, 0},.
26b0: 20 20 20 20 20 20 2f 2a 20 39 20 20 2a 2f 20 7b        /* 9  */ {
26c0: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 30 2c 20 20  OP_Next,    0,  
26d0: 32 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20  2, 0},.      /* 
26e0: 31 30 20 2a 2f 20 7b 4f 50 5f 49 6e 74 65 67 65  10 */ {OP_Intege
26f0: 72 2c 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20 20  r, 0,  0, 0},.  
2700: 20 20 20 20 2f 2a 20 31 31 20 2a 2f 20 7b 4f 50      /* 11 */ {OP
2710: 5f 43 6c 6f 73 65 2c 20 20 20 30 2c 20 20 30 2c  _Close,   0,  0,
2720: 20 30 7d 20 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0} .    };.    
2730: 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20  VdbeOp *aOp;.   
2740: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
2750: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 6d 65 6d  p->iDb];.    mem
2760: 49 64 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b 0a  Id = p->regCtr;.
2770: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2780: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2790: 6c 64 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70  ld(db, 0, pDb->p
27a0: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73  Schema) );.    s
27b0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
27c0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44  pParse, 0, p->iD
27d0: 62 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  b, pDb->pSchema-
27e0: 3e 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65  >pSeqTab, OP_Ope
27f0: 6e 52 65 61 64 29 3b 0a 20 20 20 20 73 71 6c 69  nRead);.    sqli
2800: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
2810: 67 28 76 2c 20 6d 65 6d 49 64 2d 31 2c 20 70 2d  g(v, memId-1, p-
2820: 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
2830: 20 20 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33     aOp = sqlite3
2840: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c  VdbeAddOpList(v,
2850: 20 41 72 72 61 79 53 69 7a 65 28 61 75 74 6f 49   ArraySize(autoI
2860: 6e 63 29 2c 20 61 75 74 6f 49 6e 63 2c 20 69 4c  nc), autoInc, iL
2870: 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 4f 70 3d  n);.    if( aOp=
2880: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2890: 61 4f 70 5b 30 5d 2e 70 32 20 3d 20 6d 65 6d 49  aOp[0].p2 = memI
28a0: 64 3b 0a 20 20 20 20 61 4f 70 5b 30 5d 2e 70 33  d;.    aOp[0].p3
28b0: 20 3d 20 6d 65 6d 49 64 2b 32 3b 0a 20 20 20 20   = memId+2;.    
28c0: 61 4f 70 5b 32 5d 2e 70 33 20 3d 20 6d 65 6d 49  aOp[2].p3 = memI
28d0: 64 3b 0a 20 20 20 20 61 4f 70 5b 33 5d 2e 70 31  d;.    aOp[3].p1
28e0: 20 3d 20 6d 65 6d 49 64 2d 31 3b 0a 20 20 20 20   = memId-1;.    
28f0: 61 4f 70 5b 33 5d 2e 70 33 20 3d 20 6d 65 6d 49  aOp[3].p3 = memI
2900: 64 3b 0a 20 20 20 20 61 4f 70 5b 33 5d 2e 70 35  d;.    aOp[3].p5
2910: 20 3d 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46   = SQLITE_JUMPIF
2920: 4e 55 4c 4c 3b 0a 20 20 20 20 61 4f 70 5b 34 5d  NULL;.    aOp[4]
2930: 2e 70 32 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a 20  .p2 = memId+1;. 
2940: 20 20 20 61 4f 70 5b 35 5d 2e 70 33 20 3d 20 6d     aOp[5].p3 = m
2950: 65 6d 49 64 3b 0a 20 20 20 20 61 4f 70 5b 36 5d  emId;.    aOp[6]
2960: 2e 70 31 20 3d 20 6d 65 6d 49 64 3b 0a 20 20 20  .p1 = memId;.   
2970: 20 61 4f 70 5b 37 5d 2e 70 32 20 3d 20 6d 65 6d   aOp[7].p2 = mem
2980: 49 64 2b 32 3b 0a 20 20 20 20 61 4f 70 5b 37 5d  Id+2;.    aOp[7]
2990: 2e 70 31 20 3d 20 6d 65 6d 49 64 3b 0a 20 20 20  .p1 = memId;.   
29a0: 20 61 4f 70 5b 31 30 5d 2e 70 32 20 3d 20 6d 65   aOp[10].p2 = me
29b0: 6d 49 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  mId;.  }.}../*.*
29c0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 6d 61 78  * Update the max
29d0: 69 6d 75 6d 20 72 6f 77 69 64 20 66 6f 72 20 61  imum rowid for a
29e0: 6e 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  n autoincrement 
29f0: 63 61 6c 63 75 6c 61 74 69 6f 6e 2e 0a 2a 2a 0a  calculation..**.
2a00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2a10: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
2a20: 20 77 68 65 6e 20 74 68 65 20 72 65 67 52 6f 77   when the regRow
2a30: 69 64 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  id register hold
2a40: 73 20 61 0a 2a 2a 20 6e 65 77 20 72 6f 77 69 64  s a.** new rowid
2a50: 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74   that is about t
2a60: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  o be inserted.  
2a70: 49 66 20 74 68 61 74 20 6e 65 77 20 72 6f 77 69  If that new rowi
2a80: 64 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74  d is.** larger t
2a90: 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  han the maximum 
2aa0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 6d 65 6d  rowid in the mem
2ab0: 49 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2c 20  Id memory cell, 
2ac0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f  then the.** memo
2ad0: 72 79 20 63 65 6c 6c 20 69 73 20 75 70 64 61 74  ry cell is updat
2ae0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2af0: 69 64 20 61 75 74 6f 49 6e 63 53 74 65 70 28 50  id autoIncStep(P
2b00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
2b10: 74 20 6d 65 6d 49 64 2c 20 69 6e 74 20 72 65 67  t memId, int reg
2b20: 52 6f 77 69 64 29 7b 0a 20 20 69 66 28 20 6d 65  Rowid){.  if( me
2b30: 6d 49 64 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  mId>0 ){.    sql
2b40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
2b50: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
2b60: 5f 4d 65 6d 4d 61 78 2c 20 6d 65 6d 49 64 2c 20  _MemMax, memId, 
2b70: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d  regRowid);.  }.}
2b80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2b90: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
2ba0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
2bb0: 6f 20 77 72 69 74 65 20 61 75 74 6f 69 6e 63 72  o write autoincr
2bc0: 65 6d 65 6e 74 0a 2a 2a 20 6d 61 78 69 6d 75 6d  ement.** maximum
2bd0: 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 62 61   rowid values ba
2be0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69  ck into the sqli
2bf0: 74 65 5f 73 65 71 75 65 6e 63 65 20 72 65 67 69  te_sequence regi
2c00: 73 74 65 72 2e 0a 2a 2a 20 45 76 65 72 79 20 73  ster..** Every s
2c10: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 69  tatement that mi
2c20: 67 68 74 20 64 6f 20 61 6e 20 49 4e 53 45 52 54  ght do an INSERT
2c30: 20 69 6e 74 6f 20 61 6e 20 61 75 74 6f 69 6e 63   into an autoinc
2c40: 72 65 6d 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 20  rement.** table 
2c50: 28 65 69 74 68 65 72 20 64 69 72 65 63 74 6c 79  (either directly
2c60: 20 6f 72 20 74 68 72 6f 75 67 68 20 74 72 69 67   or through trig
2c70: 67 65 72 73 29 20 6e 65 65 64 73 20 74 6f 20 63  gers) needs to c
2c80: 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
2c90: 69 6e 65 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ine just before 
2ca0: 74 68 65 20 22 65 78 69 74 22 20 63 6f 64 65 2e  the "exit" code.
2cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2cc0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
2cd0: 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74 45 6e 64  autoIncrementEnd
2ce0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
2cf0: 0a 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a  .  AutoincInfo *
2d00: 70 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  p;.  Vdbe *v = p
2d10: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
2d20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2d30: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
2d40: 65 72 74 28 20 76 20 29 3b 0a 20 20 66 6f 72 28  ert( v );.  for(
2d50: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  p = pParse->pAin
2d60: 63 3b 20 70 3b 20 70 20 3d 20 70 2d 3e 70 4e 65  c; p; p = p->pNe
2d70: 78 74 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  xt){.    static 
2d80: 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e 20 3d 20  const int iLn = 
2d90: 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c 49 4e 45  VDBE_OFFSET_LINE
2da0: 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74 61 74 69  NO(2);.    stati
2db0: 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69  c const VdbeOpLi
2dc0: 73 74 20 61 75 74 6f 49 6e 63 45 6e 64 5b 5d 20  st autoIncEnd[] 
2dd0: 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 2a  = {.      /* 0 *
2de0: 2f 20 7b 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 20  / {OP_NotNull,  
2df0: 20 20 20 30 2c 20 32 2c 20 30 7d 2c 0a 20 20 20     0, 2, 0},.   
2e00: 20 20 20 2f 2a 20 31 20 2a 2f 20 7b 4f 50 5f 4e     /* 1 */ {OP_N
2e10: 65 77 52 6f 77 69 64 2c 20 20 20 20 30 2c 20 30  ewRowid,    0, 0
2e20: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 32  , 0},.      /* 2
2e30: 20 2a 2f 20 7b 4f 50 5f 4d 61 6b 65 52 65 63 6f   */ {OP_MakeReco
2e40: 72 64 2c 20 20 30 2c 20 32 2c 20 30 7d 2c 0a 20  rd,  0, 2, 0},. 
2e50: 20 20 20 20 20 2f 2a 20 33 20 2a 2f 20 7b 4f 50       /* 3 */ {OP
2e60: 5f 49 6e 73 65 72 74 2c 20 20 20 20 20 20 30 2c  _Insert,      0,
2e70: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a   0, 0},.      /*
2e80: 20 34 20 2a 2f 20 7b 4f 50 5f 43 6c 6f 73 65 2c   4 */ {OP_Close,
2e90: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 7d 0a         0, 0, 0}.
2ea0: 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f      };.    VdbeO
2eb0: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 44 62 20 2a  p *aOp;.    Db *
2ec0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
2ed0: 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 69 6e 74 20  ->iDb];.    int 
2ee0: 69 52 65 63 3b 0a 20 20 20 20 69 6e 74 20 6d 65  iRec;.    int me
2ef0: 6d 49 64 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b  mId = p->regCtr;
2f00: 0a 0a 20 20 20 20 69 52 65 63 20 3d 20 73 71 6c  ..    iRec = sql
2f10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2f20: 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65  Parse);.    asse
2f30: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2f40: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
2f50: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 20  , pDb->pSchema) 
2f60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2f70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
2f80: 65 2c 20 6d 65 6d 49 64 2b 32 2c 20 73 71 6c 69  e, memId+2, sqli
2f90: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2fa0: 64 72 28 76 29 2b 37 2c 20 6d 65 6d 49 64 29 3b  dr(v)+7, memId);
2fb0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
2fc0: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
2fd0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2fe0: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44  e, 0, p->iDb, pD
2ff0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
3000: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  Tab, OP_OpenWrit
3010: 65 29 3b 0a 20 20 20 20 61 4f 70 20 3d 20 73 71  e);.    aOp = sq
3020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
3030: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
3040: 61 75 74 6f 49 6e 63 45 6e 64 29 2c 20 61 75 74  autoIncEnd), aut
3050: 6f 49 6e 63 45 6e 64 2c 20 69 4c 6e 29 3b 0a 20  oIncEnd, iLn);. 
3060: 20 20 20 69 66 28 20 61 4f 70 3d 3d 30 20 29 20     if( aOp==0 ) 
3070: 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f 70 5b 30  break;.    aOp[0
3080: 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a  ].p1 = memId+1;.
3090: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20      aOp[1].p2 = 
30a0: 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70  memId+1;.    aOp
30b0: 5b 32 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2d 31  [2].p1 = memId-1
30c0: 3b 0a 20 20 20 20 61 4f 70 5b 32 5d 2e 70 33 20  ;.    aOp[2].p3 
30d0: 3d 20 69 52 65 63 3b 0a 20 20 20 20 61 4f 70 5b  = iRec;.    aOp[
30e0: 33 5d 2e 70 32 20 3d 20 69 52 65 63 3b 0a 20 20  3].p2 = iRec;.  
30f0: 20 20 61 4f 70 5b 33 5d 2e 70 33 20 3d 20 6d 65    aOp[3].p3 = me
3100: 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70 5b 33  mId+1;.    aOp[3
3110: 5d 2e 70 35 20 3d 20 4f 50 46 4c 41 47 5f 41 50  ].p5 = OPFLAG_AP
3120: 50 45 4e 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  PEND;.    sqlite
3130: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
3140: 70 50 61 72 73 65 2c 20 69 52 65 63 29 3b 0a 20  pParse, iRec);. 
3150: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
3160: 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e  3AutoincrementEn
3170: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  d(Parse *pParse)
3180: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
3190: 70 41 69 6e 63 20 29 20 61 75 74 6f 49 6e 63 72  pAinc ) autoIncr
31a0: 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29  ementEnd(pParse)
31b0: 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20  ;.}.#else./*.** 
31c0: 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  If SQLITE_OMIT_A
31d0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
31e0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
31f0: 65 20 74 68 72 65 65 20 72 6f 75 74 69 6e 65 73  e three routines
3200: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 61 6c  .** above are al
3210: 6c 20 6e 6f 2d 6f 70 73 0a 2a 2f 0a 23 20 64 65  l no-ops.*/.# de
3220: 66 69 6e 65 20 61 75 74 6f 49 6e 63 42 65 67 69  fine autoIncBegi
3230: 6e 28 41 2c 42 2c 43 29 20 28 30 29 0a 23 20 64  n(A,B,C) (0).# d
3240: 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 53 74 65  efine autoIncSte
3250: 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 20  p(A,B,C).#endif 
3260: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
3270: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a  UTOINCREMENT */.
3280: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
3290: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
32a0: 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d  ic int xferOptim
32b0: 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  ization(.  Parse
32c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
32d0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
32e0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
32f0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Dest,         /*
3300: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
3310: 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  e inserting into
3320: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
3330: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41  elect,      /* A
3340: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3350: 74 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  t to use as the 
3360: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
3370: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
3380: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
3390: 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69   handle constrai
33a0: 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  nt errors */.  i
33b0: 6e 74 20 69 44 62 44 65 73 74 20 20 20 20 20 20  nt iDbDest      
33c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
33d0: 62 61 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f  base of pDest */
33e0: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .);../*.** This 
33f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3400: 64 20 74 6f 20 68 61 6e 64 6c 65 20 53 51 4c 20  d to handle SQL 
3410: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3420: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
3430: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42   insert into TAB
3440: 4c 45 20 28 49 44 4c 49 53 54 29 20 76 61 6c 75  LE (IDLIST) valu
3450: 65 73 28 45 58 50 52 4c 49 53 54 29 2c 28 45 58  es(EXPRLIST),(EX
3460: 50 52 4c 49 53 54 29 2c 2e 2e 2e 0a 2a 2a 20 20  PRLIST),....**  
3470: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41    insert into TA
3480: 42 4c 45 20 28 49 44 4c 49 53 54 29 20 73 65 6c  BLE (IDLIST) sel
3490: 65 63 74 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74  ect.**    insert
34a0: 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c   into TABLE (IDL
34b0: 49 53 54 29 20 64 65 66 61 75 6c 74 20 76 61 6c  IST) default val
34c0: 75 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44  ues.**.** The ID
34d0: 4c 49 53 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  LIST following t
34e0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
34f0: 20 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c   always optional
3500: 2e 20 20 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a  .  If omitted,.*
3510: 2a 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66  * then a list of
3520: 20 61 6c 6c 20 28 6e 6f 6e 2d 68 69 64 64 65 6e   all (non-hidden
3530: 29 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  ) columns for th
3540: 65 20 74 61 62 6c 65 20 69 73 20 73 75 62 73 74  e table is subst
3550: 69 74 75 74 65 64 2e 0a 2a 2a 20 54 68 65 20 49  ituted..** The I
3560: 44 4c 49 53 54 20 61 70 70 65 61 72 73 20 69 6e  DLIST appears in
3570: 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61 72   the pColumn par
3580: 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d 6e  ameter.  pColumn
3590: 20 69 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c 49   is NULL if IDLI
35a0: 53 54 0a 2a 2a 20 69 73 20 6f 6d 69 74 74 65 64  ST.** is omitted
35b0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
35c0: 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74 65  pSelect paramete
35d0: 72 20 68 6f 6c 64 73 20 74 68 65 20 76 61 6c 75  r holds the valu
35e0: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  es to be inserte
35f0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 66 69 72  d for the.** fir
3600: 73 74 20 74 77 6f 20 66 6f 72 6d 73 20 73 68 6f  st two forms sho
3610: 77 6e 20 61 62 6f 76 65 2e 20 20 41 20 56 41 4c  wn above.  A VAL
3620: 55 45 53 20 63 6c 61 75 73 65 20 69 73 20 72 65  UES clause is re
3630: 61 6c 6c 79 20 6a 75 73 74 20 73 68 6f 72 74 2d  ally just short-
3640: 68 61 6e 64 0a 2a 2a 20 66 6f 72 20 61 20 53 45  hand.** for a SE
3650: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
3660: 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 46 52  hat omits the FR
3670: 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 65 76  OM clause and ev
3680: 65 72 79 74 68 69 6e 67 20 65 6c 73 65 0a 2a 2a  erything else.**
3690: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 20 20   that follows.  
36a0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 70  If the pSelect p
36b0: 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c  arameter is NULL
36c0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
36d0: 74 20 74 68 65 0a 2a 2a 20 44 45 46 41 55 4c 54  t the.** DEFAULT
36e0: 20 56 41 4c 55 45 53 20 66 6f 72 6d 20 6f 66 20   VALUES form of 
36f0: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
3700: 6d 65 6e 74 20 69 73 20 69 6e 74 65 6e 64 65 64  ment is intended
3710: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
3720: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 6c 6c 6f   generated follo
3730: 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75 72 20 74  ws one of four t
3740: 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f 72 20 61  emplates.  For a
3750: 20 73 69 6d 70 6c 65 0a 2a 2a 20 69 6e 73 65 72   simple.** inser
3760: 74 20 77 69 74 68 20 64 61 74 61 20 63 6f 6d 69  t with data comi
3770: 6e 67 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ng from a single
3780: 2d 72 6f 77 20 56 41 4c 55 45 53 20 63 6c 61 75  -row VALUES clau
3790: 73 65 2c 20 74 68 65 20 63 6f 64 65 20 65 78 65  se, the code exe
37a0: 63 75 74 65 73 0a 2a 2a 20 6f 6e 63 65 20 73 74  cutes.** once st
37b0: 72 61 69 67 68 74 20 64 6f 77 6e 20 74 68 72 6f  raight down thro
37c0: 75 67 68 2e 20 20 50 73 65 75 64 6f 2d 63 6f 64  ugh.  Pseudo-cod
37d0: 65 20 66 6f 6c 6c 6f 77 73 20 28 77 65 20 63 61  e follows (we ca
37e0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 74 68 65 20 22  ll this.** the "
37f0: 31 73 74 20 74 65 6d 70 6c 61 74 65 22 29 3a 0a  1st template"):.
3800: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70  **.**         op
3810: 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  en write cursor 
3820: 74 6f 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69  to <table> and i
3830: 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20  ts indices.**   
3840: 20 20 20 20 20 20 70 75 74 20 56 41 4c 55 45 53        put VALUES
3850: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
3860: 6f 6e 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ons into registe
3870: 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 72  rs.**         wr
3880: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ite the resultin
3890: 67 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 3c 74  g record into <t
38a0: 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20  able>.**        
38b0: 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 54   cleanup.**.** T
38c0: 68 65 20 74 68 72 65 65 20 72 65 6d 61 69 6e 69  he three remaini
38d0: 6e 67 20 74 65 6d 70 6c 61 74 65 73 20 61 73 73  ng templates ass
38e0: 75 6d 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ume the statemen
38f0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
3900: 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20  .**.**   INSERT 
3910: 49 4e 54 4f 20 3c 74 61 62 6c 65 3e 20 53 45 4c  INTO <table> SEL
3920: 45 43 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ECT ....**.** If
3930: 20 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61 75   the SELECT clau
3940: 73 65 20 69 73 20 6f 66 20 74 68 65 20 72 65 73  se is of the res
3950: 74 72 69 63 74 65 64 20 66 6f 72 6d 20 22 53 45  tricted form "SE
3960: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
3970: 6c 65 32 3e 22 20 2d 0a 2a 2a 20 69 6e 20 6f 74  le2>" -.** in ot
3980: 68 65 72 20 77 6f 72 64 73 20 69 66 20 74 68 65  her words if the
3990: 20 53 45 4c 45 43 54 20 70 75 6c 6c 73 20 61 6c   SELECT pulls al
39a0: 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61  l columns from a
39b0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 0a 2a 2a   single table.**
39c0: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
39d0: 20 57 48 45 52 45 20 6f 72 20 4c 49 4d 49 54 20   WHERE or LIMIT 
39e0: 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 4f  or GROUP BY or O
39f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2c  RDER BY clauses,
3a00: 20 61 6e 64 0a 2a 2a 20 69 66 20 3c 74 61 62 6c   and.** if <tabl
3a10: 65 32 3e 20 61 6e 64 20 3c 74 61 62 6c 65 31 3e  e2> and <table1>
3a20: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 74 61   are distinct ta
3a30: 62 6c 65 73 20 62 75 74 20 68 61 76 65 20 69 64  bles but have id
3a40: 65 6e 74 69 63 61 6c 0a 2a 2a 20 73 63 68 65 6d  entical.** schem
3a50: 61 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  as, including al
3a60: 6c 20 74 68 65 20 73 61 6d 65 20 69 6e 64 69 63  l the same indic
3a70: 65 73 2c 20 74 68 65 6e 20 61 20 73 70 65 63 69  es, then a speci
3a80: 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  al optimization.
3a90: 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 68  ** is invoked th
3aa0: 61 74 20 63 6f 70 69 65 73 20 72 61 77 20 72 65  at copies raw re
3ab0: 63 6f 72 64 73 20 66 72 6f 6d 20 3c 74 61 62 6c  cords from <tabl
3ac0: 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c 74 61 62  e2> over to <tab
3ad0: 6c 65 31 3e 2e 0a 2a 2a 20 53 65 65 20 74 68 65  le1>..** See the
3ae0: 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f   xferOptimizatio
3af0: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  n() function for
3b00: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
3b10: 69 6f 6e 20 6f 66 20 74 68 69 73 0a 2a 2a 20 74  ion of this.** t
3b20: 65 6d 70 6c 61 74 65 2e 20 20 54 68 69 73 20 69  emplate.  This i
3b30: 73 20 74 68 65 20 32 6e 64 20 74 65 6d 70 6c 61  s the 2nd templa
3b40: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  te..**.**       
3b50: 20 20 6f 70 65 6e 20 61 20 77 72 69 74 65 20 63    open a write c
3b60: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3b70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 65 6e  .**         open
3b80: 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20   read cursor on 
3b90: 3c 74 61 62 6c 65 32 3e 0a 2a 2a 20 20 20 20 20  <table2>.**     
3ba0: 20 20 20 20 74 72 61 6e 73 66 65 72 20 61 6c 6c      transfer all
3bb0: 20 72 65 63 6f 72 64 73 20 69 6e 20 3c 74 61 62   records in <tab
3bc0: 6c 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c 74 61  le2> over to <ta
3bd0: 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble>.**         
3be0: 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a 2a  close cursors.**
3bf0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
3c00: 20 69 6e 64 65 78 20 6f 6e 20 3c 74 61 62 6c 65   index on <table
3c10: 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f  >.**           o
3c20: 70 65 6e 20 61 20 77 72 69 74 65 20 63 75 72 73  pen a write curs
3c30: 6f 72 20 6f 6e 20 74 68 65 20 3c 74 61 62 6c 65  or on the <table
3c40: 3e 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20  > index.**      
3c50: 20 20 20 20 20 6f 70 65 6e 20 61 20 72 65 61 64       open a read
3c60: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 63   cursor on the c
3c70: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c 74 61  orresponding <ta
3c80: 62 6c 65 32 3e 20 69 6e 64 65 78 0a 2a 2a 20 20  ble2> index.**  
3c90: 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65           transfe
3ca0: 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 66 72  r all records fr
3cb0: 6f 6d 20 74 68 65 20 72 65 61 64 20 74 6f 20 74  om the read to t
3cc0: 68 65 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  he write cursors
3cd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6c  .**           cl
3ce0: 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20  ose cursors.**  
3cf0: 20 20 20 20 20 20 20 65 6e 64 20 66 6f 72 65 61         end forea
3d00: 63 68 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 72 64  ch.**.** The 3rd
3d10: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 66 6f 72   template is for
3d20: 20 77 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   when the second
3d30: 20 74 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e   template does n
3d40: 6f 74 20 61 70 70 6c 79 0a 2a 2a 20 61 6e 64 20  ot apply.** and 
3d50: 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61 75 73  the SELECT claus
3d60: 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20  e does not read 
3d70: 66 72 6f 6d 20 3c 74 61 62 6c 65 3e 20 61 74 20  from <table> at 
3d80: 61 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 54 68 65  any time..** The
3d90: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
3da0: 66 6f 6c 6c 6f 77 73 20 74 68 69 73 20 74 65 6d  follows this tem
3db0: 70 6c 61 74 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  plate:.**.**    
3dc0: 20 20 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20       X <- A.**  
3dd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a         goto B.**
3de0: 20 20 20 20 20 20 41 3a 20 73 65 74 75 70 20 66        A: setup f
3df0: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  or the SELECT.**
3e00: 20 20 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76           loop ov
3e10: 65 72 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  er the rows in t
3e20: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
3e30: 20 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75         load valu
3e40: 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  es into register
3e50: 73 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20  s R..R+n.**     
3e60: 20 20 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a        yield X.**
3e70: 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f           end loo
3e80: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65  p.**         cle
3e90: 61 6e 75 70 20 61 66 74 65 72 20 74 68 65 20 53  anup after the S
3ea0: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
3eb0: 20 65 6e 64 2d 63 6f 72 6f 75 74 69 6e 65 20 58   end-coroutine X
3ec0: 0a 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e  .**      B: open
3ed0: 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f   write cursor to
3ee0: 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73   <table> and its
3ef0: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20   indices.**     
3f00: 20 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20   C: yield X, at 
3f10: 45 4f 46 20 67 6f 74 6f 20 44 0a 2a 2a 20 20 20  EOF goto D.**   
3f20: 20 20 20 20 20 20 69 6e 73 65 72 74 20 74 68 65        insert the
3f30: 20 73 65 6c 65 63 74 20 72 65 73 75 6c 74 20 69   select result i
3f40: 6e 74 6f 20 3c 74 61 62 6c 65 3e 20 66 72 6f 6d  nto <table> from
3f50: 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20   R..R+n.**      
3f60: 20 20 20 67 6f 74 6f 20 43 0a 2a 2a 20 20 20 20     goto C.**    
3f70: 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a    D: cleanup.**.
3f80: 2a 2a 20 54 68 65 20 34 74 68 20 74 65 6d 70 6c  ** The 4th templ
3f90: 61 74 65 20 69 73 20 75 73 65 64 20 69 66 20 74  ate is used if t
3fa0: 68 65 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d  he insert statem
3fb0: 65 6e 74 20 74 61 6b 65 73 20 69 74 73 0a 2a 2a  ent takes its.**
3fc0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 61 20 53   values from a S
3fd0: 45 4c 45 43 54 20 62 75 74 20 74 68 65 20 64 61  ELECT but the da
3fe0: 74 61 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ta is being inse
3ff0: 72 74 65 64 20 69 6e 74 6f 20 61 20 74 61 62 6c  rted into a tabl
4000: 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 6c 73  e.** that is als
4010: 6f 20 72 65 61 64 20 61 73 20 70 61 72 74 20 6f  o read as part o
4020: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 20 20 49  f the SELECT.  I
4030: 6e 20 74 68 65 20 74 68 69 72 64 20 66 6f 72 6d  n the third form
4040: 2c 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  ,.** we have to 
4050: 75 73 65 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  use an intermedi
4060: 61 74 65 20 74 61 62 6c 65 20 74 6f 20 73 74 6f  ate table to sto
4070: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
4080: 66 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63 74 2e  f.** the select.
4090: 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 69    The template i
40a0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
40b0: 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c 2d 20  **         X <- 
40c0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74  A.**         got
40d0: 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73  o B.**      A: s
40e0: 65 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c  etup for the SEL
40f0: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c  ECT.**         l
4100: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
4110: 6c 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  les in the SELEC
4120: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c  T.**           l
4130: 6f 61 64 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  oad value into r
4140: 65 67 69 73 74 65 72 20 52 2e 2e 52 2b 6e 0a 2a  egister R..R+n.*
4150: 2a 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  *           yiel
4160: 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  d X.**         e
4170: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
4180: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
4190: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
41a0: 20 20 20 20 20 20 20 65 6e 64 20 63 6f 2d 72 6f         end co-ro
41b0: 75 74 69 6e 65 20 52 0a 2a 2a 20 20 20 20 20 20  utine R.**      
41c0: 42 3a 20 6f 70 65 6e 20 74 65 6d 70 20 74 61 62  B: open temp tab
41d0: 6c 65 0a 2a 2a 20 20 20 20 20 20 4c 3a 20 79 69  le.**      L: yi
41e0: 65 6c 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f  eld X, at EOF go
41f0: 74 6f 20 4d 0a 2a 2a 20 20 20 20 20 20 20 20 20  to M.**         
4200: 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f 6d 20  insert row from 
4210: 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65 6d 70  R..R+n into temp
4220: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
4230: 20 20 67 6f 74 6f 20 4c 0a 2a 2a 20 20 20 20 20    goto L.**     
4240: 20 4d 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63   M: open write c
4250: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
4260: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
4270: 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 77 69  .**         rewi
4280: 6e 64 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a  nd temp table.**
4290: 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20 6f 76        C: loop ov
42a0: 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74 65 72  er rows of inter
42b0: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a 2a 2a  mediate table.**
42c0: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
42d0: 66 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20  fer values form 
42e0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62  intermediate tab
42f0: 6c 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a  le into <table>.
4300: 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c  **         end l
4310: 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 44 3a 20 63  oop.**      D: c
4320: 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f 69 64 20 73  leanup.*/.void s
4330: 71 6c 69 74 65 33 49 6e 73 65 72 74 28 0a 20 20  qlite3Insert(.  
4340: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4350: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4360: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
4370: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
4380: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
4390: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
43a0: 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20  e are inserting 
43b0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
43c0: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20  lect,      /* A 
43d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
43e0: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64   to use as the d
43f0: 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  ata source */.  
4400: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c  IdList *pColumn,
4410: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4420: 6e 61 6d 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  names correspond
4430: 69 6e 67 20 74 6f 20 49 44 4c 49 53 54 2e 20 2a  ing to IDLIST. *
4440: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
4450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
4460: 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74   to handle const
4470: 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a  raint errors */.
4480: 20 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72    Upsert *pUpser
4490: 74 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43 4f  t       /* ON CO
44a0: 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 66  NFLICT clauses f
44b0: 6f 72 20 75 70 73 65 72 74 2c 20 6f 72 20 4e 55  or upsert, or NU
44c0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
44d0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
44e0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 61 74   /* The main dat
44f0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20  abase structure 
4500: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
4510: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
4520: 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 73 65 72  e table to inser
4530: 74 20 69 6e 74 6f 2e 20 20 61 6b 61 20 54 41 42  t into.  aka TAB
4540: 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  LE */.  int i, j
4550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4560: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
4570: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
4580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
4590: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
45a0: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
45b0: 68 69 6e 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  hine */.  Index 
45c0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
45d0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
45e0: 76 65 72 20 69 6e 64 69 63 65 73 20 6f 66 20 74  ver indices of t
45f0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
4600: 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t nColumn;      
4610: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4620: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4630: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  data */.  int nH
4640: 69 64 64 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  idden = 0;      
4650: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69 64  /* Number of hid
4660: 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 69 66 20 54  den columns if T
4670: 41 42 4c 45 20 69 73 20 76 69 72 74 75 61 6c 20  ABLE is virtual 
4680: 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75  */.  int iDataCu
4690: 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56 44  r = 0;     /* VD
46a0: 42 45 20 63 75 72 73 6f 72 20 74 68 61 74 20 69  BE cursor that i
46b0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 20  s the main data 
46c0: 72 65 70 6f 73 69 74 6f 72 79 20 2a 2f 0a 20 20  repository */.  
46d0: 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 30 3b  int iIdxCur = 0;
46e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
46f0: 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ndex cursor */. 
4700: 20 69 6e 74 20 69 70 6b 43 6f 6c 75 6d 6e 20 3d   int ipkColumn =
4710: 20 2d 31 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e   -1;   /* Column
4720: 20 74 68 61 74 20 69 73 20 74 68 65 20 49 4e 54   that is the INT
4730: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4740: 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 4f 66 4c   */.  int endOfL
4750: 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  oop;        /* L
4760: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
4770: 20 6f 66 20 74 68 65 20 69 6e 73 65 72 74 69 6f   of the insertio
4780: 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  n loop */.  int 
4790: 73 72 63 54 61 62 20 3d 20 30 3b 20 20 20 20 20  srcTab = 0;     
47a0: 20 20 2f 2a 20 44 61 74 61 20 63 6f 6d 65 73 20    /* Data comes 
47b0: 66 72 6f 6d 20 74 68 69 73 20 74 65 6d 70 6f 72  from this tempor
47c0: 61 72 79 20 63 75 72 73 6f 72 20 69 66 20 3e 3d  ary cursor if >=
47d0: 30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  0 */.  int addrI
47e0: 6e 73 54 6f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  nsTop = 0;   /* 
47f0: 4a 75 6d 70 20 74 6f 20 6c 61 62 65 6c 20 22 44  Jump to label "D
4800: 22 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  " */.  int addrC
4810: 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ont = 0;     /* 
4820: 54 6f 70 20 6f 66 20 69 6e 73 65 72 74 20 6c 6f  Top of insert lo
4830: 6f 70 2e 20 4c 61 62 65 6c 20 22 43 22 20 69 6e  op. Label "C" in
4840: 20 74 65 6d 70 6c 61 74 65 73 20 33 20 61 6e 64   templates 3 and
4850: 20 34 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   4 */.  SelectDe
4860: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
4870: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
4880: 20 53 45 4c 45 43 54 20 6f 6e 20 72 68 73 20 6f   SELECT on rhs o
4890: 66 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69 6e  f INSERT */.  in
48a0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
48b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
48c0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
48d0: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 75   TABLE */.  u8 u
48e0: 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 30 3b  seTempTable = 0;
48f0: 20 20 2f 2a 20 53 74 6f 72 65 20 53 45 4c 45 43    /* Store SELEC
4900: 54 20 72 65 73 75 6c 74 73 20 69 6e 20 69 6e 74  T results in int
4910: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20  ermediate table 
4920: 2a 2f 0a 20 20 75 38 20 61 70 70 65 6e 64 46 6c  */.  u8 appendFl
4930: 61 67 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72  ag = 0;    /* Tr
4940: 75 65 20 69 66 20 74 68 65 20 69 6e 73 65 72 74  ue if the insert
4950: 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65   is likely to be
4960: 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   an append */.  
4970: 75 38 20 77 69 74 68 6f 75 74 52 6f 77 69 64 3b  u8 withoutRowid;
4980: 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20 6e        /* 0 for n
4990: 6f 72 6d 61 6c 20 74 61 62 6c 65 2e 20 20 31 20  ormal table.  1 
49a0: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
49b0: 44 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  D table */.  u8 
49c0: 62 49 64 4c 69 73 74 49 6e 4f 72 64 65 72 3b 20  bIdListInOrder; 
49d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 49 44     /* True if ID
49e0: 4c 49 53 54 20 69 73 20 69 6e 20 74 61 62 6c 65  LIST is in table
49f0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 45 78 70 72   order */.  Expr
4a00: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b  List *pList = 0;
4a10: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 56 41 4c    /* List of VAL
4a20: 55 45 53 28 29 20 74 6f 20 62 65 20 69 6e 73 65  UES() to be inse
4a30: 72 74 65 64 20 20 2a 2f 0a 0a 20 20 2f 2a 20 52  rted  */..  /* R
4a40: 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 69  egister allocati
4a50: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ons */.  int reg
4a60: 46 72 6f 6d 53 65 6c 65 63 74 20 3d 20 30 3b 2f  FromSelect = 0;/
4a70: 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
4a80: 66 6f 72 20 64 61 74 61 20 63 6f 6d 69 6e 67 20  for data coming 
4a90: 66 72 6f 6d 20 53 45 4c 45 43 54 20 2a 2f 0a 20  from SELECT */. 
4aa0: 20 69 6e 74 20 72 65 67 41 75 74 6f 69 6e 63 20   int regAutoinc 
4ab0: 3d 20 30 3b 20 20 20 2f 2a 20 52 65 67 69 73 74  = 0;   /* Regist
4ac0: 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 41  er holding the A
4ad0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 63 6f 75  UTOINCREMENT cou
4ae0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
4af0: 67 52 6f 77 43 6f 75 6e 74 20 3d 20 30 3b 20 20  gRowCount = 0;  
4b00: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75  /* Memory cell u
4b10: 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20  sed for the row 
4b20: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
4b30: 20 72 65 67 49 6e 73 3b 20 20 20 20 20 20 20 20   regIns;        
4b40: 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6f 66 20 72     /* Block of r
4b50: 65 67 73 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  egs holding rowi
4b60: 64 2b 64 61 74 61 20 62 65 69 6e 67 20 69 6e 73  d+data being ins
4b70: 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  erted */.  int r
4b80: 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  egRowid;        
4b90: 20 2f 2a 20 72 65 67 69 73 74 65 72 73 20 68 6f   /* registers ho
4ba0: 6c 64 69 6e 67 20 69 6e 73 65 72 74 20 72 6f 77  lding insert row
4bb0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  id */.  int regD
4bc0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
4bd0: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
4be0: 67 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 74  g first column t
4bf0: 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e  o insert */.  in
4c00: 74 20 2a 61 52 65 67 49 64 78 20 3d 20 30 3b 20  t *aRegIdx = 0; 
4c10: 20 20 20 20 2f 2a 20 4f 6e 65 20 72 65 67 69 73      /* One regis
4c20: 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
4c30: 20 65 61 63 68 20 69 6e 64 65 78 20 2a 2f 0a 0a   each index */..
4c40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4c50: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69 6e  MIT_TRIGGER.  in
4c60: 74 20 69 73 56 69 65 77 3b 20 20 20 20 20 20 20  t isView;       
4c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4c80: 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20  e if attempting 
4c90: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61  to insert into a
4ca0: 20 76 69 65 77 20 2a 2f 0a 20 20 54 72 69 67 67   view */.  Trigg
4cb0: 65 72 20 2a 70 54 72 69 67 67 65 72 3b 20 20 20  er *pTrigger;   
4cc0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4cd0: 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20 70 54  f triggers on pT
4ce0: 61 62 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  ab, if required 
4cf0: 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73 6b 3b 20  */.  int tmask; 
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 72 69 67   /* Mask of trig
4d20: 67 65 72 20 74 69 6d 65 73 20 2a 2f 0a 23 65 6e  ger times */.#en
4d30: 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
4d40: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
4d50: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
4d60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4d70: 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  {.    goto inser
4d80: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  t_cleanup;.  }. 
4d90: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20   dest.iSDParm = 
4da0: 30 3b 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  0;  /* Suppress 
4db0: 61 20 68 61 72 6d 6c 65 73 73 20 63 6f 6d 70 69  a harmless compi
4dc0: 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 0a  ler warning */..
4dd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 53 65 6c 65    /* If the Sele
4de0: 63 74 20 6f 62 6a 65 63 74 20 69 73 20 72 65 61  ct object is rea
4df0: 6c 6c 79 20 6a 75 73 74 20 61 20 73 69 6d 70 6c  lly just a simpl
4e00: 65 20 56 41 4c 55 45 53 28 29 20 6c 69 73 74 20  e VALUES() list 
4e10: 77 69 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67  with a.  ** sing
4e20: 6c 65 20 72 6f 77 20 28 74 68 65 20 63 6f 6d 6d  le row (the comm
4e30: 6f 6e 20 63 61 73 65 29 20 74 68 65 6e 20 6b 65  on case) then ke
4e40: 65 70 20 74 68 61 74 20 6f 6e 65 20 72 6f 77 20  ep that one row 
4e50: 6f 66 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  of values.  ** a
4e60: 6e 64 20 64 69 73 63 61 72 64 20 74 68 65 20 6f  nd discard the o
4e70: 74 68 65 72 20 28 75 6e 75 73 65 64 29 20 70 61  ther (unused) pa
4e80: 72 74 73 20 6f 66 20 74 68 65 20 70 53 65 6c 65  rts of the pSele
4e90: 63 74 20 6f 62 6a 65 63 74 0a 20 20 2a 2f 0a 20  ct object.  */. 
4ea0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 26 26 20   if( pSelect && 
4eb0: 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  (pSelect->selFla
4ec0: 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 29 21  gs & SF_Values)!
4ed0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 2d 3e 70  =0 && pSelect->p
4ee0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
4ef0: 70 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  pList = pSelect-
4f00: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 53 65  >pEList;.    pSe
4f10: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 20 3d 20 30  lect->pEList = 0
4f20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
4f30: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
4f40: 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 53 65 6c  elect);.    pSel
4f50: 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ect = 0;.  }..  
4f60: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
4f70: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
4f80: 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
4f90: 69 6e 67 20 6e 65 77 20 69 6e 66 6f 72 6d 61 74  ing new informat
4fa0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ion..  */.  asse
4fb0: 72 74 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  rt( pTabList->nS
4fc0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
4fd0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
4fe0: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
4ff0: 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  TabList);.  if( 
5000: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67  pTab==0 ){.    g
5010: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
5020: 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  up;.  }.  iDb = 
5030: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
5040: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
5050: 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
5060: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
5070: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
5080: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
5090: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
50a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  pTab->zName, 0,.
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
50d0: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 7b  Db].zDbSName) ){
50e0: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
50f0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
5100: 77 69 74 68 6f 75 74 52 6f 77 69 64 20 3d 20 21  withoutRowid = !
5110: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3b 0a  HasRowid(pTab);.
5120: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
5130: 20 69 66 20 77 65 20 68 61 76 65 20 61 6e 79 20   if we have any 
5140: 74 72 69 67 67 65 72 73 20 61 6e 64 20 69 66 20  triggers and if 
5150: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 0a  the table being.
5160: 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e    ** inserted in
5170: 74 6f 20 69 73 20 61 20 76 69 65 77 0a 20 20 2a  to is a view.  *
5180: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5190: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
51a0: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
51b0: 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28  e3TriggersExist(
51c0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b  pParse, pTab, TK
51d0: 5f 49 4e 53 45 52 54 2c 20 30 2c 20 26 74 6d 61  _INSERT, 0, &tma
51e0: 73 6b 29 3b 0a 20 20 69 73 56 69 65 77 20 3d 20  sk);.  isView = 
51f0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30  pTab->pSelect!=0
5200: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
5210: 20 70 54 72 69 67 67 65 72 20 30 0a 23 20 64 65   pTrigger 0.# de
5220: 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a 23 20 64  fine tmask 0.# d
5230: 65 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23  efine isView 0.#
5240: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
5250: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20  ITE_OMIT_VIEW.# 
5260: 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 20 64  undef isView.# d
5270: 65 66 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23  efine isView 0.#
5280: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
5290: 28 70 54 72 69 67 67 65 72 20 26 26 20 74 6d 61  (pTrigger && tma
52a0: 73 6b 29 20 7c 7c 20 28 70 54 72 69 67 67 65 72  sk) || (pTrigger
52b0: 3d 3d 30 20 26 26 20 74 6d 61 73 6b 3d 3d 30 29  ==0 && tmask==0)
52c0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
52d0: 62 20 69 73 20 72 65 61 6c 6c 79 20 61 20 76 69  b is really a vi
52e0: 65 77 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  ew, make sure it
52f0: 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61   has been initia
5300: 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 56 69 65 77  lized..  ** View
5310: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
5320: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 70   is a no-op if p
5330: 54 61 62 20 69 73 20 6e 6f 74 20 61 20 76 69 65  Tab is not a vie
5340: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  w..  */.  if( sq
5350: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
5360: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
5370: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  pTab) ){.    got
5380: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
5390: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 61 6e 6e  ;.  }..  /* Cann
53a0: 6f 74 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61  ot insert into a
53b0: 20 72 65 61 64 2d 6f 6e 6c 79 20 74 61 62 6c 65   read-only table
53c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
53d0: 69 74 65 33 49 73 52 65 61 64 4f 6e 6c 79 28 70  ite3IsReadOnly(p
53e0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 74 6d 61  Parse, pTab, tma
53f0: 73 6b 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  sk) ){.    goto 
5400: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
5410: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
5420: 74 65 20 61 20 56 44 42 45 0a 20 20 2a 2f 0a 20  te a VDBE.  */. 
5430: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
5440: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
5450: 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 69  f( v==0 ) goto i
5460: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
5470: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
5480: 74 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  ted==0 ) sqlite3
5490: 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
54a0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  (v);.  sqlite3Be
54b0: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
54c0: 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  n(pParse, pSelec
54d0: 74 20 7c 7c 20 70 54 72 69 67 67 65 72 2c 20 69  t || pTrigger, i
54e0: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
54f0: 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f  LITE_OMIT_XFER_O
5500: 50 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  PT.  /* If the s
5510: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
5520: 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 0a 20 20 2a  he form.  **.  *
5530: 2a 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  *       INSERT I
5540: 4e 54 4f 20 3c 74 61 62 6c 65 31 3e 20 53 45 4c  NTO <table1> SEL
5550: 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
5560: 65 32 3e 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  e2>;.  **.  ** T
5570: 68 65 6e 20 73 70 65 63 69 61 6c 20 6f 70 74 69  hen special opti
5580: 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20 62 65  mizations can be
5590: 20 61 70 70 6c 69 65 64 20 74 68 61 74 20 6d 61   applied that ma
55a0: 6b 65 20 74 68 65 20 74 72 61 6e 73 66 65 72 0a  ke the transfer.
55b0: 20 20 2a 2a 20 76 65 72 79 20 66 61 73 74 20 61    ** very fast a
55c0: 6e 64 20 77 68 69 63 68 20 72 65 64 75 63 65 20  nd which reduce 
55d0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  fragmentation of
55e0: 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20   indices..  **. 
55f0: 20 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   ** This is the 
5600: 32 6e 64 20 74 65 6d 70 6c 61 74 65 2e 0a 20 20  2nd template..  
5610: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  */.  if( pColumn
5620: 3d 3d 30 20 26 26 20 78 66 65 72 4f 70 74 69 6d  ==0 && xferOptim
5630: 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  ization(pParse, 
5640: 70 54 61 62 2c 20 70 53 65 6c 65 63 74 2c 20 6f  pTab, pSelect, o
5650: 6e 45 72 72 6f 72 2c 20 69 44 62 29 20 29 7b 0a  nError, iDb) ){.
5660: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 54 72      assert( !pTr
5670: 69 67 67 65 72 20 29 3b 0a 20 20 20 20 61 73 73  igger );.    ass
5680: 65 72 74 28 20 70 4c 69 73 74 3d 3d 30 20 29 3b  ert( pList==0 );
5690: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
56a0: 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
56b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
56c0: 58 46 45 52 5f 4f 50 54 20 2a 2f 0a 0a 20 20 2f  XFER_OPT */..  /
56d0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
56e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61  AUTOINCREMENT ta
56f0: 62 6c 65 2c 20 6c 6f 6f 6b 20 75 70 20 74 68 65  ble, look up the
5700: 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
5710: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c   in the.  ** sql
5720: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
5730: 6c 65 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  le and store it 
5740: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 72  in memory cell r
5750: 65 67 41 75 74 6f 69 6e 63 2e 0a 20 20 2a 2f 0a  egAutoinc..  */.
5760: 20 20 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 61    regAutoinc = a
5770: 75 74 6f 49 6e 63 42 65 67 69 6e 28 70 50 61 72  utoIncBegin(pPar
5780: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 29 3b 0a  se, iDb, pTab);.
5790: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
57a0: 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
57b0: 64 69 6e 67 20 74 68 65 20 72 6f 77 69 64 20 6f  ding the rowid o
57c0: 66 20 74 68 65 20 6e 65 77 20 72 6f 77 2c 0a 20  f the new row,. 
57d0: 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   ** the content 
57e0: 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77 2c 20  of the new row, 
57f0: 61 6e 64 20 74 68 65 20 61 73 73 65 6d 62 6c 65  and the assemble
5800: 64 20 72 6f 77 20 72 65 63 6f 72 64 2e 0a 20 20  d row record..  
5810: 2a 2f 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  */.  regRowid = 
5820: 72 65 67 49 6e 73 20 3d 20 70 50 61 72 73 65 2d  regIns = pParse-
5830: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
5840: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54 61 62 2d  e->nMem += pTab-
5850: 3e 6e 43 6f 6c 20 2b 20 31 3b 0a 20 20 69 66 28  >nCol + 1;.  if(
5860: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
5870: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
5880: 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ++;.    pParse->
5890: 6e 4d 65 6d 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nMem++;.  }.  re
58a0: 67 44 61 74 61 20 3d 20 72 65 67 52 6f 77 69 64  gData = regRowid
58b0: 2b 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  +1;..  /* If the
58c0: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
58d0: 74 20 69 6e 63 6c 75 64 65 64 20 61 6e 20 49 44  t included an ID
58e0: 4c 49 53 54 20 74 65 72 6d 2c 20 74 68 65 6e 20  LIST term, then 
58f0: 6d 61 6b 65 20 73 75 72 65 0a 20 20 2a 2a 20 61  make sure.  ** a
5900: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  ll elements of t
5910: 68 65 20 49 44 4c 49 53 54 20 72 65 61 6c 6c 79  he IDLIST really
5920: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   are columns of 
5930: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 0a 20  the table and . 
5940: 20 2a 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65   ** remember the
5950: 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 2e   column indices.
5960: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
5970: 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 49  e table has an I
5980: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
5990: 45 59 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68  EY column and th
59a0: 61 74 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 69  at column.  ** i
59b0: 73 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 49  s named in the I
59c0: 44 4c 49 53 54 2c 20 74 68 65 6e 20 72 65 63 6f  DLIST, then reco
59d0: 72 64 20 69 6e 20 74 68 65 20 69 70 6b 43 6f 6c  rd in the ipkCol
59e0: 75 6d 6e 20 76 61 72 69 61 62 6c 65 0a 20 20 2a  umn variable.  *
59f0: 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  * the index into
5a00: 20 49 44 4c 49 53 54 20 6f 66 20 74 68 65 20 70   IDLIST of the p
5a10: 72 69 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d  rimary key colum
5a20: 6e 2e 20 20 69 70 6b 43 6f 6c 75 6d 6e 20 69 73  n.  ipkColumn is
5a30: 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
5a40: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
5a50: 65 79 20 61 73 20 69 74 20 61 70 70 65 61 72 73  ey as it appears
5a60: 20 69 6e 20 49 44 4c 49 53 54 2c 20 6e 6f 74 20   in IDLIST, not 
5a70: 61 73 0a 20 20 2a 2a 20 69 73 20 61 70 70 65 61  as.  ** is appea
5a80: 72 73 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  rs in the origin
5a90: 61 6c 20 74 61 62 6c 65 2e 20 20 28 54 68 65 20  al table.  (The 
5aa0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 49 4e 54  index of the INT
5ab0: 45 47 45 52 0a 20 20 2a 2a 20 50 52 49 4d 41 52  EGER.  ** PRIMAR
5ac0: 59 20 4b 45 59 20 69 6e 20 74 68 65 20 6f 72 69  Y KEY in the ori
5ad0: 67 69 6e 61 6c 20 74 61 62 6c 65 20 69 73 20 70  ginal table is p
5ae0: 54 61 62 2d 3e 69 50 4b 65 79 2e 29 0a 20 20 2a  Tab->iPKey.).  *
5af0: 2f 0a 20 20 62 49 64 4c 69 73 74 49 6e 4f 72 64  /.  bIdListInOrd
5b00: 65 72 20 3d 20 28 70 54 61 62 2d 3e 74 61 62 46  er = (pTab->tabF
5b10: 6c 61 67 73 20 26 20 54 46 5f 4f 4f 4f 48 69 64  lags & TF_OOOHid
5b20: 64 65 6e 29 3d 3d 30 3b 0a 20 20 69 66 28 20 70  den)==0;.  if( p
5b30: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 66 6f  Column ){.    fo
5b40: 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e  r(i=0; i<pColumn
5b50: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
5b60: 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d     pColumn->a[i]
5b70: 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  .idx = -1;.    }
5b80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5b90: 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b  pColumn->nId; i+
5ba0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  +){.      for(j=
5bb0: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
5bc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
5bd0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
5be0: 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e  p(pColumn->a[i].
5bf0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
5c00: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
5c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
5c20: 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d 20  umn->a[i].idx = 
5c30: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  j;.          if(
5c40: 20 69 21 3d 6a 20 29 20 62 49 64 4c 69 73 74 49   i!=j ) bIdListI
5c50: 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  nOrder = 0;.    
5c60: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
5c70: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
5c80: 20 20 20 20 20 20 20 20 69 70 6b 43 6f 6c 75 6d          ipkColum
5c90: 6e 20 3d 20 69 3b 20 20 61 73 73 65 72 74 28 20  n = i;  assert( 
5ca0: 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 3b  !withoutRowid );
5cb0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5cc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5ce0: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61        if( j>=pTa
5cf0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
5d00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
5d10: 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e 2d 3e 61  Rowid(pColumn->a
5d20: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20 21 77  [i].zName) && !w
5d30: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
5d40: 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f 6c 75           ipkColu
5d50: 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  mn = i;.        
5d60: 20 20 62 49 64 4c 69 73 74 49 6e 4f 72 64 65 72    bIdListInOrder
5d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
5d80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
5d90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5da0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 53  Parse, "table %S
5db0: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
5dc0: 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
5dd0: 20 20 20 20 20 20 20 20 70 54 61 62 4c 69 73 74          pTabList
5de0: 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b  , 0, pColumn->a[
5df0: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
5e00: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
5e10: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
5e20: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 73          goto ins
5e30: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ert_cleanup;.   
5e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5e50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
5e60: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
5e70: 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  ny columns of da
5e80: 74 61 20 61 72 65 20 73 75 70 70 6c 69 65 64 2e  ta are supplied.
5e90: 20 20 49 66 20 74 68 65 20 64 61 74 61 0a 20 20    If the data.  
5ea0: 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ** is coming fro
5eb0: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
5ec0: 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65 6e 65 72  ment, then gener
5ed0: 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ate a co-routine
5ee0: 20 74 68 61 74 0a 20 20 2a 2a 20 70 72 6f 64 75   that.  ** produ
5ef0: 63 65 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ces a single row
5f00: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 6f   of the SELECT o
5f10: 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
5f20: 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20 63 6f 2d  n.  The.  ** co-
5f30: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 63  routine is the c
5f40: 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20 74 6f 20  ommon header to 
5f50: 74 68 65 20 33 72 64 20 61 6e 64 20 34 74 68 20  the 3rd and 4th 
5f60: 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20 2a 2f 0a  templates..  */.
5f70: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
5f80: 0a 20 20 20 20 2f 2a 20 44 61 74 61 20 69 73 20  .    /* Data is 
5f90: 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 53 45  coming from a SE
5fa0: 4c 45 43 54 20 6f 72 20 66 72 6f 6d 20 61 20 6d  LECT or from a m
5fb0: 75 6c 74 69 2d 72 6f 77 20 56 41 4c 55 45 53 20  ulti-row VALUES 
5fc0: 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a 20 47  clause..    ** G
5fd0: 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
5fe0: 74 69 6e 65 20 74 6f 20 72 75 6e 20 74 68 65 20  tine to run the 
5ff0: 53 45 4c 45 43 54 2e 20 2a 2f 0a 20 20 20 20 69  SELECT. */.    i
6000: 6e 74 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20  nt regYield;    
6010: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
6020: 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e  olding co-routin
6030: 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f  e entry-point */
6040: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70  .    int addrTop
6050: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  ;        /* Top 
6060: 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
6070: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b  e */.    int rc;
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6090: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
60a0: 20 20 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b      regYield = +
60b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
60c0: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
60d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
60e0: 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20  ddr(v) + 1;.    
60f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6100: 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
6110: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
6120: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
6130: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6140: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
6150: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
6160: 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 64 65 73  gYield);.    des
6170: 74 2e 69 53 64 73 74 20 3d 20 62 49 64 4c 69 73  t.iSdst = bIdLis
6180: 74 49 6e 4f 72 64 65 72 20 3f 20 72 65 67 44 61  tInOrder ? regDa
6190: 74 61 20 3a 20 30 3b 0a 20 20 20 20 64 65 73 74  ta : 0;.    dest
61a0: 2e 6e 53 64 73 74 20 3d 20 70 54 61 62 2d 3e 6e  .nSdst = pTab->n
61b0: 43 6f 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Col;.    rc = sq
61c0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
61d0: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
61e0: 73 74 29 3b 0a 20 20 20 20 72 65 67 46 72 6f 6d  st);.    regFrom
61f0: 53 65 6c 65 63 74 20 3d 20 64 65 73 74 2e 69 53  Select = dest.iS
6200: 64 73 74 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dst;.    if( rc 
6210: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
6220: 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
6230: 45 72 72 20 29 20 67 6f 74 6f 20 69 6e 73 65 72  Err ) goto inser
6240: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73  t_cleanup;.    s
6250: 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
6260: 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65  outine(v, regYie
6270: 6c 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ld);.    sqlite3
6280: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
6290: 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 20 20 20  addrTop - 1);   
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 20 20 20 20 2f 2a 20 6c 61 62 65 6c 20 42 3a 20      /* label B: 
62c0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
62d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 20 29  Select->pEList )
62e0: 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20  ;.    nColumn = 
62f0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
6300: 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20 2f 2a 20  >nExpr;..    /* 
6310: 53 65 74 20 75 73 65 54 65 6d 70 54 61 62 6c 65  Set useTempTable
6320: 20 74 6f 20 54 52 55 45 20 69 66 20 74 68 65 20   to TRUE if the 
6330: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 53 45  result of the SE
6340: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
6350: 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
6360: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 74  written into a t
6370: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
6380: 74 65 6d 70 6c 61 74 65 20 34 29 2e 20 20 53 65  template 4).  Se
6390: 74 20 74 6f 0a 20 20 20 20 2a 2a 20 46 41 4c 53  t to.    ** FALS
63a0: 45 20 69 66 20 65 61 63 68 20 6f 75 74 70 75 74  E if each output
63b0: 20 72 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45   row of the SELE
63c0: 43 54 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  CT can be writte
63d0: 6e 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 0a  n directly into.
63e0: 20 20 20 20 2a 2a 20 74 68 65 20 64 65 73 74 69      ** the desti
63f0: 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 28 74 65  nation table (te
6400: 6d 70 6c 61 74 65 20 33 29 2e 0a 20 20 20 20 2a  mplate 3)..    *
6410: 2a 0a 20 20 20 20 2a 2a 20 41 20 74 65 6d 70 20  *.    ** A temp 
6420: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
6430: 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
6440: 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 69 73  being updated is
6450: 20 61 6c 73 6f 20 6f 6e 65 0a 20 20 20 20 2a 2a   also one.    **
6460: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 62   of the tables b
6470: 65 69 6e 67 20 72 65 61 64 20 62 79 20 74 68 65  eing read by the
6480: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6490: 74 2e 20 20 41 6c 73 6f 20 75 73 65 20 61 20 0a  t.  Also use a .
64a0: 20 20 20 20 2a 2a 20 74 65 6d 70 20 74 61 62 6c      ** temp tabl
64b0: 65 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66  e in the case of
64c0: 20 72 6f 77 20 74 72 69 67 67 65 72 73 2e 0a 20   row triggers.. 
64d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
64e0: 72 69 67 67 65 72 20 7c 7c 20 72 65 61 64 73 54  rigger || readsT
64f0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
6500: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  , pTab) ){.     
6510: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20   useTempTable = 
6520: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
6530: 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29  ( useTempTable )
6540: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  {.      /* Invok
6550: 65 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20  e the coroutine 
6560: 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
6570: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
6580: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
6590: 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 61 20  and add it to a 
65a0: 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
65b0: 73 72 63 54 61 62 2e 20 20 54 68 65 20 63 6f 64  srcTab.  The cod
65c0: 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
65d0: 20 20 2a 2a 20 68 65 72 65 20 69 73 20 66 72 6f    ** here is fro
65e0: 6d 20 74 68 65 20 34 74 68 20 74 65 6d 70 6c 61  m the 4th templa
65f0: 74 65 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te:.      **.   
6600: 20 20 20 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70     **      B: op
6610: 65 6e 20 74 65 6d 70 20 74 61 62 6c 65 0a 20 20  en temp table.  
6620: 20 20 20 20 2a 2a 20 20 20 20 20 20 4c 3a 20 79      **      L: y
6630: 69 65 6c 64 20 58 2c 20 67 6f 74 6f 20 4d 20 61  ield X, goto M a
6640: 74 20 45 4f 46 0a 20 20 20 20 20 20 2a 2a 20 20  t EOF.      **  
6650: 20 20 20 20 20 20 20 69 6e 73 65 72 74 20 72 6f         insert ro
6660: 77 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e  w from R..R+n in
6670: 74 6f 20 74 65 6d 70 20 74 61 62 6c 65 0a 20 20  to temp table.  
6680: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 67      **         g
6690: 6f 74 6f 20 4c 0a 20 20 20 20 20 20 2a 2a 20 20  oto L.      **  
66a0: 20 20 20 20 4d 3a 20 2e 2e 2e 0a 20 20 20 20 20      M: ....     
66b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
66c0: 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 2f  gRec;          /
66d0: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
66e0: 6c 64 20 70 61 63 6b 65 64 20 72 65 63 6f 72 64  ld packed record
66f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
6700: 67 54 65 6d 70 52 6f 77 69 64 3b 20 20 20 20 2f  gTempRowid;    /
6710: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f  * Register to ho
6720: 6c 64 20 74 65 6d 70 20 74 61 62 6c 65 20 52 4f  ld temp table RO
6730: 57 49 44 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  WID */.      int
6740: 20 61 64 64 72 4c 3b 20 20 20 20 20 20 20 20 20   addrL;         
6750: 20 20 2f 2a 20 4c 61 62 65 6c 20 22 4c 22 20 2a    /* Label "L" *
6760: 2f 0a 0a 20 20 20 20 20 20 73 72 63 54 61 62 20  /..      srcTab 
6770: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6780: 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20 3d  ;.      regRec =
6790: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
67a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
67b0: 20 20 72 65 67 54 65 6d 70 52 6f 77 69 64 20 3d    regTempRowid =
67c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
67d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
67e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
67f0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
6800: 68 65 6d 65 72 61 6c 2c 20 73 72 63 54 61 62 2c  hemeral, srcTab,
6810: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
6820: 20 61 64 64 72 4c 20 3d 20 73 71 6c 69 74 65 33   addrL = sqlite3
6830: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6840: 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
6850: 50 61 72 6d 29 3b 20 56 64 62 65 43 6f 76 65 72  Parm); VdbeCover
6860: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
6870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6880: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6890: 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2c  , regFromSelect,
68a0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 63   nColumn, regRec
68b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
68d0: 5f 4e 65 77 52 6f 77 69 64 2c 20 73 72 63 54 61  _NewRowid, srcTa
68e0: 62 2c 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29  b, regTempRowid)
68f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6900: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6910: 49 6e 73 65 72 74 2c 20 73 72 63 54 61 62 2c 20  Insert, srcTab, 
6920: 72 65 67 52 65 63 2c 20 72 65 67 54 65 6d 70 52  regRec, regTempR
6930: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
6940: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
6950: 61 64 64 72 4c 29 3b 0a 20 20 20 20 20 20 73 71  addrL);.      sq
6960: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6970: 65 28 76 2c 20 61 64 64 72 4c 29 3b 0a 20 20 20  e(v, addrL);.   
6980: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6990: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
69a0: 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20   regRec);.      
69b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
69c0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
69d0: 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20  gTempRowid);.   
69e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
69f0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  /* This is the c
6a00: 61 73 65 20 69 66 20 74 68 65 20 64 61 74 61 20  ase if the data 
6a10: 66 6f 72 20 74 68 65 20 49 4e 53 45 52 54 20 69  for the INSERT i
6a20: 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  s coming from a 
6a30: 0a 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 72  .    ** single-r
6a40: 6f 77 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ow VALUES clause
6a50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  .    */.    Name
6a60: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
6a70: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
6a80: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
6a90: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
6aa0: 70 50 61 72 73 65 3b 0a 20 20 20 20 73 72 63 54  pParse;.    srcT
6ab0: 61 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  ab = -1;.    ass
6ac0: 65 72 74 28 20 75 73 65 54 65 6d 70 54 61 62 6c  ert( useTempTabl
6ad0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
6ae0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
6af0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e  Column = pList->
6b00: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
6b10: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
6b20: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e  xprListNames(&sN
6b30: 43 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  C, pList) ){.   
6b40: 20 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74       goto insert
6b50: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
6b60: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
6b70: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a     nColumn = 0;.
6b80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6b90: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49  If there is no I
6ba0: 44 4c 49 53 54 20 74 65 72 6d 20 62 75 74 20 74  DLIST term but t
6bb0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
6bc0: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 0a  integer primary.
6bd0: 20 20 2a 2a 20 6b 65 79 2c 20 74 68 65 20 73 65    ** key, the se
6be0: 74 20 74 68 65 20 69 70 6b 43 6f 6c 75 6d 6e 20  t the ipkColumn 
6bf0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
6c00: 69 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  integer primary 
6c10: 6b 65 79 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e  key .  ** column
6c20: 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6f 72   index in the or
6c30: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 64 65 66  iginal table def
6c40: 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  inition..  */.  
6c50: 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26  if( pColumn==0 &
6c60: 26 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  & nColumn>0 ){. 
6c70: 20 20 20 69 70 6b 43 6f 6c 75 6d 6e 20 3d 20 70     ipkColumn = p
6c80: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 7d 0a  Tab->iPKey;.  }.
6c90: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6ca0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
6cb0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75  lumns in the sou
6cc0: 72 63 65 20 64 61 74 61 20 6d 61 74 63 68 65 73  rce data matches
6cd0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a   the number.  **
6ce0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
6cf0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
6d00: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
6d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
6d20: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
6d30: 20 20 20 6e 48 69 64 64 65 6e 20 2b 3d 20 28 49     nHidden += (I
6d40: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
6d50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 3f 20  Tab->aCol[i]) ? 
6d60: 31 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  1 : 0);.  }.  if
6d70: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
6d80: 6e 43 6f 6c 75 6d 6e 20 26 26 20 6e 43 6f 6c 75  nColumn && nColu
6d90: 6d 6e 21 3d 28 70 54 61 62 2d 3e 6e 43 6f 6c 2d  mn!=(pTab->nCol-
6da0: 6e 48 69 64 64 65 6e 29 20 29 7b 0a 20 20 20 20  nHidden) ){.    
6db0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6dc0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
6dd0: 22 74 61 62 6c 65 20 25 53 20 68 61 73 20 25 64  "table %S has %d
6de0: 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 25 64 20   columns but %d 
6df0: 76 61 6c 75 65 73 20 77 65 72 65 20 73 75 70 70  values were supp
6e00: 6c 69 65 64 22 2c 0a 20 20 20 20 20 20 20 70 54  lied",.       pT
6e10: 61 62 4c 69 73 74 2c 20 30 2c 20 70 54 61 62 2d  abList, 0, pTab-
6e20: 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e 2c 20 6e  >nCol-nHidden, n
6e30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 67 6f 74  Column);.    got
6e40: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
6e50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c  ;.  }.  if( pCol
6e60: 75 6d 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d  umn!=0 && nColum
6e70: 6e 21 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20  n!=pColumn->nId 
6e80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
6e90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6ea0: 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
6eb0: 20 63 6f 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c 75   columns", nColu
6ec0: 6d 6e 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64  mn, pColumn->nId
6ed0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65  );.    goto inse
6ee0: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  rt_cleanup;.  }.
6ef0: 20 20 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61      .  /* Initia
6f00: 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f  lize the count o
6f10: 66 20 72 6f 77 73 20 74 6f 20 62 65 20 69 6e 73  f rows to be ins
6f20: 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28  erted.  */.  if(
6f30: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6f40: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21  LITE_CountRows)!
6f50: 3d 30 0a 20 20 20 26 26 20 21 70 50 61 72 73 65  =0.   && !pParse
6f60: 2d 3e 6e 65 73 74 65 64 0a 20 20 20 26 26 20 21  ->nested.   && !
6f70: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
6f80: 54 61 62 0a 20 20 29 7b 0a 20 20 20 20 72 65 67  Tab.  ){.    reg
6f90: 52 6f 77 43 6f 75 6e 74 20 3d 20 2b 2b 70 50 61  RowCount = ++pPa
6fa0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
6fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6fc0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6fd0: 30 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 29 3b  0, regRowCount);
6fe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
6ff0: 69 73 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  is is not a view
7000: 2c 20 6f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  , open the table
7010: 20 61 6e 64 20 61 6e 64 20 61 6c 6c 20 69 6e 64   and and all ind
7020: 69 63 65 73 20 2a 2f 0a 20 20 69 66 28 20 21 69  ices */.  if( !i
7030: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  sView ){.    int
7040: 20 6e 49 64 78 3b 0a 20 20 20 20 6e 49 64 78 20   nIdx;.    nIdx 
7050: 3d 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62  = sqlite3OpenTab
7060: 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61  leAndIndices(pPa
7070: 72 73 65 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  rse, pTab, OP_Op
7080: 65 6e 57 72 69 74 65 2c 20 30 2c 20 2d 31 2c 20  enWrite, 0, -1, 
7090: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 20 20 20 20 20 26 69 44 61 74 61 43           &iDataC
70c0: 75 72 2c 20 26 69 49 64 78 43 75 72 29 3b 0a 20  ur, &iIdxCur);. 
70d0: 20 20 20 61 52 65 67 49 64 78 20 3d 20 73 71 6c     aRegIdx = sql
70e0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
70f0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
7100: 29 2a 28 6e 49 64 78 2b 31 29 29 3b 0a 20 20 20  )*(nIdx+1));.   
7110: 20 69 66 28 20 61 52 65 67 49 64 78 3d 3d 30 20   if( aRegIdx==0 
7120: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 69 6e  ){.      goto in
7130: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
7140: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c    }.    for(i=0,
7150: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
7160: 65 78 3b 20 69 3c 6e 49 64 78 3b 20 70 49 64 78  ex; i<nIdx; pIdx
7170: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
7180: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
7190: 28 20 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ( pIdx );.      
71a0: 61 52 65 67 49 64 78 5b 69 5d 20 3d 20 2b 2b 70  aRegIdx[i] = ++p
71b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
71c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
71d0: 2b 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  += pIdx->nColumn
71e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e  ;.    }.  }.#ifn
71f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7200: 55 50 53 45 52 54 0a 20 20 69 66 28 20 70 55 70  UPSERT.  if( pUp
7210: 73 65 72 74 20 29 7b 0a 20 20 20 20 70 54 61 62  sert ){.    pTab
7220: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
7230: 6f 72 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20  or = iDataCur;. 
7240: 20 20 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73     pUpsert->pUps
7250: 65 72 74 53 72 63 20 3d 20 70 54 61 62 4c 69 73  ertSrc = pTabLis
7260: 74 3b 0a 20 20 20 20 70 55 70 73 65 72 74 2d 3e  t;.    pUpsert->
7270: 72 65 67 44 61 74 61 20 3d 20 72 65 67 44 61 74  regData = regDat
7280: 61 3b 0a 20 20 20 20 70 55 70 73 65 72 74 2d 3e  a;.    pUpsert->
7290: 69 44 61 74 61 43 75 72 20 3d 20 69 44 61 74 61  iDataCur = iData
72a0: 43 75 72 3b 0a 20 20 20 20 70 55 70 73 65 72 74  Cur;.    pUpsert
72b0: 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78  ->iIdxCur = iIdx
72c0: 43 75 72 3b 0a 20 20 20 20 69 66 28 20 70 55 70  Cur;.    if( pUp
72d0: 73 65 72 74 2d 3e 70 55 70 73 65 72 74 54 61 72  sert->pUpsertTar
72e0: 67 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  get ){.      sql
72f0: 69 74 65 33 55 70 73 65 72 74 41 6e 61 6c 79 7a  ite3UpsertAnalyz
7300: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
7310: 70 54 61 62 4c 69 73 74 2c 20 70 55 70 73 65 72  pTabList, pUpser
7320: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
7330: 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 54 68 69 73  ndif...  /* This
7340: 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74   is the top of t
7350: 68 65 20 6d 61 69 6e 20 69 6e 73 65 72 74 69 6f  he main insertio
7360: 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 66 28 20  n loop */.  if( 
7370: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  useTempTable ){.
7380: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
7390: 6b 20 63 6f 64 65 73 20 74 68 65 20 74 6f 70 20  k codes the top 
73a0: 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20 54  of loop only.  T
73b0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f 70  he complete loop
73c0: 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   is the.    ** f
73d0: 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64 6f 63  ollowing pseudoc
73e0: 6f 64 65 20 28 74 65 6d 70 6c 61 74 65 20 34 29  ode (template 4)
73f0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
7400: 20 20 20 20 20 20 20 20 72 65 77 69 6e 64 20 74          rewind t
7410: 65 6d 70 20 74 61 62 6c 65 2c 20 69 66 20 65 6d  emp table, if em
7420: 70 74 79 20 67 6f 74 6f 20 44 0a 20 20 20 20 2a  pty goto D.    *
7430: 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20 6f  *      C: loop o
7440: 76 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74 65  ver rows of inte
7450: 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a 20  rmediate table. 
7460: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
7470: 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73 20  transfer values 
7480: 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61 74  form intermediat
7490: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74 61  e table into <ta
74a0: 62 6c 65 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ble>.    **     
74b0: 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 20 20 20      end loop.   
74c0: 20 2a 2a 20 20 20 20 20 20 44 3a 20 2e 2e 2e 0a   **      D: ....
74d0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 49      */.    addrI
74e0: 6e 73 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  nsTop = sqlite3V
74f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7500: 52 65 77 69 6e 64 2c 20 73 72 63 54 61 62 29 3b  Rewind, srcTab);
7510: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7520: 3b 0a 20 20 20 20 61 64 64 72 43 6f 6e 74 20 3d  ;.    addrCont =
7530: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7540: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65  entAddr(v);.  }e
7550: 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63 74 20  lse if( pSelect 
7560: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ){.    /* This b
7570: 6c 6f 63 6b 20 63 6f 64 65 73 20 74 68 65 20 74  lock codes the t
7580: 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e  op of loop only.
7590: 20 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 6c    The complete l
75a0: 6f 6f 70 20 69 73 20 74 68 65 0a 20 20 20 20 2a  oop is the.    *
75b0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75  * following pseu
75c0: 64 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61 74 65  docode (template
75d0: 20 33 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   3):.    **.    
75e0: 2a 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c 64  **      C: yield
75f0: 20 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f 20   X, at EOF goto 
7600: 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  D.    **        
7610: 20 69 6e 73 65 72 74 20 74 68 65 20 73 65 6c 65   insert the sele
7620: 63 74 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 3c  ct result into <
7630: 74 61 62 6c 65 3e 20 66 72 6f 6d 20 52 2e 2e 52  table> from R..R
7640: 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  +n.    **       
7650: 20 20 67 6f 74 6f 20 43 0a 20 20 20 20 2a 2a 20    goto C.    ** 
7660: 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20 20       D: ....    
7670: 2a 2f 0a 20 20 20 20 61 64 64 72 49 6e 73 54 6f  */.    addrInsTo
7680: 70 20 3d 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  p = addrCont = s
7690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
76a0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65  (v, OP_Yield, de
76b0: 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
76c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
76d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 75 6e 20  ;.  }..  /* Run 
76e0: 74 68 65 20 42 45 46 4f 52 45 20 61 6e 64 20 49  the BEFORE and I
76f0: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
7700: 72 73 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  rs, if there are
7710: 20 61 6e 79 0a 20 20 2a 2f 0a 20 20 65 6e 64 4f   any.  */.  endO
7720: 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
7730: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
7740: 0a 20 20 69 66 28 20 74 6d 61 73 6b 20 26 20 54  .  if( tmask & T
7750: 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20 29 7b  RIGGER_BEFORE ){
7760: 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6f 6c 73  .    int regCols
7770: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7780: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
7790: 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 0a 20  Tab->nCol+1);.. 
77a0: 20 20 20 2f 2a 20 62 75 69 6c 64 20 74 68 65 20     /* build the 
77b0: 4e 45 57 2e 2a 20 72 65 66 65 72 65 6e 63 65 20  NEW.* reference 
77c0: 72 6f 77 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  row.  Note that 
77d0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  if there is an I
77e0: 4e 54 45 47 45 52 0a 20 20 20 20 2a 2a 20 50 52  NTEGER.    ** PR
77f0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 74 6f 20 77  IMARY KEY into w
7800: 68 69 63 68 20 61 20 4e 55 4c 4c 20 69 73 20 62  hich a NULL is b
7810: 65 69 6e 67 20 69 6e 73 65 72 74 65 64 2c 20 74  eing inserted, t
7820: 68 61 74 20 4e 55 4c 4c 20 77 69 6c 6c 20 62 65  hat NULL will be
7830: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74  .    ** translat
7840: 65 64 20 69 6e 74 6f 20 61 20 75 6e 69 71 75 65  ed into a unique
7850: 20 49 44 20 66 6f 72 20 74 68 65 20 72 6f 77 2e   ID for the row.
7860: 20 20 42 75 74 20 6f 6e 20 61 20 42 45 46 4f 52    But on a BEFOR
7870: 45 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a  E trigger,.    *
7880: 2a 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  * we do not know
7890: 20 77 68 61 74 20 74 68 65 20 75 6e 69 71 75 65   what the unique
78a0: 20 49 44 20 77 69 6c 6c 20 62 65 20 28 62 65 63   ID will be (bec
78b0: 61 75 73 65 20 74 68 65 20 69 6e 73 65 72 74 20  ause the insert 
78c0: 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 68  has.    ** not h
78d0: 61 70 70 65 6e 65 64 20 79 65 74 29 20 73 6f 20  appened yet) so 
78e0: 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61 20  we substitute a 
78f0: 72 6f 77 69 64 20 6f 66 20 2d 31 0a 20 20 20 20  rowid of -1.    
7900: 2a 2f 0a 20 20 20 20 69 66 28 20 69 70 6b 43 6f  */.    if( ipkCo
7910: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
7920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7930: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7940: 20 2d 31 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20   -1, regCols);. 
7950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7960: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 20  int addr1;.     
7970: 20 61 73 73 65 72 74 28 20 21 77 69 74 68 6f 75   assert( !withou
7980: 74 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  tRowid );.      
7990: 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65  if( useTempTable
79a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
79b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
79c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
79d0: 61 62 2c 20 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72  ab, ipkColumn, r
79e0: 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d  egCols);.      }
79f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
7a00: 73 65 72 74 28 20 70 53 65 6c 65 63 74 3d 3d 30  sert( pSelect==0
7a10: 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73   );  /* Otherwis
7a20: 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 69  e useTempTable i
7a30: 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20  s true */.      
7a40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
7a50: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
7a60: 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45  >a[ipkColumn].pE
7a70: 78 70 72 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20  xpr, regCols);. 
7a80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64       }.      add
7a90: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7aa0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
7ab0: 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29 3b 20  Null, regCols); 
7ac0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7ad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7ae0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7af0: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67 43  nteger, -1, regC
7b00: 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
7b10: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7b20: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
7b30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b40: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
7b50: 6e 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20 56 64  nt, regCols); Vd
7b60: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7b70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6e     }..    /* Can
7b80: 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67 65 72  not have trigger
7b90: 73 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 74  s on a virtual t
7ba0: 61 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65  able. If it were
7bb0: 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20 2a   possible,.    *
7bc0: 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f 75  * this block wou
7bd0: 6c 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f 75  ld have to accou
7be0: 6e 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63 6f  nt for hidden co
7bf0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
7c00: 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
7c10: 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20 20  ual(pTab) );..  
7c20: 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
7c30: 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61 0a  new column data.
7c40: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
7c50: 3d 6a 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  =j=0; i<pTab->nC
7c60: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
7c70: 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20  if( pColumn ){. 
7c80: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7c90: 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20  j<pColumn->nId; 
7ca0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
7cb0: 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a  if( pColumn->a[j
7cc0: 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65 61 6b  ].idx==i ) break
7cd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7ce0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 21    }.      if( (!
7cf0: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 26 26 20  useTempTable && 
7d00: 21 70 4c 69 73 74 29 20 7c 7c 20 28 70 43 6f 6c  !pList) || (pCol
7d10: 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d  umn && j>=pColum
7d20: 6e 2d 3e 6e 49 64 29 0a 20 20 20 20 20 20 20 20  n->nId).        
7d30: 20 20 20 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 3d      || (pColumn=
7d40: 3d 30 20 26 26 20 49 73 4f 72 64 69 6e 61 72 79  =0 && IsOrdinary
7d50: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
7d60: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 29 20 29 7b  ab->aCol[i])) ){
7d70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7d90: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70   pTab->aCol[i].p
7da0: 44 66 6c 74 2c 20 72 65 67 43 6f 6c 73 2b 69 2b  Dflt, regCols+i+
7db0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
7dc0: 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65  if( useTempTable
7dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7de0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7df0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
7e00: 61 62 2c 20 6a 2c 20 72 65 67 43 6f 6c 73 2b 69  ab, j, regCols+i
7e10: 2b 31 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  +1); .      }els
7e20: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7e30: 74 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  t( pSelect==0 );
7e40: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73   /* Otherwise us
7e50: 65 54 65 6d 70 54 61 62 6c 65 20 69 73 20 74 72  eTempTable is tr
7e60: 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  ue */.        sq
7e70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64  lite3ExprCodeAnd
7e80: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c  Cache(pParse, pL
7e90: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  ist->a[j].pExpr,
7ea0: 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 0a 20   regCols+i+1);. 
7eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7ec0: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 21   pColumn==0 && !
7ed0: 49 73 4f 72 64 69 6e 61 72 79 48 69 64 64 65 6e  IsOrdinaryHidden
7ee0: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
7ef0: 6f 6c 5b 69 5d 29 20 29 20 6a 2b 2b 3b 0a 20 20  ol[i]) ) j++;.  
7f00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7f10: 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54  his is an INSERT
7f20: 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68 20   on a view with 
7f30: 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e  an INSTEAD OF IN
7f40: 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20 20  SERT trigger,.  
7f50: 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65    ** do not atte
7f60: 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73 69  mpt any conversi
7f70: 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65 6d  ons before assem
7f80: 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  bling the record
7f90: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
7fa0: 20 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c 65   is a real table
7fb0: 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65 72  , attempt conver
7fc0: 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72 65  sions as require
7fd0: 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  d by the.    ** 
7fe0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66 66  table column aff
7ff0: 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f 0a  inities..    */.
8000: 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20      if( !isView 
8010: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8020: 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c  TableAffinity(v,
8030: 20 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2b 31   pTab, regCols+1
8040: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
8050: 20 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72 20   Fire BEFORE or 
8060: 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67  INSTEAD OF trigg
8070: 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ers */.    sqlit
8080: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
8090: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
80a0: 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c  r, TK_INSERT, 0,
80b0: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c   TRIGGER_BEFORE,
80c0: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20   .        pTab, 
80d0: 72 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e 6e 43  regCols-pTab->nC
80e0: 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c 20 65  ol-1, onError, e
80f0: 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20  ndOfLoop);..    
8100: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8110: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
8120: 72 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d 3e 6e  regCols, pTab->n
8130: 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Col+1);.  }..  /
8140: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
8150: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 78  ntent of the nex
8160: 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20  t row to insert 
8170: 69 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 0a  into a range of.
8180: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 62    ** registers b
8190: 65 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67 49  eginning at regI
81a0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
81b0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69 66  isView ){.    if
81c0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
81d0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
81e0: 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 56  e row that the V
81f0: 55 70 64 61 74 65 20 6f 70 63 6f 64 65 20 77 69  Update opcode wi
8200: 6c 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e 65 20  ll delete: none 
8210: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
8220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8230: 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 6e 73  _Null, 0, regIns
8240: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8250: 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b   ipkColumn>=0 ){
8260: 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 54 65  .      if( useTe
8270: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
8280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8290: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
82a0: 6e 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43 6f  n, srcTab, ipkCo
82b0: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29 3b  lumn, regRowid);
82c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
82d0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
82e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
8300: 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b  , regFromSelect+
8310: 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  ipkColumn, regRo
8320: 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid);.      }els
8330: 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f  e{.        VdbeO
8340: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20  p *pOp;.        
8350: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
8360: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
8370: 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  [ipkColumn].pExp
8380: 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  r, regRowid);.  
8390: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
83a0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
83b0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  -1);.        ass
83c0: 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20  ert( pOp!=0 );. 
83d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
83e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 20  opcode==OP_Null 
83f0: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
8400: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
8410: 20 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 31 3b   appendFlag = 1;
8420: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
8430: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 65 77 52  opcode = OP_NewR
8440: 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
8450: 70 4f 70 2d 3e 70 31 20 3d 20 69 44 61 74 61 43  pOp->p1 = iDataC
8460: 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
8470: 70 2d 3e 70 32 20 3d 20 72 65 67 52 6f 77 69 64  p->p2 = regRowid
8480: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
8490: 3e 70 33 20 3d 20 72 65 67 41 75 74 6f 69 6e 63  >p3 = regAutoinc
84a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
84b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
84c0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
84d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55  expression is NU
84e0: 4c 4c 2c 20 74 68 65 6e 20 75 73 65 20 4f 50 5f  LL, then use OP_
84f0: 4e 65 77 52 6f 77 69 64 0a 20 20 20 20 20 20 2a  NewRowid.      *
8500: 2a 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  * to generate a 
8510: 75 6e 69 71 75 65 20 70 72 69 6d 61 72 79 20 6b  unique primary k
8520: 65 79 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20  ey value..      
8530: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 61 70  */.      if( !ap
8540: 70 65 6e 64 46 6c 61 67 20 29 7b 0a 20 20 20 20  pendFlag ){.    
8550: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
8560: 20 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69         if( !IsVi
8570: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
8580: 20 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d           addr1 =
8590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85a0: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
85b0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 20 56 64 62  , regRowid); Vdb
85c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
85d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
85e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
85f0: 4e 65 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43  NewRowid, iDataC
8600: 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  ur, regRowid, re
8610: 67 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20  gAutoinc);.     
8620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8630: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
8640: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
8650: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e{.          add
8660: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
8670: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
8680: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8690: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
86a0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
86b0: 69 64 2c 20 61 64 64 72 31 2b 32 29 3b 20 56 64  id, addr1+2); Vd
86c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
86d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
86e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
86f0: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
8700: 6e 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 20 56  nt, regRowid); V
8710: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8720: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8730: 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
8740: 70 54 61 62 29 20 7c 7c 20 77 69 74 68 6f 75 74  pTab) || without
8750: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Rowid ){.      s
8760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8770: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
8780: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  regRowid);.    }
8790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
87a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
87b0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 44   OP_NewRowid, iD
87c0: 61 74 61 43 75 72 2c 20 72 65 67 52 6f 77 69 64  ataCur, regRowid
87d0: 2c 20 72 65 67 41 75 74 6f 69 6e 63 29 3b 0a 20  , regAutoinc);. 
87e0: 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61 67 20       appendFlag 
87f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 1;.    }.    a
8800: 75 74 6f 49 6e 63 53 74 65 70 28 70 50 61 72 73  utoIncStep(pPars
8810: 65 2c 20 72 65 67 41 75 74 6f 69 6e 63 2c 20 72  e, regAutoinc, r
8820: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 2f  egRowid);..    /
8830: 2a 20 43 6f 6d 70 75 74 65 20 64 61 74 61 20 66  * Compute data f
8840: 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
8850: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2c  f the new entry,
8860: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
8870: 2a 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  * with the first
8880: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
8890: 20 20 20 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b      nHidden = 0;
88a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
88b0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
88c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67  {.      int iReg
88d0: 53 74 6f 72 65 20 3d 20 72 65 67 52 6f 77 69 64  Store = regRowid
88e0: 2b 31 2b 69 3b 0a 20 20 20 20 20 20 69 66 28 20  +1+i;.      if( 
88f0: 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  i==pTab->iPKey )
8900: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
8910: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 4e   value of the IN
8920: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8930: 59 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61  Y column is alwa
8940: 79 73 20 61 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  ys a NULL..     
8950: 20 20 20 2a 2a 20 57 68 65 6e 65 76 65 72 20 74     ** Whenever t
8960: 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  his column is re
8970: 61 64 2c 20 74 68 65 20 72 6f 77 69 64 20 77 69  ad, the rowid wi
8980: 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65  ll be substitute
8990: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
89a0: 69 74 73 20 70 6c 61 63 65 2e 20 20 48 65 6e 63  its place.  Henc
89b0: 65 2c 20 66 69 6c 6c 20 74 68 69 73 20 63 6f 6c  e, fill this col
89c0: 75 6d 6e 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  umn with a NULL 
89d0: 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 20 20 20  to avoid.       
89e0: 20 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 64 61   ** taking up da
89f0: 74 61 20 73 70 61 63 65 20 77 69 74 68 20 69 6e  ta space with in
8a00: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
8a10: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
8a20: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 73  d..        ** As
8a30: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 73 68   there may be sh
8a40: 61 6c 6c 6f 77 20 63 6f 70 69 65 73 20 6f 66 20  allow copies of 
8a50: 74 68 69 73 20 76 61 6c 75 65 2c 20 6d 61 6b 65  this value, make
8a60: 20 69 74 20 61 20 73 6f 66 74 2d 4e 55 4c 4c 20   it a soft-NULL 
8a70: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
8a80: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8a90: 4f 50 5f 53 6f 66 74 4e 75 6c 6c 2c 20 69 52 65  OP_SoftNull, iRe
8aa0: 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 20  gStore);.       
8ab0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8ac0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f   }.      if( pCo
8ad0: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
8ae0: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
8af0: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
8b00: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
8b10: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
8b20: 20 20 20 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a       nHidden++;.
8b30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8b40: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 69 20 2d           j = i -
8b50: 20 6e 48 69 64 64 65 6e 3b 0a 20 20 20 20 20 20   nHidden;.      
8b60: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
8b70: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8b80: 3b 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64  ; j<pColumn->nId
8b90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8ba0: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61    if( pColumn->a
8bb0: 5b 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65  [j].idx==i ) bre
8bc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8be0: 6a 3c 30 20 7c 7c 20 6e 43 6f 6c 75 6d 6e 3d 3d  j<0 || nColumn==
8bf0: 30 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20 26 26  0 || (pColumn &&
8c00: 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64   j>=pColumn->nId
8c10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
8c20: 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
8c30: 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  orable(pParse, p
8c40: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66  Tab->aCol[i].pDf
8c50: 6c 74 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a  lt, iRegStore);.
8c60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8c70: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  useTempTable ){.
8c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8c90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8ca0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
8cb0: 6a 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 20 0a  j, iRegStore); .
8cc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8cd0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
8ce0: 20 20 20 69 66 28 20 72 65 67 46 72 6f 6d 53 65     if( regFromSe
8cf0: 6c 65 63 74 21 3d 72 65 67 44 61 74 61 20 29 7b  lect!=regData ){
8d00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8d10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8d20: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 46 72 6f  OP_SCopy, regFro
8d30: 6d 53 65 6c 65 63 74 2b 6a 2c 20 69 52 65 67 53  mSelect+j, iRegS
8d40: 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  tore);.        }
8d50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8d70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
8d80: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  ist->a[j].pExpr,
8d90: 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20   iRegStore);.   
8da0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8db0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
8dc0: 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72   to check constr
8dd0: 61 69 6e 74 73 20 61 6e 64 20 67 65 6e 65 72 61  aints and genera
8de0: 74 65 20 69 6e 64 65 78 20 6b 65 79 73 20 61 6e  te index keys an
8df0: 64 0a 20 20 20 20 2a 2a 20 64 6f 20 74 68 65 20  d.    ** do the 
8e00: 69 6e 73 65 72 74 69 6f 6e 2e 0a 20 20 20 20 2a  insertion..    *
8e10: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8e20: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8e30: 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
8e40: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
8e50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8e60: 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
8e70: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
8e80: 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
8e90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8ea0: 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28  tabMakeWritable(
8eb0: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ed0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70  AddOp4(v, OP_VUp
8ee0: 64 61 74 65 2c 20 31 2c 20 70 54 61 62 2d 3e 6e  date, 1, pTab->n
8ef0: 43 6f 6c 2b 32 2c 20 72 65 67 49 6e 73 2c 20 70  Col+2, regIns, p
8f00: 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
8f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f20: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6f 6e 45  eChangeP5(v, onE
8f30: 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
8f40: 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 6f 6e   ? OE_Abort : on
8f50: 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 73 71  Error);.      sq
8f60: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
8f70: 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
8f80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8f90: 20 20 20 20 69 6e 74 20 69 73 52 65 70 6c 61 63      int isReplac
8fa0: 65 3b 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20  e;    /* Set to 
8fb0: 74 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69  true if constrai
8fc0: 6e 74 73 20 6d 61 79 20 63 61 75 73 65 20 61 20  nts may cause a 
8fd0: 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 20 20 20  replace */.     
8fe0: 20 69 6e 74 20 62 55 73 65 53 65 65 6b 3b 20 20   int bUseSeek;  
8ff0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
9000: 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 52 45 53  e OPFLAG_SEEKRES
9010: 55 4c 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ULT */.      sql
9020: 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
9030: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61  traintChecks(pPa
9040: 72 73 65 2c 20 70 54 61 62 2c 20 61 52 65 67 49  rse, pTab, aRegI
9050: 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  dx, iDataCur, iI
9060: 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
9070: 20 72 65 67 49 6e 73 2c 20 30 2c 20 69 70 6b 43   regIns, 0, ipkC
9080: 6f 6c 75 6d 6e 3e 3d 30 2c 20 6f 6e 45 72 72 6f  olumn>=0, onErro
9090: 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 2c 20 26 69  r, endOfLoop, &i
90a0: 73 52 65 70 6c 61 63 65 2c 20 30 2c 20 70 55 70  sReplace, 0, pUp
90b0: 73 65 72 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  sert.      );.  
90c0: 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43 68 65      sqlite3FkChe
90d0: 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ck(pParse, pTab,
90e0: 20 30 2c 20 72 65 67 49 6e 73 2c 20 30 2c 20 30   0, regIns, 0, 0
90f0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  );..      /* Set
9100: 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
9110: 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 69  EEKRESULT flag i
9120: 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68 65  f either (a) the
9130: 72 65 20 61 72 65 20 6e 6f 20 52 45 50 4c 41 43  re are no REPLAC
9140: 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74  E.      ** const
9150: 72 61 69 6e 74 73 20 6f 72 20 28 62 29 20 74 68  raints or (b) th
9160: 65 72 65 20 61 72 65 20 6e 6f 20 74 72 69 67 67  ere are no trigg
9170: 65 72 73 20 61 6e 64 20 74 68 69 73 20 74 61 62  ers and this tab
9180: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 20 20 20 20  le is not a.    
9190: 20 20 2a 2a 20 70 61 72 65 6e 74 20 74 61 62 6c    ** parent tabl
91a0: 65 20 69 6e 20 61 20 66 6f 72 65 69 67 6e 20 6b  e in a foreign k
91b0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 49  ey constraint. I
91c0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 73 65 74  t is safe to set
91d0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6c   the.      ** fl
91e0: 61 67 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  ag in the second
91f0: 20 63 61 73 65 20 61 73 20 69 66 20 61 6e 79 20   case as if any 
9200: 52 45 50 4c 41 43 45 20 63 6f 6e 73 74 72 61 69  REPLACE constrai
9210: 6e 74 20 69 73 20 68 69 74 2c 20 61 6e 0a 20 20  nt is hit, an.  
9220: 20 20 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65      ** OP_Delete
9230: 20 6f 72 20 4f 50 5f 49 64 78 44 65 6c 65 74 65   or OP_IdxDelete
9240: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
9250: 6c 20 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e  l be executed on
9260: 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20   each .      ** 
9270: 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 64  cursor that is d
9280: 69 73 74 75 72 62 65 64 2e 20 41 6e 64 20 74 68  isturbed. And th
9290: 65 73 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ese instructions
92a0: 20 62 6f 74 68 20 63 6c 65 61 72 20 74 68 65 0a   both clear the.
92b0: 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43 75 72        ** VdbeCur
92c0: 73 6f 72 2e 73 65 65 6b 52 65 73 75 6c 74 20 76  sor.seekResult v
92d0: 61 72 69 61 62 6c 65 2c 20 64 69 73 61 62 6c 69  ariable, disabli
92e0: 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  ng the OPFLAG_US
92f0: 45 53 45 45 4b 52 45 53 55 4c 54 0a 20 20 20 20  ESEEKRESULT.    
9300: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69    ** functionali
9310: 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 62 55  ty.  */.      bU
9320: 73 65 53 65 65 6b 20 3d 20 28 69 73 52 65 70 6c  seSeek = (isRepl
9330: 61 63 65 3d 3d 30 20 7c 7c 20 28 70 54 72 69 67  ace==0 || (pTrig
9340: 67 65 72 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  ger==0 &&.      
9350: 20 20 20 20 28 28 64 62 2d 3e 66 6c 61 67 73 20      ((db->flags 
9360: 26 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  & SQLITE_Foreign
9370: 4b 65 79 73 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  Keys)==0 || sqli
9380: 74 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73 28  te3FkReferences(
9390: 70 54 61 62 29 3d 3d 30 29 0a 20 20 20 20 20 20  pTab)==0).      
93a0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
93b0: 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69  3CompleteInserti
93c0: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
93d0: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
93e0: 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 72 65  ur,.          re
93f0: 67 49 6e 73 2c 20 61 52 65 67 49 64 78 2c 20 30  gIns, aRegIdx, 0
9400: 2c 20 61 70 70 65 6e 64 46 6c 61 67 2c 20 62 55  , appendFlag, bU
9410: 73 65 53 65 65 6b 0a 20 20 20 20 20 20 29 3b 0a  seSeek.      );.
9420: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9430: 55 70 64 61 74 65 20 74 68 65 20 63 6f 75 6e 74  Update the count
9440: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 61 72   of rows that ar
9450: 65 20 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a  e inserted.  */.
9460: 20 20 69 66 28 20 72 65 67 52 6f 77 43 6f 75 6e    if( regRowCoun
9470: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
9480: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9490: 5f 41 64 64 49 6d 6d 2c 20 72 65 67 52 6f 77 43  _AddImm, regRowC
94a0: 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  ount, 1);.  }.. 
94b0: 20 69 66 28 20 70 54 72 69 67 67 65 72 20 29 7b   if( pTrigger ){
94c0: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 41 46 54  .    /* Code AFT
94d0: 45 52 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  ER triggers */. 
94e0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f     sqlite3CodeRo
94f0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
9500: 20 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 49 4e   pTrigger, TK_IN
9510: 53 45 52 54 2c 20 30 2c 20 54 52 49 47 47 45 52  SERT, 0, TRIGGER
9520: 5f 41 46 54 45 52 2c 20 0a 20 20 20 20 20 20 20  _AFTER, .       
9530: 20 70 54 61 62 2c 20 72 65 67 44 61 74 61 2d 32   pTab, regData-2
9540: 2d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 6f 6e 45  -pTab->nCol, onE
9550: 72 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29  rror, endOfLoop)
9560: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
9570: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6d 61  bottom of the ma
9580: 69 6e 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f  in insertion loo
9590: 70 2c 20 69 66 20 74 68 65 20 64 61 74 61 20 73  p, if the data s
95a0: 6f 75 72 63 65 0a 20 20 2a 2a 20 69 73 20 61 20  ource.  ** is a 
95b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
95c0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
95d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
95e0: 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a  (v, endOfLoop);.
95f0: 20 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62    if( useTempTab
9600: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
9610: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9620: 50 5f 4e 65 78 74 2c 20 73 72 63 54 61 62 2c 20  P_Next, srcTab, 
9630: 61 64 64 72 43 6f 6e 74 29 3b 20 56 64 62 65 43  addrCont); VdbeC
9640: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
9650: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
9660: 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 54 6f  ere(v, addrInsTo
9670: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
9680: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
9690: 43 6c 6f 73 65 2c 20 73 72 63 54 61 62 29 3b 0a  Close, srcTab);.
96a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c    }else if( pSel
96b0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
96c0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
96d0: 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 73 71 6c  drCont);.    sql
96e0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
96f0: 28 76 2c 20 61 64 64 72 49 6e 73 54 6f 70 29 3b  (v, addrInsTop);
9700: 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 65 6e 64  .  }..insert_end
9710: 3a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  :.  /* Update th
9720: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
9730: 65 20 74 61 62 6c 65 20 62 79 20 73 74 6f 72 69  e table by stori
9740: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
9750: 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d  f the.  ** maxim
9760: 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e 74 65 72  um rowid counter
9770: 20 76 61 6c 75 65 73 20 72 65 63 6f 72 64 65 64   values recorded
9780: 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67   while inserting
9790: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75 74 6f 69   into.  ** autoi
97a0: 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c 65 73 2e  ncrement tables.
97b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
97c0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26  se->nested==0 &&
97d0: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
97e0: 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rTab==0 ){.    s
97f0: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
9800: 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29 3b 0a  entEnd(pParse);.
9810: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
9820: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9830: 20 6f 66 20 72 6f 77 73 20 69 6e 73 65 72 74 65   of rows inserte
9840: 64 2e 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  d. If this routi
9850: 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67 65 6e 65  ne is .  ** gene
9860: 72 61 74 69 6e 67 20 63 6f 64 65 20 62 65 63 61  rating code beca
9870: 75 73 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f  use of a call to
9880: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
9890: 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a 20 20  rse(), do not.  
98a0: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61  ** invoke the ca
98b0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
98c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 52  .  */.  if( regR
98d0: 6f 77 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 73  owCount ){.    s
98e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
98f0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9900: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31  , regRowCount, 1
9910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9920: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
9930: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
9940: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9950: 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   0, COLNAME_NAME
9960: 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64  , "rows inserted
9970: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  ", SQLITE_STATIC
9980: 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 63  );.  }..insert_c
9990: 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
99a0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
99b0: 62 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20  b, pTabList);.  
99c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
99d0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
99e0: 3b 0a 20 20 73 71 6c 69 74 65 33 55 70 73 65 72  ;.  sqlite3Upser
99f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 70 73  tDelete(db, pUps
9a00: 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ert);.  sqlite3S
9a10: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
9a20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
9a30: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
9a40: 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20  db, pColumn);.  
9a50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9a60: 2c 20 61 52 65 67 49 64 78 29 3b 0a 7d 0a 0a 2f  , aRegIdx);.}../
9a70: 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69 73 56  * Make sure "isV
9a80: 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72 20 6d  iew" and other m
9a90: 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 61 62  acros defined ab
9aa0: 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ove are undefine
9ab0: 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d. Otherwise.** 
9ac0: 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72 66 65  they may interfe
9ad0: 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c 61 74  re with compilat
9ae0: 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66 75 6e  ion of other fun
9af0: 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66  ctions in this f
9b00: 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61 6e  ile.** (or in an
9b10: 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66 20 74  other file, if t
9b20: 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d 65 73  his file becomes
9b30: 20 70 61 72 74 20 6f 66 20 74 68 65 20 61 6d 61   part of the ama
9b40: 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a  lgamation).  */.
9b50: 23 69 66 64 65 66 20 69 73 56 69 65 77 0a 20 23  #ifdef isView. #
9b60: 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 65 6e  undef isView.#en
9b70: 64 69 66 0a 23 69 66 64 65 66 20 70 54 72 69 67  dif.#ifdef pTrig
9b80: 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54 72 69  ger. #undef pTri
9b90: 67 67 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 64  gger.#endif.#ifd
9ba0: 65 66 20 74 6d 61 73 6b 0a 20 23 75 6e 64 65 66  ef tmask. #undef
9bb0: 20 74 6d 61 73 6b 0a 23 65 6e 64 69 66 0a 0a 2f   tmask.#endif../
9bc0: 2a 0a 2a 2a 20 4d 65 61 6e 69 6e 67 73 20 6f 66  *.** Meanings of
9bd0: 20 62 69 74 73 20 69 6e 20 6f 66 20 70 57 61 6c   bits in of pWal
9be0: 6b 65 72 2d 3e 65 43 6f 64 65 20 66 6f 72 20 63  ker->eCode for c
9bf0: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e  heckConstraintUn
9c00: 63 68 61 6e 67 65 64 28 29 0a 2a 2f 0a 23 64 65  changed().*/.#de
9c10: 66 69 6e 65 20 43 4b 43 4e 53 54 52 4e 54 5f 43  fine CKCNSTRNT_C
9c20: 4f 4c 55 4d 4e 20 20 20 30 78 30 31 20 20 20 20  OLUMN   0x01    
9c30: 2f 2a 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  /* CHECK constra
9c40: 69 6e 74 20 75 73 65 73 20 61 20 63 68 61 6e 67  int uses a chang
9c50: 69 6e 67 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 23 64  ing column */.#d
9c60: 65 66 69 6e 65 20 43 4b 43 4e 53 54 52 4e 54 5f  efine CKCNSTRNT_
9c70: 52 4f 57 49 44 20 20 20 20 30 78 30 32 20 20 20  ROWID    0x02   
9c80: 20 2f 2a 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   /* CHECK constr
9c90: 61 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  aint references 
9ca0: 74 68 65 20 52 4f 57 49 44 20 2a 2f 0a 0a 2f 2a  the ROWID */../*
9cb0: 20 54 68 69 73 20 69 73 20 74 68 65 20 57 61 6c   This is the Wal
9cc0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f  ker callback fro
9cd0: 6d 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  m checkConstrain
9ce0: 74 55 6e 63 68 61 6e 67 65 64 28 29 2e 20 20 53  tUnchanged().  S
9cf0: 65 74 0a 2a 2a 20 62 69 74 20 30 78 30 31 20 6f  et.** bit 0x01 o
9d00: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
9d10: 20 69 66 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e   if.** pWalker->
9d20: 65 43 6f 64 65 20 74 6f 20 30 20 69 66 20 74 68  eCode to 0 if th
9d30: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  is expression no
9d40: 64 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  de references an
9d50: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  y of the.** colu
9d60: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 62 65 69  mns that are bei
9d70: 6e 67 20 6d 6f 64 69 66 65 64 20 62 79 20 61 6e  ng modifed by an
9d80: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
9d90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9da0: 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74   checkConstraint
9db0: 45 78 70 72 4e 6f 64 65 28 57 61 6c 6b 65 72 20  ExprNode(Walker 
9dc0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
9dd0: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
9de0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
9df0: 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  MN ){.    assert
9e00: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9e10: 3e 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  >=0 || pExpr->iC
9e20: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20  olumn==-1 );.   
9e30: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
9e40: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
9e50: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 61  if( pWalker->u.a
9e60: 69 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  iCol[pExpr->iCol
9e70: 75 6d 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  umn]>=0 ){.     
9e80: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
9e90: 65 20 7c 3d 20 43 4b 43 4e 53 54 52 4e 54 5f 43  e |= CKCNSTRNT_C
9ea0: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  OLUMN;.      }. 
9eb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ec0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 7c  pWalker->eCode |
9ed0: 3d 20 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49  = CKCNSTRNT_ROWI
9ee0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  D;.    }.  }.  r
9ef0: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
9f00: 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ue;.}../*.** pEx
9f10: 70 72 20 69 73 20 61 20 43 48 45 43 4b 20 63 6f  pr is a CHECK co
9f20: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 61 20 72 6f  nstraint on a ro
9f30: 77 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  w that is being 
9f40: 55 50 44 41 54 45 2d 65 64 2e 20 20 54 68 65 0a  UPDATE-ed.  The.
9f50: 2a 2a 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ** only columns 
9f60: 74 68 61 74 20 61 72 65 20 6d 6f 64 69 66 69 65  that are modifie
9f70: 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45 20  d by the UPDATE 
9f80: 61 72 65 20 74 68 6f 73 65 20 66 6f 72 20 77 68  are those for wh
9f90: 69 63 68 0a 2a 2a 20 61 69 43 68 6e 67 5b 69 5d  ich.** aiChng[i]
9fa0: 3e 3d 30 2c 20 61 6e 64 20 61 6c 73 6f 20 74 68  >=0, and also th
9fb0: 65 20 52 4f 57 49 44 20 69 73 20 6d 6f 64 69 66  e ROWID is modif
9fc0: 69 65 64 20 69 66 20 63 68 6e 67 52 6f 77 69 64  ied if chngRowid
9fd0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
9fe0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
9ff0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
a000: 70 45 78 70 72 20 64 6f 65 73 20 6e 6f 74 20 75  pExpr does not u
a010: 73 65 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a  se any of the.**
a020: 20 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e   changing column
a030: 73 20 28 6f 72 20 74 68 65 20 72 6f 77 69 64 20  s (or the rowid 
a040: 69 66 20 69 74 20 69 73 20 63 68 61 6e 67 69 6e  if it is changin
a050: 67 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  g).  In other wo
a060: 72 64 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74  rds,.** return t
a070: 72 75 65 20 69 66 20 74 68 69 73 20 43 48 45 43  rue if this CHEC
a080: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  K constraint can
a090: 20 62 65 20 73 6b 69 70 70 65 64 20 77 68 65 6e   be skipped when
a0a0: 20 76 61 6c 69 64 61 74 69 6e 67 0a 2a 2a 20 74   validating.** t
a0b0: 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 20 74 68  he new row in th
a0c0: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
a0d0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a0e0: 74 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  t checkConstrain
a0f0: 74 55 6e 63 68 61 6e 67 65 64 28 45 78 70 72 20  tUnchanged(Expr 
a100: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 61 69 43  *pExpr, int *aiC
a110: 68 6e 67 2c 20 69 6e 74 20 63 68 6e 67 52 6f 77  hng, int chngRow
a120: 69 64 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  id){.  Walker w;
a130: 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
a140: 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
a150: 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
a160: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
a170: 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 45  checkConstraintE
a180: 78 70 72 4e 6f 64 65 3b 0a 20 20 77 2e 75 2e 61  xprNode;.  w.u.a
a190: 69 43 6f 6c 20 3d 20 61 69 43 68 6e 67 3b 0a 20  iCol = aiChng;. 
a1a0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
a1b0: 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  (&w, pExpr);.  i
a1c0: 66 28 20 21 63 68 6e 67 52 6f 77 69 64 20 29 7b  f( !chngRowid ){
a1d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
a1e0: 77 2e 65 43 6f 64 65 20 26 20 43 4b 43 4e 53 54  w.eCode & CKCNST
a1f0: 52 4e 54 5f 52 4f 57 49 44 29 21 3d 30 20 29 3b  RNT_ROWID)!=0 );
a200: 0a 20 20 20 20 77 2e 65 43 6f 64 65 20 26 3d 20  .    w.eCode &= 
a210: 7e 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44  ~CKCNSTRNT_ROWID
a220: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
a230: 28 20 77 2e 65 43 6f 64 65 3d 3d 30 20 29 3b 0a  ( w.eCode==0 );.
a240: 20 20 74 65 73 74 63 61 73 65 28 20 77 2e 65 43    testcase( w.eC
a250: 6f 64 65 3d 3d 43 4b 43 4e 53 54 52 4e 54 5f 43  ode==CKCNSTRNT_C
a260: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63  OLUMN );.  testc
a270: 61 73 65 28 20 77 2e 65 43 6f 64 65 3d 3d 43 4b  ase( w.eCode==CK
a280: 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 20 29 3b  CNSTRNT_ROWID );
a290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 2e 65  .  testcase( w.e
a2a0: 43 6f 64 65 3d 3d 28 43 4b 43 4e 53 54 52 4e 54  Code==(CKCNSTRNT
a2b0: 5f 52 4f 57 49 44 7c 43 4b 43 4e 53 54 52 4e 54  _ROWID|CKCNSTRNT
a2c0: 5f 43 4f 4c 55 4d 4e 29 20 29 3b 0a 20 20 72 65  _COLUMN) );.  re
a2d0: 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d  turn !w.eCode;.}
a2e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
a2f0: 6e 63 65 20 6f 66 20 74 68 65 20 43 6f 6e 73 74  nce of the Const
a300: 72 61 69 6e 74 41 64 64 72 20 6f 62 6a 65 63 74  raintAddr object
a310: 20 72 65 6d 65 6d 62 65 72 73 20 74 68 65 20 62   remembers the b
a320: 79 74 65 2d 63 6f 64 65 20 61 64 64 72 65 73 73  yte-code address
a330: 65 73 0a 2a 2a 20 66 6f 72 20 73 65 63 74 69 6f  es.** for sectio
a340: 6e 73 20 6f 66 20 74 68 65 20 63 6f 6e 73 74 72  ns of the constr
a350: 61 69 6e 74 20 63 68 65 63 6b 73 20 74 68 61 74  aint checks that
a360: 20 64 65 61 6c 20 77 69 74 68 20 75 6e 69 71 75   deal with uniqu
a370: 65 6e 65 73 73 20 63 6f 6e 73 74 72 61 69 6e 74  eness constraint
a380: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 72 6f 77 69  s.** on the rowi
a390: 64 20 61 6e 64 20 6f 6e 20 74 68 65 20 75 70 73  d and on the ups
a3a0: 65 72 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ert constraint..
a3b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72  **.** This infor
a3c0: 6d 61 74 69 6f 6e 20 69 73 20 70 61 73 73 65 64  mation is passed
a3d0: 20 69 6e 74 6f 20 63 68 65 63 6b 52 65 6f 72 64   into checkReord
a3e0: 65 72 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  erConstraintChec
a3f0: 6b 73 28 29 20 74 6f 20 69 6e 73 65 72 74 0a 2a  ks() to insert.*
a400: 2a 20 73 6f 6d 65 20 4f 50 5f 47 6f 74 6f 20 6f  * some OP_Goto o
a410: 70 65 72 61 74 69 6f 6e 73 20 73 6f 20 74 68 61  perations so tha
a420: 74 20 74 68 65 20 72 6f 77 69 64 20 61 6e 64 20  t the rowid and 
a430: 75 70 73 65 72 74 20 63 6f 6e 73 74 72 61 69 6e  upsert constrain
a440: 74 73 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 74  ts occur.** in t
a450: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
a460: 20 72 65 6c 61 74 69 76 65 20 74 6f 20 6f 74 68   relative to oth
a470: 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  er constraints..
a480: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
a490: 74 20 43 6f 6e 73 74 72 61 69 6e 74 41 64 64 72  t ConstraintAddr
a4a0: 20 43 6f 6e 73 74 72 61 69 6e 74 41 64 64 72 3b   ConstraintAddr;
a4b0: 0a 73 74 72 75 63 74 20 43 6f 6e 73 74 72 61 69  .struct Constrai
a4c0: 6e 74 41 64 64 72 20 7b 0a 20 20 69 6e 74 20 69  ntAddr {.  int i
a4d0: 70 6b 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pkTop;          
a4e0: 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
a4f0: 72 20 72 6f 77 69 64 20 63 6f 6e 73 74 72 61 69  r rowid constrai
a500: 6e 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  nt check */.  in
a510: 74 20 75 70 73 65 72 74 54 6f 70 3b 20 20 20 20  t upsertTop;    
a520: 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
a530: 75 70 73 65 72 74 20 63 6f 6e 73 74 72 61 69 6e  upsert constrain
a540: 74 20 63 68 65 63 6b 20 73 75 62 72 6f 75 74 69  t check subrouti
a550: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 75 70 73 65  ne */.  int upse
a560: 72 74 54 6f 70 32 3b 20 20 20 20 20 20 2f 2a 20  rtTop2;      /* 
a570: 43 6f 70 79 20 6f 66 20 75 70 73 65 72 74 54 6f  Copy of upsertTo
a580: 70 20 6e 6f 74 20 63 6c 65 61 72 65 64 20 62 79  p not cleared by
a590: 20 74 68 65 20 63 61 6c 6c 20 2a 2f 0a 20 20 69   the call */.  i
a5a0: 6e 74 20 75 70 73 65 72 74 42 74 6d 3b 20 20 20  nt upsertBtm;   
a5b0: 20 20 20 20 2f 2a 20 75 70 73 65 72 74 20 63 6f      /* upsert co
a5c0: 6e 73 74 72 61 69 6e 74 20 72 65 74 75 72 6e 73  nstraint returns
a5d0: 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 2a   to this label *
a5e0: 2f 0a 20 20 69 6e 74 20 69 70 6b 42 74 6d 3b 20  /.  int ipkBtm; 
a5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
a600: 72 6e 20 6f 70 63 6f 64 65 20 72 6f 77 69 64 20  rn opcode rowid 
a610: 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
a620: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.};../*.** Ge
a630: 6e 65 72 61 74 65 20 61 6e 79 20 4f 50 5f 47 6f  nerate any OP_Go
a640: 74 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20 6e 65  to operations ne
a650: 65 64 65 64 20 74 6f 20 63 61 75 73 65 20 63 6f  eded to cause co
a660: 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 0a  nstraints to be.
a670: 2a 2a 20 72 75 6e 20 74 68 61 74 20 68 61 76 65  ** run that have
a680: 6e 27 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  n't already been
a690: 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   run..*/.static 
a6a0: 76 6f 69 64 20 72 65 6f 72 64 65 72 43 6f 6e 73  void reorderCons
a6b0: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 56 64 62  traintChecks(Vdb
a6c0: 65 20 2a 76 2c 20 43 6f 6e 73 74 72 61 69 6e 74  e *v, Constraint
a6d0: 41 64 64 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Addr *p){.  if( 
a6e0: 70 2d 3e 75 70 73 65 72 74 54 6f 70 20 29 7b 0a  p->upsertTop ){.
a6f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
a700: 6c 69 74 65 33 56 64 62 65 4c 61 62 65 6c 48 61  lite3VdbeLabelHa
a710: 73 42 65 65 6e 52 65 73 6f 6c 76 65 64 28 76 2c  sBeenResolved(v,
a720: 20 70 2d 3e 75 70 73 65 72 74 54 6f 70 29 20 29   p->upsertTop) )
a730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a740: 65 47 6f 74 6f 28 76 2c 20 70 2d 3e 75 70 73 65  eGoto(v, p->upse
a750: 72 74 54 6f 70 29 3b 0a 20 20 20 20 56 64 62 65  rtTop);.    Vdbe
a760: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c  Comment((v, "cal
a770: 6c 20 75 70 73 65 72 74 20 73 75 62 72 6f 75 74  l upsert subrout
a780: 69 6e 65 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  ine"));.    sqli
a790: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
a7a0: 62 65 6c 28 76 2c 20 70 2d 3e 75 70 73 65 72 74  bel(v, p->upsert
a7b0: 42 74 6d 29 3b 0a 20 20 20 20 70 2d 3e 75 70 73  Btm);.    p->ups
a7c0: 65 72 74 54 6f 70 20 3d 20 30 3b 0a 20 20 7d 0a  ertTop = 0;.  }.
a7d0: 20 20 69 66 28 20 70 2d 3e 69 70 6b 54 6f 70 20    if( p->ipkTop 
a7e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a7f0: 62 65 47 6f 74 6f 28 76 2c 20 70 2d 3e 69 70 6b  beGoto(v, p->ipk
a800: 54 6f 70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Top);.    VdbeCo
a810: 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20  mment((v, "call 
a820: 72 6f 77 69 64 20 75 6e 69 71 75 65 2d 63 68 65  rowid unique-che
a830: 63 6b 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  ck subroutine"))
a840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a850: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 2d 3e  eJumpHere(v, p->
a860: 69 70 6b 42 74 6d 29 3b 0a 20 20 20 20 70 2d 3e  ipkBtm);.    p->
a870: 69 70 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 7d 0a  ipkTop = 0;.  }.
a880: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a890: 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 63 6f 6e  e code to do con
a8a0: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 73 20 70  straint checks p
a8b0: 72 69 6f 72 20 74 6f 20 61 6e 20 49 4e 53 45 52  rior to an INSER
a8c0: 54 20 6f 72 20 61 6e 20 55 50 44 41 54 45 0a 2a  T or an UPDATE.*
a8d0: 2a 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 2e  * on table pTab.
a8e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 4e 65  .**.** The regNe
a8f0: 77 44 61 74 61 20 70 61 72 61 6d 65 74 65 72 20  wData parameter 
a900: 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
a910: 69 73 74 65 72 20 69 6e 20 61 20 72 61 6e 67 65  ister in a range
a920: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
a930: 2a 20 74 68 65 20 64 61 74 61 20 74 6f 20 62 65  * the data to be
a940: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 74 68 65   inserted or the
a950: 20 64 61 74 61 20 61 66 74 65 72 20 74 68 65 20   data after the 
a960: 75 70 64 61 74 65 2e 20 20 54 68 65 72 65 20 77  update.  There w
a970: 69 6c 6c 20 62 65 0a 2a 2a 20 70 54 61 62 2d 3e  ill be.** pTab->
a980: 6e 43 6f 6c 2b 31 20 72 65 67 69 73 74 65 72 73  nCol+1 registers
a990: 20 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2e 20   in this range. 
a9a0: 20 54 68 65 20 66 69 72 73 74 20 72 65 67 69 73   The first regis
a9b0: 74 65 72 20 28 74 68 65 20 6f 6e 65 0a 2a 2a 20  ter (the one.** 
a9c0: 74 68 61 74 20 72 65 67 4e 65 77 44 61 74 61 20  that regNewData 
a9d0: 70 6f 69 6e 74 73 20 74 6f 29 20 77 69 6c 6c 20  points to) will 
a9e0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 65 77 20  contain the new 
a9f0: 72 6f 77 69 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  rowid, or NULL i
aa00: 6e 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 6f 66  n the.** case of
aa10: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
aa20: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 65 63   table.  The sec
aa30: 6f 6e 64 20 72 65 67 69 73 74 65 72 20 69 6e 20  ond register in 
aa40: 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 0a 2a  the range will.*
aa50: 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f  * contain the co
aa60: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72  ntent of the fir
aa70: 73 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  st table column.
aa80: 20 20 54 68 65 20 74 68 69 72 64 20 72 65 67 69    The third regi
aa90: 73 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e  ster will.** con
aaa0: 74 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  tain the content
aab0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 74   of the second t
aac0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 41 6e  able column.  An
aad0: 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a  d so forth..**.*
aae0: 2a 20 54 68 65 20 72 65 67 4f 6c 64 44 61 74 61  * The regOldData
aaf0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 69   parameter is si
ab00: 6d 69 6c 61 72 20 74 6f 20 72 65 67 4e 65 77 44  milar to regNewD
ab10: 61 74 61 20 65 78 63 65 70 74 20 74 68 61 74 20  ata except that 
ab20: 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  it contains.** t
ab30: 68 65 20 64 61 74 61 20 70 72 69 6f 72 20 74 6f  he data prior to
ab40: 20 61 6e 20 55 50 44 41 54 45 20 72 61 74 68 65   an UPDATE rathe
ab50: 72 20 74 68 61 6e 20 61 66 74 65 72 77 61 72 64  r than afterward
ab60: 73 2e 20 20 72 65 67 4f 6c 64 44 61 74 61 20 69  s.  regOldData i
ab70: 73 20 7a 65 72 6f 0a 2a 2a 20 66 6f 72 20 61 6e  s zero.** for an
ab80: 20 49 4e 53 45 52 54 2e 20 20 54 68 69 73 20 72   INSERT.  This r
ab90: 6f 75 74 69 6e 65 20 63 61 6e 20 64 69 73 74 69  outine can disti
aba0: 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 55  nguish between U
abb0: 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54  PDATE and INSERT
abc0: 20 62 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20   by.** checking 
abd0: 72 65 67 4f 6c 64 44 61 74 61 20 66 6f 72 20 7a  regOldData for z
abe0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ero..**.** For a
abf0: 6e 20 55 50 44 41 54 45 2c 20 74 68 65 20 70 6b  n UPDATE, the pk
ac00: 43 68 6e 67 20 62 6f 6f 6c 65 61 6e 20 69 73 20  Chng boolean is 
ac10: 74 72 75 65 20 69 66 20 74 68 65 20 74 72 75 65  true if the true
ac20: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 74 68   primary key (th
ac30: 65 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 61  e.** rowid for a
ac40: 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 20 6f 72   normal table or
ac50: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ac60: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
ac70: 4f 57 49 44 20 74 61 62 6c 65 29 0a 2a 2a 20 6d  OWID table).** m
ac80: 69 67 68 74 20 62 65 20 6d 6f 64 69 66 69 65 64  ight be modified
ac90: 20 62 79 20 74 68 65 20 55 50 44 41 54 45 2e 20   by the UPDATE. 
aca0: 20 49 66 20 70 6b 43 68 6e 67 20 69 73 20 66 61   If pkChng is fa
acb0: 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 6b 65  lse, then the ke
acc0: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 69 44 61 74  y of.** the iDat
acd0: 61 43 75 72 20 63 6f 6e 74 65 6e 74 20 74 61 62  aCur content tab
ace0: 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
acf0: 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64   to be unchanged
ad00: 20 62 79 20 74 68 65 20 55 50 44 41 54 45 2e 0a   by the UPDATE..
ad10: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 53  **.** For an INS
ad20: 45 52 54 2c 20 74 68 65 20 70 6b 43 68 6e 67 20  ERT, the pkChng 
ad30: 62 6f 6f 6c 65 61 6e 20 69 6e 64 69 63 61 74 65  boolean indicate
ad40: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
ad50: 20 74 68 65 20 72 6f 77 69 64 0a 2a 2a 20 77 61   the rowid.** wa
ad60: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  s explicitly spe
ad70: 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
ad80: 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61  f the INSERT sta
ad90: 74 65 6d 65 6e 74 2e 20 20 49 66 20 70 6b 43 68  tement.  If pkCh
ada0: 6e 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 69  ng.** is zero, i
adb0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
adc0: 20 65 69 74 68 65 72 20 72 6f 77 69 64 20 69 73   either rowid is
add0: 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61   computed automa
ade0: 74 69 63 61 6c 6c 79 20 6f 72 0a 2a 2a 20 74 68  tically or.** th
adf0: 61 74 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  at the table is 
ae00: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
ae10: 74 61 62 6c 65 20 61 6e 64 20 68 61 73 20 6e 6f  table and has no
ae20: 20 72 6f 77 69 64 2e 20 20 4f 6e 20 61 6e 20 49   rowid.  On an I
ae30: 4e 53 45 52 54 2c 0a 2a 2a 20 70 6b 43 68 6e 67  NSERT,.** pkChng
ae40: 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 74 72   will only be tr
ae50: 75 65 20 69 66 20 74 68 65 20 49 4e 53 45 52 54  ue if the INSERT
ae60: 20 73 74 61 74 65 6d 65 6e 74 20 70 72 6f 76 69   statement provi
ae70: 64 65 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a  des an integer.*
ae80: 2a 20 76 61 6c 75 65 20 66 6f 72 20 65 69 74 68  * value for eith
ae90: 65 72 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  er the rowid col
aea0: 75 6d 6e 20 6f 72 20 69 74 73 20 49 4e 54 45 47  umn or its INTEG
aeb0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ER PRIMARY KEY a
aec0: 6c 69 61 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lias..**.** The 
aed0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
aee0: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  y this routine w
aef0: 69 6c 6c 20 73 74 6f 72 65 20 6e 65 77 20 69 6e  ill store new in
af00: 64 65 78 20 65 6e 74 72 69 65 73 20 69 6e 74 6f  dex entries into
af10: 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 64  .** registers id
af20: 65 6e 74 69 66 69 65 64 20 62 79 20 61 52 65 67  entified by aReg
af30: 49 64 78 5b 5d 2e 20 20 4e 6f 20 69 6e 64 65 78  Idx[].  No index
af40: 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
af50: 64 20 66 6f 72 0a 2a 2a 20 69 6e 64 69 63 65 73  d for.** indices
af60: 20 77 68 65 72 65 20 61 52 65 67 49 64 78 5b 69   where aRegIdx[i
af70: 5d 3d 3d 30 2e 20 20 54 68 65 20 6f 72 64 65 72  ]==0.  The order
af80: 20 6f 66 20 69 6e 64 69 63 65 73 20 69 6e 20 61   of indices in a
af90: 52 65 67 49 64 78 5b 5d 20 69 73 0a 2a 2a 20 74  RegIdx[] is.** t
afa0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f  he same as the o
afb0: 72 64 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20  rder of indices 
afc0: 6f 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  on the linked li
afd0: 73 74 20 6f 66 20 69 6e 64 69 63 65 73 0a 2a 2a  st of indices.**
afe0: 20 61 74 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   at pTab->pIndex
aff0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
b000: 65 72 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  er must have alr
b010: 65 61 64 79 20 6f 70 65 6e 65 64 20 77 72 69 74  eady opened writ
b020: 65 61 62 6c 65 20 63 75 72 73 6f 72 73 20 6f 6e  eable cursors on
b030: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62   the main.** tab
b040: 6c 65 20 61 6e 64 20 61 6c 6c 20 61 70 70 6c 69  le and all appli
b050: 63 61 62 6c 65 20 69 6e 64 69 63 65 73 20 28 74  cable indices (t
b060: 68 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20 61  hat is to say, a
b070: 6c 6c 20 69 6e 64 69 63 65 73 20 66 6f 72 20 77  ll indices for w
b080: 68 69 63 68 0a 2a 2a 20 61 52 65 67 49 64 78 5b  hich.** aRegIdx[
b090: 5d 20 69 73 20 6e 6f 74 20 7a 65 72 6f 29 2e 20  ] is not zero). 
b0a0: 20 69 44 61 74 61 43 75 72 20 69 73 20 74 68 65   iDataCur is the
b0b0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
b0c0: 6d 61 69 6e 20 74 61 62 6c 65 20 77 68 65 6e 0a  main table when.
b0d0: 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 20  ** inserting or 
b0e0: 75 70 64 61 74 69 6e 67 20 61 20 72 6f 77 69 64  updating a rowid
b0f0: 20 74 61 62 6c 65 2c 20 6f 72 20 74 68 65 20 63   table, or the c
b100: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 50 52  ursor for the PR
b110: 49 4d 41 52 59 20 4b 45 59 0a 2a 2a 20 69 6e 64  IMARY KEY.** ind
b120: 65 78 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e  ex when operatin
b130: 67 20 6f 6e 20 61 20 57 49 54 48 4f 55 54 20 52  g on a WITHOUT R
b140: 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 69 49 64  OWID table.  iId
b150: 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
b160: 6f 72 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69  or.** for the fi
b170: 72 73 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65  rst index in the
b180: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69   pTab->pIndex li
b190: 73 74 2e 20 20 43 75 72 73 6f 72 73 20 66 6f 72  st.  Cursors for
b1a0: 20 6f 74 68 65 72 20 69 6e 64 69 63 65 73 0a 2a   other indices.*
b1b0: 2a 20 61 72 65 20 61 74 20 69 49 64 78 43 75 72  * are at iIdxCur
b1c0: 2b 4e 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  +N for the N-th 
b1d0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70  element of the p
b1e0: 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74  Tab->pIndex list
b1f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b200: 74 69 6e 65 20 61 6c 73 6f 20 67 65 6e 65 72 61  tine also genera
b210: 74 65 73 20 63 6f 64 65 20 74 6f 20 63 68 65 63  tes code to chec
b220: 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  k constraints.  
b230: 4e 4f 54 20 4e 55 4c 4c 2c 0a 2a 2a 20 43 48 45  NOT NULL,.** CHE
b240: 43 4b 2c 20 61 6e 64 20 55 4e 49 51 55 45 20 63  CK, and UNIQUE c
b250: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61  onstraints are a
b260: 6c 6c 20 63 68 65 63 6b 65 64 2e 20 20 49 66 20  ll checked.  If 
b270: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  a constraint fai
b280: 6c 73 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ls,.** then the 
b290: 61 70 70 72 6f 70 72 69 61 74 65 20 61 63 74 69  appropriate acti
b2a0: 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
b2b0: 20 20 54 68 65 72 65 20 61 72 65 20 66 69 76 65    There are five
b2c0: 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 61 63 74   possible.** act
b2d0: 69 6f 6e 73 3a 20 52 4f 4c 4c 42 41 43 4b 2c 20  ions: ROLLBACK, 
b2e0: 41 42 4f 52 54 2c 20 46 41 49 4c 2c 20 52 45 50  ABORT, FAIL, REP
b2f0: 4c 41 43 45 2c 20 61 6e 64 20 49 47 4e 4f 52 45  LACE, and IGNORE
b300: 2e 0a 2a 2a 0a 2a 2a 20 20 43 6f 6e 73 74 72 61  ..**.**  Constra
b310: 69 6e 74 20 74 79 70 65 20 20 41 63 74 69 6f 6e  int type  Action
b320: 20 20 20 20 20 20 20 57 68 61 74 20 48 61 70 70         What Happ
b330: 65 6e 73 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ens.**  --------
b340: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
b350: 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---   ----------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
b380: 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20  *  any          
b390: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 20 20 20      ROLLBACK    
b3a0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   The current tra
b3b0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
b3c0: 65 64 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 20  ed back and.**  
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
b3f0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 72 65 74  lite3_step() ret
b400: 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  urns immediately
b410: 20 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20   with a.**      
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b440: 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f   code of SQLITE_
b450: 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a  CONSTRAINT..**.*
b460: 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20  *  any          
b470: 20 20 20 20 41 42 4f 52 54 20 20 20 20 20 20 20      ABORT       
b480: 20 42 61 63 6b 20 6f 75 74 20 63 68 61 6e 67 65   Back out change
b490: 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  s from the curre
b4a0: 6e 74 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20  nt command.**   
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 6c               onl
b4d0: 79 20 28 64 6f 20 6e 6f 74 20 64 6f 20 61 20 63  y (do not do a c
b4e0: 6f 6d 70 6c 65 74 65 20 72 6f 6c 6c 62 61 63 6b  omplete rollback
b4f0: 29 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  ) then.**       
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 63 61 75 73 65 20 73           cause s
b520: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
b530: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
b540: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ely.**          
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 77 69 74 68 20 53 51 4c 49 54        with SQLIT
b570: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a  E_CONSTRAINT..**
b580: 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20  .**  any        
b590: 20 20 20 20 20 20 46 41 49 4c 20 20 20 20 20 20        FAIL      
b5a0: 20 20 20 53 71 6c 69 74 65 33 5f 73 74 65 70 28     Sqlite3_step(
b5b0: 29 20 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69  ) returns immedi
b5c0: 61 74 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20  ately with a.** 
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b5f0: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
b600: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e  LITE_CONSTRAINT.
b610: 20 20 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 20    The.**        
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74          transact
b640: 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65  ion is not rolle
b650: 64 20 62 61 63 6b 20 61 6e 64 20 61 6e 79 0a 2a  d back and any.*
b660: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 72 69 6f   changes to prio
b690: 72 20 72 6f 77 73 20 61 72 65 20 72 65 74 61 69  r rows are retai
b6a0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20  ned..**.**  any 
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 47 4e               IGN
b6c0: 4f 52 45 20 20 20 20 20 20 20 54 68 65 20 61 74  ORE       The at
b6d0: 74 65 6d 70 74 20 69 6e 20 69 6e 73 65 72 74 20  tempt in insert 
b6e0: 6f 72 20 75 70 64 61 74 65 20 74 68 65 20 63 75  or update the cu
b6f0: 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  rrent.**        
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 72 6f 77 20 69 73 20 73          row is s
b720: 6b 69 70 70 65 64 2c 20 77 69 74 68 6f 75 74 20  kipped, without 
b730: 74 68 72 6f 77 69 6e 67 20 61 6e 20 65 72 72 6f  throwing an erro
b740: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r..**           
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 50 72 6f 63 65 73 73 69 6e 67 20       Processing 
b770: 63 6f 6e 74 69 6e 75 65 73 20 77 69 74 68 20 74  continues with t
b780: 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2a 20  he next row..** 
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b7b0: 54 68 65 72 65 20 69 73 20 61 6e 20 69 6d 6d 65  There is an imme
b7c0: 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 69 67  diate jump to ig
b7d0: 6e 6f 72 65 44 65 73 74 2e 29 0a 2a 2a 0a 2a 2a  noreDest.).**.**
b7e0: 20 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20    NOT NULL      
b7f0: 20 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20     REPLACE      
b800: 54 68 65 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69  The NULL value i
b810: 73 20 72 65 70 6c 61 63 65 20 62 79 20 74 68 65  s replace by the
b820: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65             value
b850: 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e   for that column
b860: 2e 20 20 49 66 20 74 68 65 20 64 65 66 61 75 6c  .  If the defaul
b870: 74 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20  t value.**      
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 20 20 20 20 20 20 69 73 20 4e 55 4c            is NUL
b8a0: 4c 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73  L, the action is
b8b0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 41 42 4f   the same as ABO
b8c0: 52 54 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e 49 51 55  RT..**.**  UNIQU
b8d0: 45 20 20 20 20 20 20 20 20 20 20 20 52 45 50 4c  E           REPL
b8e0: 41 43 45 20 20 20 20 20 20 54 68 65 20 6f 74 68  ACE      The oth
b8f0: 65 72 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 66  er row that conf
b900: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 72  licts with the r
b910: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 62 65 69 6e 67 20 69 6e 73 65 72       being inser
b940: 74 65 64 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a  ted is removed..
b950: 2a 2a 0a 2a 2a 20 20 43 48 45 43 4b 20 20 20 20  **.**  CHECK    
b960: 20 20 20 20 20 20 20 20 52 45 50 4c 41 43 45 20          REPLACE 
b970: 20 20 20 20 20 49 6c 6c 65 67 61 6c 2e 20 20 54       Illegal.  T
b980: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  he results in an
b990: 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a   exception..**.*
b9a0: 2a 20 57 68 69 63 68 20 61 63 74 69 6f 6e 20 74  * Which action t
b9b0: 6f 20 74 61 6b 65 20 69 73 20 64 65 74 65 72 6d  o take is determ
b9c0: 69 6e 65 64 20 62 79 20 74 68 65 20 6f 76 65 72  ined by the over
b9d0: 72 69 64 65 45 72 72 6f 72 20 70 61 72 61 6d 65  rideError parame
b9e0: 74 65 72 2e 0a 2a 2a 20 4f 72 20 69 66 20 6f 76  ter..** Or if ov
b9f0: 65 72 72 69 64 65 45 72 72 6f 72 3d 3d 4f 45 5f  errideError==OE_
ba00: 44 65 66 61 75 6c 74 2c 20 74 68 65 6e 20 74 68  Default, then th
ba10: 65 20 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f  e pParse->onErro
ba20: 72 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 69  r parameter.** i
ba30: 73 20 75 73 65 64 2e 20 20 4f 72 20 69 66 20 70  s used.  Or if p
ba40: 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Parse->onError==
ba50: 4f 45 5f 44 65 66 61 75 6c 74 20 74 68 65 6e 20  OE_Default then 
ba60: 74 68 65 20 6f 6e 45 72 72 6f 72 20 76 61 6c 75  the onError valu
ba70: 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6e  e.** for the con
ba80: 73 74 72 61 69 6e 74 20 69 73 20 75 73 65 64 2e  straint is used.
ba90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
baa0: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
bab0: 6e 74 43 68 65 63 6b 73 28 0a 20 20 50 61 72 73  ntChecks(.  Pars
bac0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bad0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
bae0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
baf0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
bb00: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
bb10: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20  ing inserted or 
bb20: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  updated */.  int
bb30: 20 2a 61 52 65 67 49 64 78 2c 20 20 20 20 20 20   *aRegIdx,      
bb40: 20 20 2f 2a 20 55 73 65 20 72 65 67 69 73 74 65    /* Use registe
bb50: 72 20 61 52 65 67 49 64 78 5b 69 5d 20 66 6f 72  r aRegIdx[i] for
bb60: 20 69 6e 64 65 78 20 69 2e 20 20 30 20 66 6f 72   index i.  0 for
bb70: 20 75 6e 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74   unused */.  int
bb80: 20 69 44 61 74 61 43 75 72 2c 20 20 20 20 20 20   iDataCur,      
bb90: 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 64    /* Canonical d
bba0: 61 74 61 20 63 75 72 73 6f 72 20 28 6d 61 69 6e  ata cursor (main
bbb0: 20 74 61 62 6c 65 20 6f 72 20 50 4b 20 69 6e 64   table or PK ind
bbc0: 65 78 29 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ex) */.  int iId
bbd0: 78 43 75 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  xCur,         /*
bbe0: 20 46 69 72 73 74 20 69 6e 64 65 78 20 63 75 72   First index cur
bbf0: 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  sor */.  int reg
bc00: 4e 65 77 44 61 74 61 2c 20 20 20 20 20 20 2f 2a  NewData,      /*
bc10: 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20   First register 
bc20: 69 6e 20 61 20 72 61 6e 67 65 20 68 6f 6c 64 69  in a range holdi
bc30: 6e 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73  ng values to ins
bc40: 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ert */.  int reg
bc50: 4f 6c 64 44 61 74 61 2c 20 20 20 20 20 20 2f 2a  OldData,      /*
bc60: 20 50 72 65 76 69 6f 75 73 20 63 6f 6e 74 65 6e   Previous conten
bc70: 74 2e 20 20 30 20 66 6f 72 20 49 4e 53 45 52 54  t.  0 for INSERT
bc80: 73 20 2a 2f 0a 20 20 75 38 20 70 6b 43 68 6e 67  s */.  u8 pkChng
bc90: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
bca0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 72  on-zero if the r
bcb0: 6f 77 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20  owid or PRIMARY 
bcc0: 4b 45 59 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  KEY changed */. 
bcd0: 20 75 38 20 6f 76 65 72 72 69 64 65 45 72 72 6f   u8 overrideErro
bce0: 72 2c 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64  r,    /* Overrid
bcf0: 65 20 6f 6e 45 72 72 6f 72 20 74 6f 20 74 68 69  e onError to thi
bd00: 73 20 69 66 20 6e 6f 74 20 4f 45 5f 44 65 66 61  s if not OE_Defa
bd10: 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e  ult */.  int ign
bd20: 6f 72 65 44 65 73 74 2c 20 20 20 20 20 20 2f 2a  oreDest,      /*
bd30: 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
bd40: 62 65 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49 67 6e  bel on an OE_Ign
bd50: 6f 72 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 2a  ore resolution *
bd60: 2f 0a 20 20 69 6e 74 20 2a 70 62 4d 61 79 52 65  /.  int *pbMayRe
bd70: 70 6c 61 63 65 2c 20 20 20 2f 2a 20 4f 55 54 3a  place,   /* OUT:
bd80: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
bd90: 63 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 63  constraint may c
bda0: 61 75 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a  ause a replace *
bdb0: 2f 0a 20 20 69 6e 74 20 2a 61 69 43 68 6e 67 2c  /.  int *aiChng,
bdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75           /* colu
bdd0: 6d 6e 20 69 20 69 73 20 75 6e 63 68 61 6e 67 65  mn i is unchange
bde0: 64 20 69 66 20 61 69 43 68 6e 67 5b 69 5d 3c 30  d if aiChng[i]<0
bdf0: 20 2a 2f 0a 20 20 55 70 73 65 72 74 20 2a 70 55   */.  Upsert *pU
be00: 70 73 65 72 74 20 20 20 20 20 20 2f 2a 20 4f 4e  psert      /* ON
be10: 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
be20: 73 2c 20 69 66 20 61 6e 79 2e 20 20 4e 55 4c 4c  s, if any.  NULL
be30: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 29 7b   otherwise */.){
be40: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
be50: 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20          /* VDBE 
be60: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 74 69 6f  under construtio
be70: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
be80: 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  dx;         /* P
be90: 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6f 66  ointer to one of
bea0: 20 74 68 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a   the indices */.
beb0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
bec0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 52  ;      /* The PR
bed0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
bee0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
bef0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
bf00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
bf10: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
bf20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
bf30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bf40: 69 6e 74 20 69 78 3b 20 20 20 20 20 20 20 20 20  int ix;         
bf50: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 6f       /* Index lo
bf60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bf70: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
bf80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bf90: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  f columns */.  i
bfa0: 6e 74 20 6f 6e 45 72 72 6f 72 3b 20 20 20 20 20  nt onError;     
bfb0: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
bfc0: 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74  resolution strat
bfd0: 65 67 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  egy */.  int add
bfe0: 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r1;           /*
bff0: 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70   Address of jump
c000: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
c010: 20 20 69 6e 74 20 73 65 65 6e 52 65 70 6c 61 63    int seenReplac
c020: 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  e = 0; /* True i
c030: 66 20 52 45 50 4c 41 43 45 20 69 73 20 75 73 65  f REPLACE is use
c040: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 49 4e 54  d to resolve INT
c050: 20 50 4b 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   PK conflict */.
c060: 20 20 69 6e 74 20 6e 50 6b 46 69 65 6c 64 3b 20    int nPkField; 
c070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c080: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 50 52   of fields in PR
c090: 49 4d 41 52 59 20 4b 45 59 2e 20 31 20 66 6f 72  IMARY KEY. 1 for
c0a0: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
c0b0: 0a 20 20 43 6f 6e 73 74 72 61 69 6e 74 41 64 64  .  ConstraintAdd
c0c0: 72 20 73 41 64 64 72 3b 2f 2a 20 41 64 64 72 65  r sAddr;/* Addre
c0d0: 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ss information f
c0e0: 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  or constraint re
c0f0: 6f 72 64 65 72 69 6e 67 20 2a 2f 0a 20 20 49 6e  ordering */.  In
c100: 64 65 78 20 2a 70 55 70 49 64 78 20 3d 20 30 3b  dex *pUpIdx = 0;
c110: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
c120: 68 69 63 68 20 74 6f 20 61 70 70 6c 79 20 74 68  hich to apply th
c130: 65 20 75 70 73 65 72 74 20 2a 2f 0a 20 20 75 38  e upsert */.  u8
c140: 20 69 73 55 70 64 61 74 65 3b 20 20 20 20 20 20   isUpdate;      
c150: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
c160: 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
c170: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  operation */.  u
c180: 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20  8 bAffinityDone 
c190: 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69 66  = 0;  /* True if
c1a0: 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
c1b0: 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20 62   operation has b
c1c0: 65 65 6e 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74  een run */.  int
c1d0: 20 75 70 73 65 72 74 42 79 70 61 73 73 20 3d 20   upsertBypass = 
c1e0: 30 3b 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  0;  /* Address o
c1f0: 66 20 47 6f 74 6f 20 74 6f 20 62 79 70 61 73 73  f Goto to bypass
c200: 20 75 70 73 65 72 74 20 73 75 62 72 6f 75 74 69   upsert subrouti
c210: 6e 65 20 2a 2f 0a 0a 20 20 69 73 55 70 64 61 74  ne */..  isUpdat
c220: 65 20 3d 20 72 65 67 4f 6c 64 44 61 74 61 21 3d  e = regOldData!=
c230: 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  0;.  db = pParse
c240: 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ->db;.  v = sqli
c250: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c260: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
c270: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c280: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
c290: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62   );  /* This tab
c2a0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57  le is not a VIEW
c2b0: 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 54 61   */.  nCol = pTa
c2c0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 6d 65 6d 73 65  b->nCol;.  memse
c2d0: 74 28 26 73 41 64 64 72 2c 20 30 2c 20 73 69 7a  t(&sAddr, 0, siz
c2e0: 65 6f 66 28 73 41 64 64 72 29 29 3b 0a 20 20 0a  eof(sAddr));.  .
c2f0: 20 20 2f 2a 20 70 50 6b 20 69 73 20 74 68 65 20    /* pPk is the 
c300: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
c310: 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
c320: 57 49 44 20 74 61 62 6c 65 73 20 61 6e 64 20 4e  WID tables and N
c330: 55 4c 4c 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 72  ULL for.  ** nor
c340: 6d 61 6c 20 72 6f 77 69 64 20 74 61 62 6c 65 73  mal rowid tables
c350: 2e 20 20 6e 50 6b 46 69 65 6c 64 20 69 73 20 74  .  nPkField is t
c360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79  he number of key
c370: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 0a   fields in the .
c380: 20 20 2a 2a 20 70 50 6b 20 69 6e 64 65 78 20 6f    ** pPk index o
c390: 72 20 31 20 66 6f 72 20 61 20 72 6f 77 69 64 20  r 1 for a rowid 
c3a0: 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
c3b0: 20 77 6f 72 64 73 2c 20 6e 50 6b 46 69 65 6c 64   words, nPkField
c3c0: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d   is the.  ** num
c3d0: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
c3e0: 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61 72   the true primar
c3f0: 79 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62  y key of the tab
c400: 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 48 61 73  le. */.  if( Has
c410: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
c420: 20 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20     pPk = 0;.    
c430: 6e 50 6b 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  nPkField = 1;.  
c440: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d  }else{.    pPk =
c450: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
c460: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
c470: 20 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20 70 50     nPkField = pP
c480: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a  k->nKeyCol;.  }.
c490: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 61  .  /* Record tha
c4a0: 74 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  t this module ha
c4b0: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 56  s started */.  V
c4c0: 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
c4d0: 28 28 76 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e  ((v, "BEGIN: Gen
c4e0: 43 6e 73 74 43 6b 73 28 25 64 2c 25 64 2c 25 64  CnstCks(%d,%d,%d
c4f0: 2c 25 64 2c 25 64 29 22 2c 0a 20 20 20 20 20 20  ,%d,%d)",.      
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c510: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
c520: 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20 72 65  , regNewData, re
c530: 67 4f 6c 64 44 61 74 61 2c 20 70 6b 43 68 6e 67  gOldData, pkChng
c540: 29 29 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61  ));..  /* Test a
c550: 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  ll NOT NULL cons
c560: 74 72 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  traints..  */.  
c570: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
c580: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
c590: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b  ==pTab->iPKey ){
c5a0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
c5b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 57 49 44          /* ROWID
c5c0: 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 20 2a   is never NULL *
c5d0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
c5e0: 61 69 43 68 6e 67 20 26 26 20 61 69 43 68 6e 67  aiChng && aiChng
c5f0: 5b 69 5d 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f  [i]<0 ){.      /
c600: 2a 20 44 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  * Don't bother c
c610: 68 65 63 6b 69 6e 67 20 66 6f 72 20 4e 4f 54 20  hecking for NOT 
c620: 4e 55 4c 4c 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20  NULL on columns 
c630: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e  that do not chan
c640: 67 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  ge */.      cont
c650: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
c660: 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e  onError = pTab->
c670: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 3b  aCol[i].notNull;
c680: 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
c690: 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74  ==OE_None ) cont
c6a0: 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 63  inue;  /* This c
c6b0: 6f 6c 75 6d 6e 20 69 73 20 61 6c 6c 6f 77 65 64  olumn is allowed
c6c0: 20 74 6f 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20   to be NULL */. 
c6d0: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
c6e0: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
c6f0: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
c700: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
c710: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
c720: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
c730: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e  ault ){.      on
c740: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
c750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c760: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
c770: 61 63 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  ace && pTab->aCo
c780: 6c 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b  l[i].pDflt==0 ){
c790: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
c7a0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
c7b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45  .    assert( onE
c7c0: 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  rror==OE_Rollbac
c7d0: 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  k || onError==OE
c7e0: 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f  _Abort || onErro
c7f0: 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  r==OE_Fail.     
c800: 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f     || onError==O
c810: 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72  E_Ignore || onEr
c820: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
c830: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
c840: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
c850: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20  case OE_Abort:. 
c860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
c870: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
c880: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
c890: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 20  through */.     
c8a0: 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
c8b0: 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  k:.      case OE
c8c0: 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20  _Fail: {.       
c8d0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
c8e0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c8f0: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
c900: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
c930: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
c940: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c950: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c960: 5f 48 61 6c 74 49 66 4e 75 6c 6c 2c 20 53 51 4c  _HaltIfNull, SQL
c970: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
c980: 4f 54 4e 55 4c 4c 2c 20 6f 6e 45 72 72 6f 72 2c  OTNULL, onError,
c990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c9a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4e 65             regNe
c9b0: 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20  wData+1+i);.    
c9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c9d0: 70 70 65 6e 64 50 34 28 76 2c 20 7a 4d 73 67 2c  ppendP4(v, zMsg,
c9e0: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
c9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ca00: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 50 35 5f  eChangeP5(v, P5_
ca10: 43 6f 6e 73 74 72 61 69 6e 74 4e 6f 74 4e 75 6c  ConstraintNotNul
ca20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
ca30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ca40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca50: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
ca60: 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20  E_Ignore: {.    
ca70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ca80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
ca90: 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31  ll, regNewData+1
caa0: 2b 69 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b  +i, ignoreDest);
cab0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
cac0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
cad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
cae0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
caf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
cb00: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ( onError==OE_Re
cb10: 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20  place );.       
cb20: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
cb30: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
cb40: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 4e 65 77  _NotNull, regNew
cb50: 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20 20  Data+1+i);.     
cb60: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
cb70: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
cb80: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
cb90: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f  Parse, pTab->aCo
cba0: 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 4e  l[i].pDflt, regN
cbb0: 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20  ewData+1+i);.   
cbc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cbd0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cbe0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
cbf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
cc00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
cc10: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
cc20: 61 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66 6e 64  aints.  */.#ifnd
cc30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
cc40: 48 45 43 4b 0a 20 20 69 66 28 20 70 54 61 62 2d  HECK.  if( pTab-
cc50: 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e  >pCheck && (db->
cc60: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
cc70: 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20  gnoreChecks)==0 
cc80: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
cc90: 2a 70 43 68 65 63 6b 20 3d 20 70 54 61 62 2d 3e  *pCheck = pTab->
cca0: 70 43 68 65 63 6b 3b 0a 20 20 20 20 70 50 61 72  pCheck;.    pPar
ccb0: 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 2d  se->iSelfTab = -
ccc0: 28 72 65 67 4e 65 77 44 61 74 61 2b 31 29 3b 0a  (regNewData+1);.
ccd0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
cce0: 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f  errideError!=OE_
ccf0: 44 65 66 61 75 6c 74 20 3f 20 6f 76 65 72 72 69  Default ? overri
cd00: 64 65 45 72 72 6f 72 20 3a 20 4f 45 5f 41 62 6f  deError : OE_Abo
cd10: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  rt;.    for(i=0;
cd20: 20 69 3c 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72   i<pCheck->nExpr
cd30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
cd40: 74 20 61 6c 6c 4f 6b 3b 0a 20 20 20 20 20 20 45  t allOk;.      E
cd50: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 68  xpr *pExpr = pCh
cd60: 65 63 6b 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  eck->a[i].pExpr;
cd70: 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 68 6e  .      if( aiChn
cd80: 67 20 26 26 20 63 68 65 63 6b 43 6f 6e 73 74 72  g && checkConstr
cd90: 61 69 6e 74 55 6e 63 68 61 6e 67 65 64 28 70 45  aintUnchanged(pE
cda0: 78 70 72 2c 20 61 69 43 68 6e 67 2c 20 70 6b 43  xpr, aiChng, pkC
cdb0: 68 6e 67 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  hng) ) continue;
cdc0: 0a 20 20 20 20 20 20 61 6c 6c 4f 6b 20 3d 20 73  .      allOk = s
cdd0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cde0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
cdf0: 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 41  lite3VdbeVerifyA
ce00: 62 6f 72 74 61 62 6c 65 28 76 2c 20 6f 6e 45 72  bortable(v, onEr
ce10: 72 6f 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ror);.      sqli
ce20: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
ce30: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 6c 6c  arse, pExpr, all
ce40: 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  Ok, SQLITE_JUMPI
ce50: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66  FNULL);.      if
ce60: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67  ( onError==OE_Ig
ce70: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
ce80: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
ce90: 76 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a  v, ignoreDest);.
cea0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ceb0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
cec0: 20 3d 20 70 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e   = pCheck->a[i].
ced0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
cee0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e  f( zName==0 ) zN
cef0: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
cf00: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  e;.        if( o
cf10: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
cf20: 63 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f  ce ) onError = O
cf30: 45 5f 41 62 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a  E_Abort; /* IMP:
cf40: 20 52 2d 31 35 35 36 39 2d 36 33 36 32 35 20 2a   R-15569-63625 *
cf50: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
cf60: 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
cf70: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
cf80: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 2c  ONSTRAINT_CHECK,
cf90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
cfb0: 6e 45 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c 20 50  nError, zName, P
cfc0: 34 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20 20 20  4_TRANSIENT,.   
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
cff0: 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 29 3b 0a  nstraintCheck);.
d000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
d010: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d020: 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b  Label(v, allOk);
d030: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
d040: 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b  e->iSelfTab = 0;
d050: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
d060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d070: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
d080: 20 2f 2a 20 55 4e 49 51 55 45 20 61 6e 64 20 50   /* UNIQUE and P
d090: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
d0a0: 72 61 69 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  raints should be
d0b0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 20   handled in the 
d0c0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 6f  following.  ** o
d0d0: 72 64 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rder:.  **.  ** 
d0e0: 20 20 28 31 29 20 20 4f 45 5f 41 62 6f 72 74 2c    (1)  OE_Abort,
d0f0: 20 4f 45 5f 46 61 69 6c 2c 20 4f 45 5f 52 6f 6c   OE_Fail, OE_Rol
d100: 6c 62 61 63 6b 2c 20 4f 45 5f 49 67 6e 6f 72 65  lback, OE_Ignore
d110: 0a 20 20 2a 2a 20 20 20 28 32 29 20 20 4f 45 5f  .  **   (2)  OE_
d120: 55 70 64 61 74 65 0a 20 20 2a 2a 20 20 20 28 33  Update.  **   (3
d130: 29 20 20 4f 45 5f 52 65 70 6c 61 63 65 0a 20 20  )  OE_Replace.  
d140: 2a 2a 0a 20 20 2a 2a 20 4f 45 5f 46 61 69 6c 20  **.  ** OE_Fail 
d150: 61 6e 64 20 4f 45 5f 49 67 6e 6f 72 65 20 6d 75  and OE_Ignore mu
d160: 73 74 20 68 61 70 70 65 6e 20 62 65 66 6f 72 65  st happen before
d170: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
d180: 20 6d 61 64 65 2e 0a 20 20 2a 2a 20 4f 45 5f 55   made..  ** OE_U
d190: 70 64 61 74 65 20 67 75 61 72 61 6e 74 65 65 73  pdate guarantees
d1a0: 20 74 68 61 74 20 6f 6e 6c 79 20 61 20 73 69 6e   that only a sin
d1b0: 67 6c 65 20 72 6f 77 20 77 69 6c 6c 20 63 68 61  gle row will cha
d1c0: 6e 67 65 2c 20 73 6f 20 69 74 0a 20 20 2a 2a 20  nge, so it.  ** 
d1d0: 6d 75 73 74 20 68 61 70 70 65 6e 20 62 65 66 6f  must happen befo
d1e0: 72 65 20 4f 45 5f 52 65 70 6c 61 63 65 2e 20 20  re OE_Replace.  
d1f0: 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 4f 45 5f  Technically, OE_
d200: 41 62 6f 72 74 20 61 6e 64 20 4f 45 5f 52 6f 6c  Abort and OE_Rol
d210: 6c 62 61 63 6b 0a 20 20 2a 2a 20 63 6f 75 6c 64  lback.  ** could
d220: 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 79 20 6f   happen in any o
d230: 72 64 65 72 2c 20 62 75 74 20 74 68 65 79 20 61  rder, but they a
d240: 72 65 20 67 72 6f 75 70 65 64 20 75 70 20 66 72  re grouped up fr
d250: 6f 6e 74 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  ont for.  ** con
d260: 76 65 6e 69 65 6e 63 65 2e 0a 20 20 2a 2a 0a 20  venience..  **. 
d270: 20 2a 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 63   ** Constraint c
d280: 68 65 63 6b 69 6e 67 20 63 6f 64 65 20 69 73 20  hecking code is 
d290: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 69  generated in thi
d2a0: 73 20 6f 72 64 65 72 3a 0a 20 20 2a 2a 20 20 20  s order:.  **   
d2b0: 28 41 29 20 20 54 68 65 20 72 6f 77 69 64 20 63  (A)  The rowid c
d2c0: 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 20  onstraint.  **  
d2d0: 20 28 42 29 20 20 55 6e 69 71 75 65 20 69 6e 64   (B)  Unique ind
d2e0: 65 78 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ex constraints t
d2f0: 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
d300: 4f 45 5f 52 65 70 6c 61 63 65 20 61 73 20 74 68  OE_Replace as th
d310: 65 69 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  eir.  **        
d320: 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c 69 63 74  default conflict
d330: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61   resolution stra
d340: 74 65 67 79 0a 20 20 2a 2a 20 20 20 28 43 29 20  tegy.  **   (C) 
d350: 20 55 6e 69 71 75 65 20 69 6e 64 65 78 20 74 68   Unique index th
d360: 61 74 20 64 6f 20 75 73 65 20 4f 45 5f 52 65 70  at do use OE_Rep
d370: 6c 61 63 65 20 62 79 20 64 65 66 61 75 6c 74 2e  lace by default.
d380: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6f  .  **.  ** The o
d390: 72 64 65 72 69 6e 67 20 6f 66 20 28 32 29 20 61  rdering of (2) a
d3a0: 6e 64 20 28 33 29 20 69 73 20 61 63 63 6f 6d 70  nd (3) is accomp
d3b0: 6c 69 73 68 65 64 20 62 79 20 6d 61 6b 69 6e 67  lished by making
d3c0: 20 73 75 72 65 20 74 68 65 20 6c 69 6e 6b 65 64   sure the linked
d3d0: 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 69 6e  .  ** list of in
d3e0: 64 65 78 65 73 20 61 74 74 61 63 68 65 64 20 74  dexes attached t
d3f0: 6f 20 61 20 74 61 62 6c 65 20 70 75 74 73 20 61  o a table puts a
d400: 6c 6c 20 4f 45 5f 52 65 70 6c 61 63 65 20 69 6e  ll OE_Replace in
d410: 64 65 78 65 73 20 6c 61 73 74 0a 20 20 2a 2a 20  dexes last.  ** 
d420: 69 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 53 65  in the list.  Se
d430: 65 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  e sqlite3CreateI
d440: 6e 64 65 78 28 29 20 66 6f 72 20 77 68 65 72 65  ndex() for where
d450: 20 74 68 61 74 20 68 61 70 70 65 6e 73 2e 0a 20   that happens.. 
d460: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 55 70 73 65   */..  if( pUpse
d470: 72 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 55  rt ){.    if( pU
d480: 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 54 61  psert->pUpsertTa
d490: 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rget==0 ){.     
d4a0: 20 2f 2a 20 41 6e 20 4f 4e 20 43 4f 4e 46 4c 49   /* An ON CONFLI
d4b0: 43 54 20 44 4f 20 4e 4f 54 48 49 4e 47 20 63 6c  CT DO NOTHING cl
d4c0: 61 75 73 65 2c 20 77 69 74 68 6f 75 74 20 61 20  ause, without a 
d4d0: 63 6f 6e 73 74 72 61 69 6e 74 2d 74 61 72 67 65  constraint-targe
d4e0: 74 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65  t..      ** Make
d4f0: 20 61 6c 6c 20 75 6e 69 71 75 65 20 63 6f 6e 73   all unique cons
d500: 74 72 61 69 6e 74 20 72 65 73 6f 6c 75 74 69 6f  traint resolutio
d510: 6e 20 62 65 20 4f 45 5f 49 67 6e 6f 72 65 20 2a  n be OE_Ignore *
d520: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
d530: 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74  pUpsert->pUpsert
d540: 53 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Set==0 );.      
d550: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 20 3d 20  overrideError = 
d560: 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 20 20 20  OE_Ignore;.     
d570: 20 70 55 70 73 65 72 74 20 3d 20 30 3b 0a 20 20   pUpsert = 0;.  
d580: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55 70    }else if( (pUp
d590: 49 64 78 20 3d 20 70 55 70 73 65 72 74 2d 3e 70  Idx = pUpsert->p
d5a0: 55 70 73 65 72 74 49 64 78 29 21 3d 30 20 29 7b  UpsertIdx)!=0 ){
d5b0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
d5c0: 20 63 6f 6e 73 74 72 61 69 6e 74 2d 74 61 72 67   constraint-targ
d5d0: 65 74 20 69 73 20 6f 6e 20 73 6f 6d 65 20 63 6f  et is on some co
d5e0: 6c 75 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e 0a  lumn other than.
d5f0: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 52 4f        ** then RO
d600: 57 49 44 2c 20 74 68 65 6e 20 77 65 20 6d 69 67  WID, then we mig
d610: 68 74 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ht need to move 
d620: 74 68 65 20 55 50 53 45 52 54 20 61 72 6f 75 6e  the UPSERT aroun
d630: 64 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68  d.      ** so th
d640: 61 74 20 69 74 20 6f 63 63 75 72 73 20 69 6e 20  at it occurs in 
d650: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
d660: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 41 64 64  r. */.      sAdd
d670: 72 2e 75 70 73 65 72 74 54 6f 70 20 3d 20 73 41  r.upsertTop = sA
d680: 64 64 72 2e 75 70 73 65 72 74 54 6f 70 32 20 3d  ddr.upsertTop2 =
d690: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d6a0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d6b0: 73 41 64 64 72 2e 75 70 73 65 72 74 42 74 6d 20  sAddr.upsertBtm 
d6c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d6d0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d  eLabel(v);.    }
d6e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 72 6f  .  }..  /* If ro
d6f0: 77 69 64 20 69 73 20 63 68 61 6e 67 69 6e 67 2c  wid is changing,
d700: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   make sure the n
d710: 65 77 20 72 6f 77 69 64 20 64 6f 65 73 20 6e 6f  ew rowid does no
d720: 74 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a  t previously.  *
d730: 2a 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 74  * exist in the t
d740: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
d750: 20 70 6b 43 68 6e 67 20 26 26 20 70 50 6b 3d 3d   pkChng && pPk==
d760: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
d770: 72 52 6f 77 69 64 4f 6b 20 3d 20 73 71 6c 69 74  rRowidOk = sqlit
d780: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d790: 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75  v);..    /* Figu
d7a0: 72 65 20 6f 75 74 20 77 68 61 74 20 61 63 74 69  re out what acti
d7b0: 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61  on to take in ca
d7c0: 73 65 20 6f 66 20 61 20 72 6f 77 69 64 20 63 6f  se of a rowid co
d7d0: 6c 6c 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 6f  llision */.    o
d7e0: 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 6b  nError = pTab->k
d7f0: 65 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20  eyConf;.    if( 
d800: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f  overrideError!=O
d810: 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  E_Default ){.   
d820: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65     onError = ove
d830: 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20 20  rrideError;.    
d840: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f  }else if( onErro
d850: 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
d860: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
d870: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
d880: 0a 0a 20 20 20 20 2f 2a 20 66 69 67 75 72 65 20  ..    /* figure 
d890: 6f 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e  out whether or n
d8a0: 6f 74 20 75 70 73 65 72 74 20 61 70 70 6c 69 65  ot upsert applie
d8b0: 73 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 2a  s in this case *
d8c0: 2f 0a 20 20 20 20 69 66 28 20 70 55 70 73 65 72  /.    if( pUpser
d8d0: 74 20 26 26 20 70 55 70 73 65 72 74 2d 3e 70 55  t && pUpsert->pU
d8e0: 70 73 65 72 74 49 64 78 3d 3d 30 20 29 7b 0a 20  psertIdx==0 ){. 
d8f0: 20 20 20 20 20 69 66 28 20 70 55 70 73 65 72 74       if( pUpsert
d900: 2d 3e 70 55 70 73 65 72 74 53 65 74 3d 3d 30 20  ->pUpsertSet==0 
d910: 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ){.        onErr
d920: 6f 72 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 20  or = OE_Ignore; 
d930: 20 2f 2a 20 44 4f 20 4e 4f 54 48 49 4e 47 20 69   /* DO NOTHING i
d940: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 49 4e  s the same as IN
d950: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 2a  SERT OR IGNORE *
d960: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
d970: 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d         onError =
d980: 20 4f 45 5f 55 70 64 61 74 65 3b 20 20 2f 2a 20   OE_Update;  /* 
d990: 44 4f 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20  DO UPDATE */.   
d9a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d9b0: 2f 2a 20 49 66 20 74 68 65 20 72 65 73 70 6f 6e  /* If the respon
d9c0: 73 65 20 74 6f 20 61 20 72 6f 77 69 64 20 63 6f  se to a rowid co
d9d0: 6e 66 6c 69 63 74 20 69 73 20 52 45 50 4c 41 43  nflict is REPLAC
d9e0: 45 20 62 75 74 20 74 68 65 20 72 65 73 70 6f 6e  E but the respon
d9f0: 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 73 6f 6d  se.    ** to som
da00: 65 20 6f 74 68 65 72 20 55 4e 49 51 55 45 20 63  e other UNIQUE c
da10: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 46 41 49  onstraint is FAI
da20: 4c 20 6f 72 20 49 47 4e 4f 52 45 2c 20 74 68 65  L or IGNORE, the
da30: 6e 20 77 65 20 6e 65 65 64 0a 20 20 20 20 2a 2a  n we need.    **
da40: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 72 75   to defer the ru
da50: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72 6f 77  nning of the row
da60: 69 64 20 63 6f 6e 66 6c 69 63 74 20 63 68 65 63  id conflict chec
da70: 6b 69 6e 67 20 75 6e 74 69 6c 20 61 66 74 65 72  king until after
da80: 0a 20 20 20 20 2a 2a 20 74 68 65 20 55 4e 49 51  .    ** the UNIQ
da90: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68  UE constraints h
daa0: 61 76 65 20 72 75 6e 2e 0a 20 20 20 20 2a 2f 0a  ave run..    */.
dab0: 20 20 20 20 61 73 73 65 72 74 28 20 4f 45 5f 55      assert( OE_U
dac0: 70 64 61 74 65 3e 4f 45 5f 52 65 70 6c 61 63 65  pdate>OE_Replace
dad0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
dae0: 4f 45 5f 49 67 6e 6f 72 65 3c 4f 45 5f 52 65 70  OE_Ignore<OE_Rep
daf0: 6c 61 63 65 20 29 3b 0a 20 20 20 20 61 73 73 65  lace );.    asse
db00: 72 74 28 20 4f 45 5f 46 61 69 6c 3c 4f 45 5f 52  rt( OE_Fail<OE_R
db10: 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 61 73  eplace );.    as
db20: 73 65 72 74 28 20 4f 45 5f 41 62 6f 72 74 3c 4f  sert( OE_Abort<O
db30: 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20  E_Replace );.   
db40: 20 61 73 73 65 72 74 28 20 4f 45 5f 52 6f 6c 6c   assert( OE_Roll
db50: 62 61 63 6b 3c 4f 45 5f 52 65 70 6c 61 63 65 20  back<OE_Replace 
db60: 29 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  );.    if( onErr
db70: 6f 72 3e 3d 4f 45 5f 52 65 70 6c 61 63 65 0a 20  or>=OE_Replace. 
db80: 20 20 20 20 26 26 20 28 70 55 70 73 65 72 74 20      && (pUpsert 
db90: 7c 7c 20 6f 6e 45 72 72 6f 72 21 3d 6f 76 65 72  || onError!=over
dba0: 72 69 64 65 45 72 72 6f 72 29 0a 20 20 20 20 20  rideError).     
dbb0: 26 26 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 0a  && pTab->pIndex.
dbc0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 41 64      ){.      sAd
dbd0: 64 72 2e 69 70 6b 54 6f 70 20 3d 20 73 71 6c 69  dr.ipkTop = sqli
dbe0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
dbf0: 20 4f 50 5f 47 6f 74 6f 29 2b 31 3b 0a 20 20 20   OP_Goto)+1;.   
dc00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 73 55 70   }..    if( isUp
dc10: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  date ){.      /*
dc20: 20 70 6b 43 68 6e 67 21 3d 30 20 64 6f 65 73 20   pkChng!=0 does 
dc30: 6e 6f 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68  not mean that th
dc40: 65 20 72 6f 77 69 64 20 68 61 73 20 63 68 61 6e  e rowid has chan
dc50: 67 65 64 2c 20 6f 6e 6c 79 20 74 68 61 74 0a 20  ged, only that. 
dc60: 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
dc70: 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 20 20   have changed.  
dc80: 53 6b 69 70 20 74 68 65 20 63 6f 6e 66 6c 69 63  Skip the conflic
dc90: 74 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 69 66  t logic below if
dca0: 20 74 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20   the rowid.     
dcb0: 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
dcc0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
dcd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
dce0: 4f 50 5f 45 71 2c 20 72 65 67 4e 65 77 44 61 74  OP_Eq, regNewDat
dcf0: 61 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b 2c 20  a, addrRowidOk, 
dd00: 72 65 67 4f 6c 64 44 61 74 61 29 3b 0a 20 20 20  regOldData);.   
dd10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
dd20: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
dd30: 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
dd40: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dd50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
dd60: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
dd70: 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 61 6c  the new rowid al
dd80: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
dd90: 74 68 65 20 74 61 62 6c 65 2e 20 20 53 6b 69 70  the table.  Skip
dda0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
ddb0: 6f 77 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 6c  owing conflict l
ddc0: 6f 67 69 63 20 69 66 20 69 74 20 64 6f 65 73 20  ogic if it does 
ddd0: 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 56 64 62 65  not. */.    Vdbe
dde0: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
ddf0: 22 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63  "uniqueness chec
de00: 6b 20 66 6f 72 20 52 4f 57 49 44 22 29 29 3b 0a  k for ROWID"));.
de10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
de20: 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76  erifyAbortable(v
de30: 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20  , onError);.    
de40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
de50: 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
de60: 73 2c 20 69 44 61 74 61 43 75 72 2c 20 61 64 64  s, iDataCur, add
de70: 72 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4e 65 77  rRowidOk, regNew
de80: 44 61 74 61 29 3b 0a 20 20 20 20 56 64 62 65 43  Data);.    VdbeC
de90: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
dea0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
deb0: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
dec0: 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72     switch( onErr
ded0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61  or ){.      defa
dee0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 6f  ult: {.        o
def0: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
df00: 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  t;.        /* Fa
df10: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
df20: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
df30: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
df40: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20   OE_Rollback:.  
df50: 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
df60: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  t:.      case OE
df70: 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20  _Fail: {.       
df80: 20 74 65 73 74 63 61 73 65 28 20 6f 6e 45 72 72   testcase( onErr
df90: 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  or==OE_Rollback 
dfa0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
dfb0: 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  ase( onError==OE
dfc0: 5f 41 62 6f 72 74 20 29 3b 0a 20 20 20 20 20 20  _Abort );.      
dfd0: 20 20 74 65 73 74 63 61 73 65 28 20 6f 6e 45 72    testcase( onEr
dfe0: 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 20 29 3b 0a  ror==OE_Fail );.
dff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
e000: 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 70  owidConstraint(p
e010: 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  Parse, onError, 
e020: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 62  pTab);.        b
e030: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e040: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c      case OE_Repl
e050: 61 63 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  ace: {.        /
e060: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 44  * If there are D
e070: 45 4c 45 54 45 20 74 72 69 67 67 65 72 73 20 6f  ELETE triggers o
e080: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 61 6e 64  n this table and
e090: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
e0a0: 72 65 63 75 72 73 69 76 65 2d 74 72 69 67 67 65  recursive-trigge
e0b0: 72 73 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  rs flag is set, 
e0c0: 63 61 6c 6c 20 47 65 6e 65 72 61 74 65 52 6f 77  call GenerateRow
e0d0: 44 65 6c 65 74 65 28 29 20 74 6f 0a 20 20 20 20  Delete() to.    
e0e0: 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68      ** remove th
e0f0: 65 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f  e conflicting ro
e100: 77 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  w from the table
e110: 2e 20 54 68 69 73 20 77 69 6c 6c 20 66 69 72 65  . This will fire
e120: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
e130: 74 72 69 67 67 65 72 73 20 61 6e 64 20 72 65 6d  triggers and rem
e140: 6f 76 65 20 62 6f 74 68 20 74 68 65 20 74 61 62  ove both the tab
e150: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 62 2d 74  le and index b-t
e160: 72 65 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  ree entries..   
e170: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e180: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
e190: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
e1a0: 69 67 67 65 72 73 20 6f 72 20 74 68 65 20 72 65  iggers or the re
e1b0: 63 75 72 73 69 76 65 2d 74 72 69 67 67 65 72 73  cursive-triggers
e1c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6c 61 67  .        ** flag
e1d0: 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 62 75 74   is not set, but
e1e0: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6f   the table has o
e1f0: 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78  ne or more index
e200: 65 73 2c 20 63 61 6c 6c 20 0a 20 20 20 20 20 20  es, call .      
e210: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 52 6f 77    ** GenerateRow
e220: 49 6e 64 65 78 44 65 6c 65 74 65 28 29 2e 20 54  IndexDelete(). T
e230: 68 69 73 20 72 65 6d 6f 76 65 73 20 74 68 65 20  his removes the 
e240: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e 74  index b-tree ent
e250: 72 69 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ries .        **
e260: 20 6f 6e 6c 79 2e 20 54 68 65 20 74 61 62 6c 65   only. The table
e270: 20 62 2d 74 72 65 65 20 65 6e 74 72 79 20 77 69   b-tree entry wi
e280: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  ll be replaced b
e290: 79 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  y the new entry 
e2a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
e2b0: 20 69 74 20 69 73 20 69 6e 73 65 72 74 65 64 2e   it is inserted.
e2c0: 20 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20    .        **.  
e2d0: 20 20 20 20 20 20 2a 2a 20 49 66 20 65 69 74 68        ** If eith
e2e0: 65 72 20 47 65 6e 65 72 61 74 65 52 6f 77 44 65  er GenerateRowDe
e2f0: 6c 65 74 65 28 29 20 6f 72 20 47 65 6e 65 72 61  lete() or Genera
e300: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
e310: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
e320: 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 69 6e        ** also in
e330: 76 6f 6b 65 20 4d 75 6c 74 69 57 72 69 74 65 28  voke MultiWrite(
e340: 29 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  ) to indicate th
e350: 61 74 20 74 68 69 73 20 56 44 42 45 20 6d 61 79  at this VDBE may
e360: 20 72 65 71 75 69 72 65 0a 20 20 20 20 20 20 20   require.       
e370: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 6f   ** statement ro
e380: 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65 20 73  llback (if the s
e390: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 62 6f 72  tatement is abor
e3a0: 74 65 64 20 61 66 74 65 72 20 74 68 65 20 64 65  ted after the de
e3b0: 6c 65 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  lete.        ** 
e3c0: 74 61 6b 65 73 20 70 6c 61 63 65 29 2e 20 45 61  takes place). Ea
e3d0: 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 63  rlier versions c
e3e0: 61 6c 6c 65 64 20 73 71 6c 69 74 65 33 4d 75 6c  alled sqlite3Mul
e3f0: 74 69 57 72 69 74 65 28 29 20 72 65 67 61 72 64  tiWrite() regard
e400: 6c 65 73 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  less,.        **
e410: 20 62 75 74 20 62 65 69 6e 67 20 6d 6f 72 65 20   but being more 
e420: 73 65 6c 65 63 74 69 76 65 20 68 65 72 65 20 61  selective here a
e430: 6c 6c 6f 77 73 20 73 74 61 74 65 6d 65 6e 74 73  llows statements
e440: 20 6c 69 6b 65 3a 0a 20 20 20 20 20 20 20 20 2a   like:.        *
e450: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 52  *.        **   R
e460: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 28 72 6f  EPLACE INTO t(ro
e470: 77 69 64 29 20 56 41 4c 55 45 53 28 24 6e 65 77  wid) VALUES($new
e480: 72 6f 77 69 64 29 0a 20 20 20 20 20 20 20 20 2a  rowid).        *
e490: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  *.        ** to 
e4a0: 72 75 6e 20 77 69 74 68 6f 75 74 20 61 20 73 74  run without a st
e4b0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e4c0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
e4d0: 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 20  indexes on the. 
e4e0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e         ** table.
e4f0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e500: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
e510: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  igger = 0;.     
e520: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
e530: 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67  &SQLITE_RecTrigg
e540: 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ers ){.         
e550: 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
e560: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74  te3TriggersExist
e570: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54  (pParse, pTab, T
e580: 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b  K_DELETE, 0, 0);
e590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e5a0: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 20     if( pTrigger 
e5b0: 7c 7c 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75  || sqlite3FkRequ
e5c0: 69 72 65 64 28 70 50 61 72 73 65 2c 20 70 54 61  ired(pParse, pTa
e5d0: 62 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  b, 0, 0) ){.    
e5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 6c        sqlite3Mul
e5f0: 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
e600: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e610: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
e620: 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
e630: 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74  , pTrigger, iDat
e640: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 72 65 67 4e 65 77 44 61 74 61 2c 20 31 2c    regNewData, 1,
e680: 20 30 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20   0, OE_Replace, 
e690: 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  1, -1);.        
e6a0: 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
e6b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
e6c0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 20  PDATE_HOOK.     
e6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 48 61 73       assert( Has
e6e0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 3b 0a 20  Rowid(pTab) );. 
e6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
e700: 20 4f 50 5f 44 65 6c 65 74 65 20 6f 70 63 6f 64   OP_Delete opcod
e710: 65 20 66 69 72 65 73 20 74 68 65 20 70 72 65 2d  e fires the pre-
e720: 75 70 64 61 74 65 2d 68 6f 6f 6b 20 6f 6e 6c 79  update-hook only
e730: 2e 20 49 74 20 64 6f 65 73 0a 20 20 20 20 20 20  . It does.      
e740: 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 6f 64 69 66      ** not modif
e750: 79 20 74 68 65 20 62 2d 74 72 65 65 2e 20 49 74  y the b-tree. It
e760: 20 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65   is more efficie
e770: 6e 74 20 74 6f 20 6c 65 74 20 74 68 65 20 63 6f  nt to let the co
e780: 6d 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ming.          *
e790: 2a 20 4f 50 5f 49 6e 73 65 72 74 20 72 65 70 6c  * OP_Insert repl
e7a0: 61 63 65 20 74 68 65 20 65 78 69 73 74 69 6e 67  ace the existing
e7b0: 20 65 6e 74 72 79 20 74 68 61 6e 20 69 74 20 69   entry than it i
e7c0: 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  s to delete the.
e7d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 69            ** exi
e7e0: 73 74 69 6e 67 20 65 6e 74 72 79 20 61 6e 64 20  sting entry and 
e7f0: 74 68 65 6e 20 69 6e 73 65 72 74 20 61 20 6e 65  then insert a ne
e800: 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20  w one. */.      
e810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e820: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp2(v, OP_Dele
e830: 74 65 2c 20 69 44 61 74 61 43 75 72 2c 20 4f 50  te, iDataCur, OP
e840: 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 3b 0a 20 20  FLAG_ISNOOP);.  
e850: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e860: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
e870: 54 61 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a  Tab, P4_TABLE);.
e880: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e890: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
e8a0: 45 5f 48 4f 4f 4b 20 2a 2f 0a 20 20 20 20 20 20  E_HOOK */.      
e8b0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 49      if( pTab->pI
e8c0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
e8d0: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69      sqlite3Multi
e8e0: 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20  Write(pParse);. 
e8f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e900: 65 33 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64  e3GenerateRowInd
e910: 65 78 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c  exDelete(pParse,
e920: 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72 2c   pTab, iDataCur,
e930: 20 69 49 64 78 43 75 72 2c 30 2c 2d 31 29 3b 0a   iIdxCur,0,-1);.
e940: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65      }.        se
e960: 65 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20  enReplace = 1;. 
e970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e980: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
e990: 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54  LITE_OMIT_UPSERT
e9a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 55  .      case OE_U
e9b0: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
e9c0: 20 73 71 6c 69 74 65 33 55 70 73 65 72 74 44 6f   sqlite3UpsertDo
e9d0: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 70  Update(pParse, p
e9e0: 55 70 73 65 72 74 2c 20 70 54 61 62 2c 20 30 2c  Upsert, pTab, 0,
e9f0: 20 69 44 61 74 61 43 75 72 29 3b 0a 20 20 20 20   iDataCur);.    
ea00: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
ea10: 75 67 68 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 23  ugh */.      }.#
ea20: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
ea30: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20   OE_Ignore: {.  
ea40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ea50: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f  onError==OE_Igno
ea60: 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  re );.        sq
ea70: 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
ea80: 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20   ignoreDest);.  
ea90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eaa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
eab0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
eac0: 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
ead0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
eae0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52  veLabel(v, addrR
eaf0: 6f 77 69 64 4f 6b 29 3b 0a 20 20 20 20 69 66 28  owidOk);.    if(
eb00: 20 73 41 64 64 72 2e 69 70 6b 54 6f 70 20 29 7b   sAddr.ipkTop ){
eb10: 0a 20 20 20 20 20 20 73 41 64 64 72 2e 69 70 6b  .      sAddr.ipk
eb20: 42 74 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Btm = sqlite3Vdb
eb30: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
eb40: 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  to);.      sqlit
eb50: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
eb60: 2c 20 73 41 64 64 72 2e 69 70 6b 54 6f 70 2d 31  , sAddr.ipkTop-1
eb70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
eb80: 2f 2a 20 54 65 73 74 20 61 6c 6c 20 55 4e 49 51  /* Test all UNIQ
eb90: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62  UE constraints b
eba0: 79 20 63 72 65 61 74 69 6e 67 20 65 6e 74 72 69  y creating entri
ebb0: 65 73 20 66 6f 72 20 65 61 63 68 20 55 4e 49 51  es for each UNIQ
ebc0: 55 45 0a 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e  UE.  ** index an
ebd0: 64 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68  d making sure th
ebe0: 61 74 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74  at duplicate ent
ebf0: 72 69 65 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65  ries do not alre
ec00: 61 64 79 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  ady exist..  ** 
ec10: 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 76 69  Compute the revi
ec20: 73 65 64 20 72 65 63 6f 72 64 20 65 6e 74 72 69  sed record entri
ec30: 65 73 20 66 6f 72 20 69 6e 64 69 63 65 73 20 61  es for indices a
ec40: 73 20 77 65 20 67 6f 2e 0a 20 20 2a 2a 0a 20 20  s we go..  **.  
ec50: 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
ec60: 6f 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 61  o handles the ca
ec70: 73 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  se of the PRIMAR
ec80: 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
ec90: 61 0a 20 20 2a 2a 20 57 49 54 48 4f 55 54 20 52  a.  ** WITHOUT R
eca0: 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  OWID table..  */
ecb0: 0a 20 20 66 6f 72 28 69 78 3d 30 2c 20 70 49 64  .  for(ix=0, pId
ecc0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
ecd0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
ece0: 3e 70 4e 65 78 74 2c 20 69 78 2b 2b 29 7b 0a 20  >pNext, ix++){. 
ecf0: 20 20 20 69 6e 74 20 72 65 67 49 64 78 3b 20 20     int regIdx;  
ed00: 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
ed10: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 6f   of registers ho
ed20: 6c 64 20 63 6f 6e 65 6e 74 20 66 6f 72 20 70 49  ld conent for pI
ed30: 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  dx */.    int re
ed40: 67 52 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gR;            /
ed50: 2a 20 52 61 6e 67 65 20 6f 66 20 72 65 67 69 73  * Range of regis
ed60: 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ters holding con
ed70: 66 6c 69 63 74 69 6e 67 20 50 4b 20 2a 2f 0a 20  flicting PK */. 
ed80: 20 20 20 69 6e 74 20 69 54 68 69 73 43 75 72 3b     int iThisCur;
ed90: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
eda0: 72 20 66 6f 72 20 74 68 69 73 20 55 4e 49 51 55  r for this UNIQU
edb0: 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  E index */.    i
edc0: 6e 74 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 3b  nt addrUniqueOk;
edd0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
ede0: 20 69 66 20 74 68 65 20 55 4e 49 51 55 45 20 63   if the UNIQUE c
edf0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 61 74  onstraint is sat
ee00: 69 73 66 69 65 64 20 2a 2f 0a 0a 20 20 20 20 69  isfied */..    i
ee10: 66 28 20 61 52 65 67 49 64 78 5b 69 78 5d 3d 3d  f( aRegIdx[ix]==
ee20: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
ee30: 2a 20 53 6b 69 70 20 69 6e 64 69 63 65 73 20 74  * Skip indices t
ee40: 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  hat do not chang
ee50: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 55 70  e */.    if( pUp
ee60: 49 64 78 3d 3d 70 49 64 78 20 29 7b 0a 20 20 20  Idx==pIdx ){.   
ee70: 20 20 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 20     addrUniqueOk 
ee80: 3d 20 73 41 64 64 72 2e 75 70 73 65 72 74 42 74  = sAddr.upsertBt
ee90: 6d 3b 0a 20 20 20 20 20 20 75 70 73 65 72 74 42  m;.      upsertB
eea0: 79 70 61 73 73 20 3d 20 73 71 6c 69 74 65 33 56  ypass = sqlite3V
eeb0: 64 62 65 47 6f 74 6f 28 76 2c 20 30 29 3b 0a 20  dbeGoto(v, 0);. 
eec0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
eed0: 28 28 76 2c 20 22 53 6b 69 70 20 75 70 73 65 72  ((v, "Skip upser
eee0: 74 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  t subroutine"));
eef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ef00: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ef10: 2c 20 73 41 64 64 72 2e 75 70 73 65 72 74 54 6f  , sAddr.upsertTo
ef20: 70 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  p2);.    }else{.
ef30: 20 20 20 20 20 20 61 64 64 72 55 6e 69 71 75 65        addrUnique
ef40: 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
ef50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ef60: 20 20 7d 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70    }.    VdbeNoop
ef70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 75 6e 69  Comment((v, "uni
ef80: 71 75 65 6e 65 73 73 20 63 68 65 63 6b 20 66 6f  queness check fo
ef90: 72 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  r %s", pIdx->zNa
efa0: 6d 65 29 29 3b 0a 20 20 20 20 69 66 28 20 62 41  me));.    if( bA
efb0: 66 66 69 6e 69 74 79 44 6f 6e 65 3d 3d 30 20 29  ffinityDone==0 )
efc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
efd0: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
efe0: 70 54 61 62 2c 20 72 65 67 4e 65 77 44 61 74 61  pTab, regNewData
eff0: 2b 31 29 3b 0a 20 20 20 20 20 20 62 41 66 66 69  +1);.      bAffi
f000: 6e 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  nityDone = 1;.  
f010: 20 20 7d 0a 20 20 20 20 69 54 68 69 73 43 75 72    }.    iThisCur
f020: 20 3d 20 69 49 64 78 43 75 72 2b 69 78 3b 0a 0a   = iIdxCur+ix;..
f030: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 72  .    /* Skip par
f040: 74 69 61 6c 20 69 6e 64 69 63 65 73 20 66 6f 72  tial indices for
f050: 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45   which the WHERE
f060: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 74   clause is not t
f070: 72 75 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  rue */.    if( p
f080: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
f090: 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  re ){.      sqli
f0a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f0b0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 61 52 65   OP_Null, 0, aRe
f0c0: 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20 20  gIdx[ix]);.     
f0d0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
f0e0: 62 20 3d 20 2d 28 72 65 67 4e 65 77 44 61 74 61  b = -(regNewData
f0f0: 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
f100: 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75 70  e3ExprIfFalseDup
f110: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70  (pParse, pIdx->p
f120: 50 61 72 74 49 64 78 57 68 65 72 65 2c 20 61 64  PartIdxWhere, ad
f130: 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20  drUniqueOk,.    
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a          SQLITE_J
f160: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
f170: 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
f180: 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ab = 0;.    }.. 
f190: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72     /* Create a r
f1a0: 65 63 6f 72 64 20 66 6f 72 20 74 68 69 73 20 69  ecord for this i
f1b0: 6e 64 65 78 20 65 6e 74 72 79 20 61 73 20 69 74  ndex entry as it
f1c0: 20 73 68 6f 75 6c 64 20 61 70 70 65 61 72 20 61   should appear a
f1d0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20  fter.    ** the 
f1e0: 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65  insert or update
f1f0: 2e 20 20 53 74 6f 72 65 20 74 68 61 74 20 72 65  .  Store that re
f200: 63 6f 72 64 20 69 6e 20 74 68 65 20 61 52 65 67  cord in the aReg
f210: 49 64 78 5b 69 78 5d 20 72 65 67 69 73 74 65 72  Idx[ix] register
f220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 49  .    */.    regI
f230: 64 78 20 3d 20 61 52 65 67 49 64 78 5b 69 78 5d  dx = aRegIdx[ix]
f240: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  +1;.    for(i=0;
f250: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
f260: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
f270: 74 20 69 46 69 65 6c 64 20 3d 20 70 49 64 78 2d  t iField = pIdx-
f280: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
f290: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
f2a0: 20 69 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e 5f   if( iField==XN_
f2b0: 45 58 50 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EXPR ){.        
f2c0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
f2d0: 20 3d 20 2d 28 72 65 67 4e 65 77 44 61 74 61 2b   = -(regNewData+
f2e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
f2f0: 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28  te3ExprCodeCopy(
f300: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43  pParse, pIdx->aC
f310: 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78  olExpr->a[i].pEx
f320: 70 72 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20  pr, regIdx+i);. 
f330: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69         pParse->i
f340: 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 20  SelfTab = 0;.   
f350: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f360: 28 28 76 2c 20 22 25 73 20 63 6f 6c 75 6d 6e 20  ((v, "%s column 
f370: 25 64 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %d", pIdx->zName
f380: 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , i));.      }el
f390: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
f3a0: 69 46 69 65 6c 64 3d 3d 58 4e 5f 52 4f 57 49 44  iField==XN_ROWID
f3b0: 20 7c 7c 20 69 46 69 65 6c 64 3d 3d 70 54 61 62   || iField==pTab
f3c0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
f3d0: 20 20 20 20 20 78 20 3d 20 72 65 67 4e 65 77 44       x = regNewD
f3e0: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ata;.        }el
f3f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20  se{.          x 
f400: 3d 20 69 46 69 65 6c 64 20 2b 20 72 65 67 4e 65  = iField + regNe
f410: 77 44 61 74 61 20 2b 20 31 3b 0a 20 20 20 20 20  wData + 1;.     
f420: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
f430: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f440: 2c 20 69 46 69 65 6c 64 3c 30 20 3f 20 4f 50 5f  , iField<0 ? OP_
f450: 49 6e 74 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f  IntCopy : OP_SCo
f460: 70 79 2c 20 78 2c 20 72 65 67 49 64 78 2b 69 29  py, x, regIdx+i)
f470: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
f480: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
f490: 69 46 69 65 6c 64 3c 30 20 3f 20 22 72 6f 77 69  iField<0 ? "rowi
f4a0: 64 22 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  d" : pTab->aCol[
f4b0: 69 46 69 65 6c 64 5d 2e 7a 4e 61 6d 65 29 29 3b  iField].zName));
f4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f4e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
f4f0: 65 63 6f 72 64 2c 20 72 65 67 49 64 78 2c 20 70  ecord, regIdx, p
f500: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 52  Idx->nColumn, aR
f510: 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20  egIdx[ix]);.    
f520: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f530: 22 66 6f 72 20 25 73 22 2c 20 70 49 64 78 2d 3e  "for %s", pIdx->
f540: 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
f550: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 55  SQLITE_ENABLE_NU
f560: 4c 4c 5f 54 52 49 4d 0a 20 20 20 20 69 66 28 20  LL_TRIM.    if( 
f570: 70 49 64 78 2d 3e 69 64 78 54 79 70 65 3d 3d 32  pIdx->idxType==2
f580: 20 29 20 73 71 6c 69 74 65 33 53 65 74 4d 61 6b   ) sqlite3SetMak
f590: 65 52 65 63 6f 72 64 50 35 28 76 2c 20 70 49 64  eRecordP5(v, pId
f5a0: 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64  x->pTable);.#end
f5b0: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 61 6e  if..    /* In an
f5c0: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
f5d0: 6e 2c 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  n, if this index
f5e0: 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
f5f0: 4b 45 59 20 69 6e 64 65 78 20 0a 20 20 20 20 2a  KEY index .    *
f600: 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  * of a WITHOUT R
f610: 4f 57 49 44 20 74 61 62 6c 65 20 61 6e 64 20 74  OWID table and t
f620: 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
f630: 20 63 68 61 6e 67 65 20 74 68 65 0a 20 20 20 20   change the.    
f640: 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20  ** primary key, 
f650: 74 68 65 6e 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f  then no collisio
f660: 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 20 20  n is possible.  
f670: 54 68 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65  The collision de
f680: 74 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c  tection.    ** l
f690: 6f 67 69 63 20 62 65 6c 6f 77 20 63 61 6e 20 61  ogic below can a
f6a0: 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 2a  ll be skipped. *
f6b0: 2f 0a 20 20 20 20 69 66 28 20 69 73 55 70 64 61  /.    if( isUpda
f6c0: 74 65 20 26 26 20 70 50 6b 3d 3d 70 49 64 78 20  te && pPk==pIdx 
f6d0: 26 26 20 70 6b 43 68 6e 67 3d 3d 30 20 29 7b 0a  && pkChng==0 ){.
f6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f6f0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f700: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a   addrUniqueOk);.
f710: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
f720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
f730: 6e 64 20 6f 75 74 20 77 68 61 74 20 61 63 74 69  nd out what acti
f740: 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61  on to take in ca
f750: 73 65 20 74 68 65 72 65 20 69 73 20 61 20 75 6e  se there is a un
f760: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
f770: 74 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72  t */.    onError
f780: 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72   = pIdx->onError
f790: 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  ;.    if( onErro
f7a0: 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 20 0a 20  r==OE_None ){ . 
f7b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7c0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f7d0: 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20  addrUniqueOk);. 
f7e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
f7f0: 2f 2a 20 70 49 64 78 20 69 73 20 6e 6f 74 20 61  /* pIdx is not a
f800: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f   UNIQUE index */
f810: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
f820: 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45  verrideError!=OE
f830: 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
f840: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72    onError = over
f850: 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d  rideError;.    }
f860: 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72  else if( onError
f870: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
f880: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20        onError = 
f890: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  OE_Abort;.    }.
f8a0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
f8b0: 75 74 20 69 66 20 74 68 65 20 75 70 73 65 72 74  ut if the upsert
f8c0: 20 63 6c 61 75 73 65 20 61 70 70 6c 69 65 73 20   clause applies 
f8d0: 74 6f 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  to this index */
f8e0: 0a 20 20 20 20 69 66 28 20 70 55 70 49 64 78 3d  .    if( pUpIdx=
f8f0: 3d 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69  =pIdx ){.      i
f900: 66 28 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73  f( pUpsert->pUps
f910: 65 72 74 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ertSet==0 ){.   
f920: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
f930: 45 5f 49 67 6e 6f 72 65 3b 20 20 2f 2a 20 44 4f  E_Ignore;  /* DO
f940: 20 4e 4f 54 48 49 4e 47 20 69 73 20 74 68 65 20   NOTHING is the 
f950: 73 61 6d 65 20 61 73 20 49 4e 53 45 52 54 20 4f  same as INSERT O
f960: 52 20 49 47 4e 4f 52 45 20 2a 2f 0a 20 20 20 20  R IGNORE */.    
f970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f980: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 55 70   onError = OE_Up
f990: 64 61 74 65 3b 20 20 2f 2a 20 44 4f 20 55 50 44  date;  /* DO UPD
f9a0: 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ATE */.      }. 
f9b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 76     }..    /* Inv
f9c0: 6f 6b 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  oke subroutines 
f9d0: 74 6f 20 68 61 6e 64 6c 65 20 49 50 4b 20 72 65  to handle IPK re
f9e0: 70 6c 61 63 65 20 61 6e 64 20 75 70 73 65 72 74  place and upsert
f9f0: 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e   prior to runnin
fa00: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72  g.    ** the fir
fa10: 73 74 20 52 45 50 4c 41 43 45 20 63 6f 6e 73 74  st REPLACE const
fa20: 72 61 69 6e 74 20 63 68 65 63 6b 2e 20 2a 2f 0a  raint check. */.
fa30: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
fa40: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
fa50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
fa60: 41 64 64 72 2e 69 70 6b 54 6f 70 20 29 3b 0a 20  Addr.ipkTop );. 
fa70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
fa80: 41 64 64 72 2e 75 70 73 65 72 74 54 6f 70 0a 20  Addr.upsertTop. 
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
faa0: 71 6c 69 74 65 33 56 64 62 65 4c 61 62 65 6c 48  qlite3VdbeLabelH
fab0: 61 73 42 65 65 6e 52 65 73 6f 6c 76 65 64 28 76  asBeenResolved(v
fac0: 2c 73 41 64 64 72 2e 75 70 73 65 72 74 54 6f 70  ,sAddr.upsertTop
fad0: 29 20 29 3b 0a 20 20 20 20 20 20 72 65 6f 72 64  ) );.      reord
fae0: 65 72 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  erConstraintChec
faf0: 6b 73 28 76 2c 20 26 73 41 64 64 72 29 3b 0a 20  ks(v, &sAddr);. 
fb00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6c     }..    /* Col
fb10: 6c 69 73 69 6f 6e 20 64 65 74 65 63 74 69 6f 6e  lision detection
fb20: 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20   may be omitted 
fb30: 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
fb40: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
fb50: 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54  :.    **   (1) T
fb60: 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
fb70: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
fb80: 20 69 73 20 52 45 50 4c 41 43 45 0a 20 20 20 20   is REPLACE.    
fb90: 2a 2a 20 20 20 28 32 29 20 54 68 65 20 74 61 62  **   (2) The tab
fba0: 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  le is a WITHOUT 
fbb0: 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 20 20  ROWID table.    
fbc0: 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 61  **   (3) There a
fbd0: 72 65 20 6e 6f 20 73 65 63 6f 6e 64 61 72 79 20  re no secondary 
fbe0: 69 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74  indexes on the t
fbf0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 28 34  able.    **   (4
fc00: 29 20 4e 6f 20 64 65 6c 65 74 65 20 74 72 69 67  ) No delete trig
fc10: 67 65 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20  gers need to be 
fc20: 66 69 72 65 64 20 69 66 20 74 68 65 72 65 20 69  fired if there i
fc30: 73 20 61 20 63 6f 6e 66 6c 69 63 74 0a 20 20 20  s a conflict.   
fc40: 20 2a 2a 20 20 20 28 35 29 20 4e 6f 20 46 4b 20   **   (5) No FK 
fc50: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
fc60: 65 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75  ers need to be u
fc70: 70 64 61 74 65 64 20 69 66 20 61 20 63 6f 6e 66  pdated if a conf
fc80: 6c 69 63 74 20 6f 63 63 75 72 73 2e 0a 20 20 20  lict occurs..   
fc90: 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 69 78   */ .    if( (ix
fca0: 3d 3d 30 20 26 26 20 70 49 64 78 2d 3e 70 4e 65  ==0 && pIdx->pNe
fcb0: 78 74 3d 3d 30 29 20 20 20 20 20 20 20 20 20 20  xt==0)          
fcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64           /* Cond
fcd0: 69 74 69 6f 6e 20 33 20 2a 2f 0a 20 20 20 20 20  ition 3 */.     
fce0: 26 26 20 70 50 6b 3d 3d 70 49 64 78 20 20 20 20  && pPk==pIdx    
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fd10: 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 32 20 2a 2f  * Condition 2 */
fd20: 0a 20 20 20 20 20 26 26 20 6f 6e 45 72 72 6f 72  .     && onError
fd30: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 20 20 20  ==OE_Replace    
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
fd60: 6e 20 31 20 2a 2f 0a 20 20 20 20 20 26 26 20 28  n 1 */.     && (
fd70: 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53   0==(db->flags&S
fd80: 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
fd90: 73 29 20 7c 7c 20 20 20 20 20 20 2f 2a 20 43 6f  s) ||      /* Co
fda0: 6e 64 69 74 69 6f 6e 20 34 20 2a 2f 0a 20 20 20  ndition 4 */.   
fdb0: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
fdc0: 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70  3TriggersExist(p
fdd0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f  Parse, pTab, TK_
fde0: 44 45 4c 45 54 45 2c 20 30 2c 20 30 29 29 0a 20  DELETE, 0, 0)). 
fdf0: 20 20 20 20 26 26 20 28 20 30 3d 3d 28 64 62 2d      && ( 0==(db-
fe00: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f  >flags&SQLITE_Fo
fe10: 72 65 69 67 6e 4b 65 79 73 29 20 7c 7c 20 20 20  reignKeys) ||   
fe20: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
fe30: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 28 30  5 */.         (0
fe40: 3d 3d 70 54 61 62 2d 3e 70 46 4b 65 79 20 26 26  ==pTab->pFKey &&
fe50: 20 30 3d 3d 73 71 6c 69 74 65 33 46 6b 52 65 66   0==sqlite3FkRef
fe60: 65 72 65 6e 63 65 73 28 70 54 61 62 29 29 29 0a  erences(pTab))).
fe70: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
fe80: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
fe90: 61 62 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71  abel(v, addrUniq
fea0: 75 65 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ueOk);.      con
feb0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
fec0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
fed0: 65 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64  e if the new ind
fee0: 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ex entry will be
fef0: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 73   unique */.    s
ff00: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
ff10: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
ff20: 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69   sqlite3VdbeVeri
ff30: 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 6f  fyAbortable(v, o
ff40: 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20 73 71 6c  nError);.    sql
ff50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
ff60: 74 28 76 2c 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69  t(v, OP_NoConfli
ff70: 63 74 2c 20 69 54 68 69 73 43 75 72 2c 20 61 64  ct, iThisCur, ad
ff80: 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20  drUniqueOk,.    
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 20 20 20 20 72 65 67 49 64 78 2c 20 70 49 64       regIdx, pId
ffb0: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
ffc0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
ffd0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
ffe0: 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f  ode to handle co
fff0: 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  llisions */.    
10000 72 65 67 52 20 3d 20 28 70 49 64 78 3d 3d 70 50  regR = (pIdx==pP
10010 6b 29 20 3f 20 72 65 67 49 64 78 20 3a 20 73 71  k) ? regIdx : sq
10020 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
10030 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 46 69 65  e(pParse, nPkFie
10040 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 55  ld);.    if( isU
10050 70 64 61 74 65 20 7c 7c 20 6f 6e 45 72 72 6f 72  pdate || onError
10060 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  ==OE_Replace ){.
10070 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
10080 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
10090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
100a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
100b0 6f 77 69 64 2c 20 69 54 68 69 73 43 75 72 2c 20  owid, iThisCur, 
100c0 72 65 67 52 29 3b 0a 20 20 20 20 20 20 20 20 2f  regR);.        /
100d0 2a 20 43 6f 6e 66 6c 69 63 74 20 6f 6e 6c 79 20  * Conflict only 
100e0 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  if the rowid of 
100f0 74 68 65 20 65 78 69 73 74 69 6e 67 20 69 6e 64  the existing ind
10100 65 78 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  ex entry.       
10110 20 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74   ** is different
10120 20 66 72 6f 6d 20 6f 6c 64 2d 72 6f 77 69 64 20   from old-rowid 
10130 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
10140 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  sUpdate ){.     
10150 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10160 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
10170 20 72 65 67 52 2c 20 61 64 64 72 55 6e 69 71 75   regR, addrUniqu
10180 65 4f 6b 2c 20 72 65 67 4f 6c 64 44 61 74 61 29  eOk, regOldData)
10190 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
101a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
101b0 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
101c0 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  L);.          Vd
101d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
101e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
101f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
10200 74 20 78 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t x;.        /* 
10210 45 78 74 72 61 63 74 20 74 68 65 20 50 52 49 4d  Extract the PRIM
10220 41 52 59 20 4b 45 59 20 66 72 6f 6d 20 74 68 65  ARY KEY from the
10230 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
10240 78 20 65 6e 74 72 79 20 61 6e 64 0a 20 20 20 20  x entry and.    
10250 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
10260 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67  in registers reg
10270 52 2e 2e 72 65 67 52 2b 6e 50 6b 2d 31 20 2a 2f  R..regR+nPk-1 */
10280 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
10290 78 21 3d 70 50 6b 20 29 7b 0a 20 20 20 20 20 20  x!=pPk ){.      
102a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
102b0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
102c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
102d0 73 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f  ssert( pPk->aiCo
102e0 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[i]>=0 );.  
102f0 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71            x = sq
10300 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
10310 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69  ex(pIdx, pPk->ai
10320 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20  Column[i]);.    
10330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10340 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10350 43 6f 6c 75 6d 6e 2c 20 69 54 68 69 73 43 75 72  Column, iThisCur
10360 2c 20 78 2c 20 72 65 67 52 2b 69 29 3b 0a 20 20  , x, regR+i);.  
10370 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
10380 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
10390 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
103c0 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  Col[pPk->aiColum
103d0 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20  n[i]].zName));. 
103e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
103f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10400 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20   isUpdate ){.   
10410 20 20 20 20 20 20 20 2f 2a 20 49 66 20 63 75 72         /* If cur
10420 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
10430 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
10440 59 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  Y of a WITHOUT R
10450 4f 57 49 44 20 0a 20 20 20 20 20 20 20 20 20 20  OWID .          
10460 2a 2a 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 63  ** table, only c
10470 6f 6e 66 6c 69 63 74 20 69 66 20 74 68 65 20 6e  onflict if the n
10480 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76  ew PRIMARY KEY v
10490 61 6c 75 65 73 20 61 72 65 20 61 63 74 75 61 6c  alues are actual
104a0 6c 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ly.          ** 
104b0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
104c0 68 65 20 6f 6c 64 2e 0a 20 20 20 20 20 20 20 20  he old..        
104d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
104e0 2a 20 46 6f 72 20 61 20 55 4e 49 51 55 45 20 69  * For a UNIQUE i
104f0 6e 64 65 78 2c 20 6f 6e 6c 79 20 63 6f 6e 66 6c  ndex, only confl
10500 69 63 74 20 69 66 20 74 68 65 20 50 52 49 4d 41  ict if the PRIMA
10510 52 59 20 4b 45 59 20 76 61 6c 75 65 73 0a 20 20  RY KEY values.  
10520 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
10530 65 20 6d 61 74 63 68 65 64 20 69 6e 64 65 78 20  e matched index 
10540 72 6f 77 20 61 72 65 20 64 69 66 66 65 72 65 6e  row are differen
10550 74 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  t from the origi
10560 6e 61 6c 20 50 52 49 4d 41 52 59 0a 20 20 20 20  nal PRIMARY.    
10570 20 20 20 20 20 20 2a 2a 20 4b 45 59 20 76 61 6c        ** KEY val
10580 75 65 73 20 6f 66 20 74 68 69 73 20 72 6f 77 20  ues of this row 
10590 62 65 66 6f 72 65 20 74 68 65 20 75 70 64 61 74  before the updat
105a0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
105b0 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
105c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
105d0 6e 74 41 64 64 72 28 76 29 2b 70 50 6b 2d 3e 6e  ntAddr(v)+pPk->n
105e0 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
105f0 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4e 65    int op = OP_Ne
10600 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
10610 72 65 67 43 6d 70 20 3d 20 28 49 73 50 72 69 6d  regCmp = (IsPrim
10620 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
10630 29 20 3f 20 72 65 67 49 64 78 20 3a 20 72 65 67  ) ? regIdx : reg
10640 52 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  R);.  .         
10650 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d   for(i=0; i<pPk-
10660 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
10670 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
10680 20 2a 70 34 20 3d 20 28 63 68 61 72 2a 29 73 71   *p4 = (char*)sq
10690 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
106a0 65 71 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e  eq(pParse, pPk->
106b0 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  azColl[i]);.    
106c0 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
106d0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
106e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
106f0 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
10700 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 70 50        if( i==(pP
10710 6b 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b  k->nKeyCol-1) ){
10720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
10730 64 64 72 4a 75 6d 70 20 3d 20 61 64 64 72 55 6e  ddrJump = addrUn
10740 69 71 75 65 4f 6b 3b 0a 20 20 20 20 20 20 20 20  iqueOk;.        
10750 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
10760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
10770 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10780 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10790 20 6f 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20   op, .          
107a0 20 20 20 20 20 20 72 65 67 4f 6c 64 44 61 74 61        regOldData
107b0 2b 31 2b 78 2c 20 61 64 64 72 4a 75 6d 70 2c 20  +1+x, addrJump, 
107c0 72 65 67 43 6d 70 2b 69 2c 20 70 34 2c 20 50 34  regCmp+i, p4, P4
107d0 5f 43 4f 4c 4c 53 45 51 0a 20 20 20 20 20 20 20  _COLLSEQ.       
107e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
107f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10800 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
10810 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  E_NOTNULL);.    
10820 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
10830 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
10840 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _Eq);.          
10850 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
10860 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  (v, op==OP_Ne);.
10870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10890 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
108a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
108b0 78 65 63 75 74 65 73 20 69 66 20 74 68 65 20 6e  xecutes if the n
108c0 65 77 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  ew index entry i
108d0 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 2a 2f 0a  s not unique */.
108e0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72      assert( onEr
108f0 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ror==OE_Rollback
10900 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
10910 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72  Abort || onError
10920 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
10930 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45    || onError==OE
10940 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72  _Ignore || onErr
10950 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c  or==OE_Replace |
10960 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 55 70  | onError==OE_Up
10970 64 61 74 65 20 29 3b 0a 20 20 20 20 73 77 69 74  date );.    swit
10980 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ch( onError ){. 
10990 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
109a0 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73  lback:.      cas
109b0 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20  e OE_Abort:.    
109c0 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20    case OE_Fail: 
109d0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
109e0 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  se( onError==OE_
109f0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
10a00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 6e      testcase( on
10a10 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
10a20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
10a30 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  ase( onError==OE
10a40 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Fail );.       
10a50 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
10a60 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
10a70 20 6f 6e 45 72 72 6f 72 2c 20 70 49 64 78 29 3b   onError, pIdx);
10a80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10a90 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
10aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45  SQLITE_OMIT_UPSE
10ab0 52 54 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  RT.      case OE
10ac0 5f 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20  _Update: {.     
10ad0 20 20 20 73 71 6c 69 74 65 33 55 70 73 65 72 74     sqlite3Upsert
10ae0 44 6f 55 70 64 61 74 65 28 70 50 61 72 73 65 2c  DoUpdate(pParse,
10af0 20 70 55 70 73 65 72 74 2c 20 70 54 61 62 2c 20   pUpsert, pTab, 
10b00 70 49 64 78 2c 20 69 49 64 78 43 75 72 2b 69 78  pIdx, iIdxCur+ix
10b10 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  );.        /* Fa
10b20 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
10b30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10b40 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
10b50 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 74 65 73  e: {.        tes
10b60 74 63 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d  tcase( onError==
10b70 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20  OE_Ignore );.   
10b80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b90 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72 65 44 65  Goto(v, ignoreDe
10ba0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  st);.        bre
10bb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10bc0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
10bd0 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54       Trigger *pT
10be0 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20  rigger = 0;.    
10bf0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72      assert( onEr
10c00 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
10c10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
10c20 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
10c30 52 65 63 54 72 69 67 67 65 72 73 20 29 7b 0a 20  RecTriggers ){. 
10c40 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
10c50 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
10c60 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c  ersExist(pParse,
10c70 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45   pTab, TK_DELETE
10c80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
10c90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
10ca0 54 72 69 67 67 65 72 20 7c 7c 20 73 71 6c 69 74  Trigger || sqlit
10cb0 65 33 46 6b 52 65 71 75 69 72 65 64 28 70 50 61  e3FkRequired(pPa
10cc0 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30 29  rse, pTab, 0, 0)
10cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10ce0 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
10cf0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
10d00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10d10 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  e3GenerateRowDel
10d20 65 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ete(pParse, pTab
10d30 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74  , pTrigger, iDat
10d40 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
10d50 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 2c             regR,
10d60 20 6e 50 6b 46 69 65 6c 64 2c 20 30 2c 20 4f 45   nPkField, 0, OE
10d70 5f 52 65 70 6c 61 63 65 2c 0a 20 20 20 20 20 20  _Replace,.      
10d80 20 20 20 20 20 20 28 70 49 64 78 3d 3d 70 50 6b        (pIdx==pPk
10d90 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c   ? ONEPASS_SINGL
10da0 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4f 46 46 29  E : ONEPASS_OFF)
10db0 2c 20 69 54 68 69 73 43 75 72 29 3b 0a 20 20 20  , iThisCur);.   
10dc0 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61 63 65       seenReplace
10dd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
10de0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10df0 20 7d 0a 20 20 20 20 69 66 28 20 70 55 70 49 64   }.    if( pUpId
10e00 78 3d 3d 70 49 64 78 20 29 7b 0a 20 20 20 20 20  x==pIdx ){.     
10e10 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10e20 48 65 72 65 28 76 2c 20 75 70 73 65 72 74 42 79  Here(v, upsertBy
10e30 70 61 73 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pass);.    }else
10e40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10e50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10e60 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29  v, addrUniqueOk)
10e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10e80 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
10e90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
10ea0 20 72 65 67 52 21 3d 72 65 67 49 64 78 20 29 20   regR!=regIdx ) 
10eb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10ec0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
10ed0 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 29 3b  regR, nPkField);
10ee0 0a 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ..  }.  testcase
10ef0 28 20 73 41 64 64 72 2e 69 70 6b 54 6f 70 21 3d  ( sAddr.ipkTop!=
10f00 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
10f10 20 73 41 64 64 72 2e 75 70 73 65 72 74 54 6f 70   sAddr.upsertTop
10f20 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
10f30 69 74 65 33 56 64 62 65 4c 61 62 65 6c 48 61 73  ite3VdbeLabelHas
10f40 42 65 65 6e 52 65 73 6f 6c 76 65 64 28 76 2c 73  BeenResolved(v,s
10f50 41 64 64 72 2e 75 70 73 65 72 74 54 6f 70 29 20  Addr.upsertTop) 
10f60 29 3b 0a 20 20 72 65 6f 72 64 65 72 43 6f 6e 73  );.  reorderCons
10f70 74 72 61 69 6e 74 43 68 65 63 6b 73 28 76 2c 20  traintChecks(v, 
10f80 26 73 41 64 64 72 29 3b 0a 20 20 0a 20 20 2a 70  &sAddr);.  .  *p
10f90 62 4d 61 79 52 65 70 6c 61 63 65 20 3d 20 73 65  bMayReplace = se
10fa0 65 6e 52 65 70 6c 61 63 65 3b 0a 20 20 56 64 62  enReplace;.  Vdb
10fb0 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
10fc0 76 2c 20 22 45 4e 44 3a 20 47 65 6e 43 6e 73 74  v, "END: GenCnst
10fd0 43 6b 73 28 25 64 29 22 2c 20 73 65 65 6e 52 65  Cks(%d)", seenRe
10fe0 70 6c 61 63 65 29 29 3b 0a 7d 0a 0a 23 69 66 64  place));.}..#ifd
10ff0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11000 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 2f 2a 0a 2a 2a  _NULL_TRIM./*.**
11010 20 43 68 61 6e 67 65 20 74 68 65 20 50 35 20 6f   Change the P5 o
11020 70 65 72 61 6e 64 20 6f 6e 20 74 68 65 20 6c 61  perand on the la
11030 73 74 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68  st opcode (which
11040 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 4f 50   should be an OP
11050 5f 4d 61 6b 65 52 65 63 6f 72 64 29 0a 2a 2a 20  _MakeRecord).** 
11060 74 6f 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  to be the number
11070 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
11080 61 62 6c 65 20 70 54 61 62 20 74 68 61 74 20 6d  able pTab that m
11090 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2d  ust not be NULL-
110a0 74 72 69 6d 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  trimmed..**.** O
110b0 72 20 69 66 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20  r if no columns 
110c0 6f 66 20 70 54 61 62 20 6d 61 79 20 62 65 20 4e  of pTab may be N
110d0 55 4c 4c 2d 74 72 69 6d 6d 65 64 2c 20 6c 65 61  ULL-trimmed, lea
110e0 76 65 20 50 35 20 61 74 20 7a 65 72 6f 2e 0a 2a  ve P5 at zero..*
110f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
11100 74 4d 61 6b 65 52 65 63 6f 72 64 50 35 28 56 64  tMakeRecordP5(Vd
11110 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54  be *v, Table *pT
11120 61 62 29 7b 0a 20 20 75 31 36 20 69 3b 0a 0a 20  ab){.  u16 i;.. 
11130 20 2f 2a 20 52 65 63 6f 72 64 73 20 77 69 74 68   /* Records with
11140 20 6f 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73   omitted columns
11150 20 61 72 65 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65   are only allowe
11160 64 20 66 6f 72 20 73 63 68 65 6d 61 20 66 6f 72  d for schema for
11170 6d 61 74 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e  mat.  ** version
11180 20 32 20 61 6e 64 20 6c 61 74 65 72 20 28 53 51   2 and later (SQ
11190 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 33 2e 31  Lite version 3.1
111a0 2e 34 2c 20 32 30 30 35 2d 30 32 2d 32 30 29 2e  .4, 2005-02-20).
111b0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
111c0 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
111d0 72 6d 61 74 3c 32 20 29 20 72 65 74 75 72 6e 3b  rmat<2 ) return;
111e0 0a 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ..  for(i=pTab->
111f0 6e 43 6f 6c 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  nCol-1; i>0; i--
11200 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  ){.    if( pTab-
11210 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 21 3d  >aCol[i].pDflt!=
11220 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
11230 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  f( pTab->aCol[i]
11240 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
11250 4c 41 47 5f 50 52 49 4d 4b 45 59 20 29 20 62 72  LAG_PRIMKEY ) br
11260 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  eak;.  }.  sqlit
11270 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11280 2c 20 69 2b 31 29 3b 0a 7d 0a 23 65 6e 64 69 66  , i+1);.}.#endif
11290 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
112a0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
112b0 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20 74 68  ode to finish th
112c0 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  e INSERT or UPDA
112d0 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  TE operation.** 
112e0 74 68 61 74 20 77 61 73 20 73 74 61 72 74 65 64  that was started
112f0 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
11300 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72   to sqlite3Gener
11310 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
11320 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65 63  cks..** A consec
11330 75 74 69 76 65 20 72 61 6e 67 65 20 6f 66 20 72  utive range of r
11340 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
11350 67 20 61 74 20 72 65 67 4e 65 77 44 61 74 61 20  g at regNewData 
11360 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
11370 72 6f 77 69 64 20 61 6e 64 20 74 68 65 20 63 6f  rowid and the co
11380 6e 74 65 6e 74 20 74 6f 20 62 65 20 69 6e 73 65  ntent to be inse
11390 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rted..**.** The 
113a0 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69  arguments to thi
113b0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
113c0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
113d0 74 68 65 20 66 69 72 73 74 20 73 69 78 0a 2a 2a  the first six.**
113e0 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 73 71   arguments to sq
113f0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
11400 73 74 72 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a  straintChecks..*
11410 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
11420 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28  mpleteInsertion(
11430 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11440 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
11450 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
11460 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11470 20 20 20 20 20 20 2f 2a 20 74 68 65 20 74 61 62        /* the tab
11480 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
11490 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a   are inserting *
114a0 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  /.  int iDataCur
114b0 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ,       /* Curso
114c0 72 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  r of the canonic
114d0 61 6c 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a  al data source *
114e0 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c  /.  int iIdxCur,
114f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11500 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
11510 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44 61 74  .  int regNewDat
11520 61 2c 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20  a,     /* Range 
11530 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
11540 69 6e 74 20 2a 61 52 65 67 49 64 78 2c 20 20 20  int *aRegIdx,   
11550 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11560 75 73 65 64 20 62 79 20 65 61 63 68 20 69 6e 64  used by each ind
11570 65 78 2e 20 20 30 20 66 6f 72 20 75 6e 75 73 65  ex.  0 for unuse
11580 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  d indices */.  i
11590 6e 74 20 75 70 64 61 74 65 5f 66 6c 61 67 73 2c  nt update_flags,
115a0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 55     /* True for U
115b0 50 44 41 54 45 2c 20 46 61 6c 73 65 20 66 6f 72  PDATE, False for
115c0 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69 6e 74   INSERT */.  int
115d0 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20   appendBias,    
115e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
115f0 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65   is likely to be
11600 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   an append */.  
11610 69 6e 74 20 75 73 65 53 65 65 6b 52 65 73 75 6c  int useSeekResul
11620 74 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73  t   /* True to s
11630 65 74 20 74 68 65 20 55 53 45 53 45 45 4b 52 45  et the USESEEKRE
11640 53 55 4c 54 20 66 6c 61 67 20 6f 6e 20 4f 50 5f  SULT flag on OP_
11650 5b 49 64 78 5d 49 6e 73 65 72 74 20 2a 2f 0a 29  [Idx]Insert */.)
11660 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
11670 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
11680 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 75  red statements u
11690 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
116a0 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
116b0 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  dx;        /* An
116c0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 69 6e 73   index being ins
116d0 65 72 74 65 64 20 6f 72 20 75 70 64 61 74 65 64  erted or updated
116e0 20 2a 2f 0a 20 20 75 38 20 70 69 6b 5f 66 6c 61   */.  u8 pik_fla
116f0 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 66 6c 61  gs;       /* fla
11700 67 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20  g values passed 
11710 74 6f 20 74 68 65 20 62 74 72 65 65 20 69 6e 73  to the btree ins
11720 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ert */.  int reg
11730 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  Data;        /* 
11740 43 6f 6e 74 65 6e 74 20 72 65 67 69 73 74 65 72  Content register
11750 73 20 28 61 66 74 65 72 20 74 68 65 20 72 6f 77  s (after the row
11760 69 64 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  id) */.  int reg
11770 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
11780 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
11790 20 61 73 73 65 6d 62 6c 65 64 20 72 65 63 6f 72   assembled recor
117a0 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
117b0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
117c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
117d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
117e0 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d   bAffinityDone =
117f0 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 4f   0; /* True if O
11800 50 5f 41 66 66 69 6e 69 74 79 20 68 61 73 20 62  P_Affinity has b
11810 65 65 6e 20 72 75 6e 20 61 6c 72 65 61 64 79 20  een run already 
11820 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 70  */..  assert( up
11830 64 61 74 65 5f 66 6c 61 67 73 3d 3d 30 0a 20 20  date_flags==0.  
11840 20 20 20 20 20 7c 7c 20 75 70 64 61 74 65 5f 66       || update_f
11850 6c 61 67 73 3d 3d 4f 50 46 4c 41 47 5f 49 53 55  lags==OPFLAG_ISU
11860 50 44 41 54 45 0a 20 20 20 20 20 20 20 7c 7c 20  PDATE.       || 
11870 75 70 64 61 74 65 5f 66 6c 61 67 73 3d 3d 28 4f  update_flags==(O
11880 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 7c 4f  PFLAG_ISUPDATE|O
11890 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49  PFLAG_SAVEPOSITI
118a0 4f 4e 29 0a 20 20 29 3b 0a 0a 20 20 76 20 3d 20  ON).  );..  v = 
118b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
118c0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
118d0 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
118e0 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
118f0 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73  t==0 );  /* This
11900 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
11910 56 49 45 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  VIEW */.  for(i=
11920 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
11930 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
11940 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
11950 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65 67  +){.    if( aReg
11960 49 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  Idx[i]==0 ) cont
11970 69 6e 75 65 3b 0a 20 20 20 20 62 41 66 66 69 6e  inue;.    bAffin
11980 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  ityDone = 1;.   
11990 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
119a0 49 64 78 57 68 65 72 65 20 29 7b 0a 20 20 20 20  IdxWhere ){.    
119b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
119c0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
119d0 2c 20 61 52 65 67 49 64 78 5b 69 5d 2c 20 73 71  , aRegIdx[i], sq
119e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
119f0 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
11a00 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11a10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 69 6b  );.    }.    pik
11a20 5f 66 6c 61 67 73 20 3d 20 28 75 73 65 53 65 65  _flags = (useSee
11a30 6b 52 65 73 75 6c 74 20 3f 20 4f 50 46 4c 41 47  kResult ? OPFLAG
11a40 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 3a  _USESEEKRESULT :
11a50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 49 73 50   0);.    if( IsP
11a60 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
11a70 49 64 78 29 20 26 26 20 21 48 61 73 52 6f 77 69  Idx) && !HasRowi
11a80 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
11a90 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
11aa0 3e 6e 65 73 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >nested==0 );.  
11ab0 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d      pik_flags |=
11ac0 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b   OPFLAG_NCHANGE;
11ad0 0a 20 20 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  .      pik_flags
11ae0 20 7c 3d 20 28 75 70 64 61 74 65 5f 66 6c 61 67   |= (update_flag
11af0 73 20 26 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  s & OPFLAG_SAVEP
11b00 4f 53 49 54 49 4f 4e 29 3b 0a 23 69 66 64 65 66  OSITION);.#ifdef
11b10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
11b20 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
11b30 20 20 20 20 69 66 28 20 75 70 64 61 74 65 5f 66      if( update_f
11b40 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lags==0 ){.     
11b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11b60 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp4(v, OP_Inser
11b70 74 49 6e 74 2c 20 0a 20 20 20 20 20 20 20 20 20  tInt, .         
11b80 20 20 20 69 49 64 78 43 75 72 2b 69 2c 20 61 52     iIdxCur+i, aR
11b90 65 67 49 64 78 5b 69 5d 2c 20 30 2c 20 28 63 68  egIdx[i], 0, (ch
11ba0 61 72 2a 29 70 54 61 62 2c 20 50 34 5f 54 41 42  ar*)pTab, P4_TAB
11bb0 4c 45 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  LE.        );.  
11bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11bd0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
11be0 4c 41 47 5f 49 53 4e 4f 4f 50 29 3b 0a 20 20 20  LAG_ISNOOP);.   
11bf0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
11c00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
11c10 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
11c20 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
11c30 43 75 72 2b 69 2c 20 61 52 65 67 49 64 78 5b 69  Cur+i, aRegIdx[i
11c40 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
11c50 20 20 20 20 20 20 20 20 20 20 20 20 61 52 65 67              aReg
11c60 49 64 78 5b 69 5d 2b 31 2c 0a 20 20 20 20 20 20  Idx[i]+1,.      
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74     pIdx->uniqNot
11c90 4e 75 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e 4b 65  Null ? pIdx->nKe
11ca0 79 43 6f 6c 3a 20 70 49 64 78 2d 3e 6e 43 6f 6c  yCol: pIdx->nCol
11cb0 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  umn);.    sqlite
11cc0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11cd0 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 20 20 7d   pik_flags);.  }
11ce0 0a 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  .  if( !HasRowid
11cf0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 3b  (pTab) ) return;
11d00 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72 65 67  .  regData = reg
11d10 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a 20 20 72  NewData + 1;.  r
11d20 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65 33 47  egRec = sqlite3G
11d30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
11d50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
11d60 65 52 65 63 6f 72 64 2c 20 72 65 67 44 61 74 61  eRecord, regData
11d70 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 72 65  , pTab->nCol, re
11d80 67 52 65 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  gRec);.  sqlite3
11d90 53 65 74 4d 61 6b 65 52 65 63 6f 72 64 50 35 28  SetMakeRecordP5(
11da0 76 2c 20 70 54 61 62 29 3b 0a 20 20 69 66 28 20  v, pTab);.  if( 
11db0 21 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 29  !bAffinityDone )
11dc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  {.    sqlite3Tab
11dd0 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70 54  leAffinity(v, pT
11de0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
11df0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
11e00 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
11e10 65 2c 20 72 65 67 44 61 74 61 2c 20 70 54 61 62  e, regData, pTab
11e20 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 69  ->nCol);.  }.  i
11e30 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
11e40 64 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  d ){.    pik_fla
11e50 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  gs = 0;.  }else{
11e60 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d  .    pik_flags =
11e70 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b   OPFLAG_NCHANGE;
11e80 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c  .    pik_flags |
11e90 3d 20 28 75 70 64 61 74 65 5f 66 6c 61 67 73 3f  = (update_flags?
11ea0 75 70 64 61 74 65 5f 66 6c 61 67 73 3a 4f 50 46  update_flags:OPF
11eb0 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 29 3b 0a  LAG_LASTROWID);.
11ec0 20 20 7d 0a 20 20 69 66 28 20 61 70 70 65 6e 64    }.  if( append
11ed0 42 69 61 73 20 29 7b 0a 20 20 20 20 70 69 6b 5f  Bias ){.    pik_
11ee0 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f  flags |= OPFLAG_
11ef0 41 50 50 45 4e 44 3b 0a 20 20 7d 0a 20 20 69 66  APPEND;.  }.  if
11f00 28 20 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20  ( useSeekResult 
11f10 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  ){.    pik_flags
11f20 20 7c 3d 20 4f 50 46 4c 41 47 5f 55 53 45 53 45   |= OPFLAG_USESE
11f30 45 4b 52 45 53 55 4c 54 3b 0a 20 20 7d 0a 20 20  EKRESULT;.  }.  
11f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11f50 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
11f60 69 44 61 74 61 43 75 72 2c 20 72 65 67 52 65 63  iDataCur, regRec
11f70 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b 0a 20  , regNewData);. 
11f80 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
11f90 73 74 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  sted ){.    sqli
11fa0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
11fb0 76 2c 20 70 54 61 62 2c 20 50 34 5f 54 41 42 4c  v, pTab, P4_TABL
11fc0 45 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  E);.  }.  sqlite
11fd0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
11fe0 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a 0a   pik_flags);.}..
11ff0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 63  /*.** Allocate c
12000 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 70  ursors for the p
12010 54 61 62 20 74 61 62 6c 65 20 61 6e 64 20 61 6c  Tab table and al
12020 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
12030 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  d generate.** co
12040 64 65 20 74 6f 20 6f 70 65 6e 20 61 6e 64 20 69  de to open and i
12050 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 6f 73 65  nitialized those
12060 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
12070 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  The cursor for t
12080 68 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  he object that c
12090 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70  ontains the comp
120a0 6c 65 74 65 20 64 61 74 61 20 28 6e 6f 72 6d 61  lete data (norma
120b0 6c 6c 79 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  lly.** the table
120c0 20 69 74 73 65 6c 66 2c 20 62 75 74 20 74 68 65   itself, but the
120d0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
120e0 65 78 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  ex in the case o
120f0 66 20 61 20 57 49 54 48 4f 55 54 0a 2a 2a 20 52  f a WITHOUT.** R
12100 4f 57 49 44 20 74 61 62 6c 65 29 20 69 73 20 72  OWID table) is r
12110 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 44 61  eturned in *piDa
12120 74 61 43 75 72 2e 20 20 54 68 65 20 66 69 72 73  taCur.  The firs
12130 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  t index cursor i
12140 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
12150 20 2a 70 69 49 64 78 43 75 72 2e 20 20 54 68 65   *piIdxCur.  The
12160 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63   number of indic
12170 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  es is returned..
12180 2a 2a 0a 2a 2a 20 55 73 65 20 69 42 61 73 65 20  **.** Use iBase 
12190 61 73 20 74 68 65 20 66 69 72 73 74 20 63 75 72  as the first cur
121a0 73 6f 72 20 28 65 69 74 68 65 72 20 74 68 65 20  sor (either the 
121b0 2a 70 69 44 61 74 61 43 75 72 20 66 6f 72 20 72  *piDataCur for r
121c0 6f 77 69 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  owid tables.** o
121d0 72 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65  r the first inde
121e0 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
121f0 57 49 44 20 74 61 62 6c 65 73 29 20 69 66 20 69  WID tables) if i
12200 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
12210 65 2e 0a 2a 2a 20 49 66 20 69 42 61 73 65 20 69  e..** If iBase i
12220 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
12230 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e 65   allocate the ne
12240 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75 72  xt available cur
12250 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  sor..**.** For a
12260 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 2a 70   rowid table, *p
12270 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20 62 65  iDataCur will be
12280 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6c 65 73   exactly one les
12290 73 20 74 68 61 6e 20 2a 70 69 49 64 78 43 75 72  s than *piIdxCur
122a0 2e 0a 2a 2a 20 46 6f 72 20 61 20 57 49 54 48 4f  ..** For a WITHO
122b0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
122c0 2a 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20  *piDataCur will 
122d0 62 65 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  be somewhere in 
122e0 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20  the range.** of 
122f0 2a 70 69 49 64 78 43 75 72 73 2c 20 64 65 70 65  *piIdxCurs, depe
12300 6e 64 69 6e 67 20 6f 6e 20 77 68 65 72 65 20 74  nding on where t
12310 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
12320 6e 64 65 78 20 61 70 70 65 61 72 73 20 6f 6e 20  ndex appears on 
12330 74 68 65 0a 2a 2a 20 70 54 61 62 2d 3e 70 49 6e  the.** pTab->pIn
12340 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  dex list..**.** 
12350 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
12360 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e  tual table, then
12370 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12380 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 74 68 65   a no-op and the
12390 0a 2a 2a 20 2a 70 69 44 61 74 61 43 75 72 20 61  .** *piDataCur a
123a0 6e 64 20 2a 70 69 49 64 78 43 75 72 20 76 61 6c  nd *piIdxCur val
123b0 75 65 73 20 61 72 65 20 6c 65 66 74 20 75 6e 69  ues are left uni
123c0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 69  nitialized..*/.i
123d0 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  nt sqlite3OpenTa
123e0 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a 20  bleAndIndices(. 
123f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12400 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12410 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
12420 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61  *pTab,     /* Ta
12430 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ble to be opened
12440 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
12450 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65         /* OP_Ope
12460 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
12470 57 72 69 74 65 20 2a 2f 0a 20 20 75 38 20 70 35  Write */.  u8 p5
12480 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
12490 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 4f  5 value for OP_O
124a0 70 65 6e 2a 20 6f 70 63 6f 64 65 73 20 28 65 78  pen* opcodes (ex
124b0 63 65 70 74 20 6f 6e 20 57 49 54 48 4f 55 54 20  cept on WITHOUT 
124c0 52 4f 57 49 44 29 20 2a 2f 0a 20 20 69 6e 74 20  ROWID) */.  int 
124d0 69 42 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  iBase,       /* 
124e0 55 73 65 20 74 68 69 73 20 66 6f 72 20 74 68 65  Use this for the
124f0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
12500 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 2a  f there is one *
12510 2f 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 2c  /.  u8 *aToOpen,
12520 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
12530 55 4c 4c 3a 20 62 6f 6f 6c 65 61 6e 20 66 6f 72  ULL: boolean for
12540 20 65 61 63 68 20 74 61 62 6c 65 20 61 6e 64 20   each table and 
12550 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  index */.  int *
12560 70 69 44 61 74 61 43 75 72 2c 20 20 2f 2a 20 57  piDataCur,  /* W
12570 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
12580 65 20 73 6f 75 72 63 65 20 63 75 72 73 6f 72 20  e source cursor 
12590 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
125a0 20 69 6e 74 20 2a 70 69 49 64 78 43 75 72 20 20   int *piIdxCur  
125b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
125c0 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
125d0 72 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  r number here */
125e0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
125f0 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 44  nt iDb;.  int iD
12600 61 74 61 43 75 72 3b 0a 20 20 49 6e 64 65 78 20  ataCur;.  Index 
12610 2a 70 49 64 78 3b 0a 20 20 56 64 62 65 20 2a 76  *pIdx;.  Vdbe *v
12620 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
12630 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c 20  =OP_OpenRead || 
12640 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  op==OP_OpenWrite
12650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
12660 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c  ==OP_OpenWrite |
12670 7c 20 70 35 3d 3d 30 20 29 3b 0a 20 20 69 66 28  | p5==0 );.  if(
12680 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
12690 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
126a0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
126b0 6f 70 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  op for virtual t
126c0 61 62 6c 65 73 2e 20 4c 65 61 76 65 20 74 68 65  ables. Leave the
126d0 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 76   output.    ** v
126e0 61 72 69 61 62 6c 65 73 20 2a 70 69 44 61 74 61  ariables *piData
126f0 43 75 72 20 61 6e 64 20 2a 70 69 49 64 78 43 75  Cur and *piIdxCu
12700 72 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  r uninitialized 
12710 73 6f 20 74 68 61 74 20 76 61 6c 67 72 69 6e 64  so that valgrind
12720 0a 20 20 20 20 2a 2a 20 63 61 6e 20 64 65 74 65  .    ** can dete
12730 63 74 20 69 66 20 74 68 65 79 20 61 72 65 20 75  ct if they are u
12740 73 65 64 20 62 79 20 6d 69 73 74 61 6b 65 20 69  sed by mistake i
12750 6e 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  n the caller. */
12760 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12770 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
12780 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12790 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
127a0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76 20  ->pSchema);.  v 
127b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
127c0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
127d0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
127e0 28 20 69 42 61 73 65 3c 30 20 29 20 69 42 61 73  ( iBase<0 ) iBas
127f0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
12800 3b 0a 20 20 69 44 61 74 61 43 75 72 20 3d 20 69  ;.  iDataCur = i
12810 42 61 73 65 2b 2b 3b 0a 20 20 69 66 28 20 70 69  Base++;.  if( pi
12820 44 61 74 61 43 75 72 20 29 20 2a 70 69 44 61 74  DataCur ) *piDat
12830 61 43 75 72 20 3d 20 69 44 61 74 61 43 75 72 3b  aCur = iDataCur;
12840 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
12850 70 54 61 62 29 20 26 26 20 28 61 54 6f 4f 70 65  pTab) && (aToOpe
12860 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b  n==0 || aToOpen[
12870 30 5d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0]) ){.    sqlit
12880 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
12890 73 65 2c 20 69 44 61 74 61 43 75 72 2c 20 69 44  se, iDataCur, iD
128a0 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
128b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
128c0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
128d0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
128e0 6e 75 6d 2c 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e  num, op==OP_Open
128f0 57 72 69 74 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  Write, pTab->zNa
12900 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  me);.  }.  if( p
12910 69 49 64 78 43 75 72 20 29 20 2a 70 69 49 64 78  iIdxCur ) *piIdx
12920 43 75 72 20 3d 20 69 42 61 73 65 3b 0a 20 20 66  Cur = iBase;.  f
12930 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(i=0, pIdx=pTa
12940 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
12950 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
12960 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  t, i++){.    int
12970 20 69 49 64 78 43 75 72 20 3d 20 69 42 61 73 65   iIdxCur = iBase
12980 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
12990 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
129a0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
129b0 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
129c0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
129d0 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  && !HasRowid(pTa
129e0 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b) ){.      if( 
129f0 70 69 44 61 74 61 43 75 72 20 29 20 2a 70 69 44  piDataCur ) *piD
12a00 61 74 61 43 75 72 20 3d 20 69 49 64 78 43 75 72  ataCur = iIdxCur
12a10 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 30 3b 0a  ;.      p5 = 0;.
12a20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 54      }.    if( aT
12a30 6f 4f 70 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f  oOpen==0 || aToO
12a40 70 65 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20  pen[i+1] ){.    
12a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a60 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Op3(v, op, iIdxC
12a70 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ur, pIdx->tnum, 
12a80 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
12a90 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
12aa0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
12ab0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12ac0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12ad0 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p5);.      VdbeC
12ae0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
12af0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
12b00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12b10 69 42 61 73 65 3e 70 50 61 72 73 65 2d 3e 6e 54  iBase>pParse->nT
12b20 61 62 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab ) pParse->nTa
12b30 62 20 3d 20 69 42 61 73 65 3b 0a 20 20 72 65 74  b = iBase;.  ret
12b40 75 72 6e 20 69 3b 0a 7d 0a 0a 0a 23 69 66 64 65  urn i;.}...#ifde
12b50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
12b60 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
12b70 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
12b80 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
12b90 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 2a 2a   whenever the.**
12ba0 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
12bb0 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  zation is used. 
12bc0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
12bd0 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 70 75 72  r testing.** pur
12be0 70 6f 73 65 73 20 6f 6e 6c 79 20 2d 20 74 6f 20  poses only - to 
12bf0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 72  make sure the tr
12c00 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
12c10 69 6f 6e 20 72 65 61 6c 6c 79 0a 2a 2a 20 69 73  ion really.** is
12c20 20 68 61 70 70 65 6e 69 6e 67 20 77 68 65 6e 20   happening when 
12c30 69 74 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  it is supposed t
12c40 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
12c50 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b  3_xferopt_count;
12c60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12c70 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 23 69 66 6e  E_TEST */...#ifn
12c80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12c90 58 46 45 52 5f 4f 50 54 0a 2f 2a 0a 2a 2a 20 43  XFER_OPT./*.** C
12ca0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
12cb0 6e 64 65 78 20 70 53 72 63 20 69 73 20 63 6f 6d  ndex pSrc is com
12cc0 70 61 74 69 62 6c 65 20 61 73 20 61 20 73 6f 75  patible as a sou
12cd0 72 63 65 20 6f 66 20 64 61 74 61 0a 2a 2a 20 66  rce of data.** f
12ce0 6f 72 20 69 6e 64 65 78 20 70 44 65 73 74 20 69  or index pDest i
12cf0 6e 20 61 6e 20 69 6e 73 65 72 74 20 74 72 61 6e  n an insert tran
12d00 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  sfer optimizatio
12d10 6e 2e 20 20 54 68 65 20 72 75 6c 65 73 0a 2a 2a  n.  The rules.**
12d20 20 66 6f 72 20 61 20 63 6f 6d 70 61 74 69 62 6c   for a compatibl
12d30 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20  e index:.**.**  
12d40 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20    *   The index 
12d50 69 73 20 6f 76 65 72 20 74 68 65 20 73 61 6d 65  is over the same
12d60 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a   set of columns.
12d70 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61  **    *   The sa
12d80 6d 65 20 44 45 53 43 20 61 6e 64 20 41 53 43 20  me DESC and ASC 
12d90 6d 61 72 6b 69 6e 67 73 20 6f 63 63 75 72 73 20  markings occurs 
12da0 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a 2a  on all columns.*
12db0 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d  *    *   The sam
12dc0 65 20 6f 6e 45 72 72 6f 72 20 70 72 6f 63 65 73  e onError proces
12dd0 73 69 6e 67 20 28 4f 45 5f 41 62 6f 72 74 2c 20  sing (OE_Abort, 
12de0 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 0a  OE_Ignore, etc).
12df0 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61  **    *   The sa
12e00 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
12e10 75 65 6e 63 65 20 6f 6e 20 65 61 63 68 20 63 6f  uence on each co
12e20 6c 75 6d 6e 0a 2a 2a 20 20 20 20 2a 20 20 20 54  lumn.**    *   T
12e30 68 65 20 69 6e 64 65 78 20 68 61 73 20 74 68 65  he index has the
12e40 20 65 78 61 63 74 20 73 61 6d 65 20 57 48 45 52   exact same WHER
12e50 45 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  E clause.*/.stat
12e60 69 63 20 69 6e 74 20 78 66 65 72 43 6f 6d 70 61  ic int xferCompa
12e70 74 69 62 6c 65 49 6e 64 65 78 28 49 6e 64 65 78  tibleIndex(Index
12e80 20 2a 70 44 65 73 74 2c 20 49 6e 64 65 78 20 2a   *pDest, Index *
12e90 70 53 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pSrc){.  int i;.
12ea0 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 20    assert( pDest 
12eb0 26 26 20 70 53 72 63 20 29 3b 0a 20 20 61 73 73  && pSrc );.  ass
12ec0 65 72 74 28 20 70 44 65 73 74 2d 3e 70 54 61 62  ert( pDest->pTab
12ed0 6c 65 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c 65  le!=pSrc->pTable
12ee0 20 29 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d   );.  if( pDest-
12ef0 3e 6e 4b 65 79 43 6f 6c 21 3d 70 53 72 63 2d 3e  >nKeyCol!=pSrc->
12f00 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 72  nKeyCol ){.    r
12f10 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
12f20 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  fferent number o
12f30 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 7d  f columns */.  }
12f40 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6f 6e  .  if( pDest->on
12f50 45 72 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e 45  Error!=pSrc->onE
12f60 72 72 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rror ){.    retu
12f70 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
12f80 72 65 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72 65  rent conflict re
12f90 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67  solution strateg
12fa0 69 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72  ies */.  }.  for
12fb0 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 4b  (i=0; i<pSrc->nK
12fc0 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
12fd0 20 69 66 28 20 70 53 72 63 2d 3e 61 69 43 6f 6c   if( pSrc->aiCol
12fe0 75 6d 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61  umn[i]!=pDest->a
12ff0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20 20  iColumn[i] ){.  
13000 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
13010 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c  /* Different col
13020 75 6d 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  umns indexed */.
13030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
13040 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3d  rc->aiColumn[i]=
13050 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20  =XN_EXPR ){.    
13060 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
13070 61 43 6f 6c 45 78 70 72 21 3d 30 20 26 26 20 70  aColExpr!=0 && p
13080 44 65 73 74 2d 3e 61 43 6f 6c 45 78 70 72 21 3d  Dest->aColExpr!=
13090 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
130a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
130b0 65 28 30 2c 20 70 53 72 63 2d 3e 61 43 6f 6c 45  e(0, pSrc->aColE
130c0 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  xpr->a[i].pExpr,
130d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
130f0 65 73 74 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  est->aColExpr->a
13100 5b 69 5d 2e 70 45 78 70 72 2c 20 2d 31 29 21 3d  [i].pExpr, -1)!=
13110 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
13120 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
13130 65 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  erent expression
13140 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
13150 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
13160 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 53      if( pSrc->aS
13170 6f 72 74 4f 72 64 65 72 5b 69 5d 21 3d 70 44 65  ortOrder[i]!=pDe
13180 73 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  st->aSortOrder[i
13190 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ] ){.      retur
131a0 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72  n 0;   /* Differ
131b0 65 6e 74 20 73 6f 72 74 20 6f 72 64 65 72 73 20  ent sort orders 
131c0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
131d0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
131e0 28 70 53 72 63 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  (pSrc->azColl[i]
131f0 2c 70 44 65 73 74 2d 3e 61 7a 43 6f 6c 6c 5b 69  ,pDest->azColl[i
13200 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ])!=0 ){.      r
13210 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
13220 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
13230 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20  g sequences */. 
13240 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
13250 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
13260 65 28 30 2c 20 70 53 72 63 2d 3e 70 50 61 72 74  e(0, pSrc->pPart
13270 49 64 78 57 68 65 72 65 2c 20 70 44 65 73 74 2d  IdxWhere, pDest-
13280 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c 20  >pPartIdxWhere, 
13290 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
132a0 6e 20 30 3b 20 20 20 20 20 2f 2a 20 44 69 66 66  n 0;     /* Diff
132b0 65 72 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75  erent WHERE clau
132c0 73 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ses */.  }..  /*
132d0 20 49 66 20 6e 6f 20 74 65 73 74 20 61 62 6f 76   If no test abov
132e0 65 20 66 61 69 6c 73 20 74 68 65 6e 20 74 68 65  e fails then the
132f0 20 69 6e 64 69 63 65 73 20 6d 75 73 74 20 62 65   indices must be
13300 20 63 6f 6d 70 61 74 69 62 6c 65 20 2a 2f 0a 20   compatible */. 
13310 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
13320 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 68 65 20  .** Attempt the 
13330 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a  transfer optimiz
13340 61 74 69 6f 6e 20 6f 6e 20 49 4e 53 45 52 54 73  ation on INSERTs
13350 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
13360 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  **     INSERT IN
13370 54 4f 20 74 61 62 31 20 53 45 4c 45 43 54 20 2a  TO tab1 SELECT *
13380 20 46 52 4f 4d 20 74 61 62 32 3b 0a 2a 2a 0a 2a   FROM tab2;.**.*
13390 2a 20 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d  * The xfer optim
133a0 69 7a 61 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  ization transfer
133b0 73 20 72 61 77 20 72 65 63 6f 72 64 73 20 66 72  s raw records fr
133c0 6f 6d 20 74 61 62 32 20 6f 76 65 72 20 74 6f 20  om tab2 over to 
133d0 74 61 62 31 2e 20 20 0a 2a 2a 20 43 6f 6c 75 6d  tab1.  .** Colum
133e0 6e 73 20 61 72 65 20 6e 6f 74 20 64 65 63 6f 64  ns are not decod
133f0 65 64 20 61 6e 64 20 72 65 61 73 73 65 6d 62 6c  ed and reassembl
13400 65 64 2c 20 77 68 69 63 68 20 67 72 65 61 74 6c  ed, which greatl
13410 79 20 69 6d 70 72 6f 76 65 73 0a 2a 2a 20 70 65  y improves.** pe
13420 72 66 6f 72 6d 61 6e 63 65 2e 20 20 52 61 77 20  rformance.  Raw 
13430 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 61 72  index records ar
13440 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
13450 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 0a 2a   the same way..*
13460 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20 6f 70  *.** The xfer op
13470 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6f 6e  timization is on
13480 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
13490 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 61 72  tab1 and tab2 ar
134a0 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a 2a  e compatible..**
134b0 20 54 68 65 72 65 20 61 72 65 20 6c 6f 74 73 20   There are lots 
134c0 6f 66 20 72 75 6c 65 73 20 66 6f 72 20 64 65 74  of rules for det
134d0 65 72 6d 69 6e 69 6e 67 20 63 6f 6d 70 61 74 69  ermining compati
134e0 62 69 6c 69 74 79 20 2d 20 73 65 65 20 63 6f 6d  bility - see com
134f0 6d 65 6e 74 73 0a 2a 2a 20 65 6d 62 65 64 64 65  ments.** embedde
13500 64 20 69 6e 20 74 68 65 20 63 6f 64 65 20 66 6f  d in the code fo
13510 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a  r details..**.**
13520 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
13530 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 74 68  turns TRUE if th
13540 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
13550 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
13560 62 65 20 75 73 65 64 2e 0a 2a 2a 20 53 6f 6d 65  be used..** Some
13570 74 69 6d 65 73 20 74 68 65 20 78 66 65 72 20 6f  times the xfer o
13580 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c 6c  ptimization will
13590 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74 68   only work if th
135a0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
135b0 62 6c 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20  ble.** is empty 
135c0 2d 20 61 20 66 61 63 74 6f 72 20 74 68 61 74 20  - a factor that 
135d0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 64 65 74 65  can only be dete
135e0 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
135f0 6d 65 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20  me.  In that.** 
13600 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
13610 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
13620 65 20 66 6f 72 20 74 68 65 20 78 66 65 72 20 6f  e for the xfer o
13630 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62 75 74 20  ptimization but 
13640 61 6c 73 6f 0a 2a 2a 20 64 6f 65 73 20 61 20 74  also.** does a t
13650 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 74 68  est to see if th
13660 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
13670 62 6c 65 20 69 73 20 65 6d 70 74 79 20 61 6e 64  ble is empty and
13680 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65 0a   jumps over the.
13690 2a 2a 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61  ** xfer optimiza
136a0 74 69 6f 6e 20 63 6f 64 65 20 69 66 20 74 68 65  tion code if the
136b0 20 74 65 73 74 20 66 61 69 6c 73 2e 20 20 49 6e   test fails.  In
136c0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73   that case, this
136d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
136e0 72 6e 73 20 46 41 4c 53 45 20 73 6f 20 74 68 61  rns FALSE so tha
136f0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  t the caller wil
13700 6c 20 6b 6e 6f 77 20 74 6f 20 67 6f 20 61 68 65  l know to go ahe
13710 61 64 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a  ad and generate.
13720 2a 2a 20 61 6e 20 75 6e 6f 70 74 69 6d 69 7a 65  ** an unoptimize
13730 64 20 74 72 61 6e 73 66 65 72 2e 20 20 54 68 69  d transfer.  Thi
13740 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 72  s routine also r
13750 65 74 75 72 6e 73 20 46 41 4c 53 45 20 69 66 20  eturns FALSE if 
13760 74 68 65 72 65 0a 2a 2a 20 69 73 20 6e 6f 20 63  there.** is no c
13770 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 78  hance that the x
13780 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
13790 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 2e   can be applied.
137a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69  .**.** This opti
137b0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 70 61 72 74  mization is part
137c0 69 63 75 6c 61 72 6c 79 20 75 73 65 66 75 6c 20  icularly useful 
137d0 61 74 20 6d 61 6b 69 6e 67 20 56 41 43 55 55 4d  at making VACUUM
137e0 20 72 75 6e 20 66 61 73 74 65 72 2e 0a 2a 2f 0a   run faster..*/.
137f0 73 74 61 74 69 63 20 69 6e 74 20 78 66 65 72 4f  static int xferO
13800 70 74 69 6d 69 7a 61 74 69 6f 6e 28 0a 20 20 50  ptimization(.  P
13810 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13820 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
13830 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
13840 65 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 20  e *pDest,       
13850 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77    /* The table w
13860 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20  e are inserting 
13870 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74  into */.  Select
13880 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
13890 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
138a0 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20  ement to use as 
138b0 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
138c0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
138d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  ,          /* Ho
138e0 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73  w to handle cons
138f0 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f  traint errors */
13900 0a 20 20 69 6e 74 20 69 44 62 44 65 73 74 20 20  .  int iDbDest  
13910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13920 64 61 74 61 62 61 73 65 20 6f 66 20 70 44 65 73  database of pDes
13930 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
13940 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13950 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  db;.  ExprList *
13960 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
13970 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
13980 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
13990 53 45 4c 45 43 54 20 2a 2f 0a 20 20 54 61 62 6c  SELECT */.  Tabl
139a0 65 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20  e *pSrc;        
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
139c0 54 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  The table in the
139d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
139e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 49 6e 64 65  SELECT */.  Inde
139f0 78 20 2a 70 53 72 63 49 64 78 2c 20 2a 70 44 65  x *pSrcIdx, *pDe
13a00 73 74 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  stIdx;       /* 
13a10 53 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69  Source and desti
13a20 6e 61 74 69 6f 6e 20 69 6e 64 69 63 65 73 20 2a  nation indices *
13a30 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
13a40 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
13a50 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
13a60 6e 74 20 6f 66 20 70 53 65 6c 65 63 74 2d 3e 70  nt of pSelect->p
13a70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  Src */.  int i; 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
13aa0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
13ab0 6e 74 20 69 44 62 53 72 63 3b 20 20 20 20 20 20  nt iDbSrc;      
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
13ae0 6f 66 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  of pSrc */.  int
13af0 20 69 53 72 63 2c 20 69 44 65 73 74 3b 20 20 20   iSrc, iDest;   
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13b10 20 43 75 72 73 6f 72 73 20 66 72 6f 6d 20 73 6f   Cursors from so
13b20 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61  urce and destina
13b30 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
13b40 64 72 31 2c 20 61 64 64 72 32 3b 20 20 20 20 20  dr1, addr2;     
13b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13b60 6f 70 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  op addresses */.
13b70 20 20 69 6e 74 20 65 6d 70 74 79 44 65 73 74 54    int emptyDestT
13b80 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
13b90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13ba0 20 74 65 73 74 20 66 6f 72 20 65 6d 70 74 79 20   test for empty 
13bb0 70 44 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65  pDest */.  int e
13bc0 6d 70 74 79 53 72 63 54 65 73 74 20 3d 20 30 3b  mptySrcTest = 0;
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13be0 64 64 72 65 73 73 20 6f 66 20 74 65 73 74 20 66  ddress of test f
13bf0 6f 72 20 65 6d 70 74 79 20 70 53 72 63 20 2a 2f  or empty pSrc */
13c00 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
13c30 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20  we are building 
13c40 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75 74 6f  */.  int regAuto
13c50 69 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  inc;            
13c60 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
13c70 72 65 67 69 73 74 65 72 20 75 73 65 64 20 62 79  register used by
13c80 20 41 55 54 4f 49 4e 43 20 2a 2f 0a 20 20 69 6e   AUTOINC */.  in
13c90 74 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49  t destHasUniqueI
13ca0 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  dx = 0;        /
13cb0 2a 20 54 72 75 65 20 69 66 20 70 44 65 73 74 20  * True if pDest 
13cc0 68 61 73 20 61 20 55 4e 49 51 55 45 20 69 6e 64  has a UNIQUE ind
13cd0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  ex */.  int regD
13ce0 61 74 61 2c 20 72 65 67 52 6f 77 69 64 3b 20 20  ata, regRowid;  
13cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
13d00 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 64 61  sters holding da
13d10 74 61 20 61 6e 64 20 72 6f 77 69 64 20 2a 2f 0a  ta and rowid */.
13d20 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d  .  if( pSelect==
13d30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13d40 30 3b 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20  0;   /* Must be 
13d50 6f 66 20 74 68 65 20 66 6f 72 6d 20 20 49 4e 53  of the form  INS
13d60 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c  ERT INTO ... SEL
13d70 45 43 54 20 2e 2e 2e 20 2a 2f 0a 20 20 7d 0a 20  ECT ... */.  }. 
13d80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 57 69   if( pParse->pWi
13d90 74 68 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 70  th || pSelect->p
13da0 57 69 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 44  With ){.    /* D
13db0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
13dc0 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 71 75   process this qu
13dd0 65 72 79 20 69 66 20 74 68 65 72 65 20 61 72 65  ery if there are
13de0 20 61 6e 20 57 49 54 48 20 63 6c 61 75 73 65 73   an WITH clauses
13df0 0a 20 20 20 20 2a 2a 20 61 74 74 61 63 68 65 64  .    ** attached
13e00 20 74 6f 20 69 74 2e 20 50 72 6f 63 65 65 64 69   to it. Proceedi
13e10 6e 67 20 6d 61 79 20 67 65 6e 65 72 61 74 65 20  ng may generate 
13e20 61 20 66 61 6c 73 65 20 22 6e 6f 20 73 75 63 68  a false "no such
13e30 20 74 61 62 6c 65 3a 20 78 78 78 22 0a 20 20 20   table: xxx".   
13e40 20 2a 2a 20 65 72 72 6f 72 20 69 66 20 70 53 65   ** error if pSe
13e50 6c 65 63 74 20 72 65 61 64 73 20 66 72 6f 6d 20  lect reads from 
13e60 61 20 43 54 45 20 6e 61 6d 65 64 20 22 78 78 78  a CTE named "xxx
13e70 22 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ".  */.    retur
13e80 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
13e90 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73  qlite3TriggerLis
13ea0 74 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 29  t(pParse, pDest)
13eb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
13ec0 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75 73 74  ;   /* tab1 must
13ed0 20 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67 65   not have trigge
13ee0 72 73 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65  rs */.  }.#ifnde
13ef0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13f00 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
13f10 20 49 73 56 69 72 74 75 61 6c 28 70 44 65 73 74   IsVirtual(pDest
13f20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13f30 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75 73  0;   /* tab1 mus
13f40 74 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74 75  t not be a virtu
13f50 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a  al table */.  }.
13f60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 6e 45  #endif.  if( onE
13f70 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
13f80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 44 65 73   ){.    if( pDes
13f90 74 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 20 6f 6e  t->iPKey>=0 ) on
13fa0 45 72 72 6f 72 20 3d 20 70 44 65 73 74 2d 3e 6b  Error = pDest->k
13fb0 65 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20  eyConf;.    if( 
13fc0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
13fd0 75 6c 74 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20  ult ) onError = 
13fe0 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  OE_Abort;.  }.  
13ff0 61 73 73 65 72 74 28 70 53 65 6c 65 63 74 2d 3e  assert(pSelect->
14000 70 53 72 63 29 3b 20 20 20 2f 2a 20 61 6c 6c 6f  pSrc);   /* allo
14010 63 61 74 65 64 20 65 76 65 6e 20 69 66 20 74 68  cated even if th
14020 65 72 65 20 69 73 20 6e 6f 20 46 52 4f 4d 20 63  ere is no FROM c
14030 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
14040 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 6e 53  Select->pSrc->nS
14050 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  rc!=1 ){.    ret
14060 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d  urn 0;   /* FROM
14070 20 63 6c 61 75 73 65 20 6d 75 73 74 20 68 61 76   clause must hav
14080 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 74 65  e exactly one te
14090 72 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  rm */.  }.  if( 
140a0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61  pSelect->pSrc->a
140b0 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a 20  [0].pSelect ){. 
140c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
140d0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63 61  * FROM clause ca
140e0 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 73  nnot contain a s
140f0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20  ubquery */.  }. 
14100 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 57   if( pSelect->pW
14110 68 65 72 65 20 29 7b 0a 20 20 20 20 72 65 74 75  here ){.    retu
14120 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
14130 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
14140 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
14150 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
14160 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ct->pOrderBy ){.
14170 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14180 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
14190 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
141a0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d  BY clause */.  }
141b0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6e 65 65  .  /* Do not nee
141c0 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 61 20  d to test for a 
141d0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
141e0 49 66 20 48 41 56 49 4e 47 20 69 73 20 70 72 65  If HAVING is pre
141f0 73 65 6e 74 20 62 75 74 0a 20 20 2a 2a 20 74 68  sent but.  ** th
14200 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
14210 42 59 2c 20 77 65 20 77 69 6c 6c 20 67 65 74 20  BY, we will get 
14220 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69  an error. */.  i
14230 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 47 72 6f  f( pSelect->pGro
14240 75 70 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  upBy ){.    retu
14250 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
14260 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
14270 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
14280 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
14290 65 6c 65 63 74 2d 3e 70 4c 69 6d 69 74 20 29 7b  elect->pLimit ){
142a0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
142b0 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e   /* SELECT may n
142c0 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
142d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20  clause */.  }.  
142e0 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  if( pSelect->pPr
142f0 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
14300 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
14310 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
14320 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 2a 2f 0a  mpound query */.
14330 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
14340 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
14350 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
14360 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
14370 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62  SELECT may not b
14380 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  e DISTINCT */.  
14390 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  }.  pEList = pSe
143a0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
143b0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
143c0 30 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  0 );.  if( pELis
143d0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
143e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
143f0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
14400 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
14410 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2a 2f  ly one column */
14420 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14430 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
14440 72 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  r );.  if( pELis
14450 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
14460 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p!=TK_ASTERISK )
14470 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
14480 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
14490 73 65 74 20 6d 75 73 74 20 62 65 20 74 68 65 20  set must be the 
144a0 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72  special operator
144b0 20 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f   "*" */.  }..  /
144c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
144d0 77 65 20 68 61 76 65 20 65 73 74 61 62 6c 69 73  we have establis
144e0 68 65 64 20 74 68 61 74 20 74 68 65 20 73 74 61  hed that the sta
144f0 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
14500 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 73 79  .  ** correct sy
14510 6e 74 61 63 74 69 63 20 66 6f 72 6d 20 74 6f 20  ntactic form to 
14520 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
14530 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
14540 2e 20 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20 68  .  Now.  ** we h
14550 61 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ave to check the
14560 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a 2f   semantics..  */
14570 0a 20 20 70 49 74 65 6d 20 3d 20 70 53 65 6c 65  .  pItem = pSele
14580 63 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20 70  ct->pSrc->a;.  p
14590 53 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Src = sqlite3Loc
145a0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
145b0 72 73 65 2c 20 30 2c 20 70 49 74 65 6d 29 3b 0a  rse, 0, pItem);.
145c0 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
145d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
145e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
145f0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
14600 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   a real table */
14610 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 3d  .  }.  if( pSrc=
14620 3d 70 44 65 73 74 20 29 7b 0a 20 20 20 20 72 65  =pDest ){.    re
14630 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62  turn 0;   /* tab
14640 31 20 61 6e 64 20 74 61 62 32 20 6d 61 79 20 6e  1 and tab2 may n
14650 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 74  ot be the same t
14660 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  able */.  }.  if
14670 28 20 48 61 73 52 6f 77 69 64 28 70 44 65 73 74  ( HasRowid(pDest
14680 29 21 3d 48 61 73 52 6f 77 69 64 28 70 53 72 63  )!=HasRowid(pSrc
14690 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
146a0 30 3b 20 20 20 2f 2a 20 73 6f 75 72 63 65 20 61  0;   /* source a
146b0 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  nd destination m
146c0 75 73 74 20 62 6f 74 68 20 62 65 20 57 49 54 48  ust both be WITH
146d0 4f 55 54 20 52 4f 57 49 44 20 6f 72 20 6e 6f 74  OUT ROWID or not
146e0 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20   */.  }.#ifndef 
146f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
14700 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
14710 73 56 69 72 74 75 61 6c 28 70 53 72 63 29 20 29  sVirtual(pSrc) )
14720 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
14730 20 20 2f 2a 20 74 61 62 32 20 6d 75 73 74 20 6e    /* tab2 must n
14740 6f 74 20 62 65 20 61 20 76 69 72 74 75 61 6c 20  ot be a virtual 
14750 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e  table */.  }.#en
14760 64 69 66 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  dif.  if( pSrc->
14770 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72  pSelect ){.    r
14780 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61  eturn 0;   /* ta
14790 62 32 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  b2 may not be a 
147a0 76 69 65 77 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  view */.  }.  if
147b0 28 20 70 44 65 73 74 2d 3e 6e 43 6f 6c 21 3d 70  ( pDest->nCol!=p
147c0 53 72 63 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Src->nCol ){.   
147d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
147e0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
147f0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
14800 6d 65 20 69 6e 20 74 61 62 31 20 61 6e 64 20 74  me in tab1 and t
14810 61 62 32 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ab2 */.  }.  if(
14820 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 21 3d 70   pDest->iPKey!=p
14830 53 72 63 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Src->iPKey ){.  
14840 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
14850 20 42 6f 74 68 20 74 61 62 6c 65 73 20 6d 75 73   Both tables mus
14860 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
14870 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
14880 4b 45 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72  KEY */.  }.  for
14890 28 69 3d 30 3b 20 69 3c 70 44 65 73 74 2d 3e 6e  (i=0; i<pDest->n
148a0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43  Col; i++){.    C
148b0 6f 6c 75 6d 6e 20 2a 70 44 65 73 74 43 6f 6c 20  olumn *pDestCol 
148c0 3d 20 26 70 44 65 73 74 2d 3e 61 43 6f 6c 5b 69  = &pDest->aCol[i
148d0 5d 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70  ];.    Column *p
148e0 53 72 63 43 6f 6c 20 3d 20 26 70 53 72 63 2d 3e  SrcCol = &pSrc->
148f0 61 43 6f 6c 5b 69 5d 3b 0a 23 69 66 64 65 66 20  aCol[i];.#ifdef 
14900 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49  SQLITE_ENABLE_HI
14910 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 20 20 20  DDEN_COLUMNS.   
14920 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61   if( (db->mDbFla
14930 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
14940 75 6d 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  um)==0 .     && 
14950 28 70 44 65 73 74 43 6f 6c 2d 3e 63 6f 6c 46 6c  (pDestCol->colFl
14960 61 67 73 20 7c 20 70 53 72 63 43 6f 6c 2d 3e 63  ags | pSrcCol->c
14970 6f 6c 46 6c 61 67 73 29 20 26 20 43 4f 4c 46 4c  olFlags) & COLFL
14980 41 47 5f 48 49 44 44 45 4e 20 0a 20 20 20 20 29  AG_HIDDEN .    )
14990 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
149a0 3b 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  ;    /* Neither 
149b0 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 5f  table may have _
149c0 5f 68 69 64 64 65 6e 5f 5f 20 63 6f 6c 75 6d 6e  _hidden__ column
149d0 73 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  s */.    }.#endi
149e0 66 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 43  f.    if( pDestC
149f0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 21 3d 70 53  ol->affinity!=pS
14a00 72 63 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20  rcCol->affinity 
14a10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14a20 30 3b 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74  0;    /* Affinit
14a30 79 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  y must be the sa
14a40 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e  me on all column
14a50 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  s */.    }.    i
14a60 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
14a70 6d 70 28 70 44 65 73 74 43 6f 6c 2d 3e 7a 43 6f  mp(pDestCol->zCo
14a80 6c 6c 2c 20 70 53 72 63 43 6f 6c 2d 3e 7a 43 6f  ll, pSrcCol->zCo
14a90 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ll)!=0 ){.      
14aa0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
14ab0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
14ac0 63 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ce must be the s
14ad0 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d  ame on all colum
14ae0 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ns */.    }.    
14af0 69 66 28 20 70 44 65 73 74 43 6f 6c 2d 3e 6e 6f  if( pDestCol->no
14b00 74 4e 75 6c 6c 20 26 26 20 21 70 53 72 63 43 6f  tNull && !pSrcCo
14b10 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  l->notNull ){.  
14b20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14b30 20 2f 2a 20 74 61 62 32 20 6d 75 73 74 20 62 65   /* tab2 must be
14b40 20 4e 4f 54 20 4e 55 4c 4c 20 69 66 20 74 61 62   NOT NULL if tab
14b50 31 20 69 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  1 is */.    }.  
14b60 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c    /* Default val
14b70 75 65 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ues for second a
14b80 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 6f  nd subsequent co
14b90 6c 75 6d 6e 73 20 6e 65 65 64 20 74 6f 20 6d 61  lumns need to ma
14ba0 74 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tch. */.    if( 
14bb0 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  i>0 ){.      ass
14bc0 65 72 74 28 20 70 44 65 73 74 43 6f 6c 2d 3e 70  ert( pDestCol->p
14bd0 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 44 65 73 74  Dflt==0 || pDest
14be0 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d  Col->pDflt->op==
14bf0 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20 20 20 20  TK_SPAN );.     
14c00 20 61 73 73 65 72 74 28 20 70 53 72 63 43 6f 6c   assert( pSrcCol
14c10 2d 3e 70 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 53  ->pDflt==0 || pS
14c20 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f 70  rcCol->pDflt->op
14c30 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20 20  ==TK_SPAN );.   
14c40 20 20 20 69 66 28 20 28 70 44 65 73 74 43 6f 6c     if( (pDestCol
14c50 2d 3e 70 44 66 6c 74 3d 3d 30 29 21 3d 28 70 53  ->pDflt==0)!=(pS
14c60 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 29  rcCol->pDflt==0)
14c70 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 44 65   .       || (pDe
14c80 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 20 26 26 20  stCol->pDflt && 
14c90 73 74 72 63 6d 70 28 70 44 65 73 74 43 6f 6c 2d  strcmp(pDestCol-
14ca0 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pDflt->u.zToken
14cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 20 20 20 20 70 53 72 63 43 6f 6c           pSrcCol
14ce0 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pDflt->u.zToke
14cf0 6e 29 21 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a  n)!=0).      ){.
14d00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
14d10 3b 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ;    /* Default 
14d20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
14d30 68 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20  he same for all 
14d40 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
14d50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
14d60 6f 72 28 70 44 65 73 74 49 64 78 3d 70 44 65 73  or(pDestIdx=pDes
14d70 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65 73 74  t->pIndex; pDest
14d80 49 64 78 3b 20 70 44 65 73 74 49 64 78 3d 70 44  Idx; pDestIdx=pD
14d90 65 73 74 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  estIdx->pNext){.
14da0 20 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65      if( IsUnique
14db0 49 6e 64 65 78 28 70 44 65 73 74 49 64 78 29 20  Index(pDestIdx) 
14dc0 29 7b 0a 20 20 20 20 20 20 64 65 73 74 48 61 73  ){.      destHas
14dd0 55 6e 69 71 75 65 49 64 78 20 3d 20 31 3b 0a 20  UniqueIdx = 1;. 
14de0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 72     }.    for(pSr
14df0 63 49 64 78 3d 70 53 72 63 2d 3e 70 49 6e 64 65  cIdx=pSrc->pInde
14e00 78 3b 20 70 53 72 63 49 64 78 3b 20 70 53 72 63  x; pSrcIdx; pSrc
14e10 49 64 78 3d 70 53 72 63 49 64 78 2d 3e 70 4e 65  Idx=pSrcIdx->pNe
14e20 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78  xt){.      if( x
14e30 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64  ferCompatibleInd
14e40 65 78 28 70 44 65 73 74 49 64 78 2c 20 70 53 72  ex(pDestIdx, pSr
14e50 63 49 64 78 29 20 29 20 62 72 65 61 6b 3b 0a 20  cIdx) ) break;. 
14e60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 72     }.    if( pSr
14e70 63 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  cIdx==0 ){.     
14e80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
14e90 20 70 44 65 73 74 49 64 78 20 68 61 73 20 6e 6f   pDestIdx has no
14ea0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
14eb0 6e 64 65 78 20 69 6e 20 70 53 72 63 20 2a 2f 0a  ndex in pSrc */.
14ec0 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65      }.  }.#ifnde
14ed0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
14ee0 45 43 4b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  ECK.  if( pDest-
14ef0 3e 70 43 68 65 63 6b 20 26 26 20 73 71 6c 69 74  >pCheck && sqlit
14f00 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
14f10 65 28 70 53 72 63 2d 3e 70 43 68 65 63 6b 2c 70  e(pSrc->pCheck,p
14f20 44 65 73 74 2d 3e 70 43 68 65 63 6b 2c 2d 31 29  Dest->pCheck,-1)
14f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
14f40 3b 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 68 61  ;   /* Tables ha
14f50 76 65 20 64 69 66 66 65 72 65 6e 74 20 43 48 45  ve different CHE
14f60 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  CK constraints. 
14f70 20 54 69 63 6b 65 74 20 23 32 32 35 32 20 2a 2f   Ticket #2252 */
14f80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
14f90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14fa0 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a  FOREIGN_KEY.  /*
14fb0 20 44 69 73 61 6c 6c 6f 77 20 74 68 65 20 74 72   Disallow the tr
14fc0 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
14fd0 69 6f 6e 20 69 66 20 74 68 65 20 64 65 73 74 69  ion if the desti
14fe0 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 63 6f 6e  nation table con
14ff0 73 74 61 69 6e 73 0a 20 20 2a 2a 20 61 6e 79 20  stains.  ** any 
15000 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
15010 74 72 61 69 6e 74 73 2e 20 20 54 68 69 73 20 69  traints.  This i
15020 73 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  s more restricti
15030 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
15040 79 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  y..  ** But the 
15050 6d 61 69 6e 20 62 65 6e 65 66 69 63 69 61 72 79  main beneficiary
15060 20 6f 66 20 74 68 65 20 74 72 61 6e 73 66 65 72   of the transfer
15070 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
15080 20 74 68 65 20 56 41 43 55 55 4d 20 0a 20 20 2a   the VACUUM .  *
15090 2a 20 63 6f 6d 6d 61 6e 64 2c 20 61 6e 64 20 74  * command, and t
150a0 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
150b0 64 20 64 69 73 61 62 6c 65 73 20 66 6f 72 65 69  d disables forei
150c0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
150d0 74 73 2e 20 20 53 6f 0a 20 20 2a 2a 20 74 68 65  ts.  So.  ** the
150e0 20 65 78 74 72 61 20 63 6f 6d 70 6c 69 63 61 74   extra complicat
150f0 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  ion to make this
15100 20 72 75 6c 65 20 6c 65 73 73 20 72 65 73 74 72   rule less restr
15110 69 63 74 69 76 65 20 69 73 20 70 72 6f 62 61 62  ictive is probab
15120 6c 79 0a 20 20 2a 2a 20 6e 6f 74 20 77 6f 72 74  ly.  ** not wort
15130 68 20 74 68 65 20 65 66 66 6f 72 74 2e 20 20 54  h the effort.  T
15140 69 63 6b 65 74 20 5b 36 32 38 34 64 66 38 39 64  icket [6284df89d
15150 65 62 64 66 61 36 31 64 62 38 30 37 33 65 30 36  ebdfa61db8073e06
15160 32 39 30 38 61 66 30 63 39 62 36 31 31 38 65 5d  2908af0c9b6118e]
15170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  .  */.  if( (db-
15180 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
15190 46 6f 72 65 69 67 6e 4b 65 79 73 29 21 3d 30 20  ForeignKeys)!=0 
151a0 26 26 20 70 44 65 73 74 2d 3e 70 46 4b 65 79 21  && pDest->pFKey!
151b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
151c0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
151d0 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20   if( (db->flags 
151e0 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  & SQLITE_CountRo
151f0 77 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ws)!=0 ){.    re
15200 74 75 72 6e 20 30 3b 20 20 2f 2a 20 78 66 65 72  turn 0;  /* xfer
15210 20 6f 70 74 20 64 6f 65 73 20 6e 6f 74 20 70 6c   opt does not pl
15220 61 79 20 77 65 6c 6c 20 77 69 74 68 20 50 52 41  ay well with PRA
15230 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65  GMA count_change
15240 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  s */.  }..  /* I
15250 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
15260 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
15270 20 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69   the xfer optimi
15280 7a 61 74 69 6f 6e 20 69 73 20 61 74 0a 20 20 2a  zation is at.  *
15290 2a 20 6c 65 61 73 74 20 61 20 70 6f 73 73 69 62  * least a possib
152a0 69 6c 69 74 79 2c 20 74 68 6f 75 67 68 20 69 74  ility, though it
152b0 20 6d 69 67 68 74 20 6f 6e 6c 79 20 77 6f 72 6b   might only work
152c0 20 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   if the destinat
152d0 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28  ion.  ** table (
152e0 74 61 62 31 29 20 69 73 20 69 6e 69 74 69 61 6c  tab1) is initial
152f0 6c 79 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 23  ly empty..  */.#
15300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
15310 54 0a 20 20 73 71 6c 69 74 65 33 5f 78 66 65 72  T.  sqlite3_xfer
15320 6f 70 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  opt_count++;.#en
15330 64 69 66 0a 20 20 69 44 62 53 72 63 20 3d 20 73  dif.  iDbSrc = s
15340 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
15350 64 65 78 28 64 62 2c 20 70 53 72 63 2d 3e 70 53  dex(db, pSrc->pS
15360 63 68 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71  chema);.  v = sq
15370 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15380 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
15390 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
153a0 70 50 61 72 73 65 2c 20 69 44 62 53 72 63 29 3b  pParse, iDbSrc);
153b0 0a 20 20 69 53 72 63 20 3d 20 70 50 61 72 73 65  .  iSrc = pParse
153c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 44 65 73  ->nTab++;.  iDes
153d0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
153e0 2b 2b 3b 0a 20 20 72 65 67 41 75 74 6f 69 6e 63  ++;.  regAutoinc
153f0 20 3d 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28   = autoIncBegin(
15400 70 50 61 72 73 65 2c 20 69 44 62 44 65 73 74 2c  pParse, iDbDest,
15410 20 70 44 65 73 74 29 3b 0a 20 20 72 65 67 44 61   pDest);.  regDa
15420 74 61 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ta = sqlite3GetT
15430 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15440 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
15450 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15460 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
15470 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
15480 65 2c 20 69 44 65 73 74 2c 20 69 44 62 44 65 73  e, iDest, iDbDes
15490 74 2c 20 70 44 65 73 74 2c 20 4f 50 5f 4f 70 65  t, pDest, OP_Ope
154a0 6e 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  nWrite);.  asser
154b0 74 28 20 48 61 73 52 6f 77 69 64 28 70 44 65 73  t( HasRowid(pDes
154c0 74 29 20 7c 7c 20 64 65 73 74 48 61 73 55 6e 69  t) || destHasUni
154d0 71 75 65 49 64 78 20 29 3b 0a 20 20 69 66 28 20  queIdx );.  if( 
154e0 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  (db->mDbFlags & 
154f0 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 3d 3d  DBFLAG_Vacuum)==
15500 30 20 26 26 20 28 0a 20 20 20 20 20 20 28 70 44  0 && (.      (pD
15510 65 73 74 2d 3e 69 50 4b 65 79 3c 30 20 26 26 20  est->iPKey<0 && 
15520 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 21 3d 30  pDest->pIndex!=0
15530 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31  )          /* (1
15540 29 20 2a 2f 0a 20 20 20 7c 7c 20 64 65 73 74 48  ) */.   || destH
15550 61 73 55 6e 69 71 75 65 49 64 78 20 20 20 20 20  asUniqueIdx     
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
15580 2a 2f 0a 20 20 20 7c 7c 20 28 6f 6e 45 72 72 6f  */.   || (onErro
15590 72 21 3d 4f 45 5f 41 62 6f 72 74 20 26 26 20 6f  r!=OE_Abort && o
155a0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 6f 6c 6c 62  nError!=OE_Rollb
155b0 61 63 6b 29 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ack)   /* (3) */
155c0 0a 20 20 29 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  .  )){.    /* In
155d0 20 73 6f 6d 65 20 63 69 72 63 75 6d 73 74 61 6e   some circumstan
155e0 63 65 73 2c 20 77 65 20 61 72 65 20 61 62 6c 65  ces, we are able
155f0 20 74 6f 20 72 75 6e 20 74 68 65 20 78 66 65 72   to run the xfer
15600 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
15610 20 20 2a 2a 20 6f 6e 6c 79 20 69 66 20 74 68 65    ** only if the
15620 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
15630 6c 65 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  le is initially 
15640 65 6d 70 74 79 2e 20 55 6e 6c 65 73 73 20 74 68  empty. Unless th
15650 65 0a 20 20 20 20 2a 2a 20 44 42 46 4c 41 47 5f  e.    ** DBFLAG_
15660 56 61 63 75 75 6d 20 66 6c 61 67 20 69 73 20 73  Vacuum flag is s
15670 65 74 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67  et, this block g
15680 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
15690 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 74 68 61   make.    ** tha
156a0 74 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e 2e  t determination.
156b0 20 49 66 20 44 42 46 4c 41 47 5f 56 61 63 75 75   If DBFLAG_Vacuu
156c0 6d 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  m is set, then t
156d0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
156e0 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 73 20 61     ** table is a
156f0 6c 77 61 79 73 20 65 6d 70 74 79 2e 0a 20 20 20  lways empty..   
15700 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 64 69   **.    ** Condi
15710 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63  tions under whic
15720 68 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  h the destinatio
15730 6e 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 3a  n must be empty:
15740 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
15750 31 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  1) There is no I
15760 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
15770 45 59 20 62 75 74 20 74 68 65 72 65 20 61 72 65  EY but there are
15780 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
15790 20 20 20 20 20 28 49 66 20 74 68 65 20 64 65 73       (If the des
157a0 74 69 6e 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20  tination is not 
157b0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c  initially empty,
157c0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
157d0 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 6f 66 20  s.    **     of 
157e0 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 6d 69  index entries mi
157f0 67 68 74 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ght need to chan
15800 67 65 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge.).    **.    
15810 2a 2a 20 28 32 29 20 54 68 65 20 64 65 73 74 69  ** (2) The desti
15820 6e 61 74 69 6f 6e 20 68 61 73 20 61 20 75 6e 69  nation has a uni
15830 71 75 65 20 69 6e 64 65 78 2e 20 20 28 54 68 65  que index.  (The
15840 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
15850 6f 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 69  on .    **     i
15860 73 20 75 6e 61 62 6c 65 20 74 6f 20 74 65 73 74  s unable to test
15870 20 75 6e 69 71 75 65 6e 65 73 73 2e 29 0a 20 20   uniqueness.).  
15880 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 33 29 20    **.    ** (3) 
15890 6f 6e 45 72 72 6f 72 20 69 73 20 73 6f 6d 65 74  onError is somet
158a0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
158b0 4f 45 5f 41 62 6f 72 74 20 61 6e 64 20 4f 45 5f  OE_Abort and OE_
158c0 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  Rollback..    */
158d0 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
158e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
158f0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 65  , OP_Rewind, iDe
15900 73 74 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  st, 0); VdbeCove
15910 72 61 67 65 28 76 29 3b 0a 20 20 20 20 65 6d 70  rage(v);.    emp
15920 74 79 44 65 73 74 54 65 73 74 20 3d 20 73 71 6c  tyDestTest = sql
15930 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
15940 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
15950 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
15960 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
15970 20 7d 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69   }.  if( HasRowi
15980 64 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 75  d(pSrc) ){.    u
15990 38 20 69 6e 73 46 6c 61 67 73 3b 0a 20 20 20 20  8 insFlags;.    
159a0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
159b0 28 70 50 61 72 73 65 2c 20 69 53 72 63 2c 20 69  (pParse, iSrc, i
159c0 44 62 53 72 63 2c 20 70 53 72 63 2c 20 4f 50 5f  DbSrc, pSrc, OP_
159d0 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 65  OpenRead);.    e
159e0 6d 70 74 79 53 72 63 54 65 73 74 20 3d 20 73 71  mptySrcTest = sq
159f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15a00 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 53  v, OP_Rewind, iS
15a10 72 63 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  rc, 0); VdbeCove
15a20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 69 66 28  rage(v);.    if(
15a30 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 3e 3d 30   pDest->iPKey>=0
15a40 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20   ){.      addr1 
15a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15a60 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
15a70 20 69 53 72 63 2c 20 72 65 67 52 6f 77 69 64 29   iSrc, regRowid)
15a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15a90 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62  dbeVerifyAbortab
15aa0 6c 65 28 76 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a  le(v, onError);.
15ab0 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71        addr2 = sq
15ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15ad0 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
15ae0 20 69 44 65 73 74 2c 20 30 2c 20 72 65 67 52 6f   iDest, 0, regRo
15af0 77 69 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  wid);.      Vdbe
15b00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15b10 20 20 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43     sqlite3RowidC
15b20 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
15b30 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 44 65 73 74  , onError, pDest
15b40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15b50 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15b60 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20 61 75  addr2);.      au
15b70 74 6f 49 6e 63 53 74 65 70 28 70 50 61 72 73 65  toIncStep(pParse
15b80 2c 20 72 65 67 41 75 74 6f 69 6e 63 2c 20 72 65  , regAutoinc, re
15b90 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  gRowid);.    }el
15ba0 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 70 49  se if( pDest->pI
15bb0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ndex==0 ){.     
15bc0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
15bd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15be0 5f 4e 65 77 52 6f 77 69 64 2c 20 69 44 65 73 74  _NewRowid, iDest
15bf0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
15c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
15c10 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
15c20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
15c30 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52 6f  wid, iSrc, regRo
15c40 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  wid);.      asse
15c50 72 74 28 20 28 70 44 65 73 74 2d 3e 74 61 62 46  rt( (pDest->tabF
15c60 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
15c70 63 72 65 6d 65 6e 74 29 3d 3d 30 20 29 3b 0a 20  crement)==0 );. 
15c80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15c90 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15ca0 5f 52 6f 77 44 61 74 61 2c 20 69 53 72 63 2c 20  _RowData, iSrc, 
15cb0 72 65 67 44 61 74 61 2c 20 31 29 3b 0a 20 20 20  regData, 1);.   
15cc0 20 69 66 28 20 64 62 2d 3e 6d 44 62 46 6c 61 67   if( db->mDbFlag
15cd0 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75  s & DBFLAG_Vacuu
15ce0 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  m ){.      sqlit
15cf0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15d00 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 44 65 73  OP_SeekEnd, iDes
15d10 74 29 3b 0a 20 20 20 20 20 20 69 6e 73 46 6c 61  t);.      insFla
15d20 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41  gs = OPFLAG_NCHA
15d30 4e 47 45 7c 4f 50 46 4c 41 47 5f 4c 41 53 54 52  NGE|OPFLAG_LASTR
15d40 4f 57 49 44 7c 0a 20 20 20 20 20 20 20 20 20 20  OWID|.          
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c 4f   OPFLAG_APPEND|O
15d70 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
15d80 55 4c 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULT;.    }else{.
15d90 20 20 20 20 20 20 69 6e 73 46 6c 61 67 73 20 3d        insFlags =
15da0 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 7c   OPFLAG_NCHANGE|
15db0 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44  OPFLAG_LASTROWID
15dc0 7c 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 3b 0a  |OPFLAG_APPEND;.
15dd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15de0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15df0 50 5f 49 6e 73 65 72 74 2c 20 69 44 65 73 74 2c  P_Insert, iDest,
15e00 20 72 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77   regData, regRow
15e10 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
15e20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
15e30 29 70 44 65 73 74 2c 20 50 34 5f 54 41 42 4c 45  )pDest, P4_TABLE
15e40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15e50 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 69 6e  beChangeP5(v, in
15e60 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 73 71 6c  sFlags);.    sql
15e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15e80 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63 2c  , OP_Next, iSrc,
15e90 20 61 64 64 72 31 29 3b 20 56 64 62 65 43 6f 76   addr1); VdbeCov
15ea0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
15eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ec0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72  v, OP_Close, iSr
15ed0 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
15ee0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ef0 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c  OP_Close, iDest,
15f00 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
15f10 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
15f20 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 44 65  ck(pParse, iDbDe
15f30 73 74 2c 20 70 44 65 73 74 2d 3e 74 6e 75 6d 2c  st, pDest->tnum,
15f40 20 31 2c 20 70 44 65 73 74 2d 3e 7a 4e 61 6d 65   1, pDest->zName
15f50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
15f60 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
15f70 69 44 62 53 72 63 2c 20 70 53 72 63 2d 3e 74 6e  iDbSrc, pSrc->tn
15f80 75 6d 2c 20 30 2c 20 70 53 72 63 2d 3e 7a 4e 61  um, 0, pSrc->zNa
15f90 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  me);.  }.  for(p
15fa0 44 65 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70  DestIdx=pDest->p
15fb0 49 6e 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b  Index; pDestIdx;
15fc0 20 70 44 65 73 74 49 64 78 3d 70 44 65 73 74 49   pDestIdx=pDestI
15fd0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15fe0 75 38 20 69 64 78 49 6e 73 46 6c 61 67 73 20 3d  u8 idxInsFlags =
15ff0 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 53 72 63   0;.    for(pSrc
16000 49 64 78 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  Idx=pSrc->pIndex
16010 3b 20 41 4c 57 41 59 53 28 70 53 72 63 49 64 78  ; ALWAYS(pSrcIdx
16020 29 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63 49  ); pSrcIdx=pSrcI
16030 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
16040 20 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74    if( xferCompat
16050 69 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49  ibleIndex(pDestI
16060 64 78 2c 20 70 53 72 63 49 64 78 29 20 29 20 62  dx, pSrcIdx) ) b
16070 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16080 61 73 73 65 72 74 28 20 70 53 72 63 49 64 78 20  assert( pSrcIdx 
16090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
160a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
160b0 70 65 6e 52 65 61 64 2c 20 69 53 72 63 2c 20 70  penRead, iSrc, p
160c0 53 72 63 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  SrcIdx->tnum, iD
160d0 62 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  bSrc);.    sqlit
160e0 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
160f0 66 6f 28 70 50 61 72 73 65 2c 20 70 53 72 63 49  fo(pParse, pSrcI
16100 64 78 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  dx);.    VdbeCom
16110 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
16120 53 72 63 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  SrcIdx->zName));
16130 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16140 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
16150 6e 57 72 69 74 65 2c 20 69 44 65 73 74 2c 20 70  nWrite, iDest, p
16160 44 65 73 74 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  DestIdx->tnum, i
16170 44 62 44 65 73 74 29 3b 0a 20 20 20 20 73 71 6c  DbDest);.    sql
16180 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
16190 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 44 65  Info(pParse, pDe
161a0 73 74 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  stIdx);.    sqli
161b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
161c0 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
161d0 52 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  R);.    VdbeComm
161e0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 44  ent((v, "%s", pD
161f0 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  estIdx->zName));
16200 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
16210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16220 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 53 72  , OP_Rewind, iSr
16230 63 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  c, 0); VdbeCover
16240 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16250 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16260 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 53 72   OP_RowData, iSr
16270 63 2c 20 72 65 67 44 61 74 61 2c 20 31 29 3b 0a  c, regData, 1);.
16280 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 44 62 46      if( db->mDbF
16290 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
162a0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
162b0 20 54 68 69 73 20 49 4e 53 45 52 54 20 63 6f 6d   This INSERT com
162c0 6d 61 6e 64 20 69 73 20 70 61 72 74 20 6f 66 20  mand is part of 
162d0 61 20 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69  a VACUUM operati
162e0 6f 6e 2c 20 77 68 69 63 68 20 67 75 61 72 61 6e  on, which guaran
162f0 74 65 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  tees.      ** th
16300 61 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  at the destinati
16310 6f 6e 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  on table is empt
16320 79 2e 20 49 66 20 61 6c 6c 20 69 6e 64 65 78 65  y. If all indexe
16330 64 20 63 6f 6c 75 6d 6e 73 20 75 73 65 0a 20 20  d columns use.  
16340 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
16350 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
16360 2c 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c  , then it can al
16370 73 6f 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  so be assumed th
16380 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
16390 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 70 6f  index will be po
163a0 70 75 6c 61 74 65 64 20 62 79 20 69 6e 73 65 72  pulated by inser
163b0 74 69 6e 67 20 6b 65 79 73 20 69 6e 20 73 74 72  ting keys in str
163c0 69 63 74 6c 79 20 73 6f 72 74 65 64 20 0a 20 20  ictly sorted .  
163d0 20 20 20 20 2a 2a 20 6f 72 64 65 72 2e 20 49 6e      ** order. In
163e0 20 74 68 69 73 20 63 61 73 65 2c 20 69 6e 73 74   this case, inst
163f0 65 61 64 20 6f 66 20 73 65 65 6b 69 6e 67 20 77  ead of seeking w
16400 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
16410 20 61 73 20 70 61 72 74 0a 20 20 20 20 20 20 2a   as part.      *
16420 2a 20 6f 66 20 65 76 65 72 79 20 4f 50 5f 49 64  * of every OP_Id
16430 78 49 6e 73 65 72 74 20 6f 70 63 6f 64 65 2c 20  xInsert opcode, 
16440 61 6e 20 4f 50 5f 53 65 65 6b 45 6e 64 20 69 73  an OP_SeekEnd is
16450 20 61 64 64 65 64 20 62 65 66 6f 72 65 20 74 68   added before th
16460 65 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 49 64  e.      ** OP_Id
16470 78 49 6e 73 65 72 74 20 74 6f 20 73 65 65 6b 20  xInsert to seek 
16480 74 6f 20 74 68 65 20 70 6f 69 6e 74 20 77 69 74  to the point wit
16490 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 77  hin the b-tree w
164a0 68 65 72 65 20 65 61 63 68 20 6b 65 79 20 0a 20  here each key . 
164b0 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
164c0 65 20 69 6e 73 65 72 74 65 64 2e 20 54 68 69 73  e inserted. This
164d0 20 69 73 20 66 61 73 74 65 72 2e 0a 20 20 20 20   is faster..    
164e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
164f0 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 64 65   any of the inde
16500 78 65 64 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  xed columns use 
16510 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
16520 65 6e 63 65 20 6f 74 68 65 72 20 74 68 61 6e 0a  ence other than.
16530 20 20 20 20 20 20 2a 2a 20 42 49 4e 41 52 59 2c        ** BINARY,
16540 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
16550 6f 6e 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  on is disabled. 
16560 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
16570 74 68 65 20 75 73 65 72 20 0a 20 20 20 20 20 20  the user .      
16580 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
16590 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  the definition o
165a0 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  f a collation se
165b0 71 75 65 6e 63 65 20 61 6e 64 20 74 68 65 6e 20  quence and then 
165c0 72 75 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 56  run.      ** a V
165d0 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 2e 20 49  ACUUM command. I
165e0 6e 20 74 68 61 74 20 63 61 73 65 20 6b 65 79 73  n that case keys
165f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74   may not be writ
16600 74 65 6e 20 69 6e 20 73 74 72 69 63 74 6c 79 0a  ten in strictly.
16610 20 20 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20        ** sorted 
16620 6f 72 64 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  order.  */.     
16630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
16640 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
16650 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
16660 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
16670 70 53 72 63 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  pSrcIdx->azColl[
16680 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
16690 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
166a0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
166b0 2c 20 7a 43 6f 6c 6c 29 20 29 20 62 72 65 61 6b  , zColl) ) break
166c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
166d0 69 66 28 20 69 3d 3d 70 53 72 63 49 64 78 2d 3e  if( i==pSrcIdx->
166e0 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
166f0 20 20 20 69 64 78 49 6e 73 46 6c 61 67 73 20 3d     idxInsFlags =
16700 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
16710 45 53 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 73  ESULT;.        s
16720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16730 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20  (v, OP_SeekEnd, 
16740 69 44 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  iDest);.      }.
16750 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
16760 61 73 52 6f 77 69 64 28 70 53 72 63 29 20 26 26  asRowid(pSrc) &&
16770 20 70 44 65 73 74 49 64 78 2d 3e 69 64 78 54 79   pDestIdx->idxTy
16780 70 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  pe==2 ){.      i
16790 64 78 49 6e 73 46 6c 61 67 73 20 7c 3d 20 4f 50  dxInsFlags |= OP
167a0 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20  FLAG_NCHANGE;.  
167b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
167c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
167d0 49 64 78 49 6e 73 65 72 74 2c 20 69 44 65 73 74  IdxInsert, iDest
167e0 2c 20 72 65 67 44 61 74 61 29 3b 0a 20 20 20 20  , regData);.    
167f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16800 65 50 35 28 76 2c 20 69 64 78 49 6e 73 46 6c 61  eP5(v, idxInsFla
16810 67 73 7c 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  gs|OPFLAG_APPEND
16820 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16830 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16840 65 78 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31  ext, iSrc, addr1
16850 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
16860 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
16870 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16880 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
16890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
168a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63  , OP_Close, iSrc
168b0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
168c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
168d0 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20  P_Close, iDest, 
168e0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6d  0);.  }.  if( em
168f0 70 74 79 53 72 63 54 65 73 74 20 29 20 73 71 6c  ptySrcTest ) sql
16900 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16910 28 76 2c 20 65 6d 70 74 79 53 72 63 54 65 73 74  (v, emptySrcTest
16920 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
16930 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16940 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
16950 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16960 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16970 67 44 61 74 61 29 3b 0a 20 20 69 66 28 20 65 6d  gData);.  if( em
16980 70 74 79 44 65 73 74 54 65 73 74 20 29 7b 0a 20  ptyDestTest ){. 
16990 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e     sqlite3Autoin
169a0 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73  crementEnd(pPars
169b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
169c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
169d0 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  Halt, SQLITE_OK,
169e0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
169f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16a00 65 6d 70 74 79 44 65 73 74 54 65 73 74 29 3b 0a  emptyDestTest);.
16a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
16a30 65 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20  e, iDest, 0);.  
16a40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
16a50 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
16a60 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  1;.  }.}.#endif 
16a70 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58  /* SQLITE_OMIT_X
16a80 46 45 52 5f 4f 50 54 20 2a 2f 0a                 FER_OPT */.