/ Hex Artifact Content
Login

Artifact fc3cf5c371f9a400144e8c2f148ab29cd3f67f7da7eaf47e6a6959f8255fd92c:


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 61 73  ColAff;.  }.  as
12c0: 73 65 72 74 28 20 7a 43 6f 6c 41 66 66 21 3d 30  sert( zColAff!=0
12d0: 20 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65   );.  i = sqlite
12e0: 33 53 74 72 6c 65 6e 33 30 4e 4e 28 7a 43 6f 6c  3Strlen30NN(zCol
12f0: 41 66 66 29 3b 0a 20 20 69 66 28 20 69 20 29 7b  Aff);.  if( i ){
1300: 0a 20 20 20 20 69 66 28 20 69 52 65 67 20 29 7b  .    if( iReg ){
1310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1320: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1330: 66 66 69 6e 69 74 79 2c 20 69 52 65 67 2c 20 69  ffinity, iReg, i
1340: 2c 20 30 2c 20 7a 43 6f 6c 41 66 66 2c 20 69 29  , 0, zColAff, i)
1350: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1370: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 43  angeP4(v, -1, zC
1380: 6f 6c 41 66 66 2c 20 69 29 3b 0a 20 20 20 20 7d  olAff, i);.    }
1390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
13a0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
13b0: 20 74 68 65 20 74 61 62 6c 65 20 70 54 61 62 20   the table pTab 
13c0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
13d0: 6f 72 20 61 6e 79 20 6f 66 20 69 74 73 20 69 6e  or any of its in
13e0: 64 69 63 65 73 0a 2a 2a 20 68 61 76 65 20 62 65  dices.** have be
13f0: 65 6e 20 6f 70 65 6e 65 64 20 61 74 20 61 6e 79  en opened at any
1400: 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 56 44   point in the VD
1410: 42 45 20 70 72 6f 67 72 61 6d 2e 20 54 68 69 73  BE program. This
1420: 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 65 20   is used to see 
1430: 69 66 20 0a 2a 2a 20 61 20 73 74 61 74 65 6d 65  if .** a stateme
1440: 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 20  nt of the form  
1450: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 69 44  "INSERT INTO <iD
1460: 62 2c 20 70 54 61 62 3e 20 53 45 4c 45 43 54 20  b, pTab> SELECT 
1470: 2e 2e 2e 22 20 63 61 6e 20 0a 2a 2a 20 72 75 6e  ..." can .** run
1480: 20 77 69 74 68 6f 75 74 20 75 73 69 6e 67 20 61   without using a
1490: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14a0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 73   for the results
14b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 20   of the SELECT. 
14c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
14d0: 65 61 64 73 54 61 62 6c 65 28 50 61 72 73 65 20  eadsTable(Parse 
14e0: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 54 61 62  *p, int iDb, Tab
14f0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 56 64 62  le *pTab){.  Vdb
1500: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1510: 74 56 64 62 65 28 70 29 3b 0a 20 20 69 6e 74 20  tVdbe(p);.  int 
1520: 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  i;.  int iEnd = 
1530: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1540: 6e 74 41 64 64 72 28 76 29 3b 0a 23 69 66 6e 64  ntAddr(v);.#ifnd
1550: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1560: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 56 54  IRTUALTABLE.  VT
1570: 61 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 49 73  able *pVTab = Is
1580: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
1590: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
15a0: 28 70 2d 3e 64 62 2c 20 70 54 61 62 29 20 3a 20  (p->db, pTab) : 
15b0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72  0;.#endif..  for
15c0: 28 69 3d 31 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  (i=1; i<iEnd; i+
15d0: 2b 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a  +){.    VdbeOp *
15e0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
15f0: 65 47 65 74 4f 70 28 76 2c 20 69 29 3b 0a 20 20  eGetOp(v, i);.  
1600: 20 20 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30    assert( pOp!=0
1610: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   );.    if( pOp-
1620: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e  >opcode==OP_Open
1630: 52 65 61 64 20 26 26 20 70 4f 70 2d 3e 70 33 3d  Read && pOp->p3=
1640: 3d 69 44 62 20 29 7b 0a 20 20 20 20 20 20 49 6e  =iDb ){.      In
1650: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 20  dex *pIndex;.   
1660: 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 70 4f     int tnum = pO
1670: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 69 66 28  p->p2;.      if(
1680: 20 74 6e 75 6d 3d 3d 70 54 61 62 2d 3e 74 6e 75   tnum==pTab->tnu
1690: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
16a0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
16b0: 20 20 20 20 20 66 6f 72 28 70 49 6e 64 65 78 3d       for(pIndex=
16c0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
16d0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
16e0: 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
16f0: 20 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 70       if( tnum==p
1700: 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 29 7b 0a 20  Index->tnum ){. 
1710: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1720: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1730: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
1740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1750: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1760: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1770: 3d 4f 50 5f 56 4f 70 65 6e 20 26 26 20 70 4f 70  =OP_VOpen && pOp
1780: 2d 3e 70 34 2e 70 56 74 61 62 3d 3d 70 56 54 61  ->p4.pVtab==pVTa
1790: 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
17a0: 74 28 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62  t( pOp->p4.pVtab
17b0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
17c0: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
17d0: 3d 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 20  ==P4_VTAB );.   
17e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1800: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
1810: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1820: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f  _AUTOINCREMENT./
1830: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 6f 72 20 63  *.** Locate or c
1840: 72 65 61 74 65 20 61 6e 20 41 75 74 6f 69 6e 63  reate an Autoinc
1850: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  Info structure a
1860: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1870: 61 62 6c 65 20 70 54 61 62 0a 2a 2a 20 77 68 69  able pTab.** whi
1880: 63 68 20 69 73 20 69 6e 20 64 61 74 61 62 61 73  ch is in databas
1890: 65 20 69 44 62 2e 20 20 52 65 74 75 72 6e 20 74  e iDb.  Return t
18a0: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
18b0: 65 72 20 66 6f 72 20 74 68 65 20 72 65 67 69 73  er for the regis
18c0: 74 65 72 0a 2a 2a 20 74 68 61 74 20 68 6f 6c 64  ter.** that hold
18d0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f  s the maximum ro
18e0: 77 69 64 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  wid.  Return zer
18f0: 6f 20 69 66 20 70 54 61 62 20 69 73 20 6e 6f 74  o if pTab is not
1900: 20 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e   an AUTOINCREMEN
1910: 54 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 28 41 6c  T.** table.  (Al
1920: 73 6f 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 77  so return zero w
1930: 68 65 6e 20 64 6f 69 6e 67 20 61 20 56 41 43 55  hen doing a VACU
1940: 55 4d 20 73 69 6e 63 65 20 77 65 20 64 6f 20 6e  UM since we do n
1950: 6f 74 20 77 61 6e 74 20 74 6f 0a 2a 2a 20 75 70  ot want to.** up
1960: 64 61 74 65 20 74 68 65 20 41 55 54 4f 49 4e 43  date the AUTOINC
1970: 52 45 4d 45 4e 54 20 63 6f 75 6e 74 65 72 73 20  REMENT counters 
1980: 64 75 72 69 6e 67 20 61 20 56 41 43 55 55 4d 2e  during a VACUUM.
1990: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ).**.** There is
19a0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 41 75 74   at most one Aut
19b0: 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75 63 74 75  oincInfo structu
19c0: 72 65 20 70 65 72 20 74 61 62 6c 65 20 65 76 65  re per table eve
19d0: 6e 20 69 66 20 74 68 65 0a 2a 2a 20 73 61 6d 65  n if the.** same
19e0: 20 74 61 62 6c 65 20 69 73 20 61 75 74 6f 69 6e   table is autoin
19f0: 63 72 65 6d 65 6e 74 65 64 20 6d 75 6c 74 69 70  cremented multip
1a00: 6c 65 20 74 69 6d 65 73 20 64 75 65 20 74 6f 20  le times due to 
1a10: 69 6e 73 65 72 74 73 20 77 69 74 68 69 6e 0a 2a  inserts within.*
1a20: 2a 20 74 72 69 67 67 65 72 73 2e 20 20 41 20 6e  * triggers.  A n
1a30: 65 77 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73  ew AutoincInfo s
1a40: 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
1a50: 74 65 64 20 69 66 20 74 68 69 73 20 69 73 20 74  ted if this is t
1a60: 68 65 0a 2a 2a 20 66 69 72 73 74 20 75 73 65 20  he.** first use 
1a70: 6f 66 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20  of table pTab.  
1a80: 4f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  On 2nd and subse
1a90: 71 75 65 6e 74 20 75 73 65 73 2c 20 74 68 65 20  quent uses, the 
1aa0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 41 75 74 6f  original.** Auto
1ab0: 69 6e 63 49 6e 66 6f 20 73 74 72 75 63 74 75 72  incInfo structur
1ac0: 65 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  e is used..**.**
1ad0: 20 46 6f 75 72 20 63 6f 6e 73 65 63 75 74 69 76   Four consecutiv
1ae0: 65 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  e registers are 
1af0: 61 6c 6c 6f 63 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  allocated:.**.**
1b00: 20 20 20 28 31 29 20 20 54 68 65 20 6e 61 6d 65     (1)  The name
1b10: 20 6f 66 20 74 68 65 20 70 54 61 62 20 74 61 62   of the pTab tab
1b20: 6c 65 2e 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  le..**   (2)  Th
1b30: 65 20 6d 61 78 69 6d 75 6d 20 52 4f 57 49 44 20  e maximum ROWID 
1b40: 6f 66 20 70 54 61 62 2e 0a 2a 2a 20 20 20 28 33  of pTab..**   (3
1b50: 29 20 20 54 68 65 20 72 6f 77 69 64 20 69 6e 20  )  The rowid in 
1b60: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
1b70: 6f 66 20 70 54 61 62 0a 2a 2a 20 20 20 28 34 29  of pTab.**   (4)
1b80: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 76    The original v
1b90: 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 61 78 20  alue of the max 
1ba0: 52 4f 57 49 44 20 69 6e 20 70 54 61 62 2c 20 6f  ROWID in pTab, o
1bb0: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 0a 2a  r NULL if none.*
1bc0: 2a 0a 2a 2a 20 54 68 65 20 32 6e 64 20 72 65 67  *.** The 2nd reg
1bd0: 69 73 74 65 72 20 69 73 20 74 68 65 20 6f 6e 65  ister is the one
1be0: 20 74 68 61 74 20 69 73 20 72 65 74 75 72 6e 65   that is returne
1bf0: 64 2e 20 20 54 68 61 74 20 69 73 20 61 6c 6c 20  d.  That is all 
1c00: 74 68 65 0a 2a 2a 20 69 6e 73 65 72 74 20 72 6f  the.** insert ro
1c10: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 6b  utine needs to k
1c20: 6e 6f 77 20 61 62 6f 75 74 2e 0a 2a 2f 0a 73 74  now about..*/.st
1c30: 61 74 69 63 20 69 6e 74 20 61 75 74 6f 49 6e 63  atic int autoInc
1c40: 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
1c50: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
1c60: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1c70: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
1c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1c90: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
1ca0: 65 20 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 2a  e holding pTab *
1cb0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
1cc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1cd0: 61 62 6c 65 20 77 65 20 61 72 65 20 77 72 69 74  able we are writ
1ce0: 69 6e 67 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69  ing to */.){.  i
1cf0: 6e 74 20 6d 65 6d 49 64 20 3d 20 30 3b 20 20 20  nt memId = 0;   
1d00: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
1d10: 6f 6c 64 69 6e 67 20 6d 61 78 69 6d 75 6d 20 72  olding maximum r
1d20: 6f 77 69 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owid */.  assert
1d30: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ( pParse->db->aD
1d40: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d  b[iDb].pSchema!=
1d50: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 54 61 62  0 );.  if( (pTab
1d60: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1d70: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
1d80: 30 0a 20 20 20 26 26 20 28 70 50 61 72 73 65 2d  0.   && (pParse-
1d90: 3e 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20  >db->mDbFlags & 
1da0: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 3d 3d  DBFLAG_Vacuum)==
1db0: 30 0a 20 20 29 7b 0a 20 20 20 20 50 61 72 73 65  0.  ){.    Parse
1dc0: 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1dd0: 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1de0: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
1df0: 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 49 6e  AutoincInfo *pIn
1e00: 66 6f 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  fo;.    Table *p
1e10: 53 65 71 54 61 62 20 3d 20 70 50 61 72 73 65 2d  SeqTab = pParse-
1e20: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  >db->aDb[iDb].pS
1e30: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3b 0a  chema->pSeqTab;.
1e40: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1e50: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73  hat the sqlite_s
1e60: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 65 78  equence table ex
1e70: 69 73 74 73 20 61 6e 64 20 69 73 20 61 6e 20 6f  ists and is an o
1e80: 72 64 69 6e 61 72 79 0a 20 20 20 20 2a 2a 20 72  rdinary.    ** r
1e90: 6f 77 69 64 20 74 61 62 6c 65 20 77 69 74 68 20  owid table with 
1ea0: 65 78 61 63 74 6c 79 20 74 77 6f 20 63 6f 6c 75  exactly two colu
1eb0: 6d 6e 73 2e 0a 20 20 20 20 2a 2a 20 54 69 63 6b  mns..    ** Tick
1ec0: 65 74 20 64 38 64 63 32 62 33 61 35 38 63 64 35  et d8dc2b3a58cd5
1ed0: 64 63 32 39 31 38 61 31 64 34 61 63 62 20 32 30  dc2918a1d4acb 20
1ee0: 31 38 2d 30 35 2d 32 33 20 2a 2f 0a 20 20 20 20  18-05-23 */.    
1ef0: 69 66 28 20 70 53 65 71 54 61 62 3d 3d 30 0a 20  if( pSeqTab==0. 
1f00: 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
1f10: 28 70 53 65 71 54 61 62 29 0a 20 20 20 20 20 7c  (pSeqTab).     |
1f20: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 65 71  | IsVirtual(pSeq
1f30: 54 61 62 29 0a 20 20 20 20 20 7c 7c 20 70 53 65  Tab).     || pSe
1f40: 71 54 61 62 2d 3e 6e 43 6f 6c 21 3d 32 0a 20 20  qTab->nCol!=2.  
1f50: 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73    ){.      pPars
1f60: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
1f70: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1f80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 53 45 51  LITE_CORRUPT_SEQ
1f90: 55 45 4e 43 45 3b 0a 20 20 20 20 20 20 72 65 74  UENCE;.      ret
1fa0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
1fb0: 20 20 70 49 6e 66 6f 20 3d 20 70 54 6f 70 6c 65    pInfo = pTople
1fc0: 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20 20 20  vel->pAinc;.    
1fd0: 77 68 69 6c 65 28 20 70 49 6e 66 6f 20 26 26 20  while( pInfo && 
1fe0: 70 49 6e 66 6f 2d 3e 70 54 61 62 21 3d 70 54 61  pInfo->pTab!=pTa
1ff0: 62 20 29 7b 20 70 49 6e 66 6f 20 3d 20 70 49 6e  b ){ pInfo = pIn
2000: 66 6f 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20  fo->pNext; }.   
2010: 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
2020: 0a 20 20 20 20 20 20 70 49 6e 66 6f 20 3d 20 73  .      pInfo = s
2030: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2040: 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  wNN(pParse->db, 
2050: 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 29 3b  sizeof(*pInfo));
2060: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
2070: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2080: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 70 4e 65        pInfo->pNe
2090: 78 74 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  xt = pToplevel->
20a0: 70 41 69 6e 63 3b 0a 20 20 20 20 20 20 70 54 6f  pAinc;.      pTo
20b0: 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 20 3d 20  plevel->pAinc = 
20c0: 70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 70 49 6e  pInfo;.      pIn
20d0: 66 6f 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  fo->pTab = pTab;
20e0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 44  .      pInfo->iD
20f0: 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 20 20 70  b = iDb;.      p
2100: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d 65 6d 2b 2b  Toplevel->nMem++
2110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2120: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74     /* Register t
2130: 6f 20 68 6f 6c 64 20 6e 61 6d 65 20 6f 66 20 74  o hold name of t
2140: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 70 49  able */.      pI
2150: 6e 66 6f 2d 3e 72 65 67 43 74 72 20 3d 20 2b 2b  nfo->regCtr = ++
2160: 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d 65 6d 3b  pToplevel->nMem;
2170: 20 20 2f 2a 20 4d 61 78 20 72 6f 77 69 64 20 72    /* Max rowid r
2180: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
2190: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 4d 65 6d   pToplevel->nMem
21a0: 20 2b 3d 32 3b 20 20 20 20 20 20 20 2f 2a 20 52   +=2;       /* R
21b0: 6f 77 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73  owid in sqlite_s
21c0: 65 71 75 65 6e 63 65 20 2b 20 6f 72 69 67 20 6d  equence + orig m
21d0: 61 78 20 76 61 6c 20 2a 2f 0a 20 20 20 20 7d 0a  ax val */.    }.
21e0: 20 20 20 20 6d 65 6d 49 64 20 3d 20 70 49 6e 66      memId = pInf
21f0: 6f 2d 3e 72 65 67 43 74 72 3b 0a 20 20 7d 0a 20  o->regCtr;.  }. 
2200: 20 72 65 74 75 72 6e 20 6d 65 6d 49 64 3b 0a 7d   return memId;.}
2210: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2220: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2230: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
2240: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 6f 66 20  itialize all of 
2250: 74 68 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  the.** register 
2260: 75 73 65 64 20 62 79 20 74 68 65 20 61 75 74 6f  used by the auto
2270: 69 6e 63 72 65 6d 65 6e 74 20 74 72 61 63 6b 65  increment tracke
2280: 72 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r.  .*/.void sql
2290: 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e  ite3Autoincremen
22a0: 74 42 65 67 69 6e 28 50 61 72 73 65 20 2a 70 50  tBegin(Parse *pP
22b0: 61 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63  arse){.  Autoinc
22c0: 49 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 20  Info *p;        
22d0: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
22e0: 6f 6e 20 61 62 6f 75 74 20 61 6e 20 41 55 54 4f  on about an AUTO
22f0: 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 73  INCREMENT */.  s
2300: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2310: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65  rse->db;  /* The
2320: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2330: 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44  tion */.  Db *pD
2340: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2350: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2360: 20 6f 6e 6c 79 20 61 75 74 6f 69 6e 63 20 74 61   only autoinc ta
2370: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  ble */.  int mem
2380: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
2390: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
23a0: 68 6f 6c 64 69 6e 67 20 6d 61 78 20 72 6f 77 69  holding max rowi
23b0: 64 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  d */.  Vdbe *v =
23c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
23d0: 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72 20    /* VDBE under 
23e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
23f0: 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2400: 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
2410: 65 64 20 64 75 72 69 6e 67 20 74 72 69 67 67 65  ed during trigge
2420: 72 2d 67 65 6e 65 72 61 74 69 6f 6e 2e 20 20 49  r-generation.  I
2430: 74 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79 20 63  t is.  ** only c
2440: 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 74  alled from the t
2450: 6f 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20 20 61 73  op-level */.  as
2460: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 54  sert( pParse->pT
2470: 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29 3b 0a  riggerTab==0 );.
2480: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2490: 33 49 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  3IsToplevel(pPar
24a0: 73 65 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  se) );..  assert
24b0: 28 20 76 20 29 3b 20 20 20 2f 2a 20 57 65 20 66  ( v );   /* We f
24c0: 61 69 6c 65 64 20 6c 6f 6e 67 20 61 67 6f 20 69  ailed long ago i
24d0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  f this is not so
24e0: 20 2a 2f 0a 20 20 66 6f 72 28 70 20 3d 20 70 50   */.  for(p = pP
24f0: 61 72 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20  arse->pAinc; p; 
2500: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  p = p->pNext){. 
2510: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2520: 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f  int iLn = VDBE_O
2530: 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b  FFSET_LINENO(2);
2540: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2550: 74 20 56 64 62 65 4f 70 4c 69 73 74 20 61 75 74  t VdbeOpList aut
2560: 6f 49 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  oInc[] = {.     
2570: 20 2f 2a 20 30 20 20 2a 2f 20 7b 4f 50 5f 4e 75   /* 0  */ {OP_Nu
2580: 6c 6c 2c 20 20 20 20 30 2c 20 20 30 2c 20 30 7d  ll,    0,  0, 0}
2590: 2c 0a 20 20 20 20 20 20 2f 2a 20 31 20 20 2a 2f  ,.      /* 1  */
25a0: 20 7b 4f 50 5f 52 65 77 69 6e 64 2c 20 20 30 2c   {OP_Rewind,  0,
25b0: 20 31 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f   10, 0},.      /
25c0: 2a 20 32 20 20 2a 2f 20 7b 4f 50 5f 43 6f 6c 75  * 2  */ {OP_Colu
25d0: 6d 6e 2c 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a  mn,  0,  0, 0},.
25e0: 20 20 20 20 20 20 2f 2a 20 33 20 20 2a 2f 20 7b        /* 3  */ {
25f0: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 30 2c 20 20  OP_Ne,      0,  
2600: 39 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20  9, 0},.      /* 
2610: 34 20 20 2a 2f 20 7b 4f 50 5f 52 6f 77 69 64 2c  4  */ {OP_Rowid,
2620: 20 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20 20     0,  0, 0},.  
2630: 20 20 20 20 2f 2a 20 35 20 20 2a 2f 20 7b 4f 50      /* 5  */ {OP
2640: 5f 43 6f 6c 75 6d 6e 2c 20 20 30 2c 20 20 31 2c  _Column,  0,  1,
2650: 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 36 20   0},.      /* 6 
2660: 20 2a 2f 20 7b 4f 50 5f 41 64 64 49 6d 6d 2c 20   */ {OP_AddImm, 
2670: 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20 20 20 20   0,  0, 0},.    
2680: 20 20 2f 2a 20 37 20 20 2a 2f 20 7b 4f 50 5f 43    /* 7  */ {OP_C
2690: 6f 70 79 2c 20 20 20 20 30 2c 20 20 30 2c 20 30  opy,    0,  0, 0
26a0: 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 38 20 20 2a  },.      /* 8  *
26b0: 2f 20 7b 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 30  / {OP_Goto,    0
26c0: 2c 20 31 31 2c 20 30 7d 2c 0a 20 20 20 20 20 20  , 11, 0},.      
26d0: 2f 2a 20 39 20 20 2a 2f 20 7b 4f 50 5f 4e 65 78  /* 9  */ {OP_Nex
26e0: 74 2c 20 20 20 20 30 2c 20 20 32 2c 20 30 7d 2c  t,    0,  2, 0},
26f0: 0a 20 20 20 20 20 20 2f 2a 20 31 30 20 2a 2f 20  .      /* 10 */ 
2700: 7b 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20  {OP_Integer, 0, 
2710: 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a   0, 0},.      /*
2720: 20 31 31 20 2a 2f 20 7b 4f 50 5f 43 6c 6f 73 65   11 */ {OP_Close
2730: 2c 20 20 20 30 2c 20 20 30 2c 20 30 7d 20 0a 20  ,   0,  0, 0} . 
2740: 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f 70     };.    VdbeOp
2750: 20 2a 61 4f 70 3b 0a 20 20 20 20 70 44 62 20 3d   *aOp;.    pDb =
2760: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
2770: 5d 3b 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20 70  ];.    memId = p
2780: 2d 3e 72 65 67 43 74 72 3b 0a 20 20 20 20 61 73  ->regCtr;.    as
2790: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
27a0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
27b0: 20 30 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61   0, pDb->pSchema
27c0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
27d0: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
27e0: 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44 62  , 0, p->iDb, pDb
27f0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
2800: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
2810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2820: 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 6d  eLoadString(v, m
2830: 65 6d 49 64 2d 31 2c 20 70 2d 3e 70 54 61 62 2d  emId-1, p->pTab-
2840: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 4f 70  >zName);.    aOp
2850: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2860: 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
2870: 53 69 7a 65 28 61 75 74 6f 49 6e 63 29 2c 20 61  Size(autoInc), a
2880: 75 74 6f 49 6e 63 2c 20 69 4c 6e 29 3b 0a 20 20  utoInc, iLn);.  
2890: 20 20 69 66 28 20 61 4f 70 3d 3d 30 20 29 20 62    if( aOp==0 ) b
28a0: 72 65 61 6b 3b 0a 20 20 20 20 61 4f 70 5b 30 5d  reak;.    aOp[0]
28b0: 2e 70 32 20 3d 20 6d 65 6d 49 64 3b 0a 20 20 20  .p2 = memId;.   
28c0: 20 61 4f 70 5b 30 5d 2e 70 33 20 3d 20 6d 65 6d   aOp[0].p3 = mem
28d0: 49 64 2b 32 3b 0a 20 20 20 20 61 4f 70 5b 32 5d  Id+2;.    aOp[2]
28e0: 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a 20 20 20  .p3 = memId;.   
28f0: 20 61 4f 70 5b 33 5d 2e 70 31 20 3d 20 6d 65 6d   aOp[3].p1 = mem
2900: 49 64 2d 31 3b 0a 20 20 20 20 61 4f 70 5b 33 5d  Id-1;.    aOp[3]
2910: 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a 20 20 20  .p3 = memId;.   
2920: 20 61 4f 70 5b 33 5d 2e 70 35 20 3d 20 53 51 4c   aOp[3].p5 = SQL
2930: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 3b 0a  ITE_JUMPIFNULL;.
2940: 20 20 20 20 61 4f 70 5b 34 5d 2e 70 32 20 3d 20      aOp[4].p2 = 
2950: 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70  memId+1;.    aOp
2960: 5b 35 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a  [5].p3 = memId;.
2970: 20 20 20 20 61 4f 70 5b 36 5d 2e 70 31 20 3d 20      aOp[6].p1 = 
2980: 6d 65 6d 49 64 3b 0a 20 20 20 20 61 4f 70 5b 37  memId;.    aOp[7
2990: 5d 2e 70 32 20 3d 20 6d 65 6d 49 64 2b 32 3b 0a  ].p2 = memId+2;.
29a0: 20 20 20 20 61 4f 70 5b 37 5d 2e 70 31 20 3d 20      aOp[7].p1 = 
29b0: 6d 65 6d 49 64 3b 0a 20 20 20 20 61 4f 70 5b 31  memId;.    aOp[1
29c0: 30 5d 2e 70 32 20 3d 20 6d 65 6d 49 64 3b 0a 20  0].p2 = memId;. 
29d0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
29e0: 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d  Tab==0 ) pParse-
29f0: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
2a00: 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
2a10: 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  he maximum rowid
2a20: 20 66 6f 72 20 61 6e 20 61 75 74 6f 69 6e 63 72   for an autoincr
2a30: 65 6d 65 6e 74 20 63 61 6c 63 75 6c 61 74 69 6f  ement calculatio
2a40: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
2a50: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
2a60: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
2a70: 72 65 67 52 6f 77 69 64 20 72 65 67 69 73 74 65  regRowid registe
2a80: 72 20 68 6f 6c 64 73 20 61 0a 2a 2a 20 6e 65 77  r holds a.** new
2a90: 20 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 61   rowid that is a
2aa0: 62 6f 75 74 20 74 6f 20 62 65 20 69 6e 73 65 72  bout to be inser
2ab0: 74 65 64 2e 20 20 49 66 20 74 68 61 74 20 6e 65  ted.  If that ne
2ac0: 77 20 72 6f 77 69 64 20 69 73 0a 2a 2a 20 6c 61  w rowid is.** la
2ad0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  rger than the ma
2ae0: 78 69 6d 75 6d 20 72 6f 77 69 64 20 69 6e 20 74  ximum rowid in t
2af0: 68 65 20 6d 65 6d 49 64 20 6d 65 6d 6f 72 79 20  he memId memory 
2b00: 63 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  cell, then the.*
2b10: 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73  * memory cell is
2b20: 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61   updated..*/.sta
2b30: 74 69 63 20 76 6f 69 64 20 61 75 74 6f 49 6e 63  tic void autoInc
2b40: 53 74 65 70 28 50 61 72 73 65 20 2a 70 50 61 72  Step(Parse *pPar
2b50: 73 65 2c 20 69 6e 74 20 6d 65 6d 49 64 2c 20 69  se, int memId, i
2b60: 6e 74 20 72 65 67 52 6f 77 69 64 29 7b 0a 20 20  nt regRowid){.  
2b70: 69 66 28 20 6d 65 6d 49 64 3e 30 20 29 7b 0a 20  if( memId>0 ){. 
2b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b90: 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
2ba0: 62 65 2c 20 4f 50 5f 4d 65 6d 4d 61 78 2c 20 6d  be, OP_MemMax, m
2bb0: 65 6d 49 64 2c 20 72 65 67 52 6f 77 69 64 29 3b  emId, regRowid);
2bc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2bd0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2be0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
2bf0: 65 64 65 64 20 74 6f 20 77 72 69 74 65 20 61 75  eded to write au
2c00: 74 6f 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 6d  toincrement.** m
2c10: 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 76 61 6c  aximum rowid val
2c20: 75 65 73 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ues back into th
2c30: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
2c40: 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 20 45  e register..** E
2c50: 76 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74  very statement t
2c60: 68 61 74 20 6d 69 67 68 74 20 64 6f 20 61 6e 20  hat might do an 
2c70: 49 4e 53 45 52 54 20 69 6e 74 6f 20 61 6e 20 61  INSERT into an a
2c80: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20  utoincrement.** 
2c90: 74 61 62 6c 65 20 28 65 69 74 68 65 72 20 64 69  table (either di
2ca0: 72 65 63 74 6c 79 20 6f 72 20 74 68 72 6f 75 67  rectly or throug
2cb0: 68 20 74 72 69 67 67 65 72 73 29 20 6e 65 65 64  h triggers) need
2cc0: 73 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  s to call this.*
2cd0: 2a 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 62  * routine just b
2ce0: 65 66 6f 72 65 20 74 68 65 20 22 65 78 69 74 22  efore the "exit"
2cf0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
2d00: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2d10: 20 76 6f 69 64 20 61 75 74 6f 49 6e 63 72 65 6d   void autoIncrem
2d20: 65 6e 74 45 6e 64 28 50 61 72 73 65 20 2a 70 50  entEnd(Parse *pP
2d30: 61 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63  arse){.  Autoinc
2d40: 49 6e 66 6f 20 2a 70 3b 0a 20 20 56 64 62 65 20  Info *p;.  Vdbe 
2d50: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2d60: 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  be;.  sqlite3 *d
2d70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2d80: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
2d90: 20 20 66 6f 72 28 70 20 3d 20 70 50 61 72 73 65    for(p = pParse
2da0: 2d 3e 70 41 69 6e 63 3b 20 70 3b 20 70 20 3d 20  ->pAinc; p; p = 
2db0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 73  p->pNext){.    s
2dc0: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
2dd0: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
2de0: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
2df0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
2e00: 62 65 4f 70 4c 69 73 74 20 61 75 74 6f 49 6e 63  beOpList autoInc
2e10: 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  End[] = {.      
2e20: 2f 2a 20 30 20 2a 2f 20 7b 4f 50 5f 4e 6f 74 4e  /* 0 */ {OP_NotN
2e30: 75 6c 6c 2c 20 20 20 20 20 30 2c 20 32 2c 20 30  ull,     0, 2, 0
2e40: 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f  },.      /* 1 */
2e50: 20 7b 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 20   {OP_NewRowid,  
2e60: 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    0, 0, 0},.    
2e70: 20 20 2f 2a 20 32 20 2a 2f 20 7b 4f 50 5f 4d 61    /* 2 */ {OP_Ma
2e80: 6b 65 52 65 63 6f 72 64 2c 20 20 30 2c 20 32 2c  keRecord,  0, 2,
2e90: 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 33 20   0},.      /* 3 
2ea0: 2a 2f 20 7b 4f 50 5f 49 6e 73 65 72 74 2c 20 20  */ {OP_Insert,  
2eb0: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20      0, 0, 0},.  
2ec0: 20 20 20 20 2f 2a 20 34 20 2a 2f 20 7b 4f 50 5f      /* 4 */ {OP_
2ed0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 30 2c 20  Close,       0, 
2ee0: 30 2c 20 30 7d 0a 20 20 20 20 7d 3b 0a 20 20 20  0, 0}.    };.   
2ef0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
2f00: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
2f10: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
2f20: 20 20 69 6e 74 20 69 52 65 63 3b 0a 20 20 20 20    int iRec;.    
2f30: 69 6e 74 20 6d 65 6d 49 64 20 3d 20 70 2d 3e 72  int memId = p->r
2f40: 65 67 43 74 72 3b 0a 0a 20 20 20 20 69 52 65 63  egCtr;..    iRec
2f50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2f60: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2f70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f80: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
2f90: 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63  (db, 0, pDb->pSc
2fa0: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c  hema) );.    sql
2fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2fc0: 2c 20 4f 50 5f 4c 65 2c 20 6d 65 6d 49 64 2b 32  , OP_Le, memId+2
2fd0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
2fe0: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 2c 20 6d  rentAddr(v)+7, m
2ff0: 65 6d 49 64 29 3b 0a 20 20 20 20 56 64 62 65 43  emId);.    VdbeC
3000: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
3010: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
3020: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69  (pParse, 0, p->i
3030: 44 62 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  Db, pDb->pSchema
3040: 2d 3e 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70  ->pSeqTab, OP_Op
3050: 65 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 61 4f  enWrite);.    aO
3060: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
3070: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
3080: 79 53 69 7a 65 28 61 75 74 6f 49 6e 63 45 6e 64  ySize(autoIncEnd
3090: 29 2c 20 61 75 74 6f 49 6e 63 45 6e 64 2c 20 69  ), autoIncEnd, i
30a0: 4c 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 4f 70  Ln);.    if( aOp
30b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
30c0: 20 61 4f 70 5b 30 5d 2e 70 31 20 3d 20 6d 65 6d   aOp[0].p1 = mem
30d0: 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70 5b 31 5d  Id+1;.    aOp[1]
30e0: 2e 70 32 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a 20  .p2 = memId+1;. 
30f0: 20 20 20 61 4f 70 5b 32 5d 2e 70 31 20 3d 20 6d     aOp[2].p1 = m
3100: 65 6d 49 64 2d 31 3b 0a 20 20 20 20 61 4f 70 5b  emId-1;.    aOp[
3110: 32 5d 2e 70 33 20 3d 20 69 52 65 63 3b 0a 20 20  2].p3 = iRec;.  
3120: 20 20 61 4f 70 5b 33 5d 2e 70 32 20 3d 20 69 52    aOp[3].p2 = iR
3130: 65 63 3b 0a 20 20 20 20 61 4f 70 5b 33 5d 2e 70  ec;.    aOp[3].p
3140: 33 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20  3 = memId+1;.   
3150: 20 61 4f 70 5b 33 5d 2e 70 35 20 3d 20 4f 50 46   aOp[3].p5 = OPF
3160: 4c 41 47 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20  LAG_APPEND;.    
3170: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3180: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
3190: 65 63 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ec);.  }.}.void 
31a0: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
31b0: 6d 65 6e 74 45 6e 64 28 50 61 72 73 65 20 2a 70  mentEnd(Parse *p
31c0: 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
31d0: 61 72 73 65 2d 3e 70 41 69 6e 63 20 29 20 61 75  arse->pAinc ) au
31e0: 74 6f 49 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70  toIncrementEnd(p
31f0: 50 61 72 73 65 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Parse);.}.#else.
3200: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
3210: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
3220: 4e 54 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  NT is defined, t
3230: 68 65 6e 20 74 68 65 20 74 68 72 65 65 20 72 6f  hen the three ro
3240: 75 74 69 6e 65 73 0a 2a 2a 20 61 62 6f 76 65 20  utines.** above 
3250: 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
3260: 2f 0a 23 20 64 65 66 69 6e 65 20 61 75 74 6f 49  /.# define autoI
3270: 6e 63 42 65 67 69 6e 28 41 2c 42 2c 43 29 20 28  ncBegin(A,B,C) (
3280: 30 29 0a 23 20 64 65 66 69 6e 65 20 61 75 74 6f  0).# define auto
3290: 49 6e 63 53 74 65 70 28 41 2c 42 2c 43 29 0a 23  IncStep(A,B,C).#
32a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
32b0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
32c0: 4e 54 20 2a 2f 0a 0a 0a 2f 2a 20 46 6f 72 77 61  NT */.../* Forwa
32d0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
32e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66 65  /.static int xfe
32f0: 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 0a 20  rOptimization(. 
3300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3310: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
3320: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
3330: 62 6c 65 20 2a 70 44 65 73 74 2c 20 20 20 20 20  ble *pDest,     
3340: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
3350: 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e   we are insertin
3360: 67 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c 65  g into */.  Sele
3370: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
3380: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
3390: 61 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61  atement to use a
33a0: 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  s the data sourc
33b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
33c0: 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
33d0: 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f  How to handle co
33e0: 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20  nstraint errors 
33f0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 44 65 73 74  */.  int iDbDest
3400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3410: 65 20 64 61 74 61 62 61 73 65 20 6f 66 20 70 44  e database of pD
3420: 65 73 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  est */.);../*.**
3430: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3440: 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
3450: 65 20 53 51 4c 20 6f 66 20 74 68 65 20 66 6f 6c  e SQL of the fol
3460: 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 2a 2a  lowing forms:.**
3470: 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74 20 69 6e  .**    insert in
3480: 74 6f 20 54 41 42 4c 45 20 28 49 44 4c 49 53 54  to TABLE (IDLIST
3490: 29 20 76 61 6c 75 65 73 28 45 58 50 52 4c 49 53  ) values(EXPRLIS
34a0: 54 29 2c 28 45 58 50 52 4c 49 53 54 29 2c 2e 2e  T),(EXPRLIST),..
34b0: 2e 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74 20 69  ..**    insert i
34c0: 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c 49 53  nto TABLE (IDLIS
34d0: 54 29 20 73 65 6c 65 63 74 0a 2a 2a 20 20 20 20  T) select.**    
34e0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42 4c  insert into TABL
34f0: 45 20 28 49 44 4c 49 53 54 29 20 64 65 66 61 75  E (IDLIST) defau
3500: 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 0a 2a 2a 20  lt values.**.** 
3510: 54 68 65 20 49 44 4c 49 53 54 20 66 6f 6c 6c 6f  The IDLIST follo
3520: 77 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 6e  wing the table n
3530: 61 6d 65 20 69 73 20 61 6c 77 61 79 73 20 6f 70  ame is always op
3540: 74 69 6f 6e 61 6c 2e 20 20 49 66 20 6f 6d 69 74  tional.  If omit
3550: 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 61 20 6c  ted,.** then a l
3560: 69 73 74 20 6f 66 20 61 6c 6c 20 28 6e 6f 6e 2d  ist of all (non-
3570: 68 69 64 64 65 6e 29 20 63 6f 6c 75 6d 6e 73 20  hidden) columns 
3580: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
3590: 20 73 75 62 73 74 69 74 75 74 65 64 2e 0a 2a 2a   substituted..**
35a0: 20 54 68 65 20 49 44 4c 49 53 54 20 61 70 70 65   The IDLIST appe
35b0: 61 72 73 20 69 6e 20 74 68 65 20 70 43 6f 6c 75  ars in the pColu
35c0: 6d 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20 70  mn parameter.  p
35d0: 43 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 20 69  Column is NULL i
35e0: 66 20 49 44 4c 49 53 54 0a 2a 2a 20 69 73 20 6f  f IDLIST.** is o
35f0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  mitted..**.** Fo
3600: 72 20 74 68 65 20 70 53 65 6c 65 63 74 20 70 61  r the pSelect pa
3610: 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 74 68  rameter holds th
3620: 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69  e values to be i
3630: 6e 73 65 72 74 65 64 20 66 6f 72 20 74 68 65 0a  nserted for the.
3640: 2a 2a 20 66 69 72 73 74 20 74 77 6f 20 66 6f 72  ** first two for
3650: 6d 73 20 73 68 6f 77 6e 20 61 62 6f 76 65 2e 20  ms shown above. 
3660: 20 41 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   A VALUES clause
3670: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
3680: 73 68 6f 72 74 2d 68 61 6e 64 0a 2a 2a 20 66 6f  short-hand.** fo
3690: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
36a0: 6d 65 6e 74 20 74 68 61 74 20 6f 6d 69 74 73 20  ment that omits 
36b0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
36c0: 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  and everything e
36d0: 6c 73 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c  lse.** that foll
36e0: 6f 77 73 2e 20 20 49 66 20 74 68 65 20 70 53 65  ows.  If the pSe
36f0: 6c 65 63 74 20 70 61 72 61 6d 65 74 65 72 20 69  lect parameter i
3700: 73 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61  s NULL, that mea
3710: 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 44  ns that the.** D
3720: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20 66 6f  EFAULT VALUES fo
3730: 72 6d 20 6f 66 20 74 68 65 20 49 4e 53 45 52 54  rm of the INSERT
3740: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e   statement is in
3750: 74 65 6e 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  tended..**.** Th
3760: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
3770: 20 66 6f 6c 6c 6f 77 73 20 6f 6e 65 20 6f 66 20   follows one of 
3780: 66 6f 75 72 20 74 65 6d 70 6c 61 74 65 73 2e 20  four templates. 
3790: 20 46 6f 72 20 61 20 73 69 6d 70 6c 65 0a 2a 2a   For a simple.**
37a0: 20 69 6e 73 65 72 74 20 77 69 74 68 20 64 61 74   insert with dat
37b0: 61 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  a coming from a 
37c0: 73 69 6e 67 6c 65 2d 72 6f 77 20 56 41 4c 55 45  single-row VALUE
37d0: 53 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  S clause, the co
37e0: 64 65 20 65 78 65 63 75 74 65 73 0a 2a 2a 20 6f  de executes.** o
37f0: 6e 63 65 20 73 74 72 61 69 67 68 74 20 64 6f 77  nce straight dow
3800: 6e 20 74 68 72 6f 75 67 68 2e 20 20 50 73 65 75  n through.  Pseu
3810: 64 6f 2d 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20  do-code follows 
3820: 28 77 65 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  (we call this.**
3830: 20 74 68 65 20 22 31 73 74 20 74 65 6d 70 6c 61   the "1st templa
3840: 74 65 22 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te"):.**.**     
3850: 20 20 20 20 6f 70 65 6e 20 77 72 69 74 65 20 63      open write c
3860: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3870: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
3880: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 75 74 20  .**         put 
3890: 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20 65 78  VALUES clause ex
38a0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f 20 72  pressions into r
38b0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
38c0: 20 20 20 20 77 72 69 74 65 20 74 68 65 20 72 65      write the re
38d0: 73 75 6c 74 69 6e 67 20 72 65 63 6f 72 64 20 69  sulting record i
38e0: 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20  nto <table>.**  
38f0: 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 0a 2a         cleanup.*
3900: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 65 20 72  *.** The three r
3910: 65 6d 61 69 6e 69 6e 67 20 74 65 6d 70 6c 61 74  emaining templat
3920: 65 73 20 61 73 73 75 6d 65 20 74 68 65 20 73 74  es assume the st
3930: 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
3940: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 49  e form.**.**   I
3950: 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62 6c  NSERT INTO <tabl
3960: 65 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 0a 2a 2a  e> SELECT ....**
3970: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
3980: 54 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  T clause is of t
3990: 68 65 20 72 65 73 74 72 69 63 74 65 64 20 66 6f  he restricted fo
39a0: 72 6d 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  rm "SELECT * FRO
39b0: 4d 20 3c 74 61 62 6c 65 32 3e 22 20 2d 0a 2a 2a  M <table2>" -.**
39c0: 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
39d0: 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 75  if the SELECT pu
39e0: 6c 6c 73 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  lls all columns 
39f0: 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
3a00: 62 6c 65 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65  ble.** and there
3a10: 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20   is no WHERE or 
3a20: 4c 49 4d 49 54 20 6f 72 20 47 52 4f 55 50 20 42  LIMIT or GROUP B
3a30: 59 20 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c  Y or ORDER BY cl
3a40: 61 75 73 65 73 2c 20 61 6e 64 0a 2a 2a 20 69 66  auses, and.** if
3a50: 20 3c 74 61 62 6c 65 32 3e 20 61 6e 64 20 3c 74   <table2> and <t
3a60: 61 62 6c 65 31 3e 20 61 72 65 20 64 69 73 74 69  able1> are disti
3a70: 6e 63 74 20 74 61 62 6c 65 73 20 62 75 74 20 68  nct tables but h
3a80: 61 76 65 20 69 64 65 6e 74 69 63 61 6c 0a 2a 2a  ave identical.**
3a90: 20 73 63 68 65 6d 61 73 2c 20 69 6e 63 6c 75 64   schemas, includ
3aa0: 69 6e 67 20 61 6c 6c 20 74 68 65 20 73 61 6d 65  ing all the same
3ab0: 20 69 6e 64 69 63 65 73 2c 20 74 68 65 6e 20 61   indices, then a
3ac0: 20 73 70 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a   special optimiz
3ad0: 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 69 6e 76 6f  ation.** is invo
3ae0: 6b 65 64 20 74 68 61 74 20 63 6f 70 69 65 73 20  ked that copies 
3af0: 72 61 77 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  raw records from
3b00: 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72 20 74   <table2> over t
3b10: 6f 20 3c 74 61 62 6c 65 31 3e 2e 0a 2a 2a 20 53  o <table1>..** S
3b20: 65 65 20 74 68 65 20 78 66 65 72 4f 70 74 69 6d  ee the xferOptim
3b30: 69 7a 61 74 69 6f 6e 28 29 20 66 75 6e 63 74 69  ization() functi
3b40: 6f 6e 20 66 6f 72 20 74 68 65 20 69 6d 70 6c 65  on for the imple
3b50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 69  mentation of thi
3b60: 73 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 2e 20 20  s.** template.  
3b70: 54 68 69 73 20 69 73 20 74 68 65 20 32 6e 64 20  This is the 2nd 
3b80: 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
3b90: 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20 77          open a w
3ba0: 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c  rite cursor to <
3bb0: 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20  table>.**       
3bc0: 20 20 6f 70 65 6e 20 72 65 61 64 20 63 75 72 73    open read curs
3bd0: 6f 72 20 6f 6e 20 3c 74 61 62 6c 65 32 3e 0a 2a  or on <table2>.*
3be0: 2a 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  *         transf
3bf0: 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 69  er all records i
3c00: 6e 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72 20  n <table2> over 
3c10: 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20  to <table>.**   
3c20: 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73        close curs
3c30: 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ors.**         f
3c40: 6f 72 65 61 63 68 20 69 6e 64 65 78 20 6f 6e 20  oreach index on 
3c50: 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20  <table>.**      
3c60: 20 20 20 20 20 6f 70 65 6e 20 61 20 77 72 69 74       open a writ
3c70: 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  e cursor on the 
3c80: 3c 74 61 62 6c 65 3e 20 69 6e 64 65 78 0a 2a 2a  <table> index.**
3c90: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20             open 
3ca0: 61 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e  a read cursor on
3cb0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
3cc0: 6e 67 20 3c 74 61 62 6c 65 32 3e 20 69 6e 64 65  ng <table2> inde
3cd0: 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  x.**           t
3ce0: 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 65 63 6f  ransfer all reco
3cf0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 72 65 61  rds from the rea
3d00: 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 20 63  d to the write c
3d10: 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20  ursors.**       
3d20: 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73 6f 72      close cursor
3d30: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64  s.**         end
3d40: 20 66 6f 72 65 61 63 68 0a 2a 2a 0a 2a 2a 20 54   foreach.**.** T
3d50: 68 65 20 33 72 64 20 74 65 6d 70 6c 61 74 65 20  he 3rd template 
3d60: 69 73 20 66 6f 72 20 77 68 65 6e 20 74 68 65 20  is for when the 
3d70: 73 65 63 6f 6e 64 20 74 65 6d 70 6c 61 74 65 20  second template 
3d80: 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 0a 2a  does not apply.*
3d90: 2a 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54  * and the SELECT
3da0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
3db0: 20 72 65 61 64 20 66 72 6f 6d 20 3c 74 61 62 6c   read from <tabl
3dc0: 65 3e 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 0a  e> at any time..
3dd0: 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
3de0: 20 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20 74 68   code follows th
3df0: 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a 2a 0a  is template:.**.
3e00: 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c 2d 20  **         X <- 
3e10: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74  A.**         got
3e20: 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73  o B.**      A: s
3e30: 65 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c  etup for the SEL
3e40: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c  ECT.**         l
3e50: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 72 6f 77  oop over the row
3e60: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
3e70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 61  **           loa
3e80: 64 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65  d values into re
3e90: 67 69 73 74 65 72 73 20 52 2e 2e 52 2b 6e 0a 2a  gisters R..R+n.*
3ea0: 2a 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  *           yiel
3eb0: 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  d X.**         e
3ec0: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
3ed0: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
3ee0: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3ef0: 20 20 20 20 20 20 20 65 6e 64 2d 63 6f 72 6f 75         end-corou
3f00: 74 69 6e 65 20 58 0a 2a 2a 20 20 20 20 20 20 42  tine X.**      B
3f10: 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63 75 72  : open write cur
3f20: 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61  sor to <table> a
3f30: 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a  nd its indices.*
3f40: 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c 64 20  *      C: yield 
3f50: 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f 20 44  X, at EOF goto D
3f60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65  .**         inse
3f70: 72 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65  rt the select re
3f80: 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65  sult into <table
3f90: 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 2a 2a  > from R..R+n.**
3fa0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43 0a           goto C.
3fb0: 2a 2a 20 20 20 20 20 20 44 3a 20 63 6c 65 61 6e  **      D: clean
3fc0: 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 34 74 68  up.**.** The 4th
3fd0: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 75 73 65   template is use
3fe0: 64 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  d if the insert 
3ff0: 73 74 61 74 65 6d 65 6e 74 20 74 61 6b 65 73 20  statement takes 
4000: 69 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72  its.** values fr
4010: 6f 6d 20 61 20 53 45 4c 45 43 54 20 62 75 74 20  om a SELECT but 
4020: 74 68 65 20 64 61 74 61 20 69 73 20 62 65 69 6e  the data is bein
4030: 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  g inserted into 
4040: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20  a table.** that 
4050: 69 73 20 61 6c 73 6f 20 72 65 61 64 20 61 73 20  is also read as 
4060: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 4c 45  part of the SELE
4070: 43 54 2e 20 20 49 6e 20 74 68 65 20 74 68 69 72  CT.  In the thir
4080: 64 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61  d form,.** we ha
4090: 76 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 74  ve to use an int
40a0: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20  ermediate table 
40b0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  to store the res
40c0: 75 6c 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73  ults of.** the s
40d0: 65 6c 65 63 74 2e 20 20 54 68 65 20 74 65 6d 70  elect.  The temp
40e0: 6c 61 74 65 20 69 73 20 6c 69 6b 65 20 74 68 69  late is like thi
40f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
4100: 20 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20 20 20   X <- A.**      
4110: 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20 20 20     goto B.**    
4120: 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72 20 74    A: setup for t
4130: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
4140: 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74       loop over t
4150: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
4160: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
4170: 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75 65 20       load value 
4180: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 52 2e  into register R.
4190: 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  .R+n.**         
41a0: 20 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20    yield X.**    
41b0: 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a       end loop.**
41c0: 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
41d0: 20 61 66 74 65 72 20 74 68 65 20 53 45 4c 45 43   after the SELEC
41e0: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64  T.**         end
41f0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 52 0a 2a 2a   co-routine R.**
4200: 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65        B: open te
4210: 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  mp table.**     
4220: 20 4c 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20   L: yield X, at 
4230: 45 4f 46 20 67 6f 74 6f 20 4d 0a 2a 2a 20 20 20  EOF goto M.**   
4240: 20 20 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77        insert row
4250: 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74   from R..R+n int
4260: 6f 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20  o temp table.** 
4270: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a 2a          goto L.*
4280: 2a 20 20 20 20 20 20 4d 3a 20 6f 70 65 6e 20 77  *      M: open w
4290: 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c  rite cursor to <
42a0: 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73 20 69  table> and its i
42b0: 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20  ndices.**       
42c0: 20 20 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61    rewind temp ta
42d0: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 43 3a 20 6c  ble.**      C: l
42e0: 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66  oop over rows of
42f0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61   intermediate ta
4300: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
4310: 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73   transfer values
4320: 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61   form intermedia
4330: 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74  te table into <t
4340: 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20  able>.**        
4350: 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20   end loop.**    
4360: 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a    D: cleanup.*/.
4370: 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 73 65  void sqlite3Inse
4380: 72 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rt(.  Parse *pPa
4390: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
43a0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
43b0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
43c0: 4c 69 73 74 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  List,    /* Name
43d0: 20 6f 66 20 74 61 62 6c 65 20 69 6e 74 6f 20 77   of table into w
43e0: 68 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65  hich we are inse
43f0: 72 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63  rting */.  Selec
4400: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4410: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
4420: 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73  tement to use as
4430: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
4440: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
4450: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 43  olumn,      /* C
4460: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 6f 72 72  olumn names corr
4470: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 49 44 4c  esponding to IDL
4480: 49 53 54 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  IST. */.  int on
4490: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
44a0: 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
44b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
44c0: 72 73 20 2a 2f 0a 20 20 55 70 73 65 72 74 20 2a  rs */.  Upsert *
44d0: 70 55 70 73 65 72 74 20 20 20 20 20 20 20 2f 2a  pUpsert       /*
44e0: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
44f0: 75 73 65 73 20 66 6f 72 20 75 70 73 65 72 74 2c  uses for upsert,
4500: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
4510: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
4520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
4530: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
4540: 63 74 75 72 65 20 2a 2f 0a 20 20 54 61 62 6c 65  cture */.  Table
4550: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
4560: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
4570: 20 69 6e 73 65 72 74 20 69 6e 74 6f 2e 20 20 61   insert into.  a
4580: 6b 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 69 6e  ka TABLE */.  in
4590: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
45a0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
45b0: 74 65 72 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ters */.  Vdbe *
45c0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
45d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
45e0: 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
45f0: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
4600: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
4610: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
4620: 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65  ping over indice
4630: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  s of the table *
4640: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  /.  int nColumn;
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4660: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
4670: 6e 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  n the data */.  
4680: 69 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b  int nHidden = 0;
4690: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
46a0: 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
46b0: 73 20 69 66 20 54 41 42 4c 45 20 69 73 20 76 69  s if TABLE is vi
46c0: 72 74 75 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  rtual */.  int i
46d0: 44 61 74 61 43 75 72 20 3d 20 30 3b 20 20 20 20  DataCur = 0;    
46e0: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
46f0: 74 68 61 74 20 69 73 20 74 68 65 20 6d 61 69 6e  that is the main
4700: 20 64 61 74 61 20 72 65 70 6f 73 69 74 6f 72 79   data repository
4710: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
4720: 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 46  r = 0;      /* F
4730: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
4740: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 43 6f  r */.  int ipkCo
4750: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  lumn = -1;   /* 
4760: 43 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 74  Column that is t
4770: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
4780: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20  RY KEY */.  int 
4790: 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  endOfLoop;      
47a0: 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
47b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
47c0: 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a  sertion loop */.
47d0: 20 20 69 6e 74 20 73 72 63 54 61 62 20 3d 20 30    int srcTab = 0
47e0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20  ;       /* Data 
47f0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 69 73 20  comes from this 
4800: 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
4810: 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74   if >=0 */.  int
4820: 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 30 3b   addrInsTop = 0;
4830: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 6c 61     /* Jump to la
4840: 62 65 6c 20 22 44 22 20 2a 2f 0a 20 20 69 6e 74  bel "D" */.  int
4850: 20 61 64 64 72 43 6f 6e 74 20 3d 20 30 3b 20 20   addrCont = 0;  
4860: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 69 6e 73     /* Top of ins
4870: 65 72 74 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  ert loop. Label 
4880: 22 43 22 20 69 6e 20 74 65 6d 70 6c 61 74 65 73  "C" in templates
4890: 20 33 20 61 6e 64 20 34 20 2a 2f 0a 20 20 53 65   3 and 4 */.  Se
48a0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
48b0: 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
48c0: 6f 6e 20 66 6f 72 20 53 45 4c 45 43 54 20 6f 6e  on for SELECT on
48d0: 20 72 68 73 20 6f 66 20 49 4e 53 45 52 54 20 2a   rhs of INSERT *
48e0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
48f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
4900: 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 68  ex of database h
4910: 6f 6c 64 69 6e 67 20 54 41 42 4c 45 20 2a 2f 0a  olding TABLE */.
4920: 20 20 75 38 20 75 73 65 54 65 6d 70 54 61 62 6c    u8 useTempTabl
4930: 65 20 3d 20 30 3b 20 20 2f 2a 20 53 74 6f 72 65  e = 0;  /* Store
4940: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
4950: 69 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  in intermediate 
4960: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 61 70  table */.  u8 ap
4970: 70 65 6e 64 46 6c 61 67 20 3d 20 30 3b 20 20 20  pendFlag = 0;   
4980: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4990: 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79  insert is likely
49a0: 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64   to be an append
49b0: 20 2a 2f 0a 20 20 75 38 20 77 69 74 68 6f 75 74   */.  u8 without
49c0: 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 30  Rowid;      /* 0
49d0: 20 66 6f 72 20 6e 6f 72 6d 61 6c 20 74 61 62 6c   for normal tabl
49e0: 65 2e 20 20 31 20 66 6f 72 20 57 49 54 48 4f 55  e.  1 for WITHOU
49f0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 2a 2f  T ROWID table */
4a00: 0a 20 20 75 38 20 62 49 64 4c 69 73 74 49 6e 4f  .  u8 bIdListInO
4a10: 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65  rder;    /* True
4a20: 20 69 66 20 49 44 4c 49 53 54 20 69 73 20 69 6e   if IDLIST is in
4a30: 20 74 61 62 6c 65 20 6f 72 64 65 72 20 2a 2f 0a   table order */.
4a40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4a50: 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20  t = 0;  /* List 
4a60: 6f 66 20 56 41 4c 55 45 53 28 29 20 74 6f 20 62  of VALUES() to b
4a70: 65 20 69 6e 73 65 72 74 65 64 20 20 2a 2f 0a 0a  e inserted  */..
4a80: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
4a90: 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  locations */.  i
4aa0: 6e 74 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  nt regFromSelect
4ab0: 20 3d 20 30 3b 2f 2a 20 42 61 73 65 20 72 65 67   = 0;/* Base reg
4ac0: 69 73 74 65 72 20 66 6f 72 20 64 61 74 61 20 63  ister for data c
4ad0: 6f 6d 69 6e 67 20 66 72 6f 6d 20 53 45 4c 45 43  oming from SELEC
4ae0: 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75  T */.  int regAu
4af0: 74 6f 69 6e 63 20 3d 20 30 3b 20 20 20 2f 2a 20  toinc = 0;   /* 
4b00: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
4b10: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
4b20: 4e 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  NT counter */.  
4b30: 69 6e 74 20 72 65 67 52 6f 77 43 6f 75 6e 74 20  int regRowCount 
4b40: 3d 20 30 3b 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  = 0;  /* Memory 
4b50: 63 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 74 68  cell used for th
4b60: 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f  e row counter */
4b70: 0a 20 20 69 6e 74 20 72 65 67 49 6e 73 3b 20 20  .  int regIns;  
4b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
4b90: 6b 20 6f 66 20 72 65 67 73 20 68 6f 6c 64 69 6e  k of regs holdin
4ba0: 67 20 72 6f 77 69 64 2b 64 61 74 61 20 62 65 69  g rowid+data bei
4bb0: 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  ng inserted */. 
4bc0: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
4bd0: 20 20 20 20 20 20 20 2f 2a 20 72 65 67 69 73 74         /* regist
4be0: 65 72 73 20 68 6f 6c 64 69 6e 67 20 69 6e 73 65  ers holding inse
4bf0: 72 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  rt rowid */.  in
4c00: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
4c10: 20 20 20 20 2f 2a 20 72 65 67 69 73 74 65 72 20      /* register 
4c20: 68 6f 6c 64 69 6e 67 20 66 69 72 73 74 20 63 6f  holding first co
4c30: 6c 75 6d 6e 20 74 6f 20 69 6e 73 65 72 74 20 2a  lumn to insert *
4c40: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
4c50: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4f 6e 65   = 0;     /* One
4c60: 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
4c70: 74 65 64 20 74 6f 20 65 61 63 68 20 69 6e 64 65  ted to each inde
4c80: 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  x */..#ifndef SQ
4c90: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4ca0: 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20  R.  int isView; 
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 2f 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d  /* True if attem
4cd0: 70 74 69 6e 67 20 74 6f 20 69 6e 73 65 72 74 20  pting to insert 
4ce0: 69 6e 74 6f 20 61 20 76 69 65 77 20 2a 2f 0a 20  into a view */. 
4cf0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
4d00: 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
4d10: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
4d20: 20 6f 6e 20 70 54 61 62 2c 20 69 66 20 72 65 71   on pTab, if req
4d30: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  uired */.  int t
4d40: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
4d50: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4d60: 66 20 74 72 69 67 67 65 72 20 74 69 6d 65 73 20  f trigger times 
4d70: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  */.#endif..  db 
4d80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4d90: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
4da0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
4db0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
4dc0: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
4dd0: 0a 20 20 7d 0a 20 20 64 65 73 74 2e 69 53 44 50  .  }.  dest.iSDP
4de0: 61 72 6d 20 3d 20 30 3b 20 20 2f 2a 20 53 75 70  arm = 0;  /* Sup
4df0: 70 72 65 73 73 20 61 20 68 61 72 6d 6c 65 73 73  press a harmless
4e00: 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
4e10: 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  g */..  /* If th
4e20: 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
4e30: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
4e40: 20 73 69 6d 70 6c 65 20 56 41 4c 55 45 53 28 29   simple VALUES()
4e50: 20 6c 69 73 74 20 77 69 74 68 20 61 0a 20 20 2a   list with a.  *
4e60: 2a 20 73 69 6e 67 6c 65 20 72 6f 77 20 28 74 68  * single row (th
4e70: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 29 20 74  e common case) t
4e80: 68 65 6e 20 6b 65 65 70 20 74 68 61 74 20 6f 6e  hen keep that on
4e90: 65 20 72 6f 77 20 6f 66 20 76 61 6c 75 65 73 0a  e row of values.
4ea0: 20 20 2a 2a 20 61 6e 64 20 64 69 73 63 61 72 64    ** and discard
4eb0: 20 74 68 65 20 6f 74 68 65 72 20 28 75 6e 75 73   the other (unus
4ec0: 65 64 29 20 70 61 72 74 73 20 6f 66 20 74 68 65  ed) parts of the
4ed0: 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a   pSelect object.
4ee0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65    */.  if( pSele
4ef0: 63 74 20 26 26 20 28 70 53 65 6c 65 63 74 2d 3e  ct && (pSelect->
4f00: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
4f10: 6c 75 65 73 29 21 3d 30 20 26 26 20 70 53 65 6c  lues)!=0 && pSel
4f20: 65 63 74 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ect->pPrior==0 )
4f30: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 53  {.    pList = pS
4f40: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
4f50: 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69     pSelect->pELi
4f60: 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  st = 0;.    sqli
4f70: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
4f80: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
4f90: 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20    pSelect = 0;. 
4fa0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
4fb0: 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  the table into w
4fc0: 68 69 63 68 20 77 65 20 77 69 6c 6c 20 62 65 20  hich we will be 
4fd0: 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 69 6e  inserting new in
4fe0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
4ff0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
5000: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
5010: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
5020: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
5030: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
5040: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
5050: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
5060: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
5070: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
5080: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
5090: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
50a0: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
50b0: 3e 6e 44 62 20 29 3b 0a 20 20 69 66 28 20 73 71  >nDb );.  if( sq
50c0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
50d0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
50e0: 53 45 52 54 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  SERT, pTab->zNam
50f0: 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  e, 0,.          
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
5110: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
5120: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
5130: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
5140: 20 20 7d 0a 20 20 77 69 74 68 6f 75 74 52 6f 77    }.  withoutRow
5150: 69 64 20 3d 20 21 48 61 73 52 6f 77 69 64 28 70  id = !HasRowid(p
5160: 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Tab);..  /* Figu
5170: 72 65 20 6f 75 74 20 69 66 20 77 65 20 68 61 76  re out if we hav
5180: 65 20 61 6e 79 20 74 72 69 67 67 65 72 73 20 61  e any triggers a
5190: 6e 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  nd if the table 
51a0: 62 65 69 6e 67 0a 20 20 2a 2a 20 69 6e 73 65 72  being.  ** inser
51b0: 74 65 64 20 69 6e 74 6f 20 69 73 20 61 20 76 69  ted into is a vi
51c0: 65 77 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ew.  */.#ifndef 
51d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
51e0: 47 45 52 0a 20 20 70 54 72 69 67 67 65 72 20 3d  GER.  pTrigger =
51f0: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73   sqlite3Triggers
5200: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
5210: 61 62 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  ab, TK_INSERT, 0
5220: 2c 20 26 74 6d 61 73 6b 29 3b 0a 20 20 69 73 56  , &tmask);.  isV
5230: 69 65 77 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c  iew = pTab->pSel
5240: 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20  ect!=0;.#else.# 
5250: 64 65 66 69 6e 65 20 70 54 72 69 67 67 65 72 20  define pTrigger 
5260: 30 0a 23 20 64 65 66 69 6e 65 20 74 6d 61 73 6b  0.# define tmask
5270: 20 30 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69   0.# define isVi
5280: 65 77 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  ew 0.#endif.#ifd
5290: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
52a0: 49 45 57 0a 23 20 75 6e 64 65 66 20 69 73 56 69  IEW.# undef isVi
52b0: 65 77 0a 23 20 64 65 66 69 6e 65 20 69 73 56 69  ew.# define isVi
52c0: 65 77 20 30 0a 23 65 6e 64 69 66 0a 20 20 61 73  ew 0.#endif.  as
52d0: 73 65 72 74 28 20 28 70 54 72 69 67 67 65 72 20  sert( (pTrigger 
52e0: 26 26 20 74 6d 61 73 6b 29 20 7c 7c 20 28 70 54  && tmask) || (pT
52f0: 72 69 67 67 65 72 3d 3d 30 20 26 26 20 74 6d 61  rigger==0 && tma
5300: 73 6b 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  sk==0) );..  /* 
5310: 49 66 20 70 54 61 62 20 69 73 20 72 65 61 6c 6c  If pTab is reall
5320: 79 20 61 20 76 69 65 77 2c 20 6d 61 6b 65 20 73  y a view, make s
5330: 75 72 65 20 69 74 20 68 61 73 20 62 65 65 6e 20  ure it has been 
5340: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
5350: 2a 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  * ViewGetColumnN
5360: 61 6d 65 73 28 29 20 69 73 20 61 20 6e 6f 2d 6f  ames() is a no-o
5370: 70 20 69 66 20 70 54 61 62 20 69 73 20 6e 6f 74  p if pTab is not
5380: 20 61 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20   a view..  */.  
5390: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
53a0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
53b0: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
53c0: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
53d0: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
53e0: 2a 20 43 61 6e 6e 6f 74 20 69 6e 73 65 72 74 20  * Cannot insert 
53f0: 69 6e 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  into a read-only
5400: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
5410: 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61 64  f( sqlite3IsRead
5420: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
5430: 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a 20 20 20  b, tmask) ){.   
5440: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
5450: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
5460: 41 6c 6c 6f 63 61 74 65 20 61 20 56 44 42 45 0a  Allocate a VDBE.
5470: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
5480: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5490: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
54a0: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
54b0: 6e 75 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73  nup;.  if( pPars
54c0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 20 73  e->nested==0 ) s
54d0: 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
54e0: 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73 71 6c  hanges(v);.  sql
54f0: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5500: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5510: 70 53 65 6c 65 63 74 20 7c 7c 20 70 54 72 69 67  pSelect || pTrig
5520: 67 65 72 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  ger, iDb);..#ifn
5530: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5540: 58 46 45 52 5f 4f 50 54 0a 20 20 2f 2a 20 49 66  XFER_OPT.  /* If
5550: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
5560: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20  s of the form.  
5570: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 49 4e  **.  **       IN
5580: 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62 6c 65  SERT INTO <table
5590: 31 3e 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  1> SELECT * FROM
55a0: 20 3c 74 61 62 6c 65 32 3e 3b 0a 20 20 2a 2a 0a   <table2>;.  **.
55b0: 20 20 2a 2a 20 54 68 65 6e 20 73 70 65 63 69 61    ** Then specia
55c0: 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  l optimizations 
55d0: 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20 74  can be applied t
55e0: 68 61 74 20 6d 61 6b 65 20 74 68 65 20 74 72 61  hat make the tra
55f0: 6e 73 66 65 72 0a 20 20 2a 2a 20 76 65 72 79 20  nsfer.  ** very 
5600: 66 61 73 74 20 61 6e 64 20 77 68 69 63 68 20 72  fast and which r
5610: 65 64 75 63 65 20 66 72 61 67 6d 65 6e 74 61 74  educe fragmentat
5620: 69 6f 6e 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a  ion of indices..
5630: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
5640: 73 20 74 68 65 20 32 6e 64 20 74 65 6d 70 6c 61  s the 2nd templa
5650: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  te..  */.  if( p
5660: 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 78 66 65  Column==0 && xfe
5670: 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50  rOptimization(pP
5680: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
5690: 65 63 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 69 44  ect, onError, iD
56a0: 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b) ){.    assert
56b0: 28 20 21 70 54 72 69 67 67 65 72 20 29 3b 0a 20  ( !pTrigger );. 
56c0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
56d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ==0 );.    goto 
56e0: 69 6e 73 65 72 74 5f 65 6e 64 3b 0a 20 20 7d 0a  insert_end;.  }.
56f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5700: 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 20 2a  _OMIT_XFER_OPT *
5710: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5720: 69 73 20 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d  is an AUTOINCREM
5730: 45 4e 54 20 74 61 62 6c 65 2c 20 6c 6f 6f 6b 20  ENT table, look 
5740: 75 70 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  up the sequence 
5750: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
5760: 2a 2a 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ** sqlite_sequen
5770: 63 65 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f  ce table and sto
5780: 72 65 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 20  re it in memory 
5790: 63 65 6c 6c 20 72 65 67 41 75 74 6f 69 6e 63 2e  cell regAutoinc.
57a0: 0a 20 20 2a 2f 0a 20 20 72 65 67 41 75 74 6f 69  .  */.  regAutoi
57b0: 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42 65 67 69  nc = autoIncBegi
57c0: 6e 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  n(pParse, iDb, p
57d0: 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  Tab);..  /* Allo
57e0: 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20 66  cate registers f
57f0: 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  or holding the r
5800: 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20  owid of the new 
5810: 72 6f 77 2c 0a 20 20 2a 2a 20 74 68 65 20 63 6f  row,.  ** the co
5820: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
5830: 20 72 6f 77 2c 20 61 6e 64 20 74 68 65 20 61 73   row, and the as
5840: 73 65 6d 62 6c 65 64 20 72 6f 77 20 72 65 63 6f  sembled row reco
5850: 72 64 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 52 6f  rd..  */.  regRo
5860: 77 69 64 20 3d 20 72 65 67 49 6e 73 20 3d 20 70  wid = regIns = p
5870: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
5880: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
5890: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b 20 31 3b   pTab->nCol + 1;
58a0: 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
58b0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 72 65  (pTab) ){.    re
58c0: 67 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70 50  gRowid++;.    pP
58d0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
58e0: 7d 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72 65  }.  regData = re
58f0: 67 52 6f 77 69 64 2b 31 3b 0a 0a 20 20 2f 2a 20  gRowid+1;..  /* 
5900: 49 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74  If the INSERT st
5910: 61 74 65 6d 65 6e 74 20 69 6e 63 6c 75 64 65 64  atement included
5920: 20 61 6e 20 49 44 4c 49 53 54 20 74 65 72 6d 2c   an IDLIST term,
5930: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a   then make sure.
5940: 20 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e 74    ** all element
5950: 73 20 6f 66 20 74 68 65 20 49 44 4c 49 53 54 20  s of the IDLIST 
5960: 72 65 61 6c 6c 79 20 61 72 65 20 63 6f 6c 75 6d  really are colum
5970: 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
5980: 61 6e 64 20 0a 20 20 2a 2a 20 72 65 6d 65 6d 62  and .  ** rememb
5990: 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  er the column in
59a0: 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dices..  **.  **
59b0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
59c0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
59d0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
59e0: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0a  and that column.
59f0: 20 20 2a 2a 20 69 73 20 6e 61 6d 65 64 20 69 6e    ** is named in
5a00: 20 74 68 65 20 49 44 4c 49 53 54 2c 20 74 68 65   the IDLIST, the
5a10: 6e 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  n record in the 
5a20: 69 70 6b 43 6f 6c 75 6d 6e 20 76 61 72 69 61 62  ipkColumn variab
5a30: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  le.  ** the inde
5a40: 78 20 69 6e 74 6f 20 49 44 4c 49 53 54 20 6f 66  x into IDLIST of
5a50: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
5a60: 20 63 6f 6c 75 6d 6e 2e 20 20 69 70 6b 43 6f 6c   column.  ipkCol
5a70: 75 6d 6e 20 69 73 0a 20 20 2a 2a 20 74 68 65 20  umn is.  ** the 
5a80: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 70 72 69  index of the pri
5a90: 6d 61 72 79 20 6b 65 79 20 61 73 20 69 74 20 61  mary key as it a
5aa0: 70 70 65 61 72 73 20 69 6e 20 49 44 4c 49 53 54  ppears in IDLIST
5ab0: 2c 20 6e 6f 74 20 61 73 0a 20 20 2a 2a 20 69 73  , not as.  ** is
5ac0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
5ad0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 2e 20  original table. 
5ae0: 20 28 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74   (The index of t
5af0: 68 65 20 49 4e 54 45 47 45 52 0a 20 20 2a 2a 20  he INTEGER.  ** 
5b00: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 20 74  PRIMARY KEY in t
5b10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  he original tabl
5b20: 65 20 69 73 20 70 54 61 62 2d 3e 69 50 4b 65 79  e is pTab->iPKey
5b30: 2e 29 0a 20 20 2a 2f 0a 20 20 62 49 64 4c 69 73  .).  */.  bIdLis
5b40: 74 49 6e 4f 72 64 65 72 20 3d 20 28 70 54 61 62  tInOrder = (pTab
5b50: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
5b60: 4f 4f 4f 48 69 64 64 65 6e 29 3d 3d 30 3b 0a 20  OOOHidden)==0;. 
5b70: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a   if( pColumn ){.
5b80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5b90: 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b  Column->nId; i++
5ba0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e  ){.      pColumn
5bb0: 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 2d 31 3b  ->a[i].idx = -1;
5bc0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
5bd0: 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e  =0; i<pColumn->n
5be0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; i++){.      
5bf0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
5c00: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
5c10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5c20: 53 74 72 49 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d  StrICmp(pColumn-
5c30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
5c40: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
5c50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5c60: 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e    pColumn->a[i].
5c70: 69 64 78 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  idx = j;.       
5c80: 20 20 20 69 66 28 20 69 21 3d 6a 20 29 20 62 49     if( i!=j ) bI
5c90: 64 4c 69 73 74 49 6e 4f 72 64 65 72 20 3d 20 30  dListInOrder = 0
5ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5cb0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
5cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 70  {.            ip
5cd0: 6b 43 6f 6c 75 6d 6e 20 3d 20 69 3b 20 20 61 73  kColumn = i;  as
5ce0: 73 65 72 74 28 20 21 77 69 74 68 6f 75 74 52 6f  sert( !withoutRo
5cf0: 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  wid );.         
5d00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
5d10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5d30: 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
5d40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
5d50: 69 74 65 33 49 73 52 6f 77 69 64 28 70 43 6f 6c  ite3IsRowid(pCol
5d60: 75 6d 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  umn->a[i].zName)
5d70: 20 26 26 20 21 77 69 74 68 6f 75 74 52 6f 77 69   && !withoutRowi
5d80: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
5d90: 70 6b 43 6f 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20  pkColumn = i;.  
5da0: 20 20 20 20 20 20 20 20 62 49 64 4c 69 73 74 49          bIdListI
5db0: 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  nOrder = 0;.    
5dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5de0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
5df0: 62 6c 65 20 25 53 20 68 61 73 20 6e 6f 20 63 6f  ble %S has no co
5e00: 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a  lumn named %s",.
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
5e20: 61 62 4c 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75  abList, 0, pColu
5e30: 6d 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  mn->a[i].zName);
5e40: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
5e50: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
5e60: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   1;.          go
5e70: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
5e80: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
5e90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
5ea0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
5eb0: 68 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  how many columns
5ec0: 20 6f 66 20 64 61 74 61 20 61 72 65 20 73 75 70   of data are sup
5ed0: 70 6c 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  plied.  If the d
5ee0: 61 74 61 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69  ata.  ** is comi
5ef0: 6e 67 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ng from a SELECT
5f00: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
5f10: 20 67 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72   generate a co-r
5f20: 6f 75 74 69 6e 65 20 74 68 61 74 0a 20 20 2a 2a  outine that.  **
5f30: 20 70 72 6f 64 75 63 65 73 20 61 20 73 69 6e 67   produces a sing
5f40: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 53 45  le row of the SE
5f50: 4c 45 43 54 20 6f 6e 20 65 61 63 68 20 69 6e 76  LECT on each inv
5f60: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 0a 20 20  ocation.  The.  
5f70: 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  ** co-routine is
5f80: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 68 65 61 64   the common head
5f90: 65 72 20 74 6f 20 74 68 65 20 33 72 64 20 61 6e  er to the 3rd an
5fa0: 64 20 34 74 68 20 74 65 6d 70 6c 61 74 65 73 2e  d 4th templates.
5fb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  .  */.  if( pSel
5fc0: 65 63 74 20 29 7b 0a 20 20 20 20 2f 2a 20 44 61  ect ){.    /* Da
5fd0: 74 61 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f  ta is coming fro
5fe0: 6d 20 61 20 53 45 4c 45 43 54 20 6f 72 20 66 72  m a SELECT or fr
5ff0: 6f 6d 20 61 20 6d 75 6c 74 69 2d 72 6f 77 20 56  om a multi-row V
6000: 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
6010: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20    ** Generate a 
6020: 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  co-routine to ru
6030: 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 20 2a 2f  n the SELECT. */
6040: 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c  .    int regYiel
6050: 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  d;       /* Regi
6060: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d  ster holding co-
6070: 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f  routine entry-po
6080: 69 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  int */.    int a
6090: 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f  ddrTop;        /
60a0: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d  * Top of the co-
60b0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69  routine */.    i
60c0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
60d0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
60e0: 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67 59 69 65  e */..    regYie
60f0: 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ld = ++pParse->n
6100: 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72 54 6f 70  Mem;.    addrTop
6110: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
6120: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31  rrentAddr(v) + 1
6130: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6140: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6150: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
6160: 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f  Yield, 0, addrTo
6170: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  p);.    sqlite3S
6180: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
6190: 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
61a0: 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20  ne, regYield);. 
61b0: 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
61c0: 62 49 64 4c 69 73 74 49 6e 4f 72 64 65 72 20 3f  bIdListInOrder ?
61d0: 20 72 65 67 44 61 74 61 20 3a 20 30 3b 0a 20 20   regData : 0;.  
61e0: 20 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 70    dest.nSdst = p
61f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 72  Tab->nCol;.    r
6200: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
6210: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
6220: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 72  t, &dest);.    r
6230: 65 67 46 72 6f 6d 53 65 6c 65 63 74 20 3d 20 64  egFromSelect = d
6240: 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 69  est.iSdst;.    i
6250: 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
6260: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
6270: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
6280: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
6290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
62a0: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
62b0: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 73  regYield);.    s
62c0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
62d0: 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20  re(v, addrTop - 
62e0: 31 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1);             
62f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 61 62            /* lab
6300: 65 6c 20 42 3a 20 2a 2f 0a 20 20 20 20 61 73 73  el B: */.    ass
6310: 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 70 45  ert( pSelect->pE
6320: 4c 69 73 74 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  List );.    nCol
6330: 75 6d 6e 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  umn = pSelect->p
6340: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
6350: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 54 65 6d     /* Set useTem
6360: 70 54 61 62 6c 65 20 74 6f 20 54 52 55 45 20 69  pTable to TRUE i
6370: 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
6380: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6390: 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ment.    ** shou
63a0: 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
63b0: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  to a temporary t
63c0: 61 62 6c 65 20 28 74 65 6d 70 6c 61 74 65 20 34  able (template 4
63d0: 29 2e 20 20 53 65 74 20 74 6f 0a 20 20 20 20 2a  ).  Set to.    *
63e0: 2a 20 46 41 4c 53 45 20 69 66 20 65 61 63 68 20  * FALSE if each 
63f0: 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
6400: 65 20 53 45 4c 45 43 54 20 63 61 6e 20 62 65 20  e SELECT can be 
6410: 77 72 69 74 74 65 6e 20 64 69 72 65 63 74 6c 79  written directly
6420: 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65   into.    ** the
6430: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
6440: 6c 65 20 28 74 65 6d 70 6c 61 74 65 20 33 29 2e  le (template 3).
6450: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
6460: 20 74 65 6d 70 20 74 61 62 6c 65 20 6d 75 73 74   temp table must
6470: 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
6480: 74 61 62 6c 65 20 62 65 69 6e 67 20 75 70 64 61  table being upda
6490: 74 65 64 20 69 73 20 61 6c 73 6f 20 6f 6e 65 0a  ted is also one.
64a0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61      ** of the ta
64b0: 62 6c 65 73 20 62 65 69 6e 67 20 72 65 61 64 20  bles being read 
64c0: 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  by the SELECT st
64d0: 61 74 65 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 75  atement.  Also u
64e0: 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 74 65 6d  se a .    ** tem
64f0: 70 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 63  p table in the c
6500: 61 73 65 20 6f 66 20 72 6f 77 20 74 72 69 67 67  ase of row trigg
6510: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
6520: 69 66 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20  if( pTrigger || 
6530: 72 65 61 64 73 54 61 62 6c 65 28 70 50 61 72 73  readsTable(pPars
6540: 65 2c 20 69 44 62 2c 20 70 54 61 62 29 20 29 7b  e, iDb, pTab) ){
6550: 0a 20 20 20 20 20 20 75 73 65 54 65 6d 70 54 61  .      useTempTa
6560: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ble = 1;.    }..
6570: 20 20 20 20 69 66 28 20 75 73 65 54 65 6d 70 54      if( useTempT
6580: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
6590: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 6f   Invoke the coro
65a0: 75 74 69 6e 65 20 74 6f 20 65 78 74 72 61 63 74  utine to extract
65b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
65c0: 6d 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  m the SELECT.   
65d0: 20 20 20 2a 2a 20 61 6e 64 20 61 64 64 20 69 74     ** and add it
65e0: 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
65f0: 74 61 62 6c 65 20 73 72 63 54 61 62 2e 20 20 54  table srcTab.  T
6600: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
6610: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65 20  d.      ** here 
6620: 69 73 20 66 72 6f 6d 20 74 68 65 20 34 74 68 20  is from the 4th 
6630: 74 65 6d 70 6c 61 74 65 3a 0a 20 20 20 20 20 20  template:.      
6640: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
6650: 20 42 3a 20 6f 70 65 6e 20 74 65 6d 70 20 74 61   B: open temp ta
6660: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ble.      **    
6670: 20 20 4c 3a 20 79 69 65 6c 64 20 58 2c 20 67 6f    L: yield X, go
6680: 74 6f 20 4d 20 61 74 20 45 4f 46 0a 20 20 20 20  to M at EOF.    
6690: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73    **         ins
66a0: 65 72 74 20 72 6f 77 20 66 72 6f 6d 20 52 2e 2e  ert row from R..
66b0: 52 2b 6e 20 69 6e 74 6f 20 74 65 6d 70 20 74 61  R+n into temp ta
66c0: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ble.      **    
66d0: 20 20 20 20 20 67 6f 74 6f 20 4c 0a 20 20 20 20       goto L.    
66e0: 20 20 2a 2a 20 20 20 20 20 20 4d 3a 20 2e 2e 2e    **      M: ...
66f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6700: 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20 20  int regRec;     
6710: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
6720: 20 74 6f 20 68 6f 6c 64 20 70 61 63 6b 65 64 20   to hold packed 
6730: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20  record */.      
6740: 69 6e 74 20 72 65 67 54 65 6d 70 52 6f 77 69 64  int regTempRowid
6750: 3b 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  ;    /* Register
6760: 20 74 6f 20 68 6f 6c 64 20 74 65 6d 70 20 74 61   to hold temp ta
6770: 62 6c 65 20 52 4f 57 49 44 20 2a 2f 0a 20 20 20  ble ROWID */.   
6780: 20 20 20 69 6e 74 20 61 64 64 72 4c 3b 20 20 20     int addrL;   
6790: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
67a0: 20 22 4c 22 20 2a 2f 0a 0a 20 20 20 20 20 20 73   "L" */..      s
67b0: 72 63 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  rcTab = pParse->
67c0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nTab++;.      re
67d0: 67 52 65 63 20 3d 20 73 71 6c 69 74 65 33 47 65  gRec = sqlite3Ge
67e0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
67f0: 3b 0a 20 20 20 20 20 20 72 65 67 54 65 6d 70 52  ;.      regTempR
6800: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
6810: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6830: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6840: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73  OpenEphemeral, s
6850: 72 63 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  rcTab, nColumn);
6860: 0a 20 20 20 20 20 20 61 64 64 72 4c 20 3d 20 73  .      addrL = s
6870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6880: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65  (v, OP_Yield, de
6890: 73 74 2e 69 53 44 50 61 72 6d 29 3b 20 56 64 62  st.iSDParm); Vdb
68a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
68b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
68d0: 52 65 63 6f 72 64 2c 20 72 65 67 46 72 6f 6d 53  Record, regFromS
68e0: 65 6c 65 63 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  elect, nColumn, 
68f0: 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
6900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6910: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
6920: 20 73 72 63 54 61 62 2c 20 72 65 67 54 65 6d 70   srcTab, regTemp
6930: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6950: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 73 72  v, OP_Insert, sr
6960: 63 54 61 62 2c 20 72 65 67 52 65 63 2c 20 72 65  cTab, regRec, re
6970: 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20  gTempRowid);.   
6980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
6990: 74 6f 28 76 2c 20 61 64 64 72 4c 29 3b 0a 20 20  to(v, addrL);.  
69a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
69b0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4c  umpHere(v, addrL
69c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
69d0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
69e0: 50 61 72 73 65 2c 20 72 65 67 52 65 63 29 3b 0a  Parse, regRec);.
69f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6a00: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6a10: 73 65 2c 20 72 65 67 54 65 6d 70 52 6f 77 69 64  se, regTempRowid
6a20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
6a30: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6a40: 20 74 68 65 20 63 61 73 65 20 69 66 20 74 68 65   the case if the
6a50: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 49 4e   data for the IN
6a60: 53 45 52 54 20 69 73 20 63 6f 6d 69 6e 67 20 66  SERT is coming f
6a70: 72 6f 6d 20 61 20 0a 20 20 20 20 2a 2a 20 73 69  rom a .    ** si
6a80: 6e 67 6c 65 2d 72 6f 77 20 56 41 4c 55 45 53 20  ngle-row VALUES 
6a90: 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20  clause.    */.  
6aa0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
6ab0: 43 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  C;.    memset(&s
6ac0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
6ad0: 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
6ae0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
6af0: 20 20 73 72 63 54 61 62 20 3d 20 2d 31 3b 0a 20    srcTab = -1;. 
6b00: 20 20 20 61 73 73 65 72 74 28 20 75 73 65 54 65     assert( useTe
6b10: 6d 70 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  mpTable==0 );.  
6b20: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
6b30: 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
6b40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
6b50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
6b60: 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d  solveExprListNam
6b70: 65 73 28 26 73 4e 43 2c 20 70 4c 69 73 74 29 20  es(&sNC, pList) 
6b80: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
6b90: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
6ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6bb0: 65 7b 0a 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e  e{.      nColumn
6bc0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
6bd0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
6be0: 73 20 6e 6f 20 49 44 4c 49 53 54 20 74 65 72 6d  s no IDLIST term
6bf0: 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20 68   but the table h
6c00: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 70 72  as an integer pr
6c10: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 2c 20  imary.  ** key, 
6c20: 74 68 65 20 73 65 74 20 74 68 65 20 69 70 6b 43  the set the ipkC
6c30: 6f 6c 75 6d 6e 20 76 61 72 69 61 62 6c 65 20 74  olumn variable t
6c40: 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 70 72  o the integer pr
6c50: 69 6d 61 72 79 20 6b 65 79 20 0a 20 20 2a 2a 20  imary key .  ** 
6c60: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20  column index in 
6c70: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62  the original tab
6c80: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20  le definition.. 
6c90: 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d   */.  if( pColum
6ca0: 6e 3d 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 3e  n==0 && nColumn>
6cb0: 30 20 29 7b 0a 20 20 20 20 69 70 6b 43 6f 6c 75  0 ){.    ipkColu
6cc0: 6d 6e 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  mn = pTab->iPKey
6cd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
6ce0: 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
6cf0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
6d00: 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 20 6d  he source data m
6d10: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
6d20: 72 0a 20 20 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  r.  ** of column
6d30: 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  s to be inserted
6d40: 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 2e   into the table.
6d50: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
6d60: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
6d70: 2b 2b 29 7b 0a 20 20 20 20 6e 48 69 64 64 65 6e  ++){.    nHidden
6d80: 20 2b 3d 20 28 49 73 48 69 64 64 65 6e 43 6f 6c   += (IsHiddenCol
6d90: 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
6da0: 69 5d 29 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  i]) ? 1 : 0);.  
6db0: 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d  }.  if( pColumn=
6dc0: 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 20 26 26  =0 && nColumn &&
6dd0: 20 6e 43 6f 6c 75 6d 6e 21 3d 28 70 54 61 62 2d   nColumn!=(pTab-
6de0: 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e 29 20 29  >nCol-nHidden) )
6df0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6e00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
6e10: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 53 20        "table %S 
6e20: 68 61 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62  has %d columns b
6e30: 75 74 20 25 64 20 76 61 6c 75 65 73 20 77 65 72  ut %d values wer
6e40: 65 20 73 75 70 70 6c 69 65 64 22 2c 0a 20 20 20  e supplied",.   
6e50: 20 20 20 20 70 54 61 62 4c 69 73 74 2c 20 30 2c      pTabList, 0,
6e60: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e 48 69 64   pTab->nCol-nHid
6e70: 64 65 6e 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  den, nColumn);. 
6e80: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
6e90: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66  leanup;.  }.  if
6ea0: 28 20 70 43 6f 6c 75 6d 6e 21 3d 30 20 26 26 20  ( pColumn!=0 && 
6eb0: 6e 43 6f 6c 75 6d 6e 21 3d 70 43 6f 6c 75 6d 6e  nColumn!=pColumn
6ec0: 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 73 71 6c  ->nId ){.    sql
6ed0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6ee0: 72 73 65 2c 20 22 25 64 20 76 61 6c 75 65 73 20  rse, "%d values 
6ef0: 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c  for %d columns",
6f00: 20 6e 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 75 6d   nColumn, pColum
6f10: 6e 2d 3e 6e 49 64 29 3b 0a 20 20 20 20 67 6f 74  n->nId);.    got
6f20: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
6f30: 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20  ;.  }.    .  /* 
6f40: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
6f50: 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 74 6f 20  ount of rows to 
6f60: 62 65 20 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f  be inserted.  */
6f70: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
6f80: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74  s & SQLITE_Count
6f90: 52 6f 77 73 29 21 3d 30 0a 20 20 20 26 26 20 21  Rows)!=0.   && !
6fa0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 0a 20  pParse->nested. 
6fb0: 20 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70 54    && !pParse->pT
6fc0: 72 69 67 67 65 72 54 61 62 0a 20 20 29 7b 0a 20  riggerTab.  ){. 
6fd0: 20 20 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d     regRowCount =
6fe0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7000: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7010: 65 67 65 72 2c 20 30 2c 20 72 65 67 52 6f 77 43  eger, 0, regRowC
7020: 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ount);.  }..  /*
7030: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
7040: 61 20 76 69 65 77 2c 20 6f 70 65 6e 20 74 68 65  a view, open the
7050: 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 64 20 61   table and and a
7060: 6c 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ll indices */.  
7070: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
7080: 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20 20     int nIdx;.   
7090: 20 6e 49 64 78 20 3d 20 73 71 6c 69 74 65 33 4f   nIdx = sqlite3O
70a0: 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63  penTableAndIndic
70b0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  es(pParse, pTab,
70c0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
70d0: 2c 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , -1, 0,.       
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7100: 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43  iDataCur, &iIdxC
7110: 75 72 29 3b 0a 20 20 20 20 61 52 65 67 49 64 78  ur);.    aRegIdx
7120: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7130: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
7140: 6f 66 28 69 6e 74 29 2a 28 6e 49 64 78 2b 31 29  of(int)*(nIdx+1)
7150: 29 3b 0a 20 20 20 20 69 66 28 20 61 52 65 67 49  );.    if( aRegI
7160: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  dx==0 ){.      g
7170: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
7180: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  up;.    }.    fo
7190: 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  r(i=0, pIdx=pTab
71a0: 2d 3e 70 49 6e 64 65 78 3b 20 69 3c 6e 49 64 78  ->pIndex; i<nIdx
71b0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
71c0: 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  xt, i++){.      
71d0: 61 73 73 65 72 74 28 20 70 49 64 78 20 29 3b 0a  assert( pIdx );.
71e0: 20 20 20 20 20 20 61 52 65 67 49 64 78 5b 69 5d        aRegIdx[i]
71f0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7200: 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
7210: 3e 6e 4d 65 6d 20 2b 3d 20 70 49 64 78 2d 3e 6e  >nMem += pIdx->n
7220: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20  Column;.    }.  
7230: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7240: 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a 20 20 69  _OMIT_UPSERT.  i
7250: 66 28 20 70 55 70 73 65 72 74 20 29 7b 0a 20 20  f( pUpsert ){.  
7260: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
7270: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73  pTab) ){.      s
7280: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7290: 50 61 72 73 65 2c 20 22 55 50 53 45 52 54 20 6e  Parse, "UPSERT n
72a0: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 66  ot implemented f
72b0: 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
72c0: 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
72d0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
72e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
72f0: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
7300: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c  .    }.    pTabL
7310: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
7320: 72 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20 20  r = iDataCur;.  
7330: 20 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65    pUpsert->pUpse
7340: 72 74 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74  rtSrc = pTabList
7350: 3b 0a 20 20 20 20 70 55 70 73 65 72 74 2d 3e 72  ;.    pUpsert->r
7360: 65 67 44 61 74 61 20 3d 20 72 65 67 44 61 74 61  egData = regData
7370: 3b 0a 20 20 20 20 70 55 70 73 65 72 74 2d 3e 69  ;.    pUpsert->i
7380: 44 61 74 61 43 75 72 20 3d 20 69 44 61 74 61 43  DataCur = iDataC
7390: 75 72 3b 0a 20 20 20 20 70 55 70 73 65 72 74 2d  ur;.    pUpsert-
73a0: 3e 69 49 64 78 43 75 72 20 3d 20 69 49 64 78 43  >iIdxCur = iIdxC
73b0: 75 72 3b 0a 20 20 20 20 69 66 28 20 70 55 70 73  ur;.    if( pUps
73c0: 65 72 74 2d 3e 70 55 70 73 65 72 74 54 61 72 67  ert->pUpsertTarg
73d0: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
73e0: 74 65 33 55 70 73 65 72 74 41 6e 61 6c 79 7a 65  te3UpsertAnalyze
73f0: 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
7400: 54 61 62 4c 69 73 74 2c 20 70 55 70 73 65 72 74  TabList, pUpsert
7410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
7420: 64 69 66 0a 0a 0a 20 20 2f 2a 20 54 68 69 73 20  dif...  /* This 
7430: 69 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  is the top of th
7440: 65 20 6d 61 69 6e 20 69 6e 73 65 72 74 69 6f 6e  e main insertion
7450: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 66 28 20 75   loop */.  if( u
7460: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
7470: 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
7480: 20 63 6f 64 65 73 20 74 68 65 20 74 6f 70 20 6f   codes the top o
7490: 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20 54 68  f loop only.  Th
74a0: 65 20 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f 70 20  e complete loop 
74b0: 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f  is the.    ** fo
74c0: 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64 6f 63 6f  llowing pseudoco
74d0: 64 65 20 28 74 65 6d 70 6c 61 74 65 20 34 29 3a  de (template 4):
74e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
74f0: 20 20 20 20 20 20 20 72 65 77 69 6e 64 20 74 65         rewind te
7500: 6d 70 20 74 61 62 6c 65 2c 20 69 66 20 65 6d 70  mp table, if emp
7510: 74 79 20 67 6f 74 6f 20 44 0a 20 20 20 20 2a 2a  ty goto D.    **
7520: 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20 6f 76        C: loop ov
7530: 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74 65 72  er rows of inter
7540: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a 20 20  mediate table.  
7550: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74    **           t
7560: 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73 20 66  ransfer values f
7570: 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61 74 65  orm intermediate
7580: 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74 61 62   table into <tab
7590: 6c 65 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  le>.    **      
75a0: 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 20 20 20 20     end loop.    
75b0: 2a 2a 20 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20  **      D: .... 
75c0: 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 49 6e     */.    addrIn
75d0: 73 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  sTop = sqlite3Vd
75e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
75f0: 65 77 69 6e 64 2c 20 73 72 63 54 61 62 29 3b 20  ewind, srcTab); 
7600: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7610: 0a 20 20 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  .    addrCont = 
7620: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7630: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c  ntAddr(v);.  }el
7640: 73 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29  se if( pSelect )
7650: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  {.    /* This bl
7660: 6f 63 6b 20 63 6f 64 65 73 20 74 68 65 20 74 6f  ock codes the to
7670: 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20  p of loop only. 
7680: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 6c 6f   The complete lo
7690: 6f 70 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  op is the.    **
76a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64   following pseud
76b0: 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61 74 65 20  ocode (template 
76c0: 33 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  3):.    **.    *
76d0: 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c 64 20  *      C: yield 
76e0: 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f 20 44  X, at EOF goto D
76f0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
7700: 69 6e 73 65 72 74 20 74 68 65 20 73 65 6c 65 63  insert the selec
7710: 74 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 3c 74  t result into <t
7720: 61 62 6c 65 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b  able> from R..R+
7730: 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
7740: 20 67 6f 74 6f 20 43 0a 20 20 20 20 2a 2a 20 20   goto C.    **  
7750: 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a      D: ....    *
7760: 2f 0a 20 20 20 20 61 64 64 72 49 6e 73 54 6f 70  /.    addrInsTop
7770: 20 3d 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71   = addrCont = sq
7780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7790: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
77a0: 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
77b0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
77c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 75 6e 20 74  .  }..  /* Run t
77d0: 68 65 20 42 45 46 4f 52 45 20 61 6e 64 20 49 4e  he BEFORE and IN
77e0: 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72  STEAD OF trigger
77f0: 73 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  s, if there are 
7800: 61 6e 79 0a 20 20 2a 2f 0a 20 20 65 6e 64 4f 66  any.  */.  endOf
7810: 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
7820: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
7830: 73 65 29 3b 0a 20 20 69 66 28 20 74 6d 61 73 6b  se);.  if( tmask
7840: 20 26 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52   & TRIGGER_BEFOR
7850: 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  E ){.    int reg
7860: 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 47 65  Cols = sqlite3Ge
7870: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
7880: 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  e, pTab->nCol+1)
7890: 3b 0a 0a 20 20 20 20 2f 2a 20 62 75 69 6c 64 20  ;..    /* build 
78a0: 74 68 65 20 4e 45 57 2e 2a 20 72 65 66 65 72 65  the NEW.* refere
78b0: 6e 63 65 20 72 6f 77 2e 20 20 4e 6f 74 65 20 74  nce row.  Note t
78c0: 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
78d0: 61 6e 20 49 4e 54 45 47 45 52 0a 20 20 20 20 2a  an INTEGER.    *
78e0: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
78f0: 74 6f 20 77 68 69 63 68 20 61 20 4e 55 4c 4c 20  to which a NULL 
7900: 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
7910: 64 2c 20 74 68 61 74 20 4e 55 4c 4c 20 77 69 6c  d, that NULL wil
7920: 6c 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e  l be.    ** tran
7930: 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 75 6e  slated into a un
7940: 69 71 75 65 20 49 44 20 66 6f 72 20 74 68 65 20  ique ID for the 
7950: 72 6f 77 2e 20 20 42 75 74 20 6f 6e 20 61 20 42  row.  But on a B
7960: 45 46 4f 52 45 20 74 72 69 67 67 65 72 2c 0a 20  EFORE trigger,. 
7970: 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
7980: 6b 6e 6f 77 20 77 68 61 74 20 74 68 65 20 75 6e  know what the un
7990: 69 71 75 65 20 49 44 20 77 69 6c 6c 20 62 65 20  ique ID will be 
79a0: 28 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 73  (because the ins
79b0: 65 72 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e  ert has.    ** n
79c0: 6f 74 20 68 61 70 70 65 6e 65 64 20 79 65 74 29  ot happened yet)
79d0: 20 73 6f 20 77 65 20 73 75 62 73 74 69 74 75 74   so we substitut
79e0: 65 20 61 20 72 6f 77 69 64 20 6f 66 20 2d 31 0a  e a rowid of -1.
79f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
7a00: 70 6b 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  pkColumn<0 ){.  
7a10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7a20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7a30: 67 65 72 2c 20 2d 31 2c 20 72 65 67 43 6f 6c 73  ger, -1, regCols
7a40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7a50: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
7a60: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 77 69       assert( !wi
7a70: 74 68 6f 75 74 52 6f 77 69 64 20 29 3b 0a 20 20  thoutRowid );.  
7a80: 20 20 20 20 69 66 28 20 75 73 65 54 65 6d 70 54      if( useTempT
7a90: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
7aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ab0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7ac0: 73 72 63 54 61 62 2c 20 69 70 6b 43 6f 6c 75 6d  srcTab, ipkColum
7ad0: 6e 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20  n, regCols);.   
7ae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7af0: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
7b00: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 74 68 65  t==0 );  /* Othe
7b10: 72 77 69 73 65 20 75 73 65 54 65 6d 70 54 61 62  rwise useTempTab
7b20: 6c 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  le is true */.  
7b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7b40: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
7b50: 69 73 74 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e  ist->a[ipkColumn
7b60: 5d 2e 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73  ].pExpr, regCols
7b70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7b80: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
7b90: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
7ba0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c  _NotNull, regCol
7bb0: 73 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  s); VdbeCoverage
7bc0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
7bd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7be0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
7bf0: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  regCols);.      
7c00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7c10: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
7c20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7c30: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
7c40: 74 42 65 49 6e 74 2c 20 72 65 67 43 6f 6c 73 29  tBeInt, regCols)
7c50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
7c60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7c70: 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 74 72 69   Cannot have tri
7c80: 67 67 65 72 73 20 6f 6e 20 61 20 76 69 72 74 75  ggers on a virtu
7c90: 61 6c 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20  al table. If it 
7ca0: 77 65 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20  were possible,. 
7cb0: 20 20 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b     ** this block
7cc0: 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 61   would have to a
7cd0: 63 63 6f 75 6e 74 20 66 6f 72 20 68 69 64 64 65  ccount for hidde
7ce0: 6e 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  n column..    */
7cf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 49 73  .    assert( !Is
7d00: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b  Virtual(pTab) );
7d10: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
7d20: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 64  the new column d
7d30: 61 74 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ata.    */.    f
7d40: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 70 54 61 62  or(i=j=0; i<pTab
7d50: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
7d60: 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20      if( pColumn 
7d70: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
7d80: 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e  =0; j<pColumn->n
7d90: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
7da0: 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d      if( pColumn-
7db0: 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62  >a[j].idx==i ) b
7dc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7de0: 28 20 28 21 75 73 65 54 65 6d 70 54 61 62 6c 65  ( (!useTempTable
7df0: 20 26 26 20 21 70 4c 69 73 74 29 20 7c 7c 20 28   && !pList) || (
7e00: 70 43 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43  pColumn && j>=pC
7e10: 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 0a 20 20 20 20  olumn->nId).    
7e20: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 6f 6c          || (pCol
7e30: 75 6d 6e 3d 3d 30 20 26 26 20 49 73 4f 72 64 69  umn==0 && IsOrdi
7e40: 6e 61 72 79 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  naryHiddenColumn
7e50: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29  (&pTab->aCol[i])
7e60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
7e70: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
7e80: 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  rse, pTab->aCol[
7e90: 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 43 6f 6c  i].pDflt, regCol
7ea0: 73 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  s+i+1);.      }e
7eb0: 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d 70 54  lse if( useTempT
7ec0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
7ed0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ee0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7ef0: 73 72 63 54 61 62 2c 20 6a 2c 20 72 65 67 43 6f  srcTab, j, regCo
7f00: 6c 73 2b 69 2b 31 29 3b 20 0a 20 20 20 20 20 20  ls+i+1); .      
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7f20: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 3d 3d  ssert( pSelect==
7f30: 30 20 29 3b 20 2f 2a 20 4f 74 68 65 72 77 69 73  0 ); /* Otherwis
7f40: 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 69  e useTempTable i
7f50: 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20  s true */.      
7f60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
7f70: 65 41 6e 64 43 61 63 68 65 28 70 50 61 72 73 65  eAndCache(pParse
7f80: 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  , pList->a[j].pE
7f90: 78 70 72 2c 20 72 65 67 43 6f 6c 73 2b 69 2b 31  xpr, regCols+i+1
7fa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7fb0: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20   if( pColumn==0 
7fc0: 26 26 20 21 49 73 4f 72 64 69 6e 61 72 79 48 69  && !IsOrdinaryHi
7fd0: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
7fe0: 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 20 6a 2b 2b  ->aCol[i]) ) j++
7ff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8000: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e  If this is an IN
8010: 53 45 52 54 20 6f 6e 20 61 20 76 69 65 77 20 77  SERT on a view w
8020: 69 74 68 20 61 6e 20 49 4e 53 54 45 41 44 20 4f  ith an INSTEAD O
8030: 46 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72  F INSERT trigger
8040: 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
8050: 61 74 74 65 6d 70 74 20 61 6e 79 20 63 6f 6e 76  attempt any conv
8060: 65 72 73 69 6f 6e 73 20 62 65 66 6f 72 65 20 61  ersions before a
8070: 73 73 65 6d 62 6c 69 6e 67 20 74 68 65 20 72 65  ssembling the re
8080: 63 6f 72 64 2e 0a 20 20 20 20 2a 2a 20 49 66 20  cord..    ** If 
8090: 74 68 69 73 20 69 73 20 61 20 72 65 61 6c 20 74  this is a real t
80a0: 61 62 6c 65 2c 20 61 74 74 65 6d 70 74 20 63 6f  able, attempt co
80b0: 6e 76 65 72 73 69 6f 6e 73 20 61 73 20 72 65 71  nversions as req
80c0: 75 69 72 65 64 20 62 79 20 74 68 65 0a 20 20 20  uired by the.   
80d0: 20 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   ** table column
80e0: 20 61 66 66 69 6e 69 74 69 65 73 2e 0a 20 20 20   affinities..   
80f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56   */.    if( !isV
8100: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
8110: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
8120: 79 28 76 2c 20 70 54 61 62 2c 20 72 65 67 43 6f  y(v, pTab, regCo
8130: 6c 73 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ls+1);.    }..  
8140: 20 20 2f 2a 20 46 69 72 65 20 42 45 46 4f 52 45    /* Fire BEFORE
8150: 20 6f 72 20 49 4e 53 54 45 41 44 20 4f 46 20 74   or INSTEAD OF t
8160: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 73  riggers */.    s
8170: 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69  qlite3CodeRowTri
8180: 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72  gger(pParse, pTr
8190: 69 67 67 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54  igger, TK_INSERT
81a0: 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46  , 0, TRIGGER_BEF
81b0: 4f 52 45 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ORE, .        pT
81c0: 61 62 2c 20 72 65 67 43 6f 6c 73 2d 70 54 61 62  ab, regCols-pTab
81d0: 2d 3e 6e 43 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f  ->nCol-1, onErro
81e0: 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a  r, endOfLoop);..
81f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8200: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
8210: 73 65 2c 20 72 65 67 43 6f 6c 73 2c 20 70 54 61  se, regCols, pTa
8220: 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a  b->nCol+1);.  }.
8230: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
8240: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
8250: 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73   next row to ins
8260: 65 72 74 20 69 6e 74 6f 20 61 20 72 61 6e 67 65  ert into a range
8270: 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65   of.  ** registe
8280: 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  rs beginning at 
8290: 72 65 67 49 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  regIns..  */.  i
82a0: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
82b0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
82c0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
82d0: 2a 20 54 68 65 20 72 6f 77 20 74 68 61 74 20 74  * The row that t
82e0: 68 65 20 56 55 70 64 61 74 65 20 6f 70 63 6f 64  he VUpdate opcod
82f0: 65 20 77 69 6c 6c 20 64 65 6c 65 74 65 3a 20 6e  e will delete: n
8300: 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  one */.      sql
8310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8320: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
8330: 67 49 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gIns);.    }.   
8340: 20 69 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d   if( ipkColumn>=
8350: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 75  0 ){.      if( u
8360: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
8370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8380: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
8390: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
83a0: 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77  pkColumn, regRow
83b0: 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
83c0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
83d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
83e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
83f0: 43 6f 70 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c  Copy, regFromSel
8400: 65 63 74 2b 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72  ect+ipkColumn, r
8410: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
8420: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
8430: 78 70 72 20 2a 70 49 70 6b 20 3d 20 70 4c 69 73  xpr *pIpk = pLis
8440: 74 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e  t->a[ipkColumn].
8450: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
8460: 66 28 20 70 49 70 6b 2d 3e 6f 70 3d 3d 54 4b 5f  f( pIpk->op==TK_
8470: 4e 55 4c 4c 20 26 26 20 21 49 73 56 69 72 74 75  NULL && !IsVirtu
8480: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
8490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
84b0: 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43 75 72  wRowid, iDataCur
84c0: 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 41  , regRowid, regA
84d0: 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20 20  utoinc);.       
84e0: 20 20 20 61 70 70 65 6e 64 46 6c 61 67 20 3d 20     appendFlag = 
84f0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
8500: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8510: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8520: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 70 6b  se, pList->a[ipk
8530: 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72  Column].pExpr, r
8540: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
8550: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8560: 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 49 4d    /* If the PRIM
8570: 41 52 59 20 4b 45 59 20 65 78 70 72 65 73 73 69  ARY KEY expressi
8580: 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  on is NULL, then
8590: 20 75 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64   use OP_NewRowid
85a0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 65 6e  .      ** to gen
85b0: 65 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 70  erate a unique p
85c0: 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65  rimary key value
85d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
85e0: 20 69 66 28 20 21 61 70 70 65 6e 64 46 6c 61 67   if( !appendFlag
85f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8600: 61 64 64 72 31 3b 0a 20 20 20 20 20 20 20 20 69  addr1;.        i
8610: 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
8620: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
8630: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
8640: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
8650: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  _NotNull, regRow
8660: 69 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  id); VdbeCoverag
8670: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
8680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8690: 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  3(v, OP_NewRowid
86a0: 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65 67 52  , iDataCur, regR
86b0: 6f 77 69 64 2c 20 72 65 67 41 75 74 6f 69 6e 63  owid, regAutoinc
86c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
86d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
86e0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
86f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8700: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
8710: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
8720: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
8730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8740: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
8750: 2c 20 72 65 67 52 6f 77 69 64 2c 20 61 64 64 72  , regRowid, addr
8760: 31 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+2); VdbeCovera
8770: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d  ge(v);.        }
8780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8790: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
87a0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52  _MustBeInt, regR
87b0: 6f 77 69 64 29 3b 20 56 64 62 65 43 6f 76 65 72  owid); VdbeCover
87c0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
87d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
87e0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
87f0: 20 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b   withoutRowid ){
8800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8810: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8820: 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 69 64  ull, 0, regRowid
8830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8850: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp3(v, OP_NewR
8860: 6f 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20  owid, iDataCur, 
8870: 72 65 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74  regRowid, regAut
8880: 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20 61 70 70  oinc);.      app
8890: 65 6e 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20  endFlag = 1;.   
88a0: 20 7d 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74   }.    autoIncSt
88b0: 65 70 28 70 50 61 72 73 65 2c 20 72 65 67 41 75  ep(pParse, regAu
88c0: 74 6f 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29  toinc, regRowid)
88d0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
88e0: 65 20 64 61 74 61 20 66 6f 72 20 61 6c 6c 20 63  e data for all c
88f0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65  olumns of the ne
8900: 77 20 65 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69  w entry, beginni
8910: 6e 67 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ng.    ** with t
8920: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e  he first column.
8930: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64  .    */.    nHid
8940: 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  den = 0;.    for
8950: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
8960: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
8970: 69 6e 74 20 69 52 65 67 53 74 6f 72 65 20 3d 20  int iRegStore = 
8980: 72 65 67 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20  regRowid+1+i;.  
8990: 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d      if( i==pTab-
89a0: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
89b0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
89c0: 66 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  f the INTEGER PR
89d0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
89e0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 4e 55 4c   is always a NUL
89f0: 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  L..        ** Wh
8a00: 65 6e 65 76 65 72 20 74 68 69 73 20 63 6f 6c 75  enever this colu
8a10: 6d 6e 20 69 73 20 72 65 61 64 2c 20 74 68 65 20  mn is read, the 
8a20: 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 20 73 75  rowid will be su
8a30: 62 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20  bstituted.      
8a40: 20 20 2a 2a 20 69 6e 20 69 74 73 20 70 6c 61 63    ** in its plac
8a50: 65 2e 20 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20  e.  Hence, fill 
8a60: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68  this column with
8a70: 20 61 20 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64   a NULL to avoid
8a80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69  .        ** taki
8a90: 6e 67 20 75 70 20 64 61 74 61 20 73 70 61 63 65  ng up data space
8aa0: 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f   with informatio
8ab0: 6e 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  n that will neve
8ac0: 72 20 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20  r be used..     
8ad0: 20 20 20 2a 2a 20 41 73 20 74 68 65 72 65 20 6d     ** As there m
8ae0: 61 79 20 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f  ay be shallow co
8af0: 70 69 65 73 20 6f 66 20 74 68 69 73 20 76 61 6c  pies of this val
8b00: 75 65 2c 20 6d 61 6b 65 20 69 74 20 61 20 73 6f  ue, make it a so
8b10: 66 74 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  ft-NULL */.     
8b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8b30: 64 4f 70 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e  dOp1(v, OP_SoftN
8b40: 75 6c 6c 2c 20 69 52 65 67 53 74 6f 72 65 29 3b  ull, iRegStore);
8b50: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
8b60: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8b70: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20   if( pColumn==0 
8b80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  ){.        if( I
8b90: 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
8ba0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b  Tab->aCol[i]) ){
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  .          j = -
8bc0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69  1;.          nHi
8bd0: 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  dden++;.        
8be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8bf0: 20 6a 20 3d 20 69 20 2d 20 6e 48 69 64 64 65 6e   j = i - nHidden
8c00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8c20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c   for(j=0; j<pCol
8c30: 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  umn->nId; j++){.
8c40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
8c50: 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d  olumn->a[j].idx=
8c60: 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
8c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8c80: 20 20 20 20 69 66 28 20 6a 3c 30 20 7c 7c 20 6e      if( j<0 || n
8c90: 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28 70 43  Column==0 || (pC
8ca0: 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c  olumn && j>=pCol
8cb0: 75 6d 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20 20 20  umn->nId) ){.   
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8cd0: 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70  CodeFactorable(p
8ce0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f  Parse, pTab->aCo
8cf0: 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 69 52 65 67  l[i].pDflt, iReg
8d00: 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 65  Store);.      }e
8d10: 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d 70 54  lse if( useTempT
8d20: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
8d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8d40: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8d50: 73 72 63 54 61 62 2c 20 6a 2c 20 69 52 65 67 53  srcTab, j, iRegS
8d60: 74 6f 72 65 29 3b 20 0a 20 20 20 20 20 20 7d 65  tore); .      }e
8d70: 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63 74 20  lse if( pSelect 
8d80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
8d90: 65 67 46 72 6f 6d 53 65 6c 65 63 74 21 3d 72 65  egFromSelect!=re
8da0: 67 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  gData ){.       
8db0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8dc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
8dd0: 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b  , regFromSelect+
8de0: 6a 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20  j, iRegStore);. 
8df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
8e10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
8e20: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a  arse, pList->a[j
8e30: 5d 2e 70 45 78 70 72 2c 20 69 52 65 67 53 74 6f  ].pExpr, iRegSto
8e40: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
8e50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
8e60: 61 74 65 20 63 6f 64 65 20 74 6f 20 63 68 65 63  ate code to chec
8e70: 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  k constraints an
8e80: 64 20 67 65 6e 65 72 61 74 65 20 69 6e 64 65 78  d generate index
8e90: 20 6b 65 79 73 20 61 6e 64 0a 20 20 20 20 2a 2a   keys and.    **
8ea0: 20 64 6f 20 74 68 65 20 69 6e 73 65 72 74 69 6f   do the insertio
8eb0: 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  n..    */.#ifnde
8ec0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8ed0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
8ee0: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8ef0: 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  b) ){.      cons
8f00: 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
8f10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
8f20: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
8f30: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
8f40: 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57  sqlite3VtabMakeW
8f50: 72 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ritable(pParse, 
8f60: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  pTab);.      sql
8f70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8f80: 2c 20 4f 50 5f 56 55 70 64 61 74 65 2c 20 31 2c  , OP_VUpdate, 1,
8f90: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c 20 72   pTab->nCol+2, r
8fa0: 65 67 49 6e 73 2c 20 70 56 54 61 62 2c 20 50 34  egIns, pVTab, P4
8fb0: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 73 71  _VTAB);.      sq
8fc0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8fd0: 35 28 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  5(v, onError==OE
8fe0: 5f 44 65 66 61 75 6c 74 20 3f 20 4f 45 5f 41 62  _Default ? OE_Ab
8ff0: 6f 72 74 20 3a 20 6f 6e 45 72 72 6f 72 29 3b 0a  ort : onError);.
9000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
9010: 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
9020: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
9030: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
9040: 69 73 52 65 70 6c 61 63 65 3b 20 20 20 20 2f 2a  isReplace;    /*
9050: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
9060: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6d 61 79 20  constraints may 
9070: 63 61 75 73 65 20 61 20 72 65 70 6c 61 63 65 20  cause a replace 
9080: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 55 73  */.      int bUs
9090: 65 53 65 65 6b 3b 20 20 20 20 20 2f 2a 20 54 72  eSeek;     /* Tr
90a0: 75 65 20 74 6f 20 75 73 65 20 4f 50 46 4c 41 47  ue to use OPFLAG
90b0: 5f 53 45 45 4b 52 45 53 55 4c 54 20 2a 2f 0a 20  _SEEKRESULT */. 
90c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
90d0: 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
90e0: 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61  ecks(pParse, pTa
90f0: 62 2c 20 61 52 65 67 49 64 78 2c 20 69 44 61 74  b, aRegIdx, iDat
9100: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20  aCur, iIdxCur,. 
9110: 20 20 20 20 20 20 20 20 20 72 65 67 49 6e 73 2c           regIns,
9120: 20 30 2c 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30   0, ipkColumn>=0
9130: 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66  , onError, endOf
9140: 4c 6f 6f 70 2c 20 26 69 73 52 65 70 6c 61 63 65  Loop, &isReplace
9150: 2c 20 30 2c 20 70 55 70 73 65 72 74 0a 20 20 20  , 0, pUpsert.   
9160: 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
9170: 74 65 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73  te3FkCheck(pPars
9180: 65 2c 20 70 54 61 62 2c 20 30 2c 20 72 65 67 49  e, pTab, 0, regI
9190: 6e 73 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  ns, 0, 0);..    
91a0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 4f 50 46    /* Set the OPF
91b0: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
91c0: 54 20 66 6c 61 67 20 69 66 20 65 69 74 68 65 72  T flag if either
91d0: 20 28 61 29 20 74 68 65 72 65 20 61 72 65 20 6e   (a) there are n
91e0: 6f 20 52 45 50 4c 41 43 45 0a 20 20 20 20 20 20  o REPLACE.      
91f0: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  ** constraints o
9200: 72 20 28 62 29 20 74 68 65 72 65 20 61 72 65 20  r (b) there are 
9210: 6e 6f 20 74 72 69 67 67 65 72 73 20 61 6e 64 20  no triggers and 
9220: 74 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e 6f  this table is no
9230: 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  t a.      ** par
9240: 65 6e 74 20 74 61 62 6c 65 20 69 6e 20 61 20 66  ent table in a f
9250: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
9260: 72 61 69 6e 74 2e 20 49 74 20 69 73 20 73 61 66  raint. It is saf
9270: 65 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20 20  e to set the.   
9280: 20 20 20 2a 2a 20 66 6c 61 67 20 69 6e 20 74 68     ** flag in th
9290: 65 20 73 65 63 6f 6e 64 20 63 61 73 65 20 61 73  e second case as
92a0: 20 69 66 20 61 6e 79 20 52 45 50 4c 41 43 45 20   if any REPLACE 
92b0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 68 69  constraint is hi
92c0: 74 2c 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 4f  t, an.      ** O
92d0: 50 5f 44 65 6c 65 74 65 20 6f 72 20 4f 50 5f 49  P_Delete or OP_I
92e0: 64 78 44 65 6c 65 74 65 20 69 6e 73 74 72 75 63  dxDelete instruc
92f0: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 65 78 65  tion will be exe
9300: 63 75 74 65 64 20 6f 6e 20 65 61 63 68 20 0a 20  cuted on each . 
9310: 20 20 20 20 20 2a 2a 20 63 75 72 73 6f 72 20 74       ** cursor t
9320: 68 61 74 20 69 73 20 64 69 73 74 75 72 62 65 64  hat is disturbed
9330: 2e 20 41 6e 64 20 74 68 65 73 65 20 69 6e 73 74  . And these inst
9340: 72 75 63 74 69 6f 6e 73 20 62 6f 74 68 20 63 6c  ructions both cl
9350: 65 61 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ear the.      **
9360: 20 56 64 62 65 43 75 72 73 6f 72 2e 73 65 65 6b   VdbeCursor.seek
9370: 52 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65 2c  Result variable,
9380: 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 4f   disabling the O
9390: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
93a0: 55 4c 54 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  ULT.      ** fun
93b0: 63 74 69 6f 6e 61 6c 69 74 79 2e 20 20 2a 2f 0a  ctionality.  */.
93c0: 20 20 20 20 20 20 62 55 73 65 53 65 65 6b 20 3d        bUseSeek =
93d0: 20 28 69 73 52 65 70 6c 61 63 65 3d 3d 30 20 7c   (isReplace==0 |
93e0: 7c 20 28 70 54 72 69 67 67 65 72 3d 3d 30 20 26  | (pTrigger==0 &
93f0: 26 0a 20 20 20 20 20 20 20 20 20 20 28 28 64 62  &.          ((db
9400: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9410: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 3d 3d 30  _ForeignKeys)==0
9420: 20 7c 7c 20 73 71 6c 69 74 65 33 46 6b 52 65 66   || sqlite3FkRef
9430: 65 72 65 6e 63 65 73 28 70 54 61 62 29 3d 3d 30  erences(pTab)==0
9440: 29 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20  ).      ));.    
9450: 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74    sqlite3Complet
9460: 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73  eInsertion(pPars
9470: 65 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75  e, pTab, iDataCu
9480: 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20  r, iIdxCur,.    
9490: 20 20 20 20 20 20 72 65 67 49 6e 73 2c 20 61 52        regIns, aR
94a0: 65 67 49 64 78 2c 20 30 2c 20 61 70 70 65 6e 64  egIdx, 0, append
94b0: 46 6c 61 67 2c 20 62 55 73 65 53 65 65 6b 0a 20  Flag, bUseSeek. 
94c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
94d0: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
94e0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73  he count of rows
94f0: 20 74 68 61 74 20 61 72 65 20 69 6e 73 65 72 74   that are insert
9500: 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  ed.  */.  if( re
9510: 67 52 6f 77 43 6f 75 6e 74 20 29 7b 0a 20 20 20  gRowCount ){.   
9520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9530: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
9540: 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29   regRowCount, 1)
9550: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 72  ;.  }..  if( pTr
9560: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  igger ){.    /* 
9570: 43 6f 64 65 20 41 46 54 45 52 20 74 72 69 67 67  Code AFTER trigg
9580: 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ers */.    sqlit
9590: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
95a0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
95b0: 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c  r, TK_INSERT, 0,
95c0: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c 20   TRIGGER_AFTER, 
95d0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 72  .        pTab, r
95e0: 65 67 44 61 74 61 2d 32 2d 70 54 61 62 2d 3e 6e  egData-2-pTab->n
95f0: 43 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e  Col, onError, en
9600: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20  dOfLoop);.  }.. 
9610: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
9620: 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72  f the main inser
9630: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66 20 74 68  tion loop, if th
9640: 65 20 64 61 74 61 20 73 6f 75 72 63 65 0a 20 20  e data source.  
9650: 2a 2a 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  ** is a SELECT s
9660: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
9670: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9680: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f  lveLabel(v, endO
9690: 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75 73  fLoop);.  if( us
96a0: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
96b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
96c0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
96d0: 73 72 63 54 61 62 2c 20 61 64 64 72 43 6f 6e 74  srcTab, addrCont
96e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
96f0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
9700: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
9710: 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20 20 20 20  ddrInsTop);.    
9720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9730: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 73  1(v, OP_Close, s
9740: 72 63 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20  rcTab);.  }else 
9750: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
9760: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
9770: 74 6f 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  to(v, addrCont);
9780: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9790: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
97a0: 49 6e 73 54 6f 70 29 3b 0a 20 20 7d 0a 0a 69 6e  InsTop);.  }..in
97b0: 73 65 72 74 5f 65 6e 64 3a 0a 20 20 2f 2a 20 55  sert_end:.  /* U
97c0: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
97d0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
97e0: 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63  by storing the c
97f0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20  ontent of the.  
9800: 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  ** maximum rowid
9810: 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20   counter values 
9820: 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69  recorded while i
9830: 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20  nserting into.  
9840: 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  ** autoincrement
9850: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
9860: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
9870: 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ed==0 && pParse-
9880: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
9890: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
98a0: 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70  toincrementEnd(p
98b0: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
98c0: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
98d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
98e0: 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 74 68   inserted. If th
98f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20  is routine is . 
9900: 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63   ** generating c
9910: 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61  ode because of a
9920: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9930: 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64  NestedParse(), d
9940: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b  o not.  ** invok
9950: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
9960: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
9970: 69 66 28 20 72 65 67 52 6f 77 43 6f 75 6e 74 20  if( regRowCount 
9980: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9990: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
99a0: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 6f 77  esultRow, regRow
99b0: 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20 73  Count, 1);.    s
99c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
99d0: 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20 20  Cols(v, 1);.    
99e0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
99f0: 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c 4e  lName(v, 0, COLN
9a00: 41 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73 20  AME_NAME, "rows 
9a10: 69 6e 73 65 72 74 65 64 22 2c 20 53 51 4c 49 54  inserted", SQLIT
9a20: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a  E_STATIC);.  }..
9a30: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3a 0a  insert_cleanup:.
9a40: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
9a50: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 4c  Delete(db, pTabL
9a60: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ist);.  sqlite3E
9a70: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
9a80: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
9a90: 74 65 33 55 70 73 65 72 74 44 65 6c 65 74 65 28  te3UpsertDelete(
9aa0: 64 62 2c 20 70 55 70 73 65 72 74 29 3b 0a 20 20  db, pUpsert);.  
9ab0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
9ac0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
9ad0: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
9ae0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
9af0: 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  umn);.  sqlite3D
9b00: 62 46 72 65 65 28 64 62 2c 20 61 52 65 67 49 64  bFree(db, aRegId
9b10: 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d 61 6b 65 20 73  x);.}../* Make s
9b20: 75 72 65 20 22 69 73 56 69 65 77 22 20 61 6e 64  ure "isView" and
9b30: 20 6f 74 68 65 72 20 6d 61 63 72 6f 73 20 64 65   other macros de
9b40: 66 69 6e 65 64 20 61 62 6f 76 65 20 61 72 65 20  fined above are 
9b50: 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72  undefined. Other
9b60: 77 69 73 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79  wise.** they may
9b70: 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
9b80: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f  compilation of o
9b90: 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 69  ther functions i
9ba0: 6e 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28  n this file.** (
9bb0: 6f 72 20 69 6e 20 61 6e 6f 74 68 65 72 20 66 69  or in another fi
9bc0: 6c 65 2c 20 69 66 20 74 68 69 73 20 66 69 6c 65  le, if this file
9bd0: 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f 66   becomes part of
9be0: 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
9bf0: 6e 29 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 69  n).  */.#ifdef i
9c00: 73 56 69 65 77 0a 20 23 75 6e 64 65 66 20 69 73  sView. #undef is
9c10: 56 69 65 77 0a 23 65 6e 64 69 66 0a 23 69 66 64  View.#endif.#ifd
9c20: 65 66 20 70 54 72 69 67 67 65 72 0a 20 23 75 6e  ef pTrigger. #un
9c30: 64 65 66 20 70 54 72 69 67 67 65 72 0a 23 65 6e  def pTrigger.#en
9c40: 64 69 66 0a 23 69 66 64 65 66 20 74 6d 61 73 6b  dif.#ifdef tmask
9c50: 0a 20 23 75 6e 64 65 66 20 74 6d 61 73 6b 0a 23  . #undef tmask.#
9c60: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  endif../*.** Mea
9c70: 6e 69 6e 67 73 20 6f 66 20 62 69 74 73 20 69 6e  nings of bits in
9c80: 20 6f 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   of pWalker->eCo
9c90: 64 65 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74  de for .** sqlit
9ca0: 65 33 45 78 70 72 52 65 66 65 72 65 6e 63 65 73  e3ExprReferences
9cb0: 55 70 64 61 74 65 64 43 6f 6c 75 6d 6e 28 29 0a  UpdatedColumn().
9cc0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4b 43 4e 53  */.#define CKCNS
9cd0: 54 52 4e 54 5f 43 4f 4c 55 4d 4e 20 20 20 30 78  TRNT_COLUMN   0x
9ce0: 30 31 20 20 20 20 2f 2a 20 43 48 45 43 4b 20 63  01    /* CHECK c
9cf0: 6f 6e 73 74 72 61 69 6e 74 20 75 73 65 73 20 61  onstraint uses a
9d00: 20 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e   changing column
9d10: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4b 43 4e   */.#define CKCN
9d20: 53 54 52 4e 54 5f 52 4f 57 49 44 20 20 20 20 30  STRNT_ROWID    0
9d30: 78 30 32 20 20 20 20 2f 2a 20 43 48 45 43 4b 20  x02    /* CHECK 
9d40: 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 66 65 72  constraint refer
9d50: 65 6e 63 65 73 20 74 68 65 20 52 4f 57 49 44 20  ences the ROWID 
9d60: 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74  */../* This is t
9d70: 68 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61  he Walker callba
9d80: 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45  ck from sqlite3E
9d90: 78 70 72 52 65 66 65 72 65 6e 63 65 73 55 70 64  xprReferencesUpd
9da0: 61 74 65 64 43 6f 6c 75 6d 6e 28 29 2e 0a 2a 20  atedColumn()..* 
9db0: 20 53 65 74 20 62 69 74 20 30 78 30 31 20 6f 66   Set bit 0x01 of
9dc0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
9dd0: 69 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  if pWalker->eCod
9de0: 65 20 74 6f 20 30 20 61 6e 64 20 69 66 20 74 68  e to 0 and if th
9df0: 69 73 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  is.** expression
9e00: 20 6e 6f 64 65 20 72 65 66 65 72 65 6e 63 65 73   node references
9e10: 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63   any of the.** c
9e20: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
9e30: 62 65 69 6e 67 20 6d 6f 64 69 66 65 64 20 62 79  being modifed by
9e40: 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65   an UPDATE state
9e50: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
9e60: 69 6e 74 20 63 68 65 63 6b 43 6f 6e 73 74 72 61  int checkConstra
9e70: 69 6e 74 45 78 70 72 4e 6f 64 65 28 57 61 6c 6b  intExprNode(Walk
9e80: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
9e90: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
9ea0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9eb0: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73  OLUMN ){.    ass
9ec0: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
9ed0: 75 6d 6e 3e 3d 30 20 7c 7c 20 70 45 78 70 72 2d  umn>=0 || pExpr-
9ee0: 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a  >iColumn==-1 );.
9ef0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
9f00: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
9f10: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
9f20: 75 2e 61 69 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  u.aiCol[pExpr->i
9f30: 43 6f 6c 75 6d 6e 5d 3e 3d 30 20 29 7b 0a 20 20  Column]>=0 ){.  
9f40: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
9f50: 43 6f 64 65 20 7c 3d 20 43 4b 43 4e 53 54 52 4e  Code |= CKCNSTRN
9f60: 54 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  T_COLUMN;.      
9f70: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9f80: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
9f90: 65 20 7c 3d 20 43 4b 43 4e 53 54 52 4e 54 5f 52  e |= CKCNSTRNT_R
9fa0: 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OWID;.    }.  }.
9fb0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
9fc0: 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
9fd0: 70 45 78 70 72 20 69 73 20 61 20 43 48 45 43 4b  pExpr is a CHECK
9fe0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 61   constraint on a
9ff0: 20 72 6f 77 20 74 68 61 74 20 69 73 20 62 65 69   row that is bei
a000: 6e 67 20 55 50 44 41 54 45 2d 65 64 2e 20 20 54  ng UPDATE-ed.  T
a010: 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6c 75 6d  he.** only colum
a020: 6e 73 20 74 68 61 74 20 61 72 65 20 6d 6f 64 69  ns that are modi
a030: 66 69 65 64 20 62 79 20 74 68 65 20 55 50 44 41  fied by the UPDA
a040: 54 45 20 61 72 65 20 74 68 6f 73 65 20 66 6f 72  TE are those for
a050: 20 77 68 69 63 68 0a 2a 2a 20 61 69 43 68 6e 67   which.** aiChng
a060: 5b 69 5d 3e 3d 30 2c 20 61 6e 64 20 61 6c 73 6f  [i]>=0, and also
a070: 20 74 68 65 20 52 4f 57 49 44 20 69 73 20 6d 6f   the ROWID is mo
a080: 64 69 66 69 65 64 20 69 66 20 63 68 6e 67 52 6f  dified if chngRo
a090: 77 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  wid is true..**.
a0a0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
a0b0: 66 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  f CHECK constrai
a0c0: 6e 74 20 70 45 78 70 72 20 75 73 65 73 20 61 6e  nt pExpr uses an
a0d0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e  y of the.** chan
a0e0: 67 69 6e 67 20 63 6f 6c 75 6d 6e 73 20 28 6f 72  ging columns (or
a0f0: 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 69 74   the rowid if it
a100: 20 69 73 20 63 68 61 6e 67 69 6e 67 29 2e 20 20   is changing).  
a110: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
a120: 2a 2a 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  ** return true i
a130: 66 20 74 68 69 73 20 43 48 45 43 4b 20 63 6f 6e  f this CHECK con
a140: 73 74 72 61 69 6e 74 20 6d 75 73 74 20 62 65 20  straint must be 
a150: 76 61 6c 69 64 61 74 65 64 20 66 6f 72 0a 2a 2a  validated for.**
a160: 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 20   the new row in 
a170: 74 68 65 20 55 50 44 41 54 45 20 73 74 61 74 65  the UPDATE state
a180: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 32 30 31 38  ment..**.** 2018
a190: 2d 30 39 2d 31 35 3a 20 70 45 78 70 72 20 6d 69  -09-15: pExpr mi
a1a0: 67 68 74 20 61 6c 73 6f 20 62 65 20 61 6e 20 65  ght also be an e
a1b0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 6e  xpression for an
a1c0: 20 69 6e 64 65 78 2d 6f 6e 2d 65 78 70 72 65 73   index-on-expres
a1d0: 73 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 6f 70  sions..** The op
a1e0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  eration of this 
a1f0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 73  routine is the s
a200: 61 6d 65 20 2d 20 72 65 74 75 72 6e 20 74 72 75  ame - return tru
a210: 65 20 69 66 20 61 6e 20 6f 6e 6c 79 20 69 66 0a  e if an only if.
a220: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
a230: 6e 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  n uses one or mo
a240: 72 65 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 64  re of columns id
a250: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
a260: 73 65 63 6f 6e 64 20 61 6e 64 0a 2a 2a 20 74 68  second and.** th
a270: 69 72 64 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  ird arguments..*
a280: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
a290: 72 52 65 66 65 72 65 6e 63 65 73 55 70 64 61 74  rReferencesUpdat
a2a0: 65 64 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  edColumn(.  Expr
a2b0: 20 2a 70 45 78 70 72 2c 20 20 20 20 2f 2a 20 54   *pExpr,    /* T
a2c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
a2d0: 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   be checked */. 
a2e0: 20 69 6e 74 20 2a 61 69 43 68 6e 67 2c 20 20 20   int *aiChng,   
a2f0: 20 2f 2a 20 61 69 43 68 6e 67 5b 78 5d 3e 3d 30   /* aiChng[x]>=0
a300: 20 69 66 20 63 6f 6c 75 6d 6e 20 78 20 63 68 61   if column x cha
a310: 6e 67 65 64 20 62 79 20 74 68 65 20 55 50 44 41  nged by the UPDA
a320: 54 45 20 2a 2f 0a 20 20 69 6e 74 20 63 68 6e 67  TE */.  int chng
a330: 52 6f 77 69 64 20 20 20 2f 2a 20 54 72 75 65 20  Rowid   /* True 
a340: 69 66 20 55 50 44 41 54 45 20 63 68 61 6e 67 65  if UPDATE change
a350: 73 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 29  s the rowid */.)
a360: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
a370: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
a380: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
a390: 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e 78 45 78  ode = 0;.  w.xEx
a3a0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 63 68 65  prCallback = che
a3b0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 45 78 70 72  ckConstraintExpr
a3c0: 4e 6f 64 65 3b 0a 20 20 77 2e 75 2e 61 69 43 6f  Node;.  w.u.aiCo
a3d0: 6c 20 3d 20 61 69 43 68 6e 67 3b 0a 20 20 73 71  l = aiChng;.  sq
a3e0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
a3f0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  , pExpr);.  if( 
a400: 21 63 68 6e 67 52 6f 77 69 64 20 29 7b 0a 20 20  !chngRowid ){.  
a410: 20 20 74 65 73 74 63 61 73 65 28 20 28 77 2e 65    testcase( (w.e
a420: 43 6f 64 65 20 26 20 43 4b 43 4e 53 54 52 4e 54  Code & CKCNSTRNT
a430: 5f 52 4f 57 49 44 29 21 3d 30 20 29 3b 0a 20 20  _ROWID)!=0 );.  
a440: 20 20 77 2e 65 43 6f 64 65 20 26 3d 20 7e 43 4b    w.eCode &= ~CK
a450: 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 3b 0a 20  CNSTRNT_ROWID;. 
a460: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 77   }.  testcase( w
a470: 2e 65 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 74  .eCode==0 );.  t
a480: 65 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64 65  estcase( w.eCode
a490: 3d 3d 43 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55  ==CKCNSTRNT_COLU
a4a0: 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  MN );.  testcase
a4b0: 28 20 77 2e 65 43 6f 64 65 3d 3d 43 4b 43 4e 53  ( w.eCode==CKCNS
a4c0: 54 52 4e 54 5f 52 4f 57 49 44 20 29 3b 0a 20 20  TRNT_ROWID );.  
a4d0: 74 65 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64  testcase( w.eCod
a4e0: 65 3d 3d 28 43 4b 43 4e 53 54 52 4e 54 5f 52 4f  e==(CKCNSTRNT_RO
a4f0: 57 49 44 7c 43 4b 43 4e 53 54 52 4e 54 5f 43 4f  WID|CKCNSTRNT_CO
a500: 4c 55 4d 4e 29 20 29 3b 0a 20 20 72 65 74 75 72  LUMN) );.  retur
a510: 6e 20 77 2e 65 43 6f 64 65 21 3d 30 3b 0a 7d 0a  n w.eCode!=0;.}.
a520: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a530: 63 6f 64 65 20 74 6f 20 64 6f 20 63 6f 6e 73 74  code to do const
a540: 72 61 69 6e 74 20 63 68 65 63 6b 73 20 70 72 69  raint checks pri
a550: 6f 72 20 74 6f 20 61 6e 20 49 4e 53 45 52 54 20  or to an INSERT 
a560: 6f 72 20 61 6e 20 55 50 44 41 54 45 0a 2a 2a 20  or an UPDATE.** 
a570: 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 2e 0a 2a  on table pTab..*
a580: 2a 0a 2a 2a 20 54 68 65 20 72 65 67 4e 65 77 44  *.** The regNewD
a590: 61 74 61 20 70 61 72 61 6d 65 74 65 72 20 69 73  ata parameter is
a5a0: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
a5b0: 74 65 72 20 69 6e 20 61 20 72 61 6e 67 65 20 74  ter in a range t
a5c0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
a5d0: 74 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 69  the data to be i
a5e0: 6e 73 65 72 74 65 64 20 6f 72 20 74 68 65 20 64  nserted or the d
a5f0: 61 74 61 20 61 66 74 65 72 20 74 68 65 20 75 70  ata after the up
a600: 64 61 74 65 2e 20 20 54 68 65 72 65 20 77 69 6c  date.  There wil
a610: 6c 20 62 65 0a 2a 2a 20 70 54 61 62 2d 3e 6e 43  l be.** pTab->nC
a620: 6f 6c 2b 31 20 72 65 67 69 73 74 65 72 73 20 69  ol+1 registers i
a630: 6e 20 74 68 69 73 20 72 61 6e 67 65 2e 20 20 54  n this range.  T
a640: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
a650: 72 20 28 74 68 65 20 6f 6e 65 0a 2a 2a 20 74 68  r (the one.** th
a660: 61 74 20 72 65 67 4e 65 77 44 61 74 61 20 70 6f  at regNewData po
a670: 69 6e 74 73 20 74 6f 29 20 77 69 6c 6c 20 63 6f  ints to) will co
a680: 6e 74 61 69 6e 20 74 68 65 20 6e 65 77 20 72 6f  ntain the new ro
a690: 77 69 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 6e 20  wid, or NULL in 
a6a0: 74 68 65 0a 2a 2a 20 63 61 73 65 20 6f 66 20 61  the.** case of a
a6b0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
a6c0: 61 62 6c 65 2e 20 20 54 68 65 20 73 65 63 6f 6e  able.  The secon
a6d0: 64 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  d register in th
a6e0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 0a 2a 2a 20  e range will.** 
a6f0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e 74  contain the cont
a700: 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  ent of the first
a710: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20   table column.  
a720: 54 68 65 20 74 68 69 72 64 20 72 65 67 69 73 74  The third regist
a730: 65 72 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61  er will.** conta
a740: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
a750: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 74 61 62  f the second tab
a760: 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 41 6e 64 20  le column.  And 
a770: 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20  so forth..**.** 
a780: 54 68 65 20 72 65 67 4f 6c 64 44 61 74 61 20 70  The regOldData p
a790: 61 72 61 6d 65 74 65 72 20 69 73 20 73 69 6d 69  arameter is simi
a7a0: 6c 61 72 20 74 6f 20 72 65 67 4e 65 77 44 61 74  lar to regNewDat
a7b0: 61 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  a except that it
a7c0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
a7d0: 20 64 61 74 61 20 70 72 69 6f 72 20 74 6f 20 61   data prior to a
a7e0: 6e 20 55 50 44 41 54 45 20 72 61 74 68 65 72 20  n UPDATE rather 
a7f0: 74 68 61 6e 20 61 66 74 65 72 77 61 72 64 73 2e  than afterwards.
a800: 20 20 72 65 67 4f 6c 64 44 61 74 61 20 69 73 20    regOldData is 
a810: 7a 65 72 6f 0a 2a 2a 20 66 6f 72 20 61 6e 20 49  zero.** for an I
a820: 4e 53 45 52 54 2e 20 20 54 68 69 73 20 72 6f 75  NSERT.  This rou
a830: 74 69 6e 65 20 63 61 6e 20 64 69 73 74 69 6e 67  tine can disting
a840: 75 69 73 68 20 62 65 74 77 65 65 6e 20 55 50 44  uish between UPD
a850: 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 62  ATE and INSERT b
a860: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 72 65  y.** checking re
a870: 67 4f 6c 64 44 61 74 61 20 66 6f 72 20 7a 65 72  gOldData for zer
a880: 6f 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  o..**.** For an 
a890: 55 50 44 41 54 45 2c 20 74 68 65 20 70 6b 43 68  UPDATE, the pkCh
a8a0: 6e 67 20 62 6f 6f 6c 65 61 6e 20 69 73 20 74 72  ng boolean is tr
a8b0: 75 65 20 69 66 20 74 68 65 20 74 72 75 65 20 70  ue if the true p
a8c0: 72 69 6d 61 72 79 20 6b 65 79 20 28 74 68 65 0a  rimary key (the.
a8d0: 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 61 20 6e  ** rowid for a n
a8e0: 6f 72 6d 61 6c 20 74 61 62 6c 65 20 6f 72 20 74  ormal table or t
a8f0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
a900: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
a910: 49 44 20 74 61 62 6c 65 29 0a 2a 2a 20 6d 69 67  ID table).** mig
a920: 68 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62  ht be modified b
a930: 79 20 74 68 65 20 55 50 44 41 54 45 2e 20 20 49  y the UPDATE.  I
a940: 66 20 70 6b 43 68 6e 67 20 69 73 20 66 61 6c 73  f pkChng is fals
a950: 65 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  e, then the key 
a960: 6f 66 0a 2a 2a 20 74 68 65 20 69 44 61 74 61 43  of.** the iDataC
a970: 75 72 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65  ur content table
a980: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
a990: 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 20 62  o be unchanged b
a9a0: 79 20 74 68 65 20 55 50 44 41 54 45 2e 0a 2a 2a  y the UPDATE..**
a9b0: 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 53 45 52  .** For an INSER
a9c0: 54 2c 20 74 68 65 20 70 6b 43 68 6e 67 20 62 6f  T, the pkChng bo
a9d0: 6f 6c 65 61 6e 20 69 6e 64 69 63 61 74 65 73 20  olean indicates 
a9e0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
a9f0: 68 65 20 72 6f 77 69 64 0a 2a 2a 20 77 61 73 20  he rowid.** was 
aa00: 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
aa10: 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  fied as part of 
aa20: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
aa30: 6d 65 6e 74 2e 20 20 49 66 20 70 6b 43 68 6e 67  ment.  If pkChng
aa40: 0a 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 69 74 20  .** is zero, it 
aa50: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 65  means that the e
aa60: 69 74 68 65 72 20 72 6f 77 69 64 20 69 73 20 63  ither rowid is c
aa70: 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69  omputed automati
aa80: 63 61 6c 6c 79 20 6f 72 0a 2a 2a 20 74 68 61 74  cally or.** that
aa90: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
aaa0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
aab0: 62 6c 65 20 61 6e 64 20 68 61 73 20 6e 6f 20 72  ble and has no r
aac0: 6f 77 69 64 2e 20 20 4f 6e 20 61 6e 20 49 4e 53  owid.  On an INS
aad0: 45 52 54 2c 0a 2a 2a 20 70 6b 43 68 6e 67 20 77  ERT,.** pkChng w
aae0: 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 74 72 75 65  ill only be true
aaf0: 20 69 66 20 74 68 65 20 49 4e 53 45 52 54 20 73   if the INSERT s
ab00: 74 61 74 65 6d 65 6e 74 20 70 72 6f 76 69 64 65  tatement provide
ab10: 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20  s an integer.** 
ab20: 76 61 6c 75 65 20 66 6f 72 20 65 69 74 68 65 72  value for either
ab30: 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
ab40: 6e 20 6f 72 20 69 74 73 20 49 4e 54 45 47 45 52  n or its INTEGER
ab50: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6c 69   PRIMARY KEY ali
ab60: 61 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  as..**.** The co
ab70: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
ab80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
ab90: 6c 20 73 74 6f 72 65 20 6e 65 77 20 69 6e 64 65  l store new inde
aba0: 78 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 0a 2a  x entries into.*
abb0: 2a 20 72 65 67 69 73 74 65 72 73 20 69 64 65 6e  * registers iden
abc0: 74 69 66 69 65 64 20 62 79 20 61 52 65 67 49 64  tified by aRegId
abd0: 78 5b 5d 2e 20 20 4e 6f 20 69 6e 64 65 78 20 65  x[].  No index e
abe0: 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
abf0: 66 6f 72 0a 2a 2a 20 69 6e 64 69 63 65 73 20 77  for.** indices w
ac00: 68 65 72 65 20 61 52 65 67 49 64 78 5b 69 5d 3d  here aRegIdx[i]=
ac10: 3d 30 2e 20 20 54 68 65 20 6f 72 64 65 72 20 6f  =0.  The order o
ac20: 66 20 69 6e 64 69 63 65 73 20 69 6e 20 61 52 65  f indices in aRe
ac30: 67 49 64 78 5b 5d 20 69 73 0a 2a 2a 20 74 68 65  gIdx[] is.** the
ac40: 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 64   same as the ord
ac50: 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 6f 6e  er of indices on
ac60: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
ac70: 20 6f 66 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61   of indices.** a
ac80: 74 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2e 0a  t pTab->pIndex..
ac90: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
aca0: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
acb0: 64 79 20 6f 70 65 6e 65 64 20 77 72 69 74 65 61  dy opened writea
acc0: 62 6c 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ble cursors on t
acd0: 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c 65  he main.** table
ace0: 20 61 6e 64 20 61 6c 6c 20 61 70 70 6c 69 63 61   and all applica
acf0: 62 6c 65 20 69 6e 64 69 63 65 73 20 28 74 68 61  ble indices (tha
ad00: 74 20 69 73 20 74 6f 20 73 61 79 2c 20 61 6c 6c  t is to say, all
ad10: 20 69 6e 64 69 63 65 73 20 66 6f 72 20 77 68 69   indices for whi
ad20: 63 68 0a 2a 2a 20 61 52 65 67 49 64 78 5b 5d 20  ch.** aRegIdx[] 
ad30: 69 73 20 6e 6f 74 20 7a 65 72 6f 29 2e 20 20 69  is not zero).  i
ad40: 44 61 74 61 43 75 72 20 69 73 20 74 68 65 20 63  DataCur is the c
ad50: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d 61  ursor for the ma
ad60: 69 6e 20 74 61 62 6c 65 20 77 68 65 6e 0a 2a 2a  in table when.**
ad70: 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 20 75 70   inserting or up
ad80: 64 61 74 69 6e 67 20 61 20 72 6f 77 69 64 20 74  dating a rowid t
ad90: 61 62 6c 65 2c 20 6f 72 20 74 68 65 20 63 75 72  able, or the cur
ada0: 73 6f 72 20 66 6f 72 20 74 68 65 20 50 52 49 4d  sor for the PRIM
adb0: 41 52 59 20 4b 45 59 0a 2a 2a 20 69 6e 64 65 78  ARY KEY.** index
adc0: 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 20   when operating 
add0: 6f 6e 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  on a WITHOUT ROW
ade0: 49 44 20 74 61 62 6c 65 2e 20 20 69 49 64 78 43  ID table.  iIdxC
adf0: 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  ur is the cursor
ae00: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72 73  .** for the firs
ae10: 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 70  t index in the p
ae20: 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74  Tab->pIndex list
ae30: 2e 20 20 43 75 72 73 6f 72 73 20 66 6f 72 20 6f  .  Cursors for o
ae40: 74 68 65 72 20 69 6e 64 69 63 65 73 0a 2a 2a 20  ther indices.** 
ae50: 61 72 65 20 61 74 20 69 49 64 78 43 75 72 2b 4e  are at iIdxCur+N
ae60: 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6c   for the N-th el
ae70: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 54 61  ement of the pTa
ae80: 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e 0a  b->pIndex list..
ae90: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
aea0: 6e 65 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65  ne also generate
aeb0: 73 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  s code to check 
aec0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 4e 4f  constraints.  NO
aed0: 54 20 4e 55 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b  T NULL,.** CHECK
aee0: 2c 20 61 6e 64 20 55 4e 49 51 55 45 20 63 6f 6e  , and UNIQUE con
aef0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
af00: 20 63 68 65 63 6b 65 64 2e 20 20 49 66 20 61 20   checked.  If a 
af10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73  constraint fails
af20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 70  ,.** then the ap
af30: 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e  propriate action
af40: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
af50: 54 68 65 72 65 20 61 72 65 20 66 69 76 65 20 70  There are five p
af60: 6f 73 73 69 62 6c 65 0a 2a 2a 20 61 63 74 69 6f  ossible.** actio
af70: 6e 73 3a 20 52 4f 4c 4c 42 41 43 4b 2c 20 41 42  ns: ROLLBACK, AB
af80: 4f 52 54 2c 20 46 41 49 4c 2c 20 52 45 50 4c 41  ORT, FAIL, REPLA
af90: 43 45 2c 20 61 6e 64 20 49 47 4e 4f 52 45 2e 0a  CE, and IGNORE..
afa0: 2a 2a 0a 2a 2a 20 20 43 6f 6e 73 74 72 61 69 6e  **.**  Constrain
afb0: 74 20 74 79 70 65 20 20 41 63 74 69 6f 6e 20 20  t type  Action  
afc0: 20 20 20 20 20 57 68 61 74 20 48 61 70 70 65 6e       What Happen
afd0: 73 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.**  ----------
afe0: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
aff0: 2d 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -   ------------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
b020: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
b030: 20 20 52 4f 4c 4c 42 41 43 4b 20 20 20 20 20 54    ROLLBACK     T
b040: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
b050: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
b060: 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 20 20 20   back and.**    
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
b090: 74 65 33 5f 73 74 65 70 28 29 20 72 65 74 75 72  te3_step() retur
b0a0: 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77  ns immediately w
b0b0: 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ith a.**        
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
b0e0: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ode of SQLITE_CO
b0f0: 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20  NSTRAINT..**.** 
b100: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
b110: 20 20 41 42 4f 52 54 20 20 20 20 20 20 20 20 42    ABORT        B
b120: 61 63 6b 20 6f 75 74 20 63 68 61 6e 67 65 73 20  ack out changes 
b130: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
b140: 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20 20 20   command.**     
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 6c 79 20             only 
b170: 28 64 6f 20 6e 6f 74 20 64 6f 20 61 20 63 6f 6d  (do not do a com
b180: 70 6c 65 74 65 20 72 6f 6c 6c 62 61 63 6b 29 20  plete rollback) 
b190: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 20 20 20 20 63 61 75 73 65 20 73 71 6c         cause sql
b1c0: 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72  ite3_step() to r
b1d0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
b1e0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f      with SQLITE_
b210: 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a  CONSTRAINT..**.*
b220: 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20  *  any          
b230: 20 20 20 20 46 41 49 4c 20 20 20 20 20 20 20 20      FAIL        
b240: 20 53 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   Sqlite3_step() 
b250: 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69 61 74  returns immediat
b260: 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20 20 20  ely with a.**   
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
b290: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
b2a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 20 20  TE_CONSTRAINT.  
b2b0: 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  The.**          
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f        transactio
b2e0: 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20  n is not rolled 
b2f0: 62 61 63 6b 20 61 6e 64 20 61 6e 79 0a 2a 2a 20  back and any.** 
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
b320: 68 61 6e 67 65 73 20 74 6f 20 70 72 69 6f 72 20  hanges to prior 
b330: 72 6f 77 73 20 61 72 65 20 72 65 74 61 69 6e 65  rows are retaine
b340: 64 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20  d..**.**  any   
b350: 20 20 20 20 20 20 20 20 20 20 20 49 47 4e 4f 52             IGNOR
b360: 45 20 20 20 20 20 20 20 54 68 65 20 61 74 74 65  E       The atte
b370: 6d 70 74 20 69 6e 20 69 6e 73 65 72 74 20 6f 72  mpt in insert or
b380: 20 75 70 64 61 74 65 20 74 68 65 20 63 75 72 72   update the curr
b390: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ent.**          
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 72 6f 77 20 69 73 20 73 6b 69        row is ski
b3c0: 70 70 65 64 2c 20 77 69 74 68 6f 75 74 20 74 68  pped, without th
b3d0: 72 6f 77 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  rowing an error.
b3e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 50 72 6f 63 65 73 73 69 6e 67 20 63 6f     Processing co
b410: 6e 74 69 6e 75 65 73 20 77 69 74 68 20 74 68 65  ntinues with the
b420: 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2a 20 20 20   next row..**   
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 68               (Th
b450: 65 72 65 20 69 73 20 61 6e 20 69 6d 6d 65 64 69  ere is an immedi
b460: 61 74 65 20 6a 75 6d 70 20 74 6f 20 69 67 6e 6f  ate jump to igno
b470: 72 65 44 65 73 74 2e 29 0a 2a 2a 0a 2a 2a 20 20  reDest.).**.**  
b480: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20  NOT NULL        
b490: 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 54 68   REPLACE      Th
b4a0: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  e NULL value is 
b4b0: 72 65 70 6c 61 63 65 20 62 79 20 74 68 65 20 64  replace by the d
b4c0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 66           value f
b4f0: 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20  or that column. 
b500: 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   If the default 
b510: 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20 20 20  value.**        
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 20 20 20 69 73 20 4e 55 4c 4c 2c          is NULL,
b540: 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 20 74   the action is t
b550: 68 65 20 73 61 6d 65 20 61 73 20 41 42 4f 52 54  he same as ABORT
b560: 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e 49 51 55 45 20  ..**.**  UNIQUE 
b570: 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43            REPLAC
b580: 45 20 20 20 20 20 20 54 68 65 20 6f 74 68 65 72  E      The other
b590: 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 66 6c 69   row that confli
b5a0: 63 74 73 20 77 69 74 68 20 74 68 65 20 72 6f 77  cts with the row
b5b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65     being inserte
b5e0: 64 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a  d is removed..**
b5f0: 0a 2a 2a 20 20 43 48 45 43 4b 20 20 20 20 20 20  .**  CHECK      
b600: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
b610: 20 20 20 49 6c 6c 65 67 61 6c 2e 20 20 54 68 65     Illegal.  The
b620: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 65   results in an e
b630: 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xception..**.** 
b640: 57 68 69 63 68 20 61 63 74 69 6f 6e 20 74 6f 20  Which action to 
b650: 74 61 6b 65 20 69 73 20 64 65 74 65 72 6d 69 6e  take is determin
b660: 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 72 69  ed by the overri
b670: 64 65 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  deError paramete
b680: 72 2e 0a 2a 2a 20 4f 72 20 69 66 20 6f 76 65 72  r..** Or if over
b690: 72 69 64 65 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  rideError==OE_De
b6a0: 66 61 75 6c 74 2c 20 74 68 65 6e 20 74 68 65 20  fault, then the 
b6b0: 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 20  pParse->onError 
b6c0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 69 73 20  parameter.** is 
b6d0: 75 73 65 64 2e 20 20 4f 72 20 69 66 20 70 50 61  used.  Or if pPa
b6e0: 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  rse->onError==OE
b6f0: 5f 44 65 66 61 75 6c 74 20 74 68 65 6e 20 74 68  _Default then th
b700: 65 20 6f 6e 45 72 72 6f 72 20 76 61 6c 75 65 0a  e onError value.
b710: 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ** for the const
b720: 72 61 69 6e 74 20 69 73 20 75 73 65 64 2e 0a 2a  raint is used..*
b730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47 65  /.void sqlite3Ge
b740: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
b750: 43 68 65 63 6b 73 28 0a 20 20 50 61 72 73 65 20  Checks(.  Parse 
b760: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
b770: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
b780: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
b790: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f  *pTab,         /
b7a0: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
b7b0: 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70  g inserted or up
b7c0: 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  dated */.  int *
b7d0: 61 52 65 67 49 64 78 2c 20 20 20 20 20 20 20 20  aRegIdx,        
b7e0: 2f 2a 20 55 73 65 20 72 65 67 69 73 74 65 72 20  /* Use register 
b7f0: 61 52 65 67 49 64 78 5b 69 5d 20 66 6f 72 20 69  aRegIdx[i] for i
b800: 6e 64 65 78 20 69 2e 20 20 30 20 66 6f 72 20 75  ndex i.  0 for u
b810: 6e 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  nused */.  int i
b820: 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 20 20  DataCur,        
b830: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 64 61 74  /* Canonical dat
b840: 61 20 63 75 72 73 6f 72 20 28 6d 61 69 6e 20 74  a cursor (main t
b850: 61 62 6c 65 20 6f 72 20 50 4b 20 69 6e 64 65 78  able or PK index
b860: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  ) */.  int iIdxC
b870: 75 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ur,         /* F
b880: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
b890: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65  r */.  int regNe
b8a0: 77 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 46  wData,      /* F
b8b0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
b8c0: 20 61 20 72 61 6e 67 65 20 68 6f 6c 64 69 6e 67   a range holding
b8d0: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73 65 72   values to inser
b8e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c  t */.  int regOl
b8f0: 64 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 50  dData,      /* P
b900: 72 65 76 69 6f 75 73 20 63 6f 6e 74 65 6e 74 2e  revious content.
b910: 20 20 30 20 66 6f 72 20 49 4e 53 45 52 54 73 20    0 for INSERTs 
b920: 2a 2f 0a 20 20 75 38 20 70 6b 43 68 6e 67 2c 20  */.  u8 pkChng, 
b930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
b940: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 72 6f 77  -zero if the row
b950: 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  id or PRIMARY KE
b960: 59 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  Y changed */.  u
b970: 38 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 2c  8 overrideError,
b980: 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65 20      /* Override 
b990: 6f 6e 45 72 72 6f 72 20 74 6f 20 74 68 69 73 20  onError to this 
b9a0: 69 66 20 6e 6f 74 20 4f 45 5f 44 65 66 61 75 6c  if not OE_Defaul
b9b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f 72  t */.  int ignor
b9c0: 65 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 4a  eDest,      /* J
b9d0: 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
b9e0: 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49 67 6e 6f 72  l on an OE_Ignor
b9f0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 2a 2f 0a  e resolution */.
ba00: 20 20 69 6e 74 20 2a 70 62 4d 61 79 52 65 70 6c    int *pbMayRepl
ba10: 61 63 65 2c 20 20 20 2f 2a 20 4f 55 54 3a 20 53  ace,   /* OUT: S
ba20: 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 63 6f  et to true if co
ba30: 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 63 61 75  nstraint may cau
ba40: 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a 2f 0a  se a replace */.
ba50: 20 20 69 6e 74 20 2a 61 69 43 68 6e 67 2c 20 20    int *aiChng,  
ba60: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e         /* column
ba70: 20 69 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20   i is unchanged 
ba80: 69 66 20 61 69 43 68 6e 67 5b 69 5d 3c 30 20 2a  if aiChng[i]<0 *
ba90: 2f 0a 20 20 55 70 73 65 72 74 20 2a 70 55 70 73  /.  Upsert *pUps
baa0: 65 72 74 20 20 20 20 20 20 2f 2a 20 4f 4e 20 43  ert      /* ON C
bab0: 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 2c  ONFLICT clauses,
bac0: 20 69 66 20 61 6e 79 2e 20 20 4e 55 4c 4c 20 6f   if any.  NULL o
bad0: 74 68 65 72 77 69 73 65 20 2a 2f 0a 29 7b 0a 20  therwise */.){. 
bae0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
baf0: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 75 6e        /* VDBE un
bb00: 64 65 72 20 63 6f 6e 73 74 72 75 74 69 6f 6e 20  der constrution 
bb10: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
bb20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
bb30: 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  nter to one of t
bb40: 68 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  he indices */.  
bb50: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20  Index *pPk = 0; 
bb60: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 52 49 4d       /* The PRIM
bb70: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a 2f  ARY KEY index */
bb80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
bb90: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
bba0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
bbb0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
bbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
bbd0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
bbe0: 74 20 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  t ix;           
bbf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70     /* Index loop
bc00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
bc10: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
bc20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bc30: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
bc40: 20 6f 6e 45 72 72 6f 72 3b 20 20 20 20 20 20 20   onError;       
bc50: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
bc60: 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67  solution strateg
bc70: 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  y */.  int addr1
bc80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
bc90: 64 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 69  ddress of jump i
bca0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
bcb0: 69 6e 74 20 73 65 65 6e 52 65 70 6c 61 63 65 20  int seenReplace 
bcc0: 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
bcd0: 52 45 50 4c 41 43 45 20 69 73 20 75 73 65 64 20  REPLACE is used 
bce0: 74 6f 20 72 65 73 6f 6c 76 65 20 49 4e 54 20 50  to resolve INT P
bcf0: 4b 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  K conflict */.  
bd00: 69 6e 74 20 6e 50 6b 46 69 65 6c 64 3b 20 20 20  int nPkField;   
bd10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bd20: 66 20 66 69 65 6c 64 73 20 69 6e 20 50 52 49 4d  f fields in PRIM
bd30: 41 52 59 20 4b 45 59 2e 20 31 20 66 6f 72 20 52  ARY KEY. 1 for R
bd40: 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 20  OWID tables */. 
bd50: 20 49 6e 64 65 78 20 2a 70 55 70 49 64 78 20 3d   Index *pUpIdx =
bd60: 20 30 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 74   0;   /* Index t
bd70: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 6c 79  o which to apply
bd80: 20 74 68 65 20 75 70 73 65 72 74 20 2a 2f 0a 20   the upsert */. 
bd90: 20 75 38 20 69 73 55 70 64 61 74 65 3b 20 20 20   u8 isUpdate;   
bda0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
bdb0: 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
bdc0: 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  TE operation */.
bdd0: 20 20 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f    u8 bAffinityDo
bde0: 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65  ne = 0;  /* True
bdf0: 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
be00: 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ity operation ha
be10: 73 20 62 65 65 6e 20 72 75 6e 20 2a 2f 0a 20 20  s been run */.  
be20: 69 6e 74 20 75 70 73 65 72 74 42 79 70 61 73 73  int upsertBypass
be30: 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 72 65 73   = 0;  /* Addres
be40: 73 20 6f 66 20 47 6f 74 6f 20 74 6f 20 62 79 70  s of Goto to byp
be50: 61 73 73 20 75 70 73 65 72 74 20 73 75 62 72 6f  ass upsert subro
be60: 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 75  utine */.  int u
be70: 70 73 65 72 74 4a 75 6d 70 20 3d 20 30 3b 20 20  psertJump = 0;  
be80: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
be90: 47 6f 74 6f 20 74 68 61 74 20 6a 75 6d 70 73 20  Goto that jumps 
bea0: 69 6e 74 6f 20 75 70 73 65 72 74 20 73 75 62 72  into upsert subr
beb0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
bec0: 69 70 6b 54 6f 70 20 3d 20 30 3b 20 20 20 20 20  ipkTop = 0;     
bed0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
bee0: 20 49 50 4b 20 75 6e 69 71 75 65 6e 65 73 73 20   IPK uniqueness 
bef0: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
bf00: 70 6b 42 6f 74 74 6f 6d 20 3d 20 30 3b 20 20 20  pkBottom = 0;   
bf10: 20 20 2f 2a 20 4f 50 5f 47 6f 74 6f 20 61 74 20    /* OP_Goto at 
bf20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 49  the end of the I
bf30: 50 4b 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68  PK uniqueness ch
bf40: 65 63 6b 20 2a 2f 0a 0a 20 20 69 73 55 70 64 61  eck */..  isUpda
bf50: 74 65 20 3d 20 72 65 67 4f 6c 64 44 61 74 61 21  te = regOldData!
bf60: 3d 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  =0;.  db = pPars
bf70: 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
bf80: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bf90: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
bfa0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bfb0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
bfc0: 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61  0 );  /* This ta
bfd0: 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45  ble is not a VIE
bfe0: 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 54  W */.  nCol = pT
bff0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 0a 20 20 2f  ab->nCol;.  .  /
c000: 2a 20 70 50 6b 20 69 73 20 74 68 65 20 50 52 49  * pPk is the PRI
c010: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
c020: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
c030: 20 74 61 62 6c 65 73 20 61 6e 64 20 4e 55 4c 4c   tables and NULL
c040: 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c   for.  ** normal
c050: 20 72 6f 77 69 64 20 74 61 62 6c 65 73 2e 20 20   rowid tables.  
c060: 6e 50 6b 46 69 65 6c 64 20 69 73 20 74 68 65 20  nPkField is the 
c070: 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 66 69  number of key fi
c080: 65 6c 64 73 20 69 6e 20 74 68 65 20 0a 20 20 2a  elds in the .  *
c090: 2a 20 70 50 6b 20 69 6e 64 65 78 20 6f 72 20 31  * pPk index or 1
c0a0: 20 66 6f 72 20 61 20 72 6f 77 69 64 20 74 61 62   for a rowid tab
c0b0: 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
c0c0: 72 64 73 2c 20 6e 50 6b 46 69 65 6c 64 20 69 73  rds, nPkField is
c0d0: 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72   the.  ** number
c0e0: 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68   of fields in th
c0f0: 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20 6b  e true primary k
c100: 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ey of the table.
c110: 20 2a 2f 0a 20 20 69 66 28 20 48 61 73 52 6f 77   */.  if( HasRow
c120: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
c130: 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 6e 50 6b  pPk = 0;.    nPk
c140: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  Field = 1;.  }el
c150: 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  se{.    pPk = sq
c160: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
c170: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
c180: 6e 50 6b 46 69 65 6c 64 20 3d 20 70 50 6b 2d 3e  nPkField = pPk->
c190: 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  nKeyCol;.  }..  
c1a0: 2f 2a 20 52 65 63 6f 72 64 20 74 68 61 74 20 74  /* Record that t
c1b0: 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 73  his module has s
c1c0: 74 61 72 74 65 64 20 2a 2f 0a 20 20 56 64 62 65  tarted */.  Vdbe
c1d0: 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76  ModuleComment((v
c1e0: 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e 43 6e 73  , "BEGIN: GenCns
c1f0: 74 43 6b 73 28 25 64 2c 25 64 2c 25 64 2c 25 64  tCks(%d,%d,%d,%d
c200: 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%d)",.         
c210: 20 20 20 20 20 20 20 20 20 20 20 20 69 44 61 74              iDat
c220: 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20 72  aCur, iIdxCur, r
c230: 65 67 4e 65 77 44 61 74 61 2c 20 72 65 67 4f 6c  egNewData, regOl
c240: 64 44 61 74 61 2c 20 70 6b 43 68 6e 67 29 29 3b  dData, pkChng));
c250: 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20  ..  /* Test all 
c260: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
c270: 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ints..  */.  for
c280: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
c290: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70  +){.    if( i==p
c2a0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
c2b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20      continue;   
c2c0: 20 20 20 20 20 2f 2a 20 52 4f 57 49 44 20 69 73       /* ROWID is
c2d0: 20 6e 65 76 65 72 20 4e 55 4c 4c 20 2a 2f 0a 20   never NULL */. 
c2e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 69 43     }.    if( aiC
c2f0: 68 6e 67 20 26 26 20 61 69 43 68 6e 67 5b 69 5d  hng && aiChng[i]
c300: 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  <0 ){.      /* D
c310: 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 68 65 63  on't bother chec
c320: 6b 69 6e 67 20 66 6f 72 20 4e 4f 54 20 4e 55 4c  king for NOT NUL
c330: 4c 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 74 68 61  L on columns tha
c340: 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
c350: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
c360: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6e 45  e;.    }.    onE
c370: 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 61 43 6f  rror = pTab->aCo
c380: 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20  l[i].notNull;.  
c390: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
c3a0: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
c3b0: 65 3b 20 20 2f 2a 20 54 68 69 73 20 63 6f 6c 75  e;  /* This colu
c3c0: 6d 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  mn is allowed to
c3d0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   be NULL */.    
c3e0: 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f  if( overrideErro
c3f0: 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r!=OE_Default ){
c400: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
c410: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a   overrideError;.
c420: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
c430: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
c440: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
c450: 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
c460: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6e 45     }.    if( onE
c470: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
c480: 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   && pTab->aCol[i
c490: 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b 0a 20 20  ].pDflt==0 ){.  
c4a0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
c4b0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
c4c0: 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72 6f    assert( onErro
c4d0: 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c  r==OE_Rollback |
c4e0: 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  | onError==OE_Ab
c4f0: 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d  ort || onError==
c500: 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
c510: 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49  || onError==OE_I
c520: 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72 6f 72  gnore || onError
c530: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a  ==OE_Replace );.
c540: 20 20 20 20 61 64 64 72 31 20 3d 20 30 3b 0a 20      addr1 = 0;. 
c550: 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72     switch( onErr
c560: 6f 72 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  or ){.      case
c570: 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 7b 0a 20   OE_Replace: {. 
c580: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
c590: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
c5a0: 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  ce );.        ad
c5b0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
c5c0: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
c5d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
c5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c5f0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67   OP_NotNull, reg
c600: 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20 61 64 64  NewData+1+i, add
c610: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  r1);.          V
c620: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
c640: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c650: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44  pTab->aCol[i].pD
c660: 66 6c 74 2c 20 72 65 67 4e 65 77 44 61 74 61 2b  flt, regNewData+
c670: 31 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71  1+i);.        sq
c680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c690: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72  v, OP_NotNull, r
c6a0: 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20 61  egNewData+1+i, a
c6b0: 64 64 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ddr1);.         
c6c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c6d0: 3b 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ;.        onErro
c6e0: 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r = OE_Abort;.  
c6f0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
c700: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 4f  rough into the O
c710: 45 5f 41 62 6f 72 74 20 63 61 73 65 20 74 6f 20  E_Abort case to 
c720: 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
c730: 61 74 20 72 75 6e 73 0a 20 20 20 20 20 20 20 20  at runs.        
c740: 2a 2a 20 69 66 20 62 6f 74 68 20 74 68 65 20 69  ** if both the i
c750: 6e 70 75 74 20 61 6e 64 20 74 68 65 20 64 65 66  nput and the def
c760: 61 75 6c 74 20 76 61 6c 75 65 20 61 72 65 20 4e  ault value are N
c770: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ULL */.      }. 
c780: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f       case OE_Abo
c790: 72 74 3a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rt:.        sqli
c7a0: 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
c7b0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se);.        /* 
c7c0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
c7d0: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
c7e0: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61  llback:.      ca
c7f0: 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20  se OE_Fail: {.  
c800: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67        char *zMsg
c810: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
c820: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
c830: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
c870: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
c880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c890: 76 2c 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  v, OP_HaltIfNull
c8a0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
c8b0: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 2c 20 6f 6e 45  INT_NOTNULL, onE
c8c0: 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rror,.          
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8e0: 72 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b  regNewData+1+i);
c8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c900: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
c910: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
c920: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c940: 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 4e  , P5_ConstraintN
c950: 6f 74 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  otNull);.       
c960: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c970: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
c980: 64 72 31 20 29 20 73 71 6c 69 74 65 33 56 64 62  dr1 ) sqlite3Vdb
c990: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c9a0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 20   addr1);.       
c9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c9c0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
c9d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c9e0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e   onError==OE_Ign
c9f0: 6f 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ore );.        s
ca00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ca10: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
ca20: 65 67 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20 69  egNewData+1+i, i
ca30: 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20  gnoreDest);.    
ca40: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ca50: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (v);.        bre
ca60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ca70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  }.  }..  /* Test
ca80: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
ca90: 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66 6e  raints.  */.#ifn
caa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cab0: 43 48 45 43 4b 0a 20 20 69 66 28 20 70 54 61 62  CHECK.  if( pTab
cac0: 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d  ->pCheck && (db-
cad0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
cae0: 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30  IgnoreChecks)==0
caf0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cb00: 20 2a 70 43 68 65 63 6b 20 3d 20 70 54 61 62 2d   *pCheck = pTab-
cb10: 3e 70 43 68 65 63 6b 3b 0a 20 20 20 20 70 50 61  >pCheck;.    pPa
cb20: 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20  rse->iSelfTab = 
cb30: 2d 28 72 65 67 4e 65 77 44 61 74 61 2b 31 29 3b  -(regNewData+1);
cb40: 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f  .    onError = o
cb50: 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45  verrideError!=OE
cb60: 5f 44 65 66 61 75 6c 74 20 3f 20 6f 76 65 72 72  _Default ? overr
cb70: 69 64 65 45 72 72 6f 72 20 3a 20 4f 45 5f 41 62  ideError : OE_Ab
cb80: 6f 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ort;.    for(i=0
cb90: 3b 20 69 3c 70 43 68 65 63 6b 2d 3e 6e 45 78 70  ; i<pCheck->nExp
cba0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
cbb0: 6e 74 20 61 6c 6c 4f 6b 3b 0a 20 20 20 20 20 20  nt allOk;.      
cbc0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43  Expr *pExpr = pC
cbd0: 68 65 63 6b 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  heck->a[i].pExpr
cbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 69 43 68  ;.      if( aiCh
cbf0: 6e 67 0a 20 20 20 20 20 20 20 26 26 20 21 73 71  ng.       && !sq
cc00: 6c 69 74 65 33 45 78 70 72 52 65 66 65 72 65 6e  lite3ExprReferen
cc10: 63 65 73 55 70 64 61 74 65 64 43 6f 6c 75 6d 6e  cesUpdatedColumn
cc20: 28 70 45 78 70 72 2c 20 61 69 43 68 6e 67 2c 20  (pExpr, aiChng, 
cc30: 70 6b 43 68 6e 67 29 0a 20 20 20 20 20 20 29 7b  pkChng).      ){
cc40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cc50: 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
cc60: 73 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  s do not referen
cc70: 63 65 20 61 6e 79 20 6f 66 20 74 68 65 20 63 6f  ce any of the co
cc80: 6c 75 6d 6e 73 20 62 65 69 6e 67 0a 20 20 20 20  lumns being.    
cc90: 20 20 20 20 2a 2a 20 75 70 64 61 74 65 64 20 73      ** updated s
cca0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  o there is no po
ccb0: 69 6e 74 20 69 74 20 76 65 72 69 66 79 69 6e 67  int it verifying
ccc0: 20 74 68 65 20 63 68 65 63 6b 20 63 6f 6e 73 74   the check const
ccd0: 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  raint */.       
cce0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ccf0: 20 7d 0a 20 20 20 20 20 20 61 6c 6c 4f 6b 20 3d   }.      allOk =
cd00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
cd10: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  Label(pParse);. 
cd20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd30: 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
cd40: 76 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 20  v, onError);.   
cd50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
cd60: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
cd70: 70 72 2c 20 61 6c 6c 4f 6b 2c 20 53 51 4c 49 54  pr, allOk, SQLIT
cd80: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
cd90: 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72       if( onError
cda0: 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
cdb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cdc0: 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72 65  beGoto(v, ignore
cdd0: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Dest);.      }el
cde0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
cdf0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 43 68 65 63 6b   *zName = pCheck
ce00: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
ce10: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
ce20: 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 70 54 61  =0 ) zName = pTa
ce30: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
ce40: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
ce50: 45 5f 52 65 70 6c 61 63 65 20 29 20 6f 6e 45 72  E_Replace ) onEr
ce60: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 20  ror = OE_Abort; 
ce70: 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 35 36 39 2d  /* IMP: R-15569-
ce80: 36 33 36 32 35 20 2a 2f 0a 20 20 20 20 20 20 20  63625 */.       
ce90: 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
cea0: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53  traint(pParse, S
ceb0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
cec0: 5f 43 48 45 43 4b 2c 0a 20 20 20 20 20 20 20 20  _CHECK,.        
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a        onError, z
cef0: 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53 49 45  Name, P4_TRANSIE
cf00: 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT,.            
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 43    P5_ConstraintC
cf30: 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  heck);.      }. 
cf40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cf50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
cf60: 61 6c 6c 4f 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  allOk);.    }.  
cf70: 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
cf80: 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  ab = 0;.  }.#end
cf90: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
cfa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
cfb0: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 55 4e 49 51 55  ) */..  /* UNIQU
cfc0: 45 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45  E and PRIMARY KE
cfd0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 68  Y constraints sh
cfe0: 6f 75 6c 64 20 62 65 20 68 61 6e 64 6c 65 64 20  ould be handled 
cff0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
d000: 0a 20 20 2a 2a 20 6f 72 64 65 72 3a 0a 20 20 2a  .  ** order:.  *
d010: 2a 0a 20 20 2a 2a 20 20 20 28 31 29 20 20 4f 45  *.  **   (1)  OE
d020: 5f 55 70 64 61 74 65 0a 20 20 2a 2a 20 20 20 28  _Update.  **   (
d030: 32 29 20 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45  2)  OE_Abort, OE
d040: 5f 46 61 69 6c 2c 20 4f 45 5f 52 6f 6c 6c 62 61  _Fail, OE_Rollba
d050: 63 6b 2c 20 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ck, OE_Ignore.  
d060: 2a 2a 20 20 20 28 33 29 20 20 4f 45 5f 52 65 70  **   (3)  OE_Rep
d070: 6c 61 63 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  lace.  **.  ** O
d080: 45 5f 46 61 69 6c 20 61 6e 64 20 4f 45 5f 49 67  E_Fail and OE_Ig
d090: 6e 6f 72 65 20 6d 75 73 74 20 68 61 70 70 65 6e  nore must happen
d0a0: 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
d0b0: 67 65 73 20 61 72 65 20 6d 61 64 65 2e 0a 20 20  ges are made..  
d0c0: 2a 2a 20 4f 45 5f 55 70 64 61 74 65 20 67 75 61  ** OE_Update gua
d0d0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6f 6e 6c  rantees that onl
d0e0: 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 77  y a single row w
d0f0: 69 6c 6c 20 63 68 61 6e 67 65 2c 20 73 6f 20 69  ill change, so i
d100: 74 0a 20 20 2a 2a 20 6d 75 73 74 20 68 61 70 70  t.  ** must happ
d110: 65 6e 20 62 65 66 6f 72 65 20 4f 45 5f 52 65 70  en before OE_Rep
d120: 6c 61 63 65 2e 20 20 54 65 63 68 6e 69 63 61 6c  lace.  Technical
d130: 6c 79 2c 20 4f 45 5f 41 62 6f 72 74 20 61 6e 64  ly, OE_Abort and
d140: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a   OE_Rollback.  *
d150: 2a 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 69  * could happen i
d160: 6e 20 61 6e 79 20 6f 72 64 65 72 2c 20 62 75 74  n any order, but
d170: 20 74 68 65 79 20 61 72 65 20 67 72 6f 75 70 65   they are groupe
d180: 64 20 75 70 20 66 72 6f 6e 74 20 66 6f 72 0a 20  d up front for. 
d190: 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2e   ** convenience.
d1a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 31 38 2d  .  **.  ** 2018-
d1b0: 30 38 2d 31 34 3a 20 54 69 63 6b 65 74 20 68 74  08-14: Ticket ht
d1c0: 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  tps://www.sqlite
d1d0: 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 39 30  .org/src/info/90
d1e0: 38 66 30 30 31 34 38 33 39 38 32 63 34 33 0a 20  8f001483982c43. 
d1f0: 20 2a 2a 20 54 68 65 20 6f 72 64 65 72 20 6f 66   ** The order of
d200: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73 65   constraints use
d210: 64 20 74 6f 20 68 61 76 65 20 4f 45 5f 55 70 64  d to have OE_Upd
d220: 61 74 65 20 61 73 20 28 32 29 20 61 6e 64 20 4f  ate as (2) and O
d230: 45 5f 41 62 6f 72 74 0a 20 20 2a 2a 20 61 6e 64  E_Abort.  ** and
d240: 20 73 6f 20 66 6f 72 74 68 20 61 73 20 28 31 29   so forth as (1)
d250: 2e 20 42 75 74 20 61 70 70 61 72 65 6e 74 6c 79  . But apparently
d260: 20 50 6f 73 74 67 72 65 53 51 4c 20 63 68 65 63   PostgreSQL chec
d270: 6b 73 20 74 68 65 20 4f 45 5f 55 70 64 61 74 65  ks the OE_Update
d280: 0a 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  .  ** constraint
d290: 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 74 68 65   before any othe
d2a0: 72 73 2c 20 73 6f 20 69 74 20 68 61 64 20 74 6f  rs, so it had to
d2b0: 20 62 65 20 6d 6f 76 65 64 2e 0a 20 20 2a 2a 0a   be moved..  **.
d2c0: 20 20 2a 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    ** Constraint 
d2d0: 63 68 65 63 6b 69 6e 67 20 63 6f 64 65 20 69 73  checking code is
d2e0: 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68   generated in th
d2f0: 69 73 20 6f 72 64 65 72 3a 0a 20 20 2a 2a 20 20  is order:.  **  
d300: 20 28 41 29 20 20 54 68 65 20 72 6f 77 69 64 20   (A)  The rowid 
d310: 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
d320: 20 20 28 42 29 20 20 55 6e 69 71 75 65 20 69 6e    (B)  Unique in
d330: 64 65 78 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  dex constraints 
d340: 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65  that do not have
d350: 20 4f 45 5f 52 65 70 6c 61 63 65 20 61 73 20 74   OE_Replace as t
d360: 68 65 69 72 0a 20 20 2a 2a 20 20 20 20 20 20 20  heir.  **       
d370: 20 64 65 66 61 75 6c 74 20 63 6f 6e 66 6c 69 63   default conflic
d380: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72  t resolution str
d390: 61 74 65 67 79 0a 20 20 2a 2a 20 20 20 28 43 29  ategy.  **   (C)
d3a0: 20 20 55 6e 69 71 75 65 20 69 6e 64 65 78 20 74    Unique index t
d3b0: 68 61 74 20 64 6f 20 75 73 65 20 4f 45 5f 52 65  hat do use OE_Re
d3c0: 70 6c 61 63 65 20 62 79 20 64 65 66 61 75 6c 74  place by default
d3d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
d3e0: 6f 72 64 65 72 69 6e 67 20 6f 66 20 28 32 29 20  ordering of (2) 
d3f0: 61 6e 64 20 28 33 29 20 69 73 20 61 63 63 6f 6d  and (3) is accom
d400: 70 6c 69 73 68 65 64 20 62 79 20 6d 61 6b 69 6e  plished by makin
d410: 67 20 73 75 72 65 20 74 68 65 20 6c 69 6e 6b 65  g sure the linke
d420: 64 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 69  d.  ** list of i
d430: 6e 64 65 78 65 73 20 61 74 74 61 63 68 65 64 20  ndexes attached 
d440: 74 6f 20 61 20 74 61 62 6c 65 20 70 75 74 73 20  to a table puts 
d450: 61 6c 6c 20 4f 45 5f 52 65 70 6c 61 63 65 20 69  all OE_Replace i
d460: 6e 64 65 78 65 73 20 6c 61 73 74 0a 20 20 2a 2a  ndexes last.  **
d470: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 53   in the list.  S
d480: 65 65 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  ee sqlite3Create
d490: 49 6e 64 65 78 28 29 20 66 6f 72 20 77 68 65 72  Index() for wher
d4a0: 65 20 74 68 61 74 20 68 61 70 70 65 6e 73 2e 0a  e that happens..
d4b0: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 55 70 73    */..  if( pUps
d4c0: 65 72 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ert ){.    if( p
d4d0: 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 54  Upsert->pUpsertT
d4e0: 61 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  arget==0 ){.    
d4f0: 20 20 2f 2a 20 41 6e 20 4f 4e 20 43 4f 4e 46 4c    /* An ON CONFL
d500: 49 43 54 20 44 4f 20 4e 4f 54 48 49 4e 47 20 63  ICT DO NOTHING c
d510: 6c 61 75 73 65 2c 20 77 69 74 68 6f 75 74 20 61  lause, without a
d520: 20 63 6f 6e 73 74 72 61 69 6e 74 2d 74 61 72 67   constraint-targ
d530: 65 74 2e 0a 20 20 20 20 20 20 2a 2a 20 4d 61 6b  et..      ** Mak
d540: 65 20 61 6c 6c 20 75 6e 69 71 75 65 20 63 6f 6e  e all unique con
d550: 73 74 72 61 69 6e 74 20 72 65 73 6f 6c 75 74 69  straint resoluti
d560: 6f 6e 20 62 65 20 4f 45 5f 49 67 6e 6f 72 65 20  on be OE_Ignore 
d570: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
d580: 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72   pUpsert->pUpser
d590: 74 53 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  tSet==0 );.     
d5a0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 20 3d   overrideError =
d5b0: 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 20 20   OE_Ignore;.    
d5c0: 20 20 70 55 70 73 65 72 74 20 3d 20 30 3b 0a 20    pUpsert = 0;. 
d5d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 55     }else if( (pU
d5e0: 70 49 64 78 20 3d 20 70 55 70 73 65 72 74 2d 3e  pIdx = pUpsert->
d5f0: 70 55 70 73 65 72 74 49 64 78 29 21 3d 30 20 29  pUpsertIdx)!=0 )
d600: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
d610: 65 20 63 6f 6e 73 74 72 61 69 6e 74 2d 74 61 72  e constraint-tar
d620: 67 65 74 20 75 6e 69 71 75 65 6e 65 73 73 20 63  get uniqueness c
d630: 68 65 63 6b 20 6d 75 73 74 20 62 65 20 72 75 6e  heck must be run
d640: 20 66 69 72 73 74 2e 0a 20 20 20 20 20 20 2a 2a   first..      **
d650: 20 4a 75 6d 70 20 74 6f 20 74 68 61 74 20 75 6e   Jump to that un
d660: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 20 6e  iqueness check n
d670: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 75 70 73 65  ow */.      upse
d680: 72 74 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33  rtJump = sqlite3
d690: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
d6a0: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 56 64  _Goto);.      Vd
d6b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 55  beComment((v, "U
d6c0: 50 53 45 52 54 20 63 6f 6e 73 74 72 61 69 6e 74  PSERT constraint
d6d0: 20 67 6f 65 73 20 66 69 72 73 74 22 29 29 3b 0a   goes first"));.
d6e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d6f0: 49 66 20 72 6f 77 69 64 20 69 73 20 63 68 61 6e  If rowid is chan
d700: 67 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20  ging, make sure 
d710: 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 64 6f  the new rowid do
d720: 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  es not previousl
d730: 79 0a 20 20 2a 2a 20 65 78 69 73 74 20 69 6e 20  y.  ** exist in 
d740: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
d750: 20 20 69 66 28 20 70 6b 43 68 6e 67 20 26 26 20    if( pkChng && 
d760: 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  pPk==0 ){.    in
d770: 74 20 61 64 64 72 52 6f 77 69 64 4f 6b 20 3d 20  t addrRowidOk = 
d780: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d790: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
d7a0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
d7b0: 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20   what action to 
d7c0: 74 61 6b 65 20 69 6e 20 63 61 73 65 20 6f 66 20  take in case of 
d7d0: 61 20 72 6f 77 69 64 20 63 6f 6c 6c 69 73 69 6f  a rowid collisio
d7e0: 6e 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72  n */.    onError
d7f0: 20 3d 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66   = pTab->keyConf
d800: 3b 0a 20 20 20 20 69 66 28 20 6f 76 65 72 72 69  ;.    if( overri
d810: 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61  deError!=OE_Defa
d820: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
d830: 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45  rror = overrideE
d840: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rror;.    }else 
d850: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
d860: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
d870: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
d880: 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ort;.    }..    
d890: 2f 2a 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  /* figure out wh
d8a0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 75 70 73  ether or not ups
d8b0: 65 72 74 20 61 70 70 6c 69 65 73 20 69 6e 20 74  ert applies in t
d8c0: 68 69 73 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  his case */.    
d8d0: 69 66 28 20 70 55 70 73 65 72 74 20 26 26 20 70  if( pUpsert && p
d8e0: 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 49  Upsert->pUpsertI
d8f0: 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  dx==0 ){.      i
d900: 66 28 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73  f( pUpsert->pUps
d910: 65 72 74 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ertSet==0 ){.   
d920: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
d930: 45 5f 49 67 6e 6f 72 65 3b 20 20 2f 2a 20 44 4f  E_Ignore;  /* DO
d940: 20 4e 4f 54 48 49 4e 47 20 69 73 20 74 68 65 20   NOTHING is the 
d950: 73 61 6d 65 20 61 73 20 49 4e 53 45 52 54 20 4f  same as INSERT O
d960: 52 20 49 47 4e 4f 52 45 20 2a 2f 0a 20 20 20 20  R IGNORE */.    
d970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d980: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 55 70   onError = OE_Up
d990: 64 61 74 65 3b 20 20 2f 2a 20 44 4f 20 55 50 44  date;  /* DO UPD
d9a0: 41 54 45 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ATE */.      }. 
d9b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
d9c0: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 74 6f 20  the response to 
d9d0: 61 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74  a rowid conflict
d9e0: 20 69 73 20 52 45 50 4c 41 43 45 20 62 75 74 20   is REPLACE but 
d9f0: 74 68 65 20 72 65 73 70 6f 6e 73 65 0a 20 20 20  the response.   
da00: 20 2a 2a 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65   ** to some othe
da10: 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
da20: 69 6e 74 20 69 73 20 46 41 49 4c 20 6f 72 20 49  int is FAIL or I
da30: 47 4e 4f 52 45 2c 20 74 68 65 6e 20 77 65 20 6e  GNORE, then we n
da40: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  eed.    ** to de
da50: 66 65 72 20 74 68 65 20 72 75 6e 6e 69 6e 67 20  fer the running 
da60: 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6e  of the rowid con
da70: 66 6c 69 63 74 20 63 68 65 63 6b 69 6e 67 20 75  flict checking u
da80: 6e 74 69 6c 20 61 66 74 65 72 0a 20 20 20 20 2a  ntil after.    *
da90: 2a 20 74 68 65 20 55 4e 49 51 55 45 20 63 6f 6e  * the UNIQUE con
daa0: 73 74 72 61 69 6e 74 73 20 68 61 76 65 20 72 75  straints have ru
dab0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
dac0: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ( onError==OE_Re
dad0: 70 6c 61 63 65 20 20 20 20 20 20 2f 2a 20 49 50  place      /* IP
dae0: 4b 20 72 75 6c 65 20 69 73 20 52 45 50 4c 41 43  K rule is REPLAC
daf0: 45 20 2a 2f 0a 20 20 20 20 20 26 26 20 6f 6e 45  E */.     && onE
db00: 72 72 6f 72 21 3d 6f 76 65 72 72 69 64 65 45 72  rror!=overrideEr
db10: 72 6f 72 20 20 20 2f 2a 20 52 75 6c 65 73 20 66  ror   /* Rules f
db20: 6f 72 20 6f 74 68 65 72 20 63 6f 6e 74 72 61 69  or other contrai
db30: 6e 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  nts are differen
db40: 74 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 54 61  t */.     && pTa
db50: 62 2d 3e 70 49 6e 64 65 78 20 20 20 20 20 20 20  b->pIndex       
db60: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 65        /* There e
db70: 78 69 73 74 20 6f 74 68 65 72 20 63 6f 6e 73 74  xist other const
db80: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 29 7b  raints */.    ){
db90: 0a 20 20 20 20 20 20 69 70 6b 54 6f 70 20 3d 20  .      ipkTop = 
dba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbb0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 2b 31 3b  0(v, OP_Goto)+1;
dbc0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
dbd0: 6e 74 28 28 76 2c 20 22 64 65 66 65 72 20 49 50  nt((v, "defer IP
dbe0: 4b 20 52 45 50 4c 41 43 45 20 75 6e 74 69 6c 20  K REPLACE until 
dbf0: 6c 61 73 74 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  last"));.    }..
dc00: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
dc10: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 6b 43   ){.      /* pkC
dc20: 68 6e 67 21 3d 30 20 64 6f 65 73 20 6e 6f 74 20  hng!=0 does not 
dc30: 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 72 6f  mean that the ro
dc40: 77 69 64 20 68 61 73 20 63 68 61 6e 67 65 64 2c  wid has changed,
dc50: 20 6f 6e 6c 79 20 74 68 61 74 0a 20 20 20 20 20   only that.     
dc60: 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 68 61 76   ** it might hav
dc70: 65 20 63 68 61 6e 67 65 64 2e 20 20 53 6b 69 70  e changed.  Skip
dc80: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6c 6f   the conflict lo
dc90: 67 69 63 20 62 65 6c 6f 77 20 69 66 20 74 68 65  gic below if the
dca0: 20 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20   rowid.      ** 
dcb0: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  is unchanged. */
dcc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dcd0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
dce0: 71 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20 61  q, regNewData, a
dcf0: 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4f  ddrRowidOk, regO
dd00: 6c 64 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  ldData);.      s
dd10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
dd20: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
dd30: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
dd40: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dd50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
dd60: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
dd70: 6e 65 77 20 72 6f 77 69 64 20 61 6c 72 65 61 64  new rowid alread
dd80: 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
dd90: 74 61 62 6c 65 2e 20 20 53 6b 69 70 0a 20 20 20  table.  Skip.   
dda0: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
ddb0: 67 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67 69 63  g conflict logic
ddc0: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
ddd0: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   */.    VdbeNoop
dde0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 75 6e 69  Comment((v, "uni
ddf0: 71 75 65 6e 65 73 73 20 63 68 65 63 6b 20 66 6f  queness check fo
de00: 72 20 52 4f 57 49 44 22 29 29 3b 0a 20 20 20 20  r ROWID"));.    
de10: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
de20: 79 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 6f 6e  yAbortable(v, on
de30: 45 72 72 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  Error);.    sqli
de40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
de50: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
de60: 44 61 74 61 43 75 72 2c 20 61 64 64 72 52 6f 77  DataCur, addrRow
de70: 69 64 4f 6b 2c 20 72 65 67 4e 65 77 44 61 74 61  idOk, regNewData
de80: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
de90: 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 73 77 69  age(v);..    swi
dea0: 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a  tch( onError ){.
deb0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
dec0: 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  .        onError
ded0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
dee0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
def0: 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  u into the next 
df00: 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  case */.      }.
df10: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
df20: 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61  llback:.      ca
df30: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20  se OE_Abort:.   
df40: 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
df50: 20 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   {.        testc
df60: 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  ase( onError==OE
df70: 5f 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  _Rollback );.   
df80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
df90: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
dfa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
dfb0: 63 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f  case( onError==O
dfc0: 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
dfd0: 20 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f    sqlite3RowidCo
dfe0: 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
dff0: 20 6f 6e 45 72 72 6f 72 2c 20 70 54 61 62 29 3b   onError, pTab);
e000: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
e020: 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 7b  se OE_Replace: {
e030: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
e040: 68 65 72 65 20 61 72 65 20 44 45 4c 45 54 45 20  here are DELETE 
e050: 74 72 69 67 67 65 72 73 20 6f 6e 20 74 68 69 73  triggers on this
e060: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 20   table and the. 
e070: 20 20 20 20 20 20 20 2a 2a 20 72 65 63 75 72 73         ** recurs
e080: 69 76 65 2d 74 72 69 67 67 65 72 73 20 66 6c 61  ive-triggers fla
e090: 67 20 69 73 20 73 65 74 2c 20 63 61 6c 6c 20 47  g is set, call G
e0a0: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
e0b0: 28 29 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  () to.        **
e0c0: 20 72 65 6d 6f 76 65 20 74 68 65 20 63 6f 6e 66   remove the conf
e0d0: 6c 69 63 74 69 6e 67 20 72 6f 77 20 66 72 6f 6d  licting row from
e0e0: 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 69 73   the table. This
e0f0: 20 77 69 6c 6c 20 66 69 72 65 0a 20 20 20 20 20   will fire.     
e100: 20 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65     ** the trigge
e110: 72 73 20 61 6e 64 20 72 65 6d 6f 76 65 20 62 6f  rs and remove bo
e120: 74 68 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  th the table and
e130: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e   index b-tree en
e140: 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
e150: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  *.        ** Oth
e160: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
e170: 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73   are no triggers
e180: 20 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76   or the recursiv
e190: 65 2d 74 72 69 67 67 65 72 73 0a 20 20 20 20 20  e-triggers.     
e1a0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 6e 6f     ** flag is no
e1b0: 74 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 74  t set, but the t
e1c0: 61 62 6c 65 20 68 61 73 20 6f 6e 65 20 6f 72 20  able has one or 
e1d0: 6d 6f 72 65 20 69 6e 64 65 78 65 73 2c 20 63 61  more indexes, ca
e1e0: 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 47  ll .        ** G
e1f0: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
e200: 65 6c 65 74 65 28 29 2e 20 54 68 69 73 20 72 65  elete(). This re
e210: 6d 6f 76 65 73 20 74 68 65 20 69 6e 64 65 78 20  moves the index 
e220: 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73 20 0a  b-tree entries .
e230: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 2e          ** only.
e240: 20 54 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65   The table b-tre
e250: 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
e260: 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20  replaced by the 
e270: 6e 65 77 20 65 6e 74 72 79 20 0a 20 20 20 20 20  new entry .     
e280: 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 69 73     ** when it is
e290: 20 69 6e 73 65 72 74 65 64 2e 20 20 0a 20 20 20   inserted.  .   
e2a0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e2b0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 47 65 6e  ** If either Gen
e2c0: 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 29  erateRowDelete()
e2d0: 20 6f 72 20 47 65 6e 65 72 61 74 65 52 6f 77 49   or GenerateRowI
e2e0: 6e 64 65 78 44 65 6c 65 74 65 28 29 20 69 73 20  ndexDelete() is 
e2f0: 63 61 6c 6c 65 64 2c 0a 20 20 20 20 20 20 20 20  called,.        
e300: 2a 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 20 4d  ** also invoke M
e310: 75 6c 74 69 57 72 69 74 65 28 29 20 74 6f 20 69  ultiWrite() to i
e320: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 69  ndicate that thi
e330: 73 20 56 44 42 45 20 6d 61 79 20 72 65 71 75 69  s VDBE may requi
e340: 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  re.        ** st
e350: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
e360: 20 28 69 66 20 74 68 65 20 73 74 61 74 65 6d 65   (if the stateme
e370: 6e 74 20 69 73 20 61 62 6f 72 74 65 64 20 61 66  nt is aborted af
e380: 74 65 72 20 74 68 65 20 64 65 6c 65 74 65 0a 20  ter the delete. 
e390: 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 73 20         ** takes 
e3a0: 70 6c 61 63 65 29 2e 20 45 61 72 6c 69 65 72 20  place). Earlier 
e3b0: 76 65 72 73 69 6f 6e 73 20 63 61 6c 6c 65 64 20  versions called 
e3c0: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
e3d0: 65 28 29 20 72 65 67 61 72 64 6c 65 73 73 2c 0a  e() regardless,.
e3e0: 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 62          ** but b
e3f0: 65 69 6e 67 20 6d 6f 72 65 20 73 65 6c 65 63 74  eing more select
e400: 69 76 65 20 68 65 72 65 20 61 6c 6c 6f 77 73 20  ive here allows 
e410: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 3a  statements like:
e420: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
e430: 20 20 20 20 2a 2a 20 20 20 52 45 50 4c 41 43 45      **   REPLACE
e440: 20 49 4e 54 4f 20 74 28 72 6f 77 69 64 29 20 56   INTO t(rowid) V
e450: 41 4c 55 45 53 28 24 6e 65 77 72 6f 77 69 64 29  ALUES($newrowid)
e460: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
e470: 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 77 69      ** to run wi
e480: 74 68 6f 75 74 20 61 20 73 74 61 74 65 6d 65 6e  thout a statemen
e490: 74 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  t journal if the
e4a0: 72 65 20 61 72 65 20 6e 6f 20 69 6e 64 65 78 65  re are no indexe
e4b0: 73 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s on the.       
e4c0: 20 2a 2a 20 74 61 62 6c 65 2e 0a 20 20 20 20 20   ** table..     
e4d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 72     */.        Tr
e4e0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
e4f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
e500: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
e510: 45 5f 52 65 63 54 72 69 67 67 65 72 73 20 29 7b  E_RecTriggers ){
e520: 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
e530: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
e540: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
e550: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45  e, pTab, TK_DELE
e560: 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 0, 0);.     
e570: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e580: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71 6c   pTrigger || sql
e590: 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 70  ite3FkRequired(p
e5a0: 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20  Parse, pTab, 0, 
e5b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
e5c0: 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
e5d0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
e5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
e5f0: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50  rateRowDelete(pP
e600: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 54 72 69  arse, pTab, pTri
e610: 67 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c 20  gger, iDataCur, 
e620: 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20  iIdxCur,.       
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4e              regN
e650: 65 77 44 61 74 61 2c 20 31 2c 20 30 2c 20 4f 45  ewData, 1, 0, OE
e660: 5f 52 65 70 6c 61 63 65 2c 20 31 2c 20 2d 31 29  _Replace, 1, -1)
e670: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e680: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e690: 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
e6a0: 48 4f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 61  HOOK.          a
e6b0: 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
e6c0: 70 54 61 62 29 20 29 3b 0a 20 20 20 20 20 20 20  pTab) );.       
e6d0: 20 20 20 2f 2a 20 54 68 69 73 20 4f 50 5f 44 65     /* This OP_De
e6e0: 6c 65 74 65 20 6f 70 63 6f 64 65 20 66 69 72 65  lete opcode fire
e6f0: 73 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  s the pre-update
e700: 2d 68 6f 6f 6b 20 6f 6e 6c 79 2e 20 49 74 20 64  -hook only. It d
e710: 6f 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  oes.          **
e720: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 20   not modify the 
e730: 62 2d 74 72 65 65 2e 20 49 74 20 69 73 20 6d 6f  b-tree. It is mo
e740: 72 65 20 65 66 66 69 63 69 65 6e 74 20 74 6f 20  re efficient to 
e750: 6c 65 74 20 74 68 65 20 63 6f 6d 69 6e 67 0a 20  let the coming. 
e760: 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 49           ** OP_I
e770: 6e 73 65 72 74 20 72 65 70 6c 61 63 65 20 74 68  nsert replace th
e780: 65 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  e existing entry
e790: 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20 64   than it is to d
e7a0: 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
e7b0: 20 20 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20      ** existing 
e7c0: 65 6e 74 72 79 20 61 6e 64 20 74 68 65 6e 20 69  entry and then i
e7d0: 6e 73 65 72 74 20 61 20 6e 65 77 20 6f 6e 65 2e  nsert a new one.
e7e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
e7f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e800: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 44  v, OP_Delete, iD
e810: 61 74 61 43 75 72 2c 20 4f 50 46 4c 41 47 5f 49  ataCur, OPFLAG_I
e820: 53 4e 4f 4f 50 29 3b 0a 20 20 20 20 20 20 20 20  SNOOP);.        
e830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
e840: 65 6e 64 50 34 28 76 2c 20 70 54 61 62 2c 20 50  endP4(v, pTab, P
e850: 34 5f 54 41 42 4c 45 29 3b 0a 23 65 6e 64 69 66  4_TABLE);.#endif
e860: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e870: 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
e880: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
e890: 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 29  ( pTab->pIndex )
e8a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
e8b0: 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
e8c0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
e8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
e8e0: 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65  rateRowIndexDele
e8f0: 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  te(pParse, pTab,
e900: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
e910: 75 72 2c 30 2c 2d 31 29 3b 0a 20 20 20 20 20 20  ur,0,-1);.      
e920: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e930: 20 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c          seenRepl
e940: 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
e950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e960: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e970: 4d 49 54 5f 55 50 53 45 52 54 0a 20 20 20 20 20  MIT_UPSERT.     
e980: 20 63 61 73 65 20 4f 45 5f 55 70 64 61 74 65 3a   case OE_Update:
e990: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
e9a0: 65 33 55 70 73 65 72 74 44 6f 55 70 64 61 74 65  e3UpsertDoUpdate
e9b0: 28 70 50 61 72 73 65 2c 20 70 55 70 73 65 72 74  (pParse, pUpsert
e9c0: 2c 20 70 54 61 62 2c 20 30 2c 20 69 44 61 74 61  , pTab, 0, iData
e9d0: 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  Cur);.        /*
e9e0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
e9f0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
ea00: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
ea10: 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  nore: {.        
ea20: 74 65 73 74 63 61 73 65 28 20 6f 6e 45 72 72 6f  testcase( onErro
ea30: 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a  r==OE_Ignore );.
ea40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ea50: 64 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72  dbeGoto(v, ignor
ea60: 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  eDest);.        
ea70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ea80: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ea90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
eaa0: 28 76 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b 29  (v, addrRowidOk)
eab0: 3b 0a 20 20 20 20 69 66 28 20 69 70 6b 54 6f 70  ;.    if( ipkTop
eac0: 20 29 7b 0a 20 20 20 20 20 20 69 70 6b 42 6f 74   ){.      ipkBot
ead0: 74 6f 6d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  tom = sqlite3Vdb
eae0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
eaf0: 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  to);.      sqlit
eb00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
eb10: 2c 20 69 70 6b 54 6f 70 2d 31 29 3b 0a 20 20 20  , ipkTop-1);.   
eb20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73   }.  }..  /* Tes
eb30: 74 20 61 6c 6c 20 55 4e 49 51 55 45 20 63 6f 6e  t all UNIQUE con
eb40: 73 74 72 61 69 6e 74 73 20 62 79 20 63 72 65 61  straints by crea
eb50: 74 69 6e 67 20 65 6e 74 72 69 65 73 20 66 6f 72  ting entries for
eb60: 20 65 61 63 68 20 55 4e 49 51 55 45 0a 20 20 2a   each UNIQUE.  *
eb70: 2a 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 69  * index and maki
eb80: 6e 67 20 73 75 72 65 20 74 68 61 74 20 64 75 70  ng sure that dup
eb90: 6c 69 63 61 74 65 20 65 6e 74 72 69 65 73 20 64  licate entries d
eba0: 6f 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  o not already ex
ebb0: 69 73 74 2e 0a 20 20 2a 2a 20 43 6f 6d 70 75 74  ist..  ** Comput
ebc0: 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72 65  e the revised re
ebd0: 63 6f 72 64 20 65 6e 74 72 69 65 73 20 66 6f 72  cord entries for
ebe0: 20 69 6e 64 69 63 65 73 20 61 73 20 77 65 20 67   indices as we g
ebf0: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  o..  **.  ** Thi
ec00: 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 68 61 6e 64  s loop also hand
ec10: 6c 65 73 20 74 68 65 20 63 61 73 65 20 6f 66 20  les the case of 
ec20: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
ec30: 69 6e 64 65 78 20 66 6f 72 20 61 0a 20 20 2a 2a  index for a.  **
ec40: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
ec50: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  able..  */.  for
ec60: 28 69 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62  (ix=0, pIdx=pTab
ec70: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
ec80: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
ec90: 2c 20 69 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , ix++){.    int
eca0: 20 72 65 67 49 64 78 3b 20 20 20 20 20 20 20 20   regIdx;        
ecb0: 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 72 65    /* Range of re
ecc0: 67 69 73 74 65 72 73 20 68 6f 6c 64 20 63 6f 6e  gisters hold con
ecd0: 65 6e 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a  ent for pIdx */.
ece0: 20 20 20 20 69 6e 74 20 72 65 67 52 3b 20 20 20      int regR;   
ecf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67           /* Rang
ed00: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68  e of registers h
ed10: 6f 6c 64 69 6e 67 20 63 6f 6e 66 6c 69 63 74 69  olding conflicti
ed20: 6e 67 20 50 4b 20 2a 2f 0a 20 20 20 20 69 6e 74  ng PK */.    int
ed30: 20 69 54 68 69 73 43 75 72 3b 20 20 20 20 20 20   iThisCur;      
ed40: 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20    /* Cursor for 
ed50: 74 68 69 73 20 55 4e 49 51 55 45 20 69 6e 64 65  this UNIQUE inde
ed60: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  x */.    int add
ed70: 72 55 6e 69 71 75 65 4f 6b 3b 20 20 20 20 2f 2a  rUniqueOk;    /*
ed80: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
ed90: 65 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  e UNIQUE constra
eda0: 69 6e 74 20 69 73 20 73 61 74 69 73 66 69 65 64  int is satisfied
edb0: 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 61 52 65   */..    if( aRe
edc0: 67 49 64 78 5b 69 78 5d 3d 3d 30 20 29 20 63 6f  gIdx[ix]==0 ) co
edd0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70  ntinue;  /* Skip
ede0: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 64 6f   indices that do
edf0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20   not change */. 
ee00: 20 20 20 69 66 28 20 70 55 70 49 64 78 3d 3d 70     if( pUpIdx==p
ee10: 49 64 78 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Idx ){.      add
ee20: 72 55 6e 69 71 75 65 4f 6b 20 3d 20 75 70 73 65  rUniqueOk = upse
ee30: 72 74 4a 75 6d 70 2b 31 3b 0a 20 20 20 20 20 20  rtJump+1;.      
ee40: 75 70 73 65 72 74 42 79 70 61 73 73 20 3d 20 73  upsertBypass = s
ee50: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
ee60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 0);.      Vdbe
ee70: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 53 6b 69  Comment((v, "Ski
ee80: 70 20 75 70 73 65 72 74 20 73 75 62 72 6f 75 74  p upsert subrout
ee90: 69 6e 65 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ine"));.      sq
eea0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
eeb0: 65 28 76 2c 20 75 70 73 65 72 74 4a 75 6d 70 29  e(v, upsertJump)
eec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
eed0: 20 20 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 20     addrUniqueOk 
eee0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eef0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
ef00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 41      }.    if( bA
ef10: 66 66 69 6e 69 74 79 44 6f 6e 65 3d 3d 30 20 26  ffinityDone==0 &
ef20: 26 20 28 70 55 70 49 64 78 3d 3d 30 20 7c 7c 20  & (pUpIdx==0 || 
ef30: 70 55 70 49 64 78 3d 3d 70 49 64 78 29 20 29 7b  pUpIdx==pIdx) ){
ef40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
ef50: 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
ef60: 54 61 62 2c 20 72 65 67 4e 65 77 44 61 74 61 2b  Tab, regNewData+
ef70: 31 29 3b 0a 20 20 20 20 20 20 62 41 66 66 69 6e  1);.      bAffin
ef80: 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  ityDone = 1;.   
ef90: 20 7d 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43   }.    VdbeNoopC
efa0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 75 6e 69 71  omment((v, "uniq
efb0: 75 65 6e 65 73 73 20 63 68 65 63 6b 20 66 6f 72  ueness check for
efc0: 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
efd0: 65 29 29 3b 0a 20 20 20 20 69 54 68 69 73 43 75  e));.    iThisCu
efe0: 72 20 3d 20 69 49 64 78 43 75 72 2b 69 78 3b 0a  r = iIdxCur+ix;.
eff0: 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61  ..    /* Skip pa
f000: 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 66 6f  rtial indices fo
f010: 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52  r which the WHER
f020: 45 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  E clause is not 
f030: 74 72 75 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  true */.    if( 
f040: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
f050: 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ere ){.      sql
f060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f070: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 61 52  , OP_Null, 0, aR
f080: 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20  egIdx[ix]);.    
f090: 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54    pParse->iSelfT
f0a0: 61 62 20 3d 20 2d 28 72 65 67 4e 65 77 44 61 74  ab = -(regNewDat
f0b0: 61 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  a+1);.      sqli
f0c0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 44 75  te3ExprIfFalseDu
f0d0: 70 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  p(pParse, pIdx->
f0e0: 70 50 61 72 74 49 64 78 57 68 65 72 65 2c 20 61  pPartIdxWhere, a
f0f0: 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20  ddrUniqueOk,.   
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
f120: 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
f130: 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
f140: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Tab = 0;.    }..
f150: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
f160: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 69 73 20  record for this 
f170: 69 6e 64 65 78 20 65 6e 74 72 79 20 61 73 20 69  index entry as i
f180: 74 20 73 68 6f 75 6c 64 20 61 70 70 65 61 72 20  t should appear 
f190: 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  after.    ** the
f1a0: 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74   insert or updat
f1b0: 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74 20 72  e.  Store that r
f1c0: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 61 52 65  ecord in the aRe
f1d0: 67 49 64 78 5b 69 78 5d 20 72 65 67 69 73 74 65  gIdx[ix] registe
f1e0: 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  r.    */.    reg
f1f0: 49 64 78 20 3d 20 61 52 65 67 49 64 78 5b 69 78  Idx = aRegIdx[ix
f200: 5d 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ]+1;.    for(i=0
f210: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
f220: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
f230: 6e 74 20 69 46 69 65 6c 64 20 3d 20 70 49 64 78  nt iField = pIdx
f240: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
f250: 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20       int x;.    
f260: 20 20 69 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e    if( iField==XN
f270: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20 20 20  _EXPR ){.       
f280: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
f290: 62 20 3d 20 2d 28 72 65 67 4e 65 77 44 61 74 61  b = -(regNewData
f2a0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +1);.        sql
f2b0: 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
f2c0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 61  (pParse, pIdx->a
f2d0: 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45  ColExpr->a[i].pE
f2e0: 78 70 72 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a  xpr, regIdx+i);.
f2f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
f300: 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20  iSelfTab = 0;.  
f310: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f320: 74 28 28 76 2c 20 22 25 73 20 63 6f 6c 75 6d 6e  t((v, "%s column
f330: 20 25 64 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %d", pIdx->zNam
f340: 65 2c 20 69 29 29 3b 0a 20 20 20 20 20 20 7d 65  e, i));.      }e
f350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
f360: 20 69 46 69 65 6c 64 3d 3d 58 4e 5f 52 4f 57 49   iField==XN_ROWI
f370: 44 20 7c 7c 20 69 46 69 65 6c 64 3d 3d 70 54 61  D || iField==pTa
f380: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
f390: 20 20 20 20 20 20 78 20 3d 20 72 65 67 4e 65 77        x = regNew
f3a0: 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 65  Data;.        }e
f3b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 78  lse{.          x
f3c0: 20 3d 20 69 46 69 65 6c 64 20 2b 20 72 65 67 4e   = iField + regN
f3d0: 65 77 44 61 74 61 20 2b 20 31 3b 0a 20 20 20 20  ewData + 1;.    
f3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
f3f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f400: 76 2c 20 69 46 69 65 6c 64 3c 30 20 3f 20 4f 50  v, iField<0 ? OP
f410: 5f 49 6e 74 43 6f 70 79 20 3a 20 4f 50 5f 53 43  _IntCopy : OP_SC
f420: 6f 70 79 2c 20 78 2c 20 72 65 67 49 64 78 2b 69  opy, x, regIdx+i
f430: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
f440: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
f450: 20 69 46 69 65 6c 64 3c 30 20 3f 20 22 72 6f 77   iField<0 ? "row
f460: 69 64 22 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c  id" : pTab->aCol
f470: 5b 69 46 69 65 6c 64 5d 2e 7a 4e 61 6d 65 29 29  [iField].zName))
f480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f4a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
f4b0: 52 65 63 6f 72 64 2c 20 72 65 67 49 64 78 2c 20  Record, regIdx, 
f4c0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61  pIdx->nColumn, a
f4d0: 52 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20  RegIdx[ix]);.   
f4e0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
f4f0: 20 22 66 6f 72 20 25 73 22 2c 20 70 49 64 78 2d   "for %s", pIdx-
f500: 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66  >zName));.#ifdef
f510: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
f520: 55 4c 4c 5f 54 52 49 4d 0a 20 20 20 20 69 66 28  ULL_TRIM.    if(
f530: 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 3d 3d   pIdx->idxType==
f540: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
f550: 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20  RIMARYKEY ){.   
f560: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4d 61 6b     sqlite3SetMak
f570: 65 52 65 63 6f 72 64 50 35 28 76 2c 20 70 49 64  eRecordP5(v, pId
f580: 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 20 20 20 20  x->pTable);.    
f590: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
f5a0: 20 49 6e 20 61 6e 20 55 50 44 41 54 45 20 6f 70   In an UPDATE op
f5b0: 65 72 61 74 69 6f 6e 2c 20 69 66 20 74 68 69 73  eration, if this
f5c0: 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52   index is the PR
f5d0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
f5e0: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54  .    ** of a WIT
f5f0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
f600: 20 61 6e 64 20 74 68 65 72 65 20 68 61 73 20 62   and there has b
f610: 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 20 74 68  een no change th
f620: 65 0a 20 20 20 20 2a 2a 20 70 72 69 6d 61 72 79  e.    ** primary
f630: 20 6b 65 79 2c 20 74 68 65 6e 20 6e 6f 20 63 6f   key, then no co
f640: 6c 6c 69 73 69 6f 6e 20 69 73 20 70 6f 73 73 69  llision is possi
f650: 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 6c 69 73  ble.  The collis
f660: 69 6f 6e 20 64 65 74 65 63 74 69 6f 6e 0a 20 20  ion detection.  
f670: 20 20 2a 2a 20 6c 6f 67 69 63 20 62 65 6c 6f 77    ** logic below
f680: 20 63 61 6e 20 61 6c 6c 20 62 65 20 73 6b 69 70   can all be skip
f690: 70 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ped. */.    if( 
f6a0: 69 73 55 70 64 61 74 65 20 26 26 20 70 50 6b 3d  isUpdate && pPk=
f6b0: 3d 70 49 64 78 20 26 26 20 70 6b 43 68 6e 67 3d  =pIdx && pkChng=
f6c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f6d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f6e0: 62 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75  bel(v, addrUniqu
f6f0: 65 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  eOk);.      cont
f700: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
f710: 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 61   /* Find out wha
f720: 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  t action to take
f730: 20 69 6e 20 63 61 73 65 20 74 68 65 72 65 20 69   in case there i
f740: 73 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  s a uniqueness c
f750: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 6f  onflict */.    o
f760: 6e 45 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f  nError = pIdx->o
f770: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
f780: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
f790: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74   ){ .      sqlit
f7a0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f7b0: 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65  el(v, addrUnique
f7c0: 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Ok);.      conti
f7d0: 6e 75 65 3b 20 20 2f 2a 20 70 49 64 78 20 69 73  nue;  /* pIdx is
f7e0: 20 6e 6f 74 20 61 20 55 4e 49 51 55 45 20 69 6e   not a UNIQUE in
f7f0: 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  dex */.    }.   
f800: 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72   if( overrideErr
f810: 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or!=OE_Default )
f820: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
f830: 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b  = overrideError;
f840: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
f850: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
f860: 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72  lt ){.      onEr
f870: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
f880: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
f890: 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 65 20  gure out if the 
f8a0: 75 70 73 65 72 74 20 63 6c 61 75 73 65 20 61 70  upsert clause ap
f8b0: 70 6c 69 65 73 20 74 6f 20 74 68 69 73 20 69 6e  plies to this in
f8c0: 64 65 78 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  dex */.    if( p
f8d0: 55 70 49 64 78 3d 3d 70 49 64 78 20 29 7b 0a 20  UpIdx==pIdx ){. 
f8e0: 20 20 20 20 20 69 66 28 20 70 55 70 73 65 72 74       if( pUpsert
f8f0: 2d 3e 70 55 70 73 65 72 74 53 65 74 3d 3d 30 20  ->pUpsertSet==0 
f900: 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ){.        onErr
f910: 6f 72 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 20  or = OE_Ignore; 
f920: 20 2f 2a 20 44 4f 20 4e 4f 54 48 49 4e 47 20 69   /* DO NOTHING i
f930: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 49 4e  s the same as IN
f940: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 2a  SERT OR IGNORE *
f950: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
f960: 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d         onError =
f970: 20 4f 45 5f 55 70 64 61 74 65 3b 20 20 2f 2a 20   OE_Update;  /* 
f980: 44 4f 20 55 50 44 41 54 45 20 2a 2f 0a 20 20 20  DO UPDATE */.   
f990: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f9a0: 2f 2a 20 43 6f 6c 6c 69 73 69 6f 6e 20 64 65 74  /* Collision det
f9b0: 65 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 6f 6d  ection may be om
f9c0: 69 74 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  itted if all of 
f9d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
f9e0: 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20 20  e true:.    **  
f9f0: 20 28 31 29 20 54 68 65 20 63 6f 6e 66 6c 69 63   (1) The conflic
fa00: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
fa10: 6f 72 69 74 68 6d 20 69 73 20 52 45 50 4c 41 43  orithm is REPLAC
fa20: 45 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 54  E.    **   (2) T
fa30: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49  he table is a WI
fa40: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
fa50: 65 0a 20 20 20 20 2a 2a 20 20 20 28 33 29 20 54  e.    **   (3) T
fa60: 68 65 72 65 20 61 72 65 20 6e 6f 20 73 65 63 6f  here are no seco
fa70: 6e 64 61 72 79 20 69 6e 64 65 78 65 73 20 6f 6e  ndary indexes on
fa80: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
fa90: 2a 20 20 20 28 34 29 20 4e 6f 20 64 65 6c 65 74  *   (4) No delet
faa0: 65 20 74 72 69 67 67 65 72 73 20 6e 65 65 64 20  e triggers need 
fab0: 74 6f 20 62 65 20 66 69 72 65 64 20 69 66 20 74  to be fired if t
fac0: 68 65 72 65 20 69 73 20 61 20 63 6f 6e 66 6c 69  here is a confli
fad0: 63 74 0a 20 20 20 20 2a 2a 20 20 20 28 35 29 20  ct.    **   (5) 
fae0: 4e 6f 20 46 4b 20 63 6f 6e 73 74 72 61 69 6e 74  No FK constraint
faf0: 20 63 6f 75 6e 74 65 72 73 20 6e 65 65 64 20 74   counters need t
fb00: 6f 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  o be updated if 
fb10: 61 20 63 6f 6e 66 6c 69 63 74 20 6f 63 63 75 72  a conflict occur
fb20: 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
fb30: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   This is not pos
fb40: 73 69 62 6c 65 20 66 6f 72 20 45 4e 41 42 4c 45  sible for ENABLE
fb50: 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
fb60: 62 75 69 6c 64 73 2c 20 61 73 20 74 68 65 20 72  builds, as the r
fb70: 6f 77 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62  ow.    ** must b
fb80: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 6c  e explicitly del
fb90: 65 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  eted in order to
fba0: 20 65 6e 73 75 72 65 20 61 6e 79 20 70 72 65 2d   ensure any pre-
fbb0: 75 70 64 61 74 65 20 68 6f 6f 6b 0a 20 20 20 20  update hook.    
fbc0: 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20  ** is invoked.  
fbd0: 2a 2f 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */ .#ifndef SQLI
fbe0: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
fbf0: 41 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 69 66 28  ATE_HOOK.    if(
fc00: 20 28 69 78 3d 3d 30 20 26 26 20 70 49 64 78 2d   (ix==0 && pIdx-
fc10: 3e 70 4e 65 78 74 3d 3d 30 29 20 20 20 20 20 20  >pNext==0)      
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc30: 43 6f 6e 64 69 74 69 6f 6e 20 33 20 2a 2f 0a 20  Condition 3 */. 
fc40: 20 20 20 20 26 26 20 70 50 6b 3d 3d 70 49 64 78      && pPk==pIdx
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
fc80: 32 20 2a 2f 0a 20 20 20 20 20 26 26 20 6f 6e 45  2 */.     && onE
fc90: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64           /* Cond
fcc0: 69 74 69 6f 6e 20 31 20 2a 2f 0a 20 20 20 20 20  ition 1 */.     
fcd0: 26 26 20 28 20 30 3d 3d 28 64 62 2d 3e 66 6c 61  && ( 0==(db->fla
fce0: 67 73 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69  gs&SQLITE_RecTri
fcf0: 67 67 65 72 73 29 20 7c 7c 20 20 20 20 20 20 2f  ggers) ||      /
fd00: 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 34 20 2a 2f  * Condition 4 */
fd10: 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71  .          0==sq
fd20: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
fd30: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  st(pParse, pTab,
fd40: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30   TK_DELETE, 0, 0
fd50: 29 29 0a 20 20 20 20 20 26 26 20 28 20 30 3d 3d  )).     && ( 0==
fd60: 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
fd70: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 20 7c  E_ForeignKeys) |
fd80: 7c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74  |      /* Condit
fd90: 69 6f 6e 20 35 20 2a 2f 0a 20 20 20 20 20 20 20  ion 5 */.       
fda0: 20 20 28 30 3d 3d 70 54 61 62 2d 3e 70 46 4b 65    (0==pTab->pFKe
fdb0: 79 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  y && 0==sqlite3F
fdc0: 6b 52 65 66 65 72 65 6e 63 65 73 28 70 54 61 62  kReferences(pTab
fdd0: 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
fde0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
fdf0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
fe00: 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 20  UniqueOk);.     
fe10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
fe20: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65  .#endif /* ifnde
fe30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
fe40: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
fe50: 2f 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  /..    /* Check 
fe60: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 6e 65  to see if the ne
fe70: 77 20 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69  w index entry wi
fe80: 6c 6c 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  ll be unique */.
fe90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56      sqlite3VdbeV
fea0: 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76  erifyAbortable(v
feb0: 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20  , onError);.    
fec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fed0: 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 43 6f 6e  4Int(v, OP_NoCon
fee0: 66 6c 69 63 74 2c 20 69 54 68 69 73 43 75 72 2c  flict, iThisCur,
fef0: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20   addrUniqueOk,. 
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 20 72 65 67 49 64 78 2c 20          regIdx, 
ff20: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20  pIdx->nKeyCol); 
ff30: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ff40: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
ff50: 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
ff60: 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20   collisions */. 
ff70: 20 20 20 72 65 67 52 20 3d 20 28 70 49 64 78 3d     regR = (pIdx=
ff80: 3d 70 50 6b 29 20 3f 20 72 65 67 49 64 78 20 3a  =pPk) ? regIdx :
ff90: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ffa0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b  ange(pParse, nPk
ffb0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  Field);.    if( 
ffc0: 69 73 55 70 64 61 74 65 20 7c 7c 20 6f 6e 45 72  isUpdate || onEr
ffd0: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
ffe0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
fff0: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
10000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10010 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10020 64 78 52 6f 77 69 64 2c 20 69 54 68 69 73 43 75  dxRowid, iThisCu
10030 72 2c 20 72 65 67 52 29 3b 0a 20 20 20 20 20 20  r, regR);.      
10040 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 6f 6e    /* Conflict on
10050 6c 79 20 69 66 20 74 68 65 20 72 6f 77 69 64 20  ly if the rowid 
10060 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
10070 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20 20  index entry.    
10080 20 20 20 20 2a 2a 20 69 73 20 64 69 66 66 65 72      ** is differ
10090 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 2d 72 6f 77  ent from old-row
100a0 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  id */.        if
100b0 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20  ( isUpdate ){.  
100c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
100d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
100e0 45 71 2c 20 72 65 67 52 2c 20 61 64 64 72 55 6e  Eq, regR, addrUn
100f0 69 71 75 65 4f 6b 2c 20 72 65 67 4f 6c 64 44 61  iqueOk, regOldDa
10100 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ta);.          s
10110 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10120 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
10130 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
10140 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10170 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 20 20   int x;.        
10180 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 50  /* Extract the P
10190 52 49 4d 41 52 59 20 4b 45 59 20 66 72 6f 6d 20  RIMARY KEY from 
101a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
101b0 6e 64 65 78 20 65 6e 74 72 79 20 61 6e 64 0a 20  ndex entry and. 
101c0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
101d0 69 74 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  it in registers 
101e0 72 65 67 52 2e 2e 72 65 67 52 2b 6e 50 6b 2d 31  regR..regR+nPk-1
101f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10200 70 49 64 78 21 3d 70 50 6b 20 29 7b 0a 20 20 20  pIdx!=pPk ){.   
10210 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
10220 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  i<pPk->nKeyCol; 
10230 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
10240 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 61    assert( pPk->a
10250 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b  iColumn[i]>=0 );
10260 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
10270 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
10280 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50 6b 2d  Index(pIdx, pPk-
10290 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20  >aiColumn[i]);. 
102a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
102b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
102c0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 68 69 73  OP_Column, iThis
102d0 43 75 72 2c 20 78 2c 20 72 65 67 52 2b 69 29 3b  Cur, x, regR+i);
102e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
102f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
10300 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
10310 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
10320 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
10330 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f  ->aCol[pPk->aiCo
10340 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 29  lumn[i]].zName))
10350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10370 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a  if( isUpdate ){.
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10390 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
103a0 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59  sing the PRIMARY
103b0 20 4b 45 59 20 6f 66 20 61 20 57 49 54 48 4f 55   KEY of a WITHOU
103c0 54 20 52 4f 57 49 44 20 0a 20 20 20 20 20 20 20  T ROWID .       
103d0 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6f 6e 6c     ** table, onl
103e0 79 20 63 6f 6e 66 6c 69 63 74 20 69 66 20 74 68  y conflict if th
103f0 65 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45  e new PRIMARY KE
10400 59 20 76 61 6c 75 65 73 20 61 72 65 20 61 63 74  Y values are act
10410 75 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 20 20  ually.          
10420 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
10430 6d 20 74 68 65 20 6f 6c 64 2e 0a 20 20 20 20 20  m the old..     
10440 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
10450 20 20 2a 2a 20 46 6f 72 20 61 20 55 4e 49 51 55    ** For a UNIQU
10460 45 20 69 6e 64 65 78 2c 20 6f 6e 6c 79 20 63 6f  E index, only co
10470 6e 66 6c 69 63 74 20 69 66 20 74 68 65 20 50 52  nflict if the PR
10480 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73  IMARY KEY values
10490 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
104a0 20 74 68 65 20 6d 61 74 63 68 65 64 20 69 6e 64   the matched ind
104b0 65 78 20 72 6f 77 20 61 72 65 20 64 69 66 66 65  ex row are diffe
104c0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 72  rent from the or
104d0 69 67 69 6e 61 6c 20 50 52 49 4d 41 52 59 0a 20  iginal PRIMARY. 
104e0 20 20 20 20 20 20 20 20 20 2a 2a 20 4b 45 59 20           ** KEY 
104f0 76 61 6c 75 65 73 20 6f 66 20 74 68 69 73 20 72  values of this r
10500 6f 77 20 62 65 66 6f 72 65 20 74 68 65 20 75 70  ow before the up
10510 64 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  date.  */.      
10520 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
10530 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
10540 72 72 65 6e 74 41 64 64 72 28 76 29 2b 70 50 6b  rrentAddr(v)+pPk
10550 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
10560 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50       int op = OP
10570 5f 4e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _Ne;.          i
10580 6e 74 20 72 65 67 43 6d 70 20 3d 20 28 49 73 50  nt regCmp = (IsP
10590 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
105a0 49 64 78 29 20 3f 20 72 65 67 49 64 78 20 3a 20  Idx) ? regIdx : 
105b0 72 65 67 52 29 3b 0a 20 20 0a 20 20 20 20 20 20  regR);.  .      
105c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
105d0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
105e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
105f0 68 61 72 20 2a 70 34 20 3d 20 28 63 68 61 72 2a  har *p4 = (char*
10600 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  )sqlite3LocateCo
10610 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 50  llSeq(pParse, pP
10620 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  k->azColl[i]);. 
10630 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70             x = p
10640 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  Pk->aiColumn[i];
10650 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
10660 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
10670 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
10680 28 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  (pPk->nKeyCol-1)
10690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
106a0 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 61 64 64    addrJump = add
106b0 72 55 6e 69 71 75 65 4f 6b 3b 0a 20 20 20 20 20  rUniqueOk;.     
106c0 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50           op = OP
106d0 5f 45 71 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _Eq;.           
106e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
106f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10700 28 76 2c 20 6f 70 2c 20 0a 20 20 20 20 20 20 20  (v, op, .       
10710 20 20 20 20 20 20 20 20 20 72 65 67 4f 6c 64 44           regOldD
10720 61 74 61 2b 31 2b 78 2c 20 61 64 64 72 4a 75 6d  ata+1+x, addrJum
10730 70 2c 20 72 65 67 43 6d 70 2b 69 2c 20 70 34 2c  p, regCmp+i, p4,
10740 20 50 34 5f 43 4f 4c 4c 53 45 51 0a 20 20 20 20   P4_COLLSEQ.    
10750 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
10760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10770 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
10780 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
10790 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
107a0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
107b0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 20  =OP_Eq);.       
107c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
107d0 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
107e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
107f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10800 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
10810 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
10820 74 20 65 78 65 63 75 74 65 73 20 69 66 20 74 68  t executes if th
10830 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72  e new index entr
10840 79 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 20  y is not unique 
10850 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  */.    assert( o
10860 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62  nError==OE_Rollb
10870 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d  ack || onError==
10880 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72  OE_Abort || onEr
10890 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ror==OE_Fail.   
108a0 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d       || onError=
108b0 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e  =OE_Ignore || on
108c0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
108d0 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  e || onError==OE
108e0 5f 55 70 64 61 74 65 20 29 3b 0a 20 20 20 20 73  _Update );.    s
108f0 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29  witch( onError )
10900 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  {.      case OE_
10910 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20  Rollback:.      
10920 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20  case OE_Abort:. 
10930 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69       case OE_Fai
10940 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 74 65 73  l: {.        tes
10950 74 63 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d 3d  tcase( onError==
10960 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  OE_Rollback );. 
10970 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
10980 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
10990 72 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  rt );.        te
109a0 73 74 63 61 73 65 28 20 6f 6e 45 72 72 6f 72 3d  stcase( onError=
109b0 3d 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20  =OE_Fail );.    
109c0 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
109d0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
109e0 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 49 64  se, onError, pId
109f0 78 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  x);.        brea
10a00 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
10a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
10a20 50 53 45 52 54 0a 20 20 20 20 20 20 63 61 73 65  PSERT.      case
10a30 20 4f 45 5f 55 70 64 61 74 65 3a 20 7b 0a 20 20   OE_Update: {.  
10a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 55 70 73        sqlite3Ups
10a50 65 72 74 44 6f 55 70 64 61 74 65 28 70 50 61 72  ertDoUpdate(pPar
10a60 73 65 2c 20 70 55 70 73 65 72 74 2c 20 70 54 61  se, pUpsert, pTa
10a70 62 2c 20 70 49 64 78 2c 20 69 49 64 78 43 75 72  b, pIdx, iIdxCur
10a80 2b 69 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  +ix);.        /*
10a90 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
10aa0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
10ab0 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
10ac0 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  nore: {.        
10ad0 74 65 73 74 63 61 73 65 28 20 6f 6e 45 72 72 6f  testcase( onErro
10ae0 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a  r==OE_Ignore );.
10af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10b00 64 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72  dbeGoto(v, ignor
10b10 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  eDest);.        
10b20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
10b30 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
10b40 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20          Trigger 
10b50 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20  *pTrigger = 0;. 
10b60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
10b70 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
10b80 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ce );.        if
10b90 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ( db->flags&SQLI
10ba0 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 20 29  TE_RecTriggers )
10bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69  {.          pTri
10bc0 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
10bd0 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72  iggersExist(pPar
10be0 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c  se, pTab, TK_DEL
10bf0 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ETE, 0, 0);.    
10c00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10c10 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71  ( pTrigger || sq
10c20 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65 64 28  lite3FkRequired(
10c30 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c  pParse, pTab, 0,
10c40 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
10c50 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
10c60 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
10c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
10c80 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77  lite3GenerateRow
10c90 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70  Delete(pParse, p
10ca0 54 61 62 2c 20 70 54 72 69 67 67 65 72 2c 20 69  Tab, pTrigger, i
10cb0 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
10cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ,.            re
10cd0 67 52 2c 20 6e 50 6b 46 69 65 6c 64 2c 20 30 2c  gR, nPkField, 0,
10ce0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 0a 20 20 20   OE_Replace,.   
10cf0 20 20 20 20 20 20 20 20 20 28 70 49 64 78 3d 3d           (pIdx==
10d00 70 50 6b 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49  pPk ? ONEPASS_SI
10d10 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4f  NGLE : ONEPASS_O
10d20 46 46 29 2c 20 69 54 68 69 73 43 75 72 29 3b 0a  FF), iThisCur);.
10d30 20 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c          seenRepl
10d40 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
10d50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10d60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 55      }.    if( pU
10d70 70 49 64 78 3d 3d 70 49 64 78 20 29 7b 0a 20 20  pIdx==pIdx ){.  
10d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
10d90 6f 74 6f 28 76 2c 20 75 70 73 65 72 74 4a 75 6d  oto(v, upsertJum
10da0 70 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p+1);.      sqli
10db0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10dc0 76 2c 20 75 70 73 65 72 74 42 79 70 61 73 73 29  v, upsertBypass)
10dd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10df0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
10e00 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20  drUniqueOk);.   
10e10 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 52 21   }.    if( regR!
10e20 3d 72 65 67 49 64 78 20 29 20 73 71 6c 69 74 65  =regIdx ) sqlite
10e30 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
10e40 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 2c 20  e(pParse, regR, 
10e50 6e 50 6b 46 69 65 6c 64 29 3b 0a 20 20 7d 0a 0a  nPkField);.  }..
10e60 20 20 2f 2a 20 49 66 20 74 68 65 20 49 50 4b 20    /* If the IPK 
10e70 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 61 20  constraint is a 
10e80 52 45 50 4c 41 43 45 2c 20 72 75 6e 20 69 74 20  REPLACE, run it 
10e90 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 69 70  last */.  if( ip
10ea0 6b 54 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  kTop ){.    sqli
10eb0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
10ec0 70 6b 54 6f 70 29 3b 0a 20 20 20 20 56 64 62 65  pkTop);.    Vdbe
10ed0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 44 6f 20  Comment((v, "Do 
10ee0 49 50 4b 20 52 45 50 4c 41 43 45 22 29 29 3b 0a  IPK REPLACE"));.
10ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
10f00 75 6d 70 48 65 72 65 28 76 2c 20 69 70 6b 42 6f  umpHere(v, ipkBo
10f10 74 74 6f 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  ttom);.  }..  *p
10f20 62 4d 61 79 52 65 70 6c 61 63 65 20 3d 20 73 65  bMayReplace = se
10f30 65 6e 52 65 70 6c 61 63 65 3b 0a 20 20 56 64 62  enReplace;.  Vdb
10f40 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
10f50 76 2c 20 22 45 4e 44 3a 20 47 65 6e 43 6e 73 74  v, "END: GenCnst
10f60 43 6b 73 28 25 64 29 22 2c 20 73 65 65 6e 52 65  Cks(%d)", seenRe
10f70 70 6c 61 63 65 29 29 3b 0a 7d 0a 0a 23 69 66 64  place));.}..#ifd
10f80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10f90 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 2f 2a 0a 2a 2a  _NULL_TRIM./*.**
10fa0 20 43 68 61 6e 67 65 20 74 68 65 20 50 35 20 6f   Change the P5 o
10fb0 70 65 72 61 6e 64 20 6f 6e 20 74 68 65 20 6c 61  perand on the la
10fc0 73 74 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68  st opcode (which
10fd0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 4f 50   should be an OP
10fe0 5f 4d 61 6b 65 52 65 63 6f 72 64 29 0a 2a 2a 20  _MakeRecord).** 
10ff0 74 6f 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  to be the number
11000 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
11010 61 62 6c 65 20 70 54 61 62 20 74 68 61 74 20 6d  able pTab that m
11020 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2d  ust not be NULL-
11030 74 72 69 6d 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  trimmed..**.** O
11040 72 20 69 66 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20  r if no columns 
11050 6f 66 20 70 54 61 62 20 6d 61 79 20 62 65 20 4e  of pTab may be N
11060 55 4c 4c 2d 74 72 69 6d 6d 65 64 2c 20 6c 65 61  ULL-trimmed, lea
11070 76 65 20 50 35 20 61 74 20 7a 65 72 6f 2e 0a 2a  ve P5 at zero..*
11080 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
11090 74 4d 61 6b 65 52 65 63 6f 72 64 50 35 28 56 64  tMakeRecordP5(Vd
110a0 62 65 20 2a 76 2c 20 54 61 62 6c 65 20 2a 70 54  be *v, Table *pT
110b0 61 62 29 7b 0a 20 20 75 31 36 20 69 3b 0a 0a 20  ab){.  u16 i;.. 
110c0 20 2f 2a 20 52 65 63 6f 72 64 73 20 77 69 74 68   /* Records with
110d0 20 6f 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73   omitted columns
110e0 20 61 72 65 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65   are only allowe
110f0 64 20 66 6f 72 20 73 63 68 65 6d 61 20 66 6f 72  d for schema for
11100 6d 61 74 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e  mat.  ** version
11110 20 32 20 61 6e 64 20 6c 61 74 65 72 20 28 53 51   2 and later (SQ
11120 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 33 2e 31  Lite version 3.1
11130 2e 34 2c 20 32 30 30 35 2d 30 32 2d 32 30 29 2e  .4, 2005-02-20).
11140 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
11150 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
11160 72 6d 61 74 3c 32 20 29 20 72 65 74 75 72 6e 3b  rmat<2 ) return;
11170 0a 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ..  for(i=pTab->
11180 6e 43 6f 6c 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  nCol-1; i>0; i--
11190 29 7b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  ){.    if( pTab-
111a0 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 21 3d  >aCol[i].pDflt!=
111b0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
111c0 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  f( pTab->aCol[i]
111d0 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
111e0 4c 41 47 5f 50 52 49 4d 4b 45 59 20 29 20 62 72  LAG_PRIMKEY ) br
111f0 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  eak;.  }.  sqlit
11200 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11210 2c 20 69 2b 31 29 3b 0a 7d 0a 23 65 6e 64 69 66  , i+1);.}.#endif
11220 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11230 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
11240 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20 74 68  ode to finish th
11250 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41  e INSERT or UPDA
11260 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  TE operation.** 
11270 74 68 61 74 20 77 61 73 20 73 74 61 72 74 65 64  that was started
11280 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   by a prior call
11290 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72   to sqlite3Gener
112a0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
112b0 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e 73 65 63  cks..** A consec
112c0 75 74 69 76 65 20 72 61 6e 67 65 20 6f 66 20 72  utive range of r
112d0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
112e0 67 20 61 74 20 72 65 67 4e 65 77 44 61 74 61 20  g at regNewData 
112f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
11300 72 6f 77 69 64 20 61 6e 64 20 74 68 65 20 63 6f  rowid and the co
11310 6e 74 65 6e 74 20 74 6f 20 62 65 20 69 6e 73 65  ntent to be inse
11320 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rted..**.** The 
11330 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69  arguments to thi
11340 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
11350 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
11360 74 68 65 20 66 69 72 73 74 20 73 69 78 0a 2a 2a  the first six.**
11370 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 73 71   arguments to sq
11380 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
11390 73 74 72 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a  straintChecks..*
113a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
113b0 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e 28  mpleteInsertion(
113c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
113d0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
113e0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
113f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
11400 20 20 20 20 20 20 2f 2a 20 74 68 65 20 74 61 62        /* the tab
11410 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  le into which we
11420 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a   are inserting *
11430 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  /.  int iDataCur
11440 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ,       /* Curso
11450 72 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63  r of the canonic
11460 61 6c 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a  al data source *
11470 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c  /.  int iIdxCur,
11480 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11490 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
114a0 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44 61 74  .  int regNewDat
114b0 61 2c 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20  a,     /* Range 
114c0 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
114d0 69 6e 74 20 2a 61 52 65 67 49 64 78 2c 20 20 20  int *aRegIdx,   
114e0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
114f0 75 73 65 64 20 62 79 20 65 61 63 68 20 69 6e 64  used by each ind
11500 65 78 2e 20 20 30 20 66 6f 72 20 75 6e 75 73 65  ex.  0 for unuse
11510 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  d indices */.  i
11520 6e 74 20 75 70 64 61 74 65 5f 66 6c 61 67 73 2c  nt update_flags,
11530 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 55     /* True for U
11540 50 44 41 54 45 2c 20 46 61 6c 73 65 20 66 6f 72  PDATE, False for
11550 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69 6e 74   INSERT */.  int
11560 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20   appendBias,    
11570 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
11580 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65   is likely to be
11590 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20   an append */.  
115a0 69 6e 74 20 75 73 65 53 65 65 6b 52 65 73 75 6c  int useSeekResul
115b0 74 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73  t   /* True to s
115c0 65 74 20 74 68 65 20 55 53 45 53 45 45 4b 52 45  et the USESEEKRE
115d0 53 55 4c 54 20 66 6c 61 67 20 6f 6e 20 4f 50 5f  SULT flag on OP_
115e0 5b 49 64 78 5d 49 6e 73 65 72 74 20 2a 2f 0a 29  [Idx]Insert */.)
115f0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  {.  Vdbe *v;    
11600 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61          /* Prepa
11610 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 75  red statements u
11620 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11630 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
11640 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  dx;        /* An
11650 20 69 6e 64 65 78 20 62 65 69 6e 67 20 69 6e 73   index being ins
11660 65 72 74 65 64 20 6f 72 20 75 70 64 61 74 65 64  erted or updated
11670 20 2a 2f 0a 20 20 75 38 20 70 69 6b 5f 66 6c 61   */.  u8 pik_fla
11680 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 66 6c 61  gs;       /* fla
11690 67 20 76 61 6c 75 65 73 20 70 61 73 73 65 64 20  g values passed 
116a0 74 6f 20 74 68 65 20 62 74 72 65 65 20 69 6e 73  to the btree ins
116b0 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ert */.  int reg
116c0 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  Data;        /* 
116d0 43 6f 6e 74 65 6e 74 20 72 65 67 69 73 74 65 72  Content register
116e0 73 20 28 61 66 74 65 72 20 74 68 65 20 72 6f 77  s (after the row
116f0 69 64 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  id) */.  int reg
11700 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
11710 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
11720 20 61 73 73 65 6d 62 6c 65 64 20 72 65 63 6f 72   assembled recor
11730 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
11740 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
11750 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11760 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
11770 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d   bAffinityDone =
11780 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 4f   0; /* True if O
11790 50 5f 41 66 66 69 6e 69 74 79 20 68 61 73 20 62  P_Affinity has b
117a0 65 65 6e 20 72 75 6e 20 61 6c 72 65 61 64 79 20  een run already 
117b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 70  */..  assert( up
117c0 64 61 74 65 5f 66 6c 61 67 73 3d 3d 30 0a 20 20  date_flags==0.  
117d0 20 20 20 20 20 7c 7c 20 75 70 64 61 74 65 5f 66       || update_f
117e0 6c 61 67 73 3d 3d 4f 50 46 4c 41 47 5f 49 53 55  lags==OPFLAG_ISU
117f0 50 44 41 54 45 0a 20 20 20 20 20 20 20 7c 7c 20  PDATE.       || 
11800 75 70 64 61 74 65 5f 66 6c 61 67 73 3d 3d 28 4f  update_flags==(O
11810 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 7c 4f  PFLAG_ISUPDATE|O
11820 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49  PFLAG_SAVEPOSITI
11830 4f 4e 29 0a 20 20 29 3b 0a 0a 20 20 76 20 3d 20  ON).  );..  v = 
11840 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11850 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
11860 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
11870 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
11880 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73  t==0 );  /* This
11890 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
118a0 56 49 45 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  VIEW */.  for(i=
118b0 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
118c0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
118d0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
118e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65 67  +){.    if( aReg
118f0 49 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  Idx[i]==0 ) cont
11900 69 6e 75 65 3b 0a 20 20 20 20 62 41 66 66 69 6e  inue;.    bAffin
11910 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  ityDone = 1;.   
11920 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
11930 49 64 78 57 68 65 72 65 20 29 7b 0a 20 20 20 20  IdxWhere ){.    
11940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11950 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
11960 2c 20 61 52 65 67 49 64 78 5b 69 5d 2c 20 73 71  , aRegIdx[i], sq
11970 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11980 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
11990 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
119a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 69 6b  );.    }.    pik
119b0 5f 66 6c 61 67 73 20 3d 20 28 75 73 65 53 65 65  _flags = (useSee
119c0 6b 52 65 73 75 6c 74 20 3f 20 4f 50 46 4c 41 47  kResult ? OPFLAG
119d0 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 3a  _USESEEKRESULT :
119e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 49 73 50   0);.    if( IsP
119f0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
11a00 49 64 78 29 20 26 26 20 21 48 61 73 52 6f 77 69  Idx) && !HasRowi
11a10 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
11a20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
11a30 3e 6e 65 73 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >nested==0 );.  
11a40 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d      pik_flags |=
11a50 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b   OPFLAG_NCHANGE;
11a60 0a 20 20 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  .      pik_flags
11a70 20 7c 3d 20 28 75 70 64 61 74 65 5f 66 6c 61 67   |= (update_flag
11a80 73 20 26 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  s & OPFLAG_SAVEP
11a90 4f 53 49 54 49 4f 4e 29 3b 0a 23 69 66 64 65 66  OSITION);.#ifdef
11aa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
11ab0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
11ac0 20 20 20 20 69 66 28 20 75 70 64 61 74 65 5f 66      if( update_f
11ad0 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lags==0 ){.     
11ae0 20 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74     int r = sqlit
11af0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
11b00 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
11b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11b20 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11b30 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , r);.        sq
11b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11b50 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 0a 20  v, OP_Insert, . 
11b60 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78 43             iIdxC
11b70 75 72 2b 69 2c 20 61 52 65 67 49 64 78 5b 69 5d  ur+i, aRegIdx[i]
11b80 2c 20 72 2c 20 28 63 68 61 72 2a 29 70 54 61 62  , r, (char*)pTab
11b90 2c 20 50 34 5f 54 41 42 4c 45 0a 20 20 20 20 20  , P4_TABLE.     
11ba0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
11bb0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11bc0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 49 53 4e 4f  5(v, OPFLAG_ISNO
11bd0 4f 50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  OP);.        sql
11be0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11bf0 65 67 28 70 50 61 72 73 65 2c 20 72 29 3b 0a 20  eg(pParse, r);. 
11c00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11c10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
11c20 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
11c30 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
11c40 64 78 43 75 72 2b 69 2c 20 61 52 65 67 49 64 78  dxCur+i, aRegIdx
11c50 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 52                aR
11c70 65 67 49 64 78 5b 69 5d 2b 31 2c 0a 20 20 20 20  egIdx[i]+1,.    
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c90 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e       pIdx->uniqN
11ca0 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78 2d 3e 6e  otNull ? pIdx->n
11cb0 4b 65 79 43 6f 6c 3a 20 70 49 64 78 2d 3e 6e 43  KeyCol: pIdx->nC
11cc0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69  olumn);.    sqli
11cd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11ce0 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 20  v, pik_flags);. 
11cf0 20 7d 0a 20 20 69 66 28 20 21 48 61 73 52 6f 77   }.  if( !HasRow
11d00 69 64 28 70 54 61 62 29 20 29 20 72 65 74 75 72  id(pTab) ) retur
11d10 6e 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72  n;.  regData = r
11d20 65 67 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a 20  egNewData + 1;. 
11d30 20 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65   regRec = sqlite
11d40 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11d50 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
11d60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
11d70 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 44 61  akeRecord, regDa
11d80 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  ta, pTab->nCol, 
11d90 72 65 67 52 65 63 29 3b 0a 20 20 73 71 6c 69 74  regRec);.  sqlit
11da0 65 33 53 65 74 4d 61 6b 65 52 65 63 6f 72 64 50  e3SetMakeRecordP
11db0 35 28 76 2c 20 70 54 61 62 29 3b 0a 20 20 69 66  5(v, pTab);.  if
11dc0 28 20 21 62 41 66 66 69 6e 69 74 79 44 6f 6e 65  ( !bAffinityDone
11dd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
11de0 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
11df0 70 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pTab, 0);.  }.  
11e00 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
11e10 65 64 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c  ed ){.    pik_fl
11e20 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
11e30 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20  {.    pik_flags 
11e40 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  = OPFLAG_NCHANGE
11e50 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20  ;.    pik_flags 
11e60 7c 3d 20 28 75 70 64 61 74 65 5f 66 6c 61 67 73  |= (update_flags
11e70 3f 75 70 64 61 74 65 5f 66 6c 61 67 73 3a 4f 50  ?update_flags:OP
11e80 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 29 3b  FLAG_LASTROWID);
11e90 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 70 65 6e  .  }.  if( appen
11ea0 64 42 69 61 73 20 29 7b 0a 20 20 20 20 70 69 6b  dBias ){.    pik
11eb0 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47  _flags |= OPFLAG
11ec0 5f 41 50 50 45 4e 44 3b 0a 20 20 7d 0a 20 20 69  _APPEND;.  }.  i
11ed0 66 28 20 75 73 65 53 65 65 6b 52 65 73 75 6c 74  f( useSeekResult
11ee0 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67   ){.    pik_flag
11ef0 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 55 53 45 53  s |= OPFLAG_USES
11f00 45 45 4b 52 45 53 55 4c 54 3b 0a 20 20 7d 0a 20  EEKRESULT;.  }. 
11f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f20 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
11f30 20 69 44 61 74 61 43 75 72 2c 20 72 65 67 52 65   iDataCur, regRe
11f40 63 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b 0a  c, regNewData);.
11f50 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
11f60 65 73 74 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ested ){.    sql
11f70 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
11f80 28 76 2c 20 70 54 61 62 2c 20 50 34 5f 54 41 42  (v, pTab, P4_TAB
11f90 4c 45 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  LE);.  }.  sqlit
11fa0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
11fb0 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a  , pik_flags);.}.
11fc0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
11fd0 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20  cursors for the 
11fe0 70 54 61 62 20 74 61 62 6c 65 20 61 6e 64 20 61  pTab table and a
11ff0 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61  ll its indices a
12000 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  nd generate.** c
12010 6f 64 65 20 74 6f 20 6f 70 65 6e 20 61 6e 64 20  ode to open and 
12020 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 6f 73  initialized thos
12030 65 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  e cursors..**.**
12040 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   The cursor for 
12050 74 68 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  the object that 
12060 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d  contains the com
12070 70 6c 65 74 65 20 64 61 74 61 20 28 6e 6f 72 6d  plete data (norm
12080 61 6c 6c 79 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ally.** the tabl
12090 65 20 69 74 73 65 6c 66 2c 20 62 75 74 20 74 68  e itself, but th
120a0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
120b0 64 65 78 20 69 6e 20 74 68 65 20 63 61 73 65 20  dex in the case 
120c0 6f 66 20 61 20 57 49 54 48 4f 55 54 0a 2a 2a 20  of a WITHOUT.** 
120d0 52 4f 57 49 44 20 74 61 62 6c 65 29 20 69 73 20  ROWID table) is 
120e0 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 44  returned in *piD
120f0 61 74 61 43 75 72 2e 20 20 54 68 65 20 66 69 72  ataCur.  The fir
12100 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  st index cursor 
12110 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
12120 6e 20 2a 70 69 49 64 78 43 75 72 2e 20 20 54 68  n *piIdxCur.  Th
12130 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69  e number of indi
12140 63 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ces is returned.
12150 0a 2a 2a 0a 2a 2a 20 55 73 65 20 69 42 61 73 65  .**.** Use iBase
12160 20 61 73 20 74 68 65 20 66 69 72 73 74 20 63 75   as the first cu
12170 72 73 6f 72 20 28 65 69 74 68 65 72 20 74 68 65  rsor (either the
12180 20 2a 70 69 44 61 74 61 43 75 72 20 66 6f 72 20   *piDataCur for 
12190 72 6f 77 69 64 20 74 61 62 6c 65 73 0a 2a 2a 20  rowid tables.** 
121a0 6f 72 20 74 68 65 20 66 69 72 73 74 20 69 6e 64  or the first ind
121b0 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ex for WITHOUT R
121c0 4f 57 49 44 20 74 61 62 6c 65 73 29 20 69 66 20  OWID tables) if 
121d0 69 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  it is non-negati
121e0 76 65 2e 0a 2a 2a 20 49 66 20 69 42 61 73 65 20  ve..** If iBase 
121f0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
12200 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e  n allocate the n
12210 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75  ext available cu
12220 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  rsor..**.** For 
12230 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 2a  a rowid table, *
12240 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20 62  piDataCur will b
12250 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6c 65  e exactly one le
12260 73 73 20 74 68 61 6e 20 2a 70 69 49 64 78 43 75  ss than *piIdxCu
12270 72 2e 0a 2a 2a 20 46 6f 72 20 61 20 57 49 54 48  r..** For a WITH
12280 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
12290 20 2a 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c   *piDataCur will
122a0 20 62 65 20 73 6f 6d 65 77 68 65 72 65 20 69 6e   be somewhere in
122b0 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66   the range.** of
122c0 20 2a 70 69 49 64 78 43 75 72 73 2c 20 64 65 70   *piIdxCurs, dep
122d0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 72 65 20  ending on where 
122e0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
122f0 69 6e 64 65 78 20 61 70 70 65 61 72 73 20 6f 6e  index appears on
12300 20 74 68 65 0a 2a 2a 20 70 54 61 62 2d 3e 70 49   the.** pTab->pI
12310 6e 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  ndex list..**.**
12320 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
12330 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65  rtual table, the
12340 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
12350 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 74 68  s a no-op and th
12360 65 0a 2a 2a 20 2a 70 69 44 61 74 61 43 75 72 20  e.** *piDataCur 
12370 61 6e 64 20 2a 70 69 49 64 78 43 75 72 20 76 61  and *piIdxCur va
12380 6c 75 65 73 20 61 72 65 20 6c 65 66 74 20 75 6e  lues are left un
12390 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a  initialized..*/.
123a0 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
123b0 61 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a  ableAndIndices(.
123c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
123d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
123e0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
123f0 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54   *pTab,     /* T
12400 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65  able to be opene
12410 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  d */.  int op,  
12420 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70          /* OP_Op
12430 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
12440 6e 57 72 69 74 65 20 2a 2f 0a 20 20 75 38 20 70  nWrite */.  u8 p
12450 35 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5,           /* 
12460 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
12470 4f 70 65 6e 2a 20 6f 70 63 6f 64 65 73 20 28 65  Open* opcodes (e
12480 78 63 65 70 74 20 6f 6e 20 57 49 54 48 4f 55 54  xcept on WITHOUT
12490 20 52 4f 57 49 44 29 20 2a 2f 0a 20 20 69 6e 74   ROWID) */.  int
124a0 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 2f 2a   iBase,       /*
124b0 20 55 73 65 20 74 68 69 73 20 66 6f 72 20 74 68   Use this for th
124c0 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20  e table cursor, 
124d0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  if there is one 
124e0 2a 2f 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e  */.  u8 *aToOpen
124f0 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
12500 4e 55 4c 4c 3a 20 62 6f 6f 6c 65 61 6e 20 66 6f  NULL: boolean fo
12510 72 20 65 61 63 68 20 74 61 62 6c 65 20 61 6e 64  r each table and
12520 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
12530 2a 70 69 44 61 74 61 43 75 72 2c 20 20 2f 2a 20  *piDataCur,  /* 
12540 57 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  Write the databa
12550 73 65 20 73 6f 75 72 63 65 20 63 75 72 73 6f 72  se source cursor
12560 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
12570 20 20 69 6e 74 20 2a 70 69 49 64 78 43 75 72 20    int *piIdxCur 
12580 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
12590 66 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73  first index curs
125a0 6f 72 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  or number here *
125b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
125c0 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69  int iDb;.  int i
125d0 44 61 74 61 43 75 72 3b 0a 20 20 49 6e 64 65 78  DataCur;.  Index
125e0 20 2a 70 49 64 78 3b 0a 20 20 56 64 62 65 20 2a   *pIdx;.  Vdbe *
125f0 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70  v;..  assert( op
12600 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c  ==OP_OpenRead ||
12610 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74   op==OP_OpenWrit
12620 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
12630 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  p==OP_OpenWrite 
12640 7c 7c 20 70 35 3d 3d 30 20 29 3b 0a 20 20 69 66  || p5==0 );.  if
12650 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12660 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  ) ){.    /* This
12670 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
12680 2d 6f 70 20 66 6f 72 20 76 69 72 74 75 61 6c 20  -op for virtual 
12690 74 61 62 6c 65 73 2e 20 4c 65 61 76 65 20 74 68  tables. Leave th
126a0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
126b0 76 61 72 69 61 62 6c 65 73 20 2a 70 69 44 61 74  variables *piDat
126c0 61 43 75 72 20 61 6e 64 20 2a 70 69 49 64 78 43  aCur and *piIdxC
126d0 75 72 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ur uninitialized
126e0 20 73 6f 20 74 68 61 74 20 76 61 6c 67 72 69 6e   so that valgrin
126f0 64 0a 20 20 20 20 2a 2a 20 63 61 6e 20 64 65 74  d.    ** can det
12700 65 63 74 20 69 66 20 74 68 65 79 20 61 72 65 20  ect if they are 
12710 75 73 65 64 20 62 79 20 6d 69 73 74 61 6b 65 20  used by mistake 
12720 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a  in the caller. *
12730 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
12740 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
12750 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12760 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
12770 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76  b->pSchema);.  v
12780 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12790 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
127a0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69  ert( v!=0 );.  i
127b0 66 28 20 69 42 61 73 65 3c 30 20 29 20 69 42 61  f( iBase<0 ) iBa
127c0 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  se = pParse->nTa
127d0 62 3b 0a 20 20 69 44 61 74 61 43 75 72 20 3d 20  b;.  iDataCur = 
127e0 69 42 61 73 65 2b 2b 3b 0a 20 20 69 66 28 20 70  iBase++;.  if( p
127f0 69 44 61 74 61 43 75 72 20 29 20 2a 70 69 44 61  iDataCur ) *piDa
12800 74 61 43 75 72 20 3d 20 69 44 61 74 61 43 75 72  taCur = iDataCur
12810 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64  ;.  if( HasRowid
12820 28 70 54 61 62 29 20 26 26 20 28 61 54 6f 4f 70  (pTab) && (aToOp
12830 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f 70 65 6e  en==0 || aToOpen
12840 5b 30 5d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  [0]) ){.    sqli
12850 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
12860 72 73 65 2c 20 69 44 61 74 61 43 75 72 2c 20 69  rse, iDataCur, i
12870 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
12880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
12890 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
128a0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
128b0 74 6e 75 6d 2c 20 6f 70 3d 3d 4f 50 5f 4f 70 65  tnum, op==OP_Ope
128c0 6e 57 72 69 74 65 2c 20 70 54 61 62 2d 3e 7a 4e  nWrite, pTab->zN
128d0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
128e0 70 69 49 64 78 43 75 72 20 29 20 2a 70 69 49 64  piIdxCur ) *piId
128f0 78 43 75 72 20 3d 20 69 42 61 73 65 3b 0a 20 20  xCur = iBase;.  
12900 66 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54  for(i=0, pIdx=pT
12910 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
12920 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
12930 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  xt, i++){.    in
12940 74 20 69 49 64 78 43 75 72 20 3d 20 69 42 61 73  t iIdxCur = iBas
12950 65 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e++;.    assert(
12960 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
12970 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
12980 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61  .    if( IsPrima
12990 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
129a0 20 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54   && !HasRowid(pT
129b0 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ab) ){.      if(
129c0 20 70 69 44 61 74 61 43 75 72 20 29 20 2a 70 69   piDataCur ) *pi
129d0 44 61 74 61 43 75 72 20 3d 20 69 49 64 78 43 75  DataCur = iIdxCu
129e0 72 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 30 3b  r;.      p5 = 0;
129f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
12a00 54 6f 4f 70 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f  ToOpen==0 || aTo
12a10 4f 70 65 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20  Open[i+1] ){.   
12a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a30 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp3(v, op, iIdx
12a40 43 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Cur, pIdx->tnum,
12a50 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
12a60 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
12a70 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
12a80 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
12a90 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12aa0 20 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65   p5);.      Vdbe
12ab0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
12ac0 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  , pIdx->zName));
12ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12ae0 20 69 42 61 73 65 3e 70 50 61 72 73 65 2d 3e 6e   iBase>pParse->n
12af0 54 61 62 20 29 20 70 50 61 72 73 65 2d 3e 6e 54  Tab ) pParse->nT
12b00 61 62 20 3d 20 69 42 61 73 65 3b 0a 20 20 72 65  ab = iBase;.  re
12b10 74 75 72 6e 20 69 3b 0a 7d 0a 0a 0a 23 69 66 64  turn i;.}...#ifd
12b20 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
12b30 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
12b40 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
12b50 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
12b60 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 2a  d whenever the.*
12b70 2a 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  * transfer optim
12b80 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ization is used.
12b90 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
12ba0 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 70 75  or testing.** pu
12bb0 72 70 6f 73 65 73 20 6f 6e 6c 79 20 2d 20 74 6f  rposes only - to
12bc0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
12bd0 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61  ransfer optimiza
12be0 74 69 6f 6e 20 72 65 61 6c 6c 79 0a 2a 2a 20 69  tion really.** i
12bf0 73 20 68 61 70 70 65 6e 69 6e 67 20 77 68 65 6e  s happening when
12c00 20 69 74 20 69 73 20 73 75 70 70 6f 73 65 64 20   it is supposed 
12c10 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
12c20 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
12c30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
12c40 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 23 69 66  TE_TEST */...#if
12c50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12c60 5f 58 46 45 52 5f 4f 50 54 0a 2f 2a 0a 2a 2a 20  _XFER_OPT./*.** 
12c70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
12c80 69 6e 64 65 78 20 70 53 72 63 20 69 73 20 63 6f  index pSrc is co
12c90 6d 70 61 74 69 62 6c 65 20 61 73 20 61 20 73 6f  mpatible as a so
12ca0 75 72 63 65 20 6f 66 20 64 61 74 61 0a 2a 2a 20  urce of data.** 
12cb0 66 6f 72 20 69 6e 64 65 78 20 70 44 65 73 74 20  for index pDest 
12cc0 69 6e 20 61 6e 20 69 6e 73 65 72 74 20 74 72 61  in an insert tra
12cd0 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
12ce0 6f 6e 2e 20 20 54 68 65 20 72 75 6c 65 73 0a 2a  on.  The rules.*
12cf0 2a 20 66 6f 72 20 61 20 63 6f 6d 70 61 74 69 62  * for a compatib
12d00 6c 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20  le index:.**.** 
12d10 20 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65 78     *   The index
12d20 20 69 73 20 6f 76 65 72 20 74 68 65 20 73 61 6d   is over the sam
12d30 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  e set of columns
12d40 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73  .**    *   The s
12d50 61 6d 65 20 44 45 53 43 20 61 6e 64 20 41 53 43  ame DESC and ASC
12d60 20 6d 61 72 6b 69 6e 67 73 20 6f 63 63 75 72 73   markings occurs
12d70 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a   on all columns.
12d80 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61  **    *   The sa
12d90 6d 65 20 6f 6e 45 72 72 6f 72 20 70 72 6f 63 65  me onError proce
12da0 73 73 69 6e 67 20 28 4f 45 5f 41 62 6f 72 74 2c  ssing (OE_Abort,
12db0 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29   OE_Ignore, etc)
12dc0 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73  .**    *   The s
12dd0 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
12de0 71 75 65 6e 63 65 20 6f 6e 20 65 61 63 68 20 63  quence on each c
12df0 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 2a 20 20 20  olumn.**    *   
12e00 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 74 68  The index has th
12e10 65 20 65 78 61 63 74 20 73 61 6d 65 20 57 48 45  e exact same WHE
12e20 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61  RE clause.*/.sta
12e30 74 69 63 20 69 6e 74 20 78 66 65 72 43 6f 6d 70  tic int xferComp
12e40 61 74 69 62 6c 65 49 6e 64 65 78 28 49 6e 64 65  atibleIndex(Inde
12e50 78 20 2a 70 44 65 73 74 2c 20 49 6e 64 65 78 20  x *pDest, Index 
12e60 2a 70 53 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b  *pSrc){.  int i;
12e70 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
12e80 20 26 26 20 70 53 72 63 20 29 3b 0a 20 20 61 73   && pSrc );.  as
12e90 73 65 72 74 28 20 70 44 65 73 74 2d 3e 70 54 61  sert( pDest->pTa
12ea0 62 6c 65 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c  ble!=pSrc->pTabl
12eb0 65 20 29 3b 0a 20 20 69 66 28 20 70 44 65 73 74  e );.  if( pDest
12ec0 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 53 72 63 2d  ->nKeyCol!=pSrc-
12ed0 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
12ee0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44  return 0;   /* D
12ef0 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20  ifferent number 
12f00 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
12f10 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6f  }.  if( pDest->o
12f20 6e 45 72 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e  nError!=pSrc->on
12f30 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  Error ){.    ret
12f40 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
12f50 65 72 65 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72  erent conflict r
12f60 65 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65  esolution strate
12f70 67 69 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  gies */.  }.  fo
12f80 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
12f90 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
12fa0 20 20 69 66 28 20 70 53 72 63 2d 3e 61 69 43 6f    if( pSrc->aiCo
12fb0 6c 75 6d 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e  lumn[i]!=pDest->
12fc0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20  aiColumn[i] ){. 
12fd0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
12fe0 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f   /* Different co
12ff0 6c 75 6d 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f  lumns indexed */
13000 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13010 53 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Src->aiColumn[i]
13020 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20  ==XN_EXPR ){.   
13030 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d     assert( pSrc-
13040 3e 61 43 6f 6c 45 78 70 72 21 3d 30 20 26 26 20  >aColExpr!=0 && 
13050 70 44 65 73 74 2d 3e 61 43 6f 6c 45 78 70 72 21  pDest->aColExpr!
13060 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
13070 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
13080 72 65 28 30 2c 20 70 53 72 63 2d 3e 61 43 6f 6c  re(0, pSrc->aCol
13090 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Expr->a[i].pExpr
130a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
130c0 44 65 73 74 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e  Dest->aColExpr->
130d0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 2d 31 29 21  a[i].pExpr, -1)!
130e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
130f0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66  turn 0;   /* Dif
13100 66 65 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f  ferent expressio
13110 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
13120 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
13130 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
13140 53 6f 72 74 4f 72 64 65 72 5b 69 5d 21 3d 70 44  SortOrder[i]!=pD
13150 65 73 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  est->aSortOrder[
13160 69 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  i] ){.      retu
13170 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
13180 72 65 6e 74 20 73 6f 72 74 20 6f 72 64 65 72 73  rent sort orders
13190 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
131a0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
131b0 70 28 70 53 72 63 2d 3e 61 7a 43 6f 6c 6c 5b 69  p(pSrc->azColl[i
131c0 5d 2c 70 44 65 73 74 2d 3e 61 7a 43 6f 6c 6c 5b  ],pDest->azColl[
131d0 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])!=0 ){.      
131e0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44  return 0;   /* D
131f0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
13200 6e 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a  ng sequences */.
13210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13220 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
13230 72 65 28 30 2c 20 70 53 72 63 2d 3e 70 50 61 72  re(0, pSrc->pPar
13240 74 49 64 78 57 68 65 72 65 2c 20 70 44 65 73 74  tIdxWhere, pDest
13250 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
13260 20 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75   -1) ){.    retu
13270 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 44 69 66  rn 0;     /* Dif
13280 66 65 72 65 6e 74 20 57 48 45 52 45 20 63 6c 61  ferent WHERE cla
13290 75 73 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  uses */.  }..  /
132a0 2a 20 49 66 20 6e 6f 20 74 65 73 74 20 61 62 6f  * If no test abo
132b0 76 65 20 66 61 69 6c 73 20 74 68 65 6e 20 74 68  ve fails then th
132c0 65 20 69 6e 64 69 63 65 73 20 6d 75 73 74 20 62  e indices must b
132d0 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 2a 2f 0a  e compatible */.
132e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
132f0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 68 65  *.** Attempt the
13300 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
13310 7a 61 74 69 6f 6e 20 6f 6e 20 49 4e 53 45 52 54  zation on INSERT
13320 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
13330 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52 54 20 49  .**     INSERT I
13340 4e 54 4f 20 74 61 62 31 20 53 45 4c 45 43 54 20  NTO tab1 SELECT 
13350 2a 20 46 52 4f 4d 20 74 61 62 32 3b 0a 2a 2a 0a  * FROM tab2;.**.
13360 2a 2a 20 54 68 65 20 78 66 65 72 20 6f 70 74 69  ** The xfer opti
13370 6d 69 7a 61 74 69 6f 6e 20 74 72 61 6e 73 66 65  mization transfe
13380 72 73 20 72 61 77 20 72 65 63 6f 72 64 73 20 66  rs raw records f
13390 72 6f 6d 20 74 61 62 32 20 6f 76 65 72 20 74 6f  rom tab2 over to
133a0 20 74 61 62 31 2e 20 20 0a 2a 2a 20 43 6f 6c 75   tab1.  .** Colu
133b0 6d 6e 73 20 61 72 65 20 6e 6f 74 20 64 65 63 6f  mns are not deco
133c0 64 65 64 20 61 6e 64 20 72 65 61 73 73 65 6d 62  ded and reassemb
133d0 6c 65 64 2c 20 77 68 69 63 68 20 67 72 65 61 74  led, which great
133e0 6c 79 20 69 6d 70 72 6f 76 65 73 0a 2a 2a 20 70  ly improves.** p
133f0 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 52 61 77  erformance.  Raw
13400 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 61   index records a
13410 72 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  re transferred i
13420 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 0a  n the same way..
13430 2a 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20 6f  **.** The xfer o
13440 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6f  ptimization is o
13450 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
13460 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 61   tab1 and tab2 a
13470 72 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a  re compatible..*
13480 2a 20 54 68 65 72 65 20 61 72 65 20 6c 6f 74 73  * There are lots
13490 20 6f 66 20 72 75 6c 65 73 20 66 6f 72 20 64 65   of rules for de
134a0 74 65 72 6d 69 6e 69 6e 67 20 63 6f 6d 70 61 74  termining compat
134b0 69 62 69 6c 69 74 79 20 2d 20 73 65 65 20 63 6f  ibility - see co
134c0 6d 6d 65 6e 74 73 0a 2a 2a 20 65 6d 62 65 64 64  mments.** embedd
134d0 65 64 20 69 6e 20 74 68 65 20 63 6f 64 65 20 66  ed in the code f
134e0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  or details..**.*
134f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
13500 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 74  eturns TRUE if t
13510 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
13520 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
13530 20 62 65 20 75 73 65 64 2e 0a 2a 2a 20 53 6f 6d   be used..** Som
13540 65 74 69 6d 65 73 20 74 68 65 20 78 66 65 72 20  etimes the xfer 
13550 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 6c  optimization wil
13560 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74  l only work if t
13570 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
13580 61 62 6c 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79  able.** is empty
13590 20 2d 20 61 20 66 61 63 74 6f 72 20 74 68 61 74   - a factor that
135a0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 64 65 74   can only be det
135b0 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
135c0 69 6d 65 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a  ime.  In that.**
135d0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
135e0 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
135f0 64 65 20 66 6f 72 20 74 68 65 20 78 66 65 72 20  de for the xfer 
13600 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62 75 74  optimization but
13610 20 61 6c 73 6f 0a 2a 2a 20 64 6f 65 73 20 61 20   also.** does a 
13620 74 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 74  test to see if t
13630 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
13640 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 61 6e  able is empty an
13650 64 20 6a 75 6d 70 73 20 6f 76 65 72 20 74 68 65  d jumps over the
13660 0a 2a 2a 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  .** xfer optimiz
13670 61 74 69 6f 6e 20 63 6f 64 65 20 69 66 20 74 68  ation code if th
13680 65 20 74 65 73 74 20 66 61 69 6c 73 2e 20 20 49  e test fails.  I
13690 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
136a0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
136b0 75 72 6e 73 20 46 41 4c 53 45 20 73 6f 20 74 68  urns FALSE so th
136c0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
136d0 6c 6c 20 6b 6e 6f 77 20 74 6f 20 67 6f 20 61 68  ll know to go ah
136e0 65 61 64 20 61 6e 64 20 67 65 6e 65 72 61 74 65  ead and generate
136f0 0a 2a 2a 20 61 6e 20 75 6e 6f 70 74 69 6d 69 7a  .** an unoptimiz
13700 65 64 20 74 72 61 6e 73 66 65 72 2e 20 20 54 68  ed transfer.  Th
13710 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
13720 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 69 66  returns FALSE if
13730 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 6e 6f 20   there.** is no 
13740 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
13750 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  xfer optimizatio
13760 6e 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64  n can be applied
13770 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 74  ..**.** This opt
13780 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 70 61 72  imization is par
13790 74 69 63 75 6c 61 72 6c 79 20 75 73 65 66 75 6c  ticularly useful
137a0 20 61 74 20 6d 61 6b 69 6e 67 20 56 41 43 55 55   at making VACUU
137b0 4d 20 72 75 6e 20 66 61 73 74 65 72 2e 0a 2a 2f  M run faster..*/
137c0 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66 65 72  .static int xfer
137d0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28 0a 20 20  Optimization(.  
137e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
137f0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
13800 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
13810 6c 65 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  le *pDest,      
13820 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
13830 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67  we are inserting
13840 20 69 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63   into */.  Selec
13850 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
13860 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
13870 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73  tement to use as
13880 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
13890 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
138a0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48  r,          /* H
138b0 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e  ow to handle con
138c0 73 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a  straint errors *
138d0 2f 0a 20 20 69 6e 74 20 69 44 62 44 65 73 74 20  /.  int iDbDest 
138e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
138f0 20 64 61 74 61 62 61 73 65 20 6f 66 20 70 44 65   database of pDe
13900 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  st */.){.  sqlit
13910 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
13920 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  >db;.  ExprList 
13930 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20  *pEList;        
13940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
13950 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
13960 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 54 61 62   SELECT */.  Tab
13970 6c 65 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  le *pSrc;       
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13990 20 54 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   The table in th
139a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
139b0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 49 6e 64   SELECT */.  Ind
139c0 65 78 20 2a 70 53 72 63 49 64 78 2c 20 2a 70 44  ex *pSrcIdx, *pD
139d0 65 73 74 49 64 78 3b 20 20 20 20 20 20 20 2f 2a  estIdx;       /*
139e0 20 53 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74   Source and dest
139f0 69 6e 61 74 69 6f 6e 20 69 6e 64 69 63 65 73 20  ination indices 
13a00 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13a10 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
13a20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d        /* An elem
13a30 65 6e 74 20 6f 66 20 70 53 65 6c 65 63 74 2d 3e  ent of pSelect->
13a40 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  pSrc */.  int i;
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
13a70 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
13a80 69 6e 74 20 69 44 62 53 72 63 3b 20 20 20 20 20  int iDbSrc;     
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
13ab0 20 6f 66 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   of pSrc */.  in
13ac0 74 20 69 53 72 63 2c 20 69 44 65 73 74 3b 20 20  t iSrc, iDest;  
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ae0 2a 20 43 75 72 73 6f 72 73 20 66 72 6f 6d 20 73  * Cursors from s
13af0 6f 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e  ource and destin
13b00 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ation */.  int a
13b10 64 64 72 31 2c 20 61 64 64 72 32 3b 20 20 20 20  ddr1, addr2;    
13b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13b30 6f 6f 70 20 61 64 64 72 65 73 73 65 73 20 2a 2f  oop addresses */
13b40 0a 20 20 69 6e 74 20 65 6d 70 74 79 44 65 73 74  .  int emptyDest
13b50 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
13b60 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13b70 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70 74 79  f test for empty
13b80 20 70 44 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pDest */.  int 
13b90 65 6d 70 74 79 53 72 63 54 65 73 74 20 3d 20 30  emptySrcTest = 0
13ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13bb0 41 64 64 72 65 73 73 20 6f 66 20 74 65 73 74 20  Address of test 
13bc0 66 6f 72 20 65 6d 70 74 79 20 70 53 72 63 20 2a  for empty pSrc *
13bd0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bf0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
13c00 20 77 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67   we are building
13c10 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75 74   */.  int regAut
13c20 6f 69 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  oinc;           
13c30 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
13c40 20 72 65 67 69 73 74 65 72 20 75 73 65 64 20 62   register used b
13c50 79 20 41 55 54 4f 49 4e 43 20 2a 2f 0a 20 20 69  y AUTOINC */.  i
13c60 6e 74 20 64 65 73 74 48 61 73 55 6e 69 71 75 65  nt destHasUnique
13c70 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Idx = 0;        
13c80 2f 2a 20 54 72 75 65 20 69 66 20 70 44 65 73 74  /* True if pDest
13c90 20 68 61 73 20 61 20 55 4e 49 51 55 45 20 69 6e   has a UNIQUE in
13ca0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
13cb0 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64 3b 20  Data, regRowid; 
13cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
13cd0 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 64  isters holding d
13ce0 61 74 61 20 61 6e 64 20 72 6f 77 69 64 20 2a 2f  ata and rowid */
13cf0 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d  ..  if( pSelect=
13d00 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
13d10 20 30 3b 20 20 20 2f 2a 20 4d 75 73 74 20 62 65   0;   /* Must be
13d20 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 20 49 4e   of the form  IN
13d30 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45  SERT INTO ... SE
13d40 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a 20 20 7d 0a  LECT ... */.  }.
13d50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 57    if( pParse->pW
13d60 69 74 68 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ith || pSelect->
13d70 70 57 69 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  pWith ){.    /* 
13d80 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
13d90 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 71  o process this q
13da0 75 65 72 79 20 69 66 20 74 68 65 72 65 20 61 72  uery if there ar
13db0 65 20 61 6e 20 57 49 54 48 20 63 6c 61 75 73 65  e an WITH clause
13dc0 73 0a 20 20 20 20 2a 2a 20 61 74 74 61 63 68 65  s.    ** attache
13dd0 64 20 74 6f 20 69 74 2e 20 50 72 6f 63 65 65 64  d to it. Proceed
13de0 69 6e 67 20 6d 61 79 20 67 65 6e 65 72 61 74 65  ing may generate
13df0 20 61 20 66 61 6c 73 65 20 22 6e 6f 20 73 75 63   a false "no suc
13e00 68 20 74 61 62 6c 65 3a 20 78 78 78 22 0a 20 20  h table: xxx".  
13e10 20 20 2a 2a 20 65 72 72 6f 72 20 69 66 20 70 53    ** error if pS
13e20 65 6c 65 63 74 20 72 65 61 64 73 20 66 72 6f 6d  elect reads from
13e30 20 61 20 43 54 45 20 6e 61 6d 65 64 20 22 78 78   a CTE named "xx
13e40 78 22 2e 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  x".  */.    retu
13e50 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
13e60 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
13e70 73 74 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  st(pParse, pDest
13e80 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13e90 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75 73  0;   /* tab1 mus
13ea0 74 20 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67  t not have trigg
13eb0 65 72 73 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64  ers */.  }.#ifnd
13ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13ed0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
13ee0 28 20 49 73 56 69 72 74 75 61 6c 28 70 44 65 73  ( IsVirtual(pDes
13ef0 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
13f00 20 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 6d 75   0;   /* tab1 mu
13f10 73 74 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74  st not be a virt
13f20 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d  ual table */.  }
13f30 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 6e  .#endif.  if( on
13f40 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
13f50 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 44 65  t ){.    if( pDe
13f60 73 74 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 20 6f  st->iPKey>=0 ) o
13f70 6e 45 72 72 6f 72 20 3d 20 70 44 65 73 74 2d 3e  nError = pDest->
13f80 6b 65 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28  keyConf;.    if(
13f90 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
13fa0 61 75 6c 74 20 29 20 6f 6e 45 72 72 6f 72 20 3d  ault ) onError =
13fb0 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20   OE_Abort;.  }. 
13fc0 20 61 73 73 65 72 74 28 70 53 65 6c 65 63 74 2d   assert(pSelect-
13fd0 3e 70 53 72 63 29 3b 20 20 20 2f 2a 20 61 6c 6c  >pSrc);   /* all
13fe0 6f 63 61 74 65 64 20 65 76 65 6e 20 69 66 20 74  ocated even if t
13ff0 68 65 72 65 20 69 73 20 6e 6f 20 46 52 4f 4d 20  here is no FROM 
14000 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
14010 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 6e  pSelect->pSrc->n
14020 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 72 65  Src!=1 ){.    re
14030 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f  turn 0;   /* FRO
14040 4d 20 63 6c 61 75 73 65 20 6d 75 73 74 20 68 61  M clause must ha
14050 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 74  ve exactly one t
14060 65 72 6d 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  erm */.  }.  if(
14070 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e   pSelect->pSrc->
14080 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 7b 0a  a[0].pSelect ){.
14090 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
140a0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  /* FROM clause c
140b0 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  annot contain a 
140c0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a  subquery */.  }.
140d0 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
140e0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 72 65 74  Where ){.    ret
140f0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45  urn 0;   /* SELE
14100 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CT may not have 
14110 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  a WHERE clause *
14120 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  /.  }.  if( pSel
14130 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ect->pOrderBy ){
14140 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
14150 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e   /* SELECT may n
14160 6f 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ot have an ORDER
14170 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
14180 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6e 65  }.  /* Do not ne
14190 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 61  ed to test for a
141a0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
141b0 20 49 66 20 48 41 56 49 4e 47 20 69 73 20 70 72   If HAVING is pr
141c0 65 73 65 6e 74 20 62 75 74 0a 20 20 2a 2a 20 74  esent but.  ** t
141d0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
141e0 20 42 59 2c 20 77 65 20 77 69 6c 6c 20 67 65 74   BY, we will get
141f0 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
14200 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 47 72  if( pSelect->pGr
14210 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 72 65 74  oupBy ){.    ret
14220 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45  urn 0;   /* SELE
14230 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CT may not have 
14240 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
14250 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  e */.  }.  if( p
14260 53 65 6c 65 63 74 2d 3e 70 4c 69 6d 69 74 20 29  Select->pLimit )
14270 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
14280 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
14290 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
142a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20   clause */.  }. 
142b0 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
142c0 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
142d0 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
142e0 54 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  T may not be a c
142f0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 2a 2f  ompound query */
14300 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
14310 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
14320 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
14330 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
14340 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20   SELECT may not 
14350 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  be DISTINCT */. 
14360 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
14370 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
14380 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
14390 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  =0 );.  if( pELi
143a0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
143b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
143c0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
143d0 74 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  t must have exac
143e0 74 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 2a  tly one column *
143f0 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
14400 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
14410 70 72 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  pr );.  if( pELi
14420 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
14430 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20  op!=TK_ASTERISK 
14440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14450 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
14460 20 73 65 74 20 6d 75 73 74 20 62 65 20 74 68 65   set must be the
14470 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f   special operato
14480 72 20 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20  r "*" */.  }..  
14490 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
144a0 20 77 65 20 68 61 76 65 20 65 73 74 61 62 6c 69   we have establi
144b0 73 68 65 64 20 74 68 61 74 20 74 68 65 20 73 74  shed that the st
144c0 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
144d0 65 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 73  e.  ** correct s
144e0 79 6e 74 61 63 74 69 63 20 66 6f 72 6d 20 74 6f  yntactic form to
144f0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
14500 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
14510 6e 2e 20 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20  n.  Now.  ** we 
14520 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68  have to check th
14530 65 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a  e semantics..  *
14540 2f 0a 20 20 70 49 74 65 6d 20 3d 20 70 53 65 6c  /.  pItem = pSel
14550 65 63 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20  ect->pSrc->a;.  
14560 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pSrc = sqlite3Lo
14570 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
14580 61 72 73 65 2c 20 30 2c 20 70 49 74 65 6d 29 3b  arse, 0, pItem);
14590 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
145a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
145b0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
145c0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
145d0 6e 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  n a real table *
145e0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  /.  }.  if( pSrc
145f0 2d 3e 74 6e 75 6d 3d 3d 70 44 65 73 74 2d 3e 74  ->tnum==pDest->t
14600 6e 75 6d 20 26 26 20 70 53 72 63 2d 3e 70 53 63  num && pSrc->pSc
14610 68 65 6d 61 3d 3d 70 44 65 73 74 2d 3e 70 53 63  hema==pDest->pSc
14620 68 65 6d 61 20 29 7b 0a 20 20 20 20 74 65 73 74  hema ){.    test
14630 63 61 73 65 28 20 70 53 72 63 21 3d 70 44 65 73  case( pSrc!=pDes
14640 74 20 29 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65  t ); /* Possible
14650 20 64 75 65 20 74 6f 20 62 61 64 20 73 71 6c 69   due to bad sqli
14660 74 65 5f 6d 61 73 74 65 72 2e 72 6f 6f 74 70 61  te_master.rootpa
14670 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ge */.    return
14680 20 30 3b 20 20 20 2f 2a 20 74 61 62 31 20 61 6e   0;   /* tab1 an
14690 64 20 74 61 62 32 20 6d 61 79 20 6e 6f 74 20 62  d tab2 may not b
146a0 65 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  e the same table
146b0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 48 61   */.  }.  if( Ha
146c0 73 52 6f 77 69 64 28 70 44 65 73 74 29 21 3d 48  sRowid(pDest)!=H
146d0 61 73 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b  asRowid(pSrc) ){
146e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
146f0 20 2f 2a 20 73 6f 75 72 63 65 20 61 6e 64 20 64   /* source and d
14700 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
14710 62 6f 74 68 20 62 65 20 57 49 54 48 4f 55 54 20  both be WITHOUT 
14720 52 4f 57 49 44 20 6f 72 20 6e 6f 74 20 2a 2f 0a  ROWID or not */.
14730 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
14740 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14750 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
14760 74 75 61 6c 28 70 53 72 63 29 20 29 7b 0a 20 20  tual(pSrc) ){.  
14770 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
14780 20 74 61 62 32 20 6d 75 73 74 20 6e 6f 74 20 62   tab2 must not b
14790 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
147a0 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  e */.  }.#endif.
147b0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 53 65 6c    if( pSrc->pSel
147c0 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ect ){.    retur
147d0 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d  n 0;   /* tab2 m
147e0 61 79 20 6e 6f 74 20 62 65 20 61 20 76 69 65 77  ay not be a view
147f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   */.  }.  if( pD
14800 65 73 74 2d 3e 6e 43 6f 6c 21 3d 70 53 72 63 2d  est->nCol!=pSrc-
14810 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74  >nCol ){.    ret
14820 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  urn 0;   /* Numb
14830 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6d 75  er of columns mu
14840 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 69  st be the same i
14850 6e 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20  n tab1 and tab2 
14860 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  */.  }.  if( pDe
14870 73 74 2d 3e 69 50 4b 65 79 21 3d 70 53 72 63 2d  st->iPKey!=pSrc-
14880 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  >iPKey ){.    re
14890 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 42 6f 74  turn 0;   /* Bot
148a0 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 68 61  h tables must ha
148b0 76 65 20 74 68 65 20 73 61 6d 65 20 49 4e 54 45  ve the same INTE
148c0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
148d0 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  */.  }.  for(i=0
148e0 3b 20 69 3c 70 44 65 73 74 2d 3e 6e 43 6f 6c 3b  ; i<pDest->nCol;
148f0 20 69 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d   i++){.    Colum
14900 6e 20 2a 70 44 65 73 74 43 6f 6c 20 3d 20 26 70  n *pDestCol = &p
14910 44 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  Dest->aCol[i];. 
14920 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 53 72 63 43     Column *pSrcC
14930 6f 6c 20 3d 20 26 70 53 72 63 2d 3e 61 43 6f 6c  ol = &pSrc->aCol
14940 5b 69 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [i];.#ifdef SQLI
14950 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
14960 5f 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 69 66 28  _COLUMNS.    if(
14970 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26   (db->mDbFlags &
14980 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 3d   DBFLAG_Vacuum)=
14990 3d 30 20 0a 20 20 20 20 20 26 26 20 28 70 44 65  =0 .     && (pDe
149a0 73 74 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  stCol->colFlags 
149b0 7c 20 70 53 72 63 43 6f 6c 2d 3e 63 6f 6c 46 6c  | pSrcCol->colFl
149c0 61 67 73 29 20 26 20 43 4f 4c 46 4c 41 47 5f 48  ags) & COLFLAG_H
149d0 49 44 44 45 4e 20 0a 20 20 20 20 29 7b 0a 20 20  IDDEN .    ){.  
149e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
149f0 20 2f 2a 20 4e 65 69 74 68 65 72 20 74 61 62 6c   /* Neither tabl
14a00 65 20 6d 61 79 20 68 61 76 65 20 5f 5f 68 69 64  e may have __hid
14a10 64 65 6e 5f 5f 20 63 6f 6c 75 6d 6e 73 20 2a 2f  den__ columns */
14a20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14a30 20 20 69 66 28 20 70 44 65 73 74 43 6f 6c 2d 3e    if( pDestCol->
14a40 61 66 66 69 6e 69 74 79 21 3d 70 53 72 63 43 6f  affinity!=pSrcCo
14a50 6c 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  l->affinity ){. 
14a60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
14a70 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6d 75    /* Affinity mu
14a80 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 6f  st be the same o
14a90 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f  n all columns */
14aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
14ab0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
14ac0 44 65 73 74 43 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20  DestCol->zColl, 
14ad0 70 53 72 63 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 21  pSrcCol->zColl)!
14ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
14af0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c  rn 0;    /* Coll
14b00 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
14b10 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
14b20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a  on all columns *
14b30 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
14b40 70 44 65 73 74 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  pDestCol->notNul
14b50 6c 20 26 26 20 21 70 53 72 63 43 6f 6c 2d 3e 6e  l && !pSrcCol->n
14b60 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  otNull ){.      
14b70 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
14b80 74 61 62 32 20 6d 75 73 74 20 62 65 20 4e 4f 54  tab2 must be NOT
14b90 20 4e 55 4c 4c 20 69 66 20 74 61 62 31 20 69 73   NULL if tab1 is
14ba0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   */.    }.    /*
14bb0 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   Default values 
14bc0 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73  for second and s
14bd0 75 62 73 65 71 75 65 6e 74 20 63 6f 6c 75 6d 6e  ubsequent column
14be0 73 20 6e 65 65 64 20 74 6f 20 6d 61 74 63 68 2e  s need to match.
14bf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3e 30 20   */.    if( i>0 
14c00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14c10 20 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74   pDestCol->pDflt
14c20 3d 3d 30 20 7c 7c 20 70 44 65 73 74 43 6f 6c 2d  ==0 || pDestCol-
14c30 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pDflt->op==TK_S
14c40 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PAN );.      ass
14c50 65 72 74 28 20 70 53 72 63 43 6f 6c 2d 3e 70 44  ert( pSrcCol->pD
14c60 66 6c 74 3d 3d 30 20 7c 7c 20 70 53 72 63 43 6f  flt==0 || pSrcCo
14c70 6c 2d 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b  l->pDflt->op==TK
14c80 5f 53 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 69  _SPAN );.      i
14c90 66 28 20 28 70 44 65 73 74 43 6f 6c 2d 3e 70 44  f( (pDestCol->pD
14ca0 66 6c 74 3d 3d 30 29 21 3d 28 70 53 72 63 43 6f  flt==0)!=(pSrcCo
14cb0 6c 2d 3e 70 44 66 6c 74 3d 3d 30 29 20 0a 20 20  l->pDflt==0) .  
14cc0 20 20 20 20 20 7c 7c 20 28 70 44 65 73 74 43 6f       || (pDestCo
14cd0 6c 2d 3e 70 44 66 6c 74 20 26 26 20 73 74 72 63  l->pDflt && strc
14ce0 6d 70 28 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66  mp(pDestCol->pDf
14cf0 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 0a 20 20  lt->u.zToken,.  
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 20 70 53 72 63 43 6f 6c 2d 3e 70 44       pSrcCol->pD
14d30 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  flt->u.zToken)!=
14d40 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
14d50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
14d60 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
14d70 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
14d80 61 6d 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ame for all colu
14d90 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  mns */.      }. 
14da0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
14db0 44 65 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70  DestIdx=pDest->p
14dc0 49 6e 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b  Index; pDestIdx;
14dd0 20 70 44 65 73 74 49 64 78 3d 70 44 65 73 74 49   pDestIdx=pDestI
14de0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14df0 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
14e00 78 28 70 44 65 73 74 49 64 78 29 20 29 7b 0a 20  x(pDestIdx) ){. 
14e10 20 20 20 20 20 64 65 73 74 48 61 73 55 6e 69 71       destHasUniq
14e20 75 65 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 7d  ueIdx = 1;.    }
14e30 0a 20 20 20 20 66 6f 72 28 70 53 72 63 49 64 78  .    for(pSrcIdx
14e40 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 70  =pSrc->pIndex; p
14e50 53 72 63 49 64 78 3b 20 70 53 72 63 49 64 78 3d  SrcIdx; pSrcIdx=
14e60 70 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b  pSrcIdx->pNext){
14e70 0a 20 20 20 20 20 20 69 66 28 20 78 66 65 72 43  .      if( xferC
14e80 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70  ompatibleIndex(p
14e90 44 65 73 74 49 64 78 2c 20 70 53 72 63 49 64 78  DestIdx, pSrcIdx
14ea0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
14eb0 0a 20 20 20 20 69 66 28 20 70 53 72 63 49 64 78  .    if( pSrcIdx
14ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
14ed0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 70 44 65  urn 0;    /* pDe
14ee0 73 74 49 64 78 20 68 61 73 20 6e 6f 20 63 6f 72  stIdx has no cor
14ef0 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 64 65 78  responding index
14f00 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 20 20   in pSrc */.    
14f10 7d 0a 20 20 20 20 69 66 28 20 70 53 72 63 49 64  }.    if( pSrcId
14f20 78 2d 3e 74 6e 75 6d 3d 3d 70 44 65 73 74 49 64  x->tnum==pDestId
14f30 78 2d 3e 74 6e 75 6d 20 26 26 20 70 53 72 63 2d  x->tnum && pSrc-
14f40 3e 70 53 63 68 65 6d 61 3d 3d 70 44 65 73 74 2d  >pSchema==pDest-
14f50 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20  >pSchema.       
14f60 20 20 26 26 20 73 71 6c 69 74 65 33 46 61 75 6c    && sqlite3Faul
14f70 74 53 69 6d 28 34 31 31 29 3d 3d 53 51 4c 49 54  tSim(411)==SQLIT
14f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
14f90 20 54 68 65 20 73 71 6c 69 74 65 33 46 61 75 6c   The sqlite3Faul
14fa0 74 53 69 6d 28 29 20 63 61 6c 6c 20 61 6c 6c 6f  tSim() call allo
14fb0 77 73 20 74 68 69 73 20 63 6f 72 72 75 70 74 69  ws this corrupti
14fc0 6f 6e 20 74 65 73 74 20 74 6f 20 62 65 0a 20 20  on test to be.  
14fd0 20 20 20 20 2a 2a 20 62 79 70 61 73 73 65 64 20      ** bypassed 
14fe0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20  during testing, 
14ff0 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 65 72  in order to exer
15000 63 69 73 65 20 6f 74 68 65 72 20 63 6f 72 72 75  cise other corru
15010 70 74 69 6f 6e 20 74 65 73 74 73 0a 20 20 20 20  ption tests.    
15020 20 20 2a 2a 20 66 75 72 74 68 65 72 20 64 6f 77    ** further dow
15030 6e 73 74 72 65 61 6d 2e 20 2a 2f 0a 20 20 20 20  nstream. */.    
15040 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
15050 20 43 6f 72 72 75 70 74 20 73 63 68 65 6d 61 20   Corrupt schema 
15060 2d 20 74 77 6f 20 69 6e 64 65 78 65 73 20 6f 6e  - two indexes on
15070 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 20   the same btree 
15080 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  */.    }.  }.#if
15090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
150a0 5f 43 48 45 43 4b 0a 20 20 69 66 28 20 70 44 65  _CHECK.  if( pDe
150b0 73 74 2d 3e 70 43 68 65 63 6b 20 26 26 20 73 71  st->pCheck && sq
150c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
150d0 70 61 72 65 28 70 53 72 63 2d 3e 70 43 68 65 63  pare(pSrc->pChec
150e0 6b 2c 70 44 65 73 74 2d 3e 70 43 68 65 63 6b 2c  k,pDest->pCheck,
150f0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
15100 6e 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c 65 73  n 0;   /* Tables
15110 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 20   have different 
15120 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
15130 73 2e 20 20 54 69 63 6b 65 74 20 23 32 32 35 32  s.  Ticket #2252
15140 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   */.  }.#endif.#
15150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15160 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
15170 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68 65   /* Disallow the
15180 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
15190 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64 65  zation if the de
151a0 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
151b0 63 6f 6e 73 74 61 69 6e 73 0a 20 20 2a 2a 20 61  constains.  ** a
151c0 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ny foreign key c
151d0 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 54 68 69  onstraints.  Thi
151e0 73 20 69 73 20 6d 6f 72 65 20 72 65 73 74 72 69  s is more restri
151f0 63 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ctive than neces
15200 73 61 72 79 2e 0a 20 20 2a 2a 20 42 75 74 20 74  sary..  ** But t
15210 68 65 20 6d 61 69 6e 20 62 65 6e 65 66 69 63 69  he main benefici
15220 61 72 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ary of the trans
15230 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
15240 20 69 73 20 74 68 65 20 56 41 43 55 55 4d 20 0a   is the VACUUM .
15250 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20 61 6e    ** command, an
15260 64 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  d the VACUUM com
15270 6d 61 6e 64 20 64 69 73 61 62 6c 65 73 20 66 6f  mand disables fo
15280 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
15290 61 69 6e 74 73 2e 20 20 53 6f 0a 20 20 2a 2a 20  aints.  So.  ** 
152a0 74 68 65 20 65 78 74 72 61 20 63 6f 6d 70 6c 69  the extra compli
152b0 63 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 74  cation to make t
152c0 68 69 73 20 72 75 6c 65 20 6c 65 73 73 20 72 65  his rule less re
152d0 73 74 72 69 63 74 69 76 65 20 69 73 20 70 72 6f  strictive is pro
152e0 62 61 62 6c 79 0a 20 20 2a 2a 20 6e 6f 74 20 77  bably.  ** not w
152f0 6f 72 74 68 20 74 68 65 20 65 66 66 6f 72 74 2e  orth the effort.
15300 20 20 54 69 63 6b 65 74 20 5b 36 32 38 34 64 66    Ticket [6284df
15310 38 39 64 65 62 64 66 61 36 31 64 62 38 30 37 33  89debdfa61db8073
15320 65 30 36 32 39 30 38 61 66 30 63 39 62 36 31 31  e062908af0c9b611
15330 38 65 5d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  8e].  */.  if( (
15340 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
15350 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 21  TE_ForeignKeys)!
15360 3d 30 20 26 26 20 70 44 65 73 74 2d 3e 70 46 4b  =0 && pDest->pFK
15370 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey!=0 ){.    ret
15380 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
15390 66 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  f.  if( (db->fla
153a0 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
153b0 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20  tRows)!=0 ){.   
153c0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 78   return 0;  /* x
153d0 66 65 72 20 6f 70 74 20 64 6f 65 73 20 6e 6f 74  fer opt does not
153e0 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
153f0 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68 61  PRAGMA count_cha
15400 6e 67 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  nges */.  }..  /
15410 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
15420 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
15430 68 61 74 20 74 68 65 20 78 66 65 72 20 6f 70 74  hat the xfer opt
15440 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 74 0a  imization is at.
15450 20 20 2a 2a 20 6c 65 61 73 74 20 61 20 70 6f 73    ** least a pos
15460 73 69 62 69 6c 69 74 79 2c 20 74 68 6f 75 67 68  sibility, though
15470 20 69 74 20 6d 69 67 68 74 20 6f 6e 6c 79 20 77   it might only w
15480 6f 72 6b 20 69 66 20 74 68 65 20 64 65 73 74 69  ork if the desti
15490 6e 61 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c  nation.  ** tabl
154a0 65 20 28 74 61 62 31 29 20 69 73 20 69 6e 69 74  e (tab1) is init
154b0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 20 20 2a  ially empty..  *
154c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
154d0 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 78  TEST.  sqlite3_x
154e0 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  feropt_count++;.
154f0 23 65 6e 64 69 66 0a 20 20 69 44 62 53 72 63 20  #endif.  iDbSrc 
15500 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
15510 6f 49 6e 64 65 78 28 64 62 2c 20 70 53 72 63 2d  oIndex(db, pSrc-
15520 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76 20 3d  >pSchema);.  v =
15530 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15540 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
15550 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
15560 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 53 72  ma(pParse, iDbSr
15570 63 29 3b 0a 20 20 69 53 72 63 20 3d 20 70 50 61  c);.  iSrc = pPa
15580 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
15590 44 65 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Dest = pParse->n
155a0 54 61 62 2b 2b 3b 0a 20 20 72 65 67 41 75 74 6f  Tab++;.  regAuto
155b0 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42 65 67  inc = autoIncBeg
155c0 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62 44 65  in(pParse, iDbDe
155d0 73 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 72 65  st, pDest);.  re
155e0 67 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 47  gData = sqlite3G
155f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15600 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  );.  regRowid = 
15610 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15620 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
15630 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
15640 61 72 73 65 2c 20 69 44 65 73 74 2c 20 69 44 62  arse, iDest, iDb
15650 44 65 73 74 2c 20 70 44 65 73 74 2c 20 4f 50 5f  Dest, pDest, OP_
15660 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20 61 73  OpenWrite);.  as
15670 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70  sert( HasRowid(p
15680 44 65 73 74 29 20 7c 7c 20 64 65 73 74 48 61 73  Dest) || destHas
15690 55 6e 69 71 75 65 49 64 78 20 29 3b 0a 20 20 69  UniqueIdx );.  i
156a0 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  f( (db->mDbFlags
156b0 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
156c0 29 3d 3d 30 20 26 26 20 28 0a 20 20 20 20 20 20  )==0 && (.      
156d0 28 70 44 65 73 74 2d 3e 69 50 4b 65 79 3c 30 20  (pDest->iPKey<0 
156e0 26 26 20 70 44 65 73 74 2d 3e 70 49 6e 64 65 78  && pDest->pIndex
156f0 21 3d 30 29 20 20 20 20 20 20 20 20 20 20 2f 2a  !=0)          /*
15700 20 28 31 29 20 2a 2f 0a 20 20 20 7c 7c 20 64 65   (1) */.   || de
15710 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 20  stHasUniqueIdx  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
15740 32 29 20 2a 2f 0a 20 20 20 7c 7c 20 28 6f 6e 45  2) */.   || (onE
15750 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72 74 20 26  rror!=OE_Abort &
15760 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 6f  & onError!=OE_Ro
15770 6c 6c 62 61 63 6b 29 20 20 20 2f 2a 20 28 33 29  llback)   /* (3)
15780 20 2a 2f 0a 20 20 29 29 7b 0a 20 20 20 20 2f 2a   */.  )){.    /*
15790 20 49 6e 20 73 6f 6d 65 20 63 69 72 63 75 6d 73   In some circums
157a0 74 61 6e 63 65 73 2c 20 77 65 20 61 72 65 20 61  tances, we are a
157b0 62 6c 65 20 74 6f 20 72 75 6e 20 74 68 65 20 78  ble to run the x
157c0 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
157d0 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 69 66 20  .    ** only if 
157e0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
157f0 74 61 62 6c 65 20 69 73 20 69 6e 69 74 69 61 6c  table is initial
15800 6c 79 20 65 6d 70 74 79 2e 20 55 6e 6c 65 73 73  ly empty. Unless
15810 20 74 68 65 0a 20 20 20 20 2a 2a 20 44 42 46 4c   the.    ** DBFL
15820 41 47 5f 56 61 63 75 75 6d 20 66 6c 61 67 20 69  AG_Vacuum flag i
15830 73 20 73 65 74 2c 20 74 68 69 73 20 62 6c 6f 63  s set, this bloc
15840 6b 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  k generates code
15850 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
15860 74 68 61 74 20 64 65 74 65 72 6d 69 6e 61 74 69  that determinati
15870 6f 6e 2e 20 49 66 20 44 42 46 4c 41 47 5f 56 61  on. If DBFLAG_Va
15880 63 75 75 6d 20 69 73 20 73 65 74 2c 20 74 68 65  cuum is set, the
15890 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  n the destinatio
158a0 6e 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  n.    ** table i
158b0 73 20 61 6c 77 61 79 73 20 65 6d 70 74 79 2e 0a  s always empty..
158c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
158d0 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72 20 77  nditions under w
158e0 68 69 63 68 20 74 68 65 20 64 65 73 74 69 6e 61  hich the destina
158f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 6d 70  tion must be emp
15900 74 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ty:.    **.    *
15910 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20 6e  * (1) There is n
15920 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
15930 59 20 4b 45 59 20 62 75 74 20 74 68 65 72 65 20  Y KEY but there 
15940 61 72 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  are indices..   
15950 20 2a 2a 20 20 20 20 20 28 49 66 20 74 68 65 20   **     (If the 
15960 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 6e  destination is n
15970 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  ot initially emp
15980 74 79 2c 20 74 68 65 20 72 6f 77 69 64 20 66 69  ty, the rowid fi
15990 65 6c 64 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  elds.    **     
159a0 6f 66 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  of index entries
159b0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 63   might need to c
159c0 68 61 6e 67 65 2e 29 0a 20 20 20 20 2a 2a 0a 20  hange.).    **. 
159d0 20 20 20 2a 2a 20 28 32 29 20 54 68 65 20 64 65     ** (2) The de
159e0 73 74 69 6e 61 74 69 6f 6e 20 68 61 73 20 61 20  stination has a 
159f0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 28  unique index.  (
15a00 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  The xfer optimiz
15a10 61 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 20 20  ation .    **   
15a20 20 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 74    is unable to t
15a30 65 73 74 20 75 6e 69 71 75 65 6e 65 73 73 2e 29  est uniqueness.)
15a40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
15a50 33 29 20 6f 6e 45 72 72 6f 72 20 69 73 20 73 6f  3) onError is so
15a60 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
15a70 61 6e 20 4f 45 5f 41 62 6f 72 74 20 61 6e 64 20  an OE_Abort and 
15a80 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  OE_Rollback..   
15a90 20 2a 2f 0a 20 20 20 20 61 64 64 72 31 20 3d 20   */.    addr1 = 
15aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ab0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
15ac0 69 44 65 73 74 2c 20 30 29 3b 20 56 64 62 65 43  iDest, 0); VdbeC
15ad0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15ae0 65 6d 70 74 79 44 65 73 74 54 65 73 74 20 3d 20  emptyDestTest = 
15af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b00 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
15b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15b20 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
15b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48 61 73 52  ;.  }.  if( HasR
15b40 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a 20 20  owid(pSrc) ){.  
15b50 20 20 75 38 20 69 6e 73 46 6c 61 67 73 3b 0a 20    u8 insFlags;. 
15b60 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
15b70 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53 72 63  ble(pParse, iSrc
15b80 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63 2c 20  , iDbSrc, pSrc, 
15b90 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
15ba0 20 20 65 6d 70 74 79 53 72 63 54 65 73 74 20 3d    emptySrcTest =
15bb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15bc0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15bd0 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62 65 43   iSrc, 0); VdbeC
15be0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15bf0 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b 65 79  if( pDest->iPKey
15c00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
15c10 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
15c20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15c30 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52 6f 77  id, iSrc, regRow
15c40 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
15c50 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72  e3VdbeVerifyAbor
15c60 74 61 62 6c 65 28 76 2c 20 6f 6e 45 72 72 6f 72  table(v, onError
15c70 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d  );.      addr2 =
15c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15c90 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
15ca0 74 73 2c 20 69 44 65 73 74 2c 20 30 2c 20 72 65  ts, iDest, 0, re
15cb0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 56  gRowid);.      V
15cc0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77        sqlite3Row
15ce0 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  idConstraint(pPa
15cf0 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 44  rse, onError, pD
15d00 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
15d10 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15d20 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20  v, addr2);.     
15d30 20 61 75 74 6f 49 6e 63 53 74 65 70 28 70 50 61   autoIncStep(pPa
15d40 72 73 65 2c 20 72 65 67 41 75 74 6f 69 6e 63 2c  rse, regAutoinc,
15d50 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
15d60 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d  }else if( pDest-
15d70 3e 70 49 6e 64 65 78 3d 3d 30 20 26 26 20 21 28  >pIndex==0 && !(
15d80 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44  db->mDbFlags & D
15d90 42 46 4c 41 47 5f 56 61 63 75 75 6d 49 6e 74 6f  BFLAG_VacuumInto
15da0 29 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 31  ) ){.      addr1
15db0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15dc0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
15dd0 77 69 64 2c 20 69 44 65 73 74 2c 20 72 65 67 52  wid, iDest, regR
15de0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  owid);.    }else
15df0 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  {.      addr1 = 
15e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e10 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
15e20 53 72 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Src, regRowid);.
15e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
15e40 44 65 73 74 2d 3e 74 61 62 46 6c 61 67 73 20 26  Dest->tabFlags &
15e50 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
15e60 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  t)==0 );.    }. 
15e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15e80 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp3(v, OP_RowDa
15e90 74 61 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74  ta, iSrc, regDat
15ea0 61 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 64  a, 1);.    if( d
15eb0 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42  b->mDbFlags & DB
15ec0 46 4c 41 47 5f 56 61 63 75 75 6d 20 29 7b 0a 20  FLAG_Vacuum ){. 
15ed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ee0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65  AddOp1(v, OP_See
15ef0 6b 45 6e 64 2c 20 69 44 65 73 74 29 3b 0a 20 20  kEnd, iDest);.  
15f00 20 20 20 20 69 6e 73 46 6c 61 67 73 20 3d 20 4f      insFlags = O
15f10 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 7c 4f 50  PFLAG_NCHANGE|OP
15f20 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 7c 0a  FLAG_LASTROWID|.
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 20 20 20 20 20 20 4f 50 46 4c 41             OPFLA
15f50 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f  G_APPEND|OPFLAG_
15f60 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20  USESEEKRESULT;. 
15f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f80 69 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41  insFlags = OPFLA
15f90 47 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47  G_NCHANGE|OPFLAG
15fa0 5f 4c 41 53 54 52 4f 57 49 44 7c 4f 50 46 4c 41  _LASTROWID|OPFLA
15fb0 47 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 7d 0a  G_APPEND;.    }.
15fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15fd0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp4(v, OP_Inse
15fe0 72 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61  rt, iDest, regDa
15ff0 74 61 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20  ta, regRowid,.  
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 73 74      (char*)pDest
16020 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20  , P4_TABLE);.   
16030 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16040 67 65 50 35 28 76 2c 20 69 6e 73 46 6c 61 67 73  geP5(v, insFlags
16050 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16060 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16070 65 78 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31  ext, iSrc, addr1
16080 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16090 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
160a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
160b0 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30 29 3b  Close, iSrc, 0);
160c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
160d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
160e0 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20  se, iDest, 0);. 
160f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
16100 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
16110 72 73 65 2c 20 69 44 62 44 65 73 74 2c 20 70 44  rse, iDbDest, pD
16120 65 73 74 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 44  est->tnum, 1, pD
16130 65 73 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  est->zName);.   
16140 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
16150 6b 28 70 50 61 72 73 65 2c 20 69 44 62 53 72 63  k(pParse, iDbSrc
16160 2c 20 70 53 72 63 2d 3e 74 6e 75 6d 2c 20 30 2c  , pSrc->tnum, 0,
16170 20 70 53 72 63 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pSrc->zName);. 
16180 20 7d 0a 20 20 66 6f 72 28 70 44 65 73 74 49 64   }.  for(pDestId
16190 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b  x=pDest->pIndex;
161a0 20 70 44 65 73 74 49 64 78 3b 20 70 44 65 73 74   pDestIdx; pDest
161b0 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e  Idx=pDestIdx->pN
161c0 65 78 74 29 7b 0a 20 20 20 20 75 38 20 69 64 78  ext){.    u8 idx
161d0 49 6e 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  InsFlags = 0;.  
161e0 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70 53    for(pSrcIdx=pS
161f0 72 63 2d 3e 70 49 6e 64 65 78 3b 20 41 4c 57 41  rc->pIndex; ALWA
16200 59 53 28 70 53 72 63 49 64 78 29 3b 20 70 53 72  YS(pSrcIdx); pSr
16210 63 49 64 78 3d 70 53 72 63 49 64 78 2d 3e 70 4e  cIdx=pSrcIdx->pN
16220 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
16230 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e  xferCompatibleIn
16240 64 65 78 28 70 44 65 73 74 49 64 78 2c 20 70 53  dex(pDestIdx, pS
16250 72 63 49 64 78 29 20 29 20 62 72 65 61 6b 3b 0a  rcIdx) ) break;.
16260 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
16270 28 20 70 53 72 63 49 64 78 20 29 3b 0a 20 20 20  ( pSrcIdx );.   
16280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16290 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
162a0 64 2c 20 69 53 72 63 2c 20 70 53 72 63 49 64 78  d, iSrc, pSrcIdx
162b0 2d 3e 74 6e 75 6d 2c 20 69 44 62 53 72 63 29 3b  ->tnum, iDbSrc);
162c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
162d0 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
162e0 72 73 65 2c 20 70 53 72 63 49 64 78 29 3b 0a 20  rse, pSrcIdx);. 
162f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16300 76 2c 20 22 25 73 22 2c 20 70 53 72 63 49 64 78  v, "%s", pSrcIdx
16310 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73  ->zName));.    s
16320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16330 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
16340 2c 20 69 44 65 73 74 2c 20 70 44 65 73 74 49 64  , iDest, pDestId
16350 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 44 65 73 74  x->tnum, iDbDest
16360 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16370 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
16380 50 61 72 73 65 2c 20 70 44 65 73 74 49 64 78 29  Parse, pDestIdx)
16390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
163a0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
163b0 4c 41 47 5f 42 55 4c 4b 43 53 52 29 3b 0a 20 20  LAG_BULKCSR);.  
163c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
163d0 2c 20 22 25 73 22 2c 20 70 44 65 73 74 49 64 78  , "%s", pDestIdx
163e0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 61  ->zName));.    a
163f0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
16400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16410 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30 29 3b  ewind, iSrc, 0);
16420 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16440 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f  eAddOp3(v, OP_Ro
16450 77 44 61 74 61 2c 20 69 53 72 63 2c 20 72 65 67  wData, iSrc, reg
16460 44 61 74 61 2c 20 31 29 3b 0a 20 20 20 20 69 66  Data, 1);.    if
16470 28 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26  ( db->mDbFlags &
16480 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 20 29   DBFLAG_Vacuum )
16490 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
164a0 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 69  INSERT command i
164b0 73 20 70 61 72 74 20 6f 66 20 61 20 56 41 43 55  s part of a VACU
164c0 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2c 20 77 68  UM operation, wh
164d0 69 63 68 20 67 75 61 72 61 6e 74 65 65 73 0a 20  ich guarantees. 
164e0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
164f0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62   destination tab
16500 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49 66 20  le is empty. If 
16510 61 6c 6c 20 69 6e 64 65 78 65 64 20 63 6f 6c 75  all indexed colu
16520 6d 6e 73 20 75 73 65 0a 20 20 20 20 20 20 2a 2a  mns use.      **
16530 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16540 6e 63 65 20 42 49 4e 41 52 59 2c 20 74 68 65 6e  nce BINARY, then
16550 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
16560 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
16570 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  .      ** index 
16580 77 69 6c 6c 20 62 65 20 70 6f 70 75 6c 61 74 65  will be populate
16590 64 20 62 79 20 69 6e 73 65 72 74 69 6e 67 20 6b  d by inserting k
165a0 65 79 73 20 69 6e 20 73 74 72 69 63 74 6c 79 20  eys in strictly 
165b0 73 6f 72 74 65 64 20 0a 20 20 20 20 20 20 2a 2a  sorted .      **
165c0 20 6f 72 64 65 72 2e 20 49 6e 20 74 68 69 73 20   order. In this 
165d0 63 61 73 65 2c 20 69 6e 73 74 65 61 64 20 6f 66  case, instead of
165e0 20 73 65 65 6b 69 6e 67 20 77 69 74 68 69 6e 20   seeking within 
165f0 74 68 65 20 62 2d 74 72 65 65 20 61 73 20 70 61  the b-tree as pa
16600 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 65  rt.      ** of e
16610 76 65 72 79 20 4f 50 5f 49 64 78 49 6e 73 65 72  very OP_IdxInser
16620 74 20 6f 70 63 6f 64 65 2c 20 61 6e 20 4f 50 5f  t opcode, an OP_
16630 53 65 65 6b 45 6e 64 20 69 73 20 61 64 64 65 64  SeekEnd is added
16640 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
16650 20 20 2a 2a 20 4f 50 5f 49 64 78 49 6e 73 65 72    ** OP_IdxInser
16660 74 20 74 6f 20 73 65 65 6b 20 74 6f 20 74 68 65  t to seek to the
16670 20 70 6f 69 6e 74 20 77 69 74 68 69 6e 20 74 68   point within th
16680 65 20 62 2d 74 72 65 65 20 77 68 65 72 65 20 65  e b-tree where e
16690 61 63 68 20 6b 65 79 20 0a 20 20 20 20 20 20 2a  ach key .      *
166a0 2a 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  * should be inse
166b0 72 74 65 64 2e 20 54 68 69 73 20 69 73 20 66 61  rted. This is fa
166c0 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ster..      **. 
166d0 20 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f       ** If any o
166e0 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f  f the indexed co
166f0 6c 75 6d 6e 73 20 75 73 65 20 61 20 63 6f 6c 6c  lumns use a coll
16700 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
16710 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ther than.      
16720 2a 2a 20 42 49 4e 41 52 59 2c 20 74 68 69 73 20  ** BINARY, this 
16730 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
16740 64 69 73 61 62 6c 65 64 2e 20 54 68 69 73 20 69  disabled. This i
16750 73 20 62 65 63 61 75 73 65 20 74 68 65 20 75 73  s because the us
16760 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67  er .      ** mig
16770 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 65  ht change the de
16780 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20 63 6f  finition of a co
16790 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
167a0 20 61 6e 64 20 74 68 65 6e 20 72 75 6e 0a 20 20   and then run.  
167b0 20 20 20 20 2a 2a 20 61 20 56 41 43 55 55 4d 20      ** a VACUUM 
167c0 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68 61 74  command. In that
167d0 20 63 61 73 65 20 6b 65 79 73 20 6d 61 79 20 6e   case keys may n
167e0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ot be written in
167f0 20 73 74 72 69 63 74 6c 79 0a 20 20 20 20 20 20   strictly.      
16800 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  ** sorted order.
16810 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
16820 3d 30 3b 20 69 3c 70 53 72 63 49 64 78 2d 3e 6e  =0; i<pSrcIdx->n
16830 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
16840 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
16850 20 2a 7a 43 6f 6c 6c 20 3d 20 70 53 72 63 49 64   *zColl = pSrcId
16860 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
16870 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16880 33 5f 73 74 72 69 63 6d 70 28 73 71 6c 69 74 65  3_stricmp(sqlite
16890 33 53 74 72 42 49 4e 41 52 59 2c 20 7a 43 6f 6c  3StrBINARY, zCol
168a0 6c 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  l) ) break;.    
168b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
168c0 3d 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c 75 6d  =pSrcIdx->nColum
168d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78  n ){.        idx
168e0 49 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41  InsFlags = OPFLA
168f0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b  G_USESEEKRESULT;
16900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16910 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16920 5f 53 65 65 6b 45 6e 64 2c 20 69 44 65 73 74 29  _SeekEnd, iDest)
16930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16940 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
16950 64 28 70 53 72 63 29 20 26 26 20 70 44 65 73 74  d(pSrc) && pDest
16960 49 64 78 2d 3e 69 64 78 54 79 70 65 3d 3d 53 51  Idx->idxType==SQ
16970 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
16980 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 20  MARYKEY ){.     
16990 20 69 64 78 49 6e 73 46 6c 61 67 73 20 7c 3d 20   idxInsFlags |= 
169a0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a  OPFLAG_NCHANGE;.
169b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
169c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
169d0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 44 65  P_IdxInsert, iDe
169e0 73 74 2c 20 72 65 67 44 61 74 61 29 3b 0a 20 20  st, regData);.  
169f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16a00 6e 67 65 50 35 28 76 2c 20 69 64 78 49 6e 73 46  ngeP5(v, idxInsF
16a10 6c 61 67 73 7c 4f 50 46 4c 41 47 5f 41 50 50 45  lags|OPFLAG_APPE
16a20 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
16a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16a40 5f 4e 65 78 74 2c 20 69 53 72 63 2c 20 61 64 64  _Next, iSrc, add
16a50 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
16a60 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16a70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16a80 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
16a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16aa0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
16ab0 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
16ac0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16ad0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74   OP_Close, iDest
16ae0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
16af0 65 6d 70 74 79 53 72 63 54 65 73 74 20 29 20 73  emptySrcTest ) s
16b00 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16b10 72 65 28 76 2c 20 65 6d 70 74 79 53 72 63 54 65  re(v, emptySrcTe
16b20 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  st);.  sqlite3Re
16b30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16b40 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
16b50 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16b60 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16b70 72 65 67 44 61 74 61 29 3b 0a 20 20 69 66 28 20  regData);.  if( 
16b80 65 6d 70 74 79 44 65 73 74 54 65 73 74 20 29 7b  emptyDestTest ){
16b90 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
16ba0 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61  incrementEnd(pPa
16bb0 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
16bc0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16bd0 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f  P_Halt, SQLITE_O
16be0 4b 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  K, 0);.    sqlit
16bf0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
16c00 2c 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 29  , emptyDestTest)
16c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16c20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
16c30 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a  ose, iDest, 0);.
16c40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16c50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
16c60 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 1;.  }.}.#endi
16c70 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16c80 5f 58 46 45 52 5f 4f 50 54 20 2a 2f 0a           _XFER_OPT */.