/ Hex Artifact Content
Login

Artifact 0db6364a6a64e521281d6f443b1669a5a16bdbd6:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 49 4e 53 45 52 54 20 73   handle INSERT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
0210: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 0a 2a  ode that will .*
0220: 2a 0a 2a 2a 20 20 20 28 31 29 20 61 63 71 75 69  *.**   (1) acqui
0230: 72 65 20 61 20 6c 6f 63 6b 20 66 6f 72 20 74 61  re a lock for ta
0240: 62 6c 65 20 70 54 61 62 20 74 68 65 6e 0a 2a 2a  ble pTab then.**
0250: 20 20 20 28 32 29 20 6f 70 65 6e 20 70 54 61 62     (2) open pTab
0260: 20 61 73 20 63 75 72 73 6f 72 20 69 43 75 72 2e   as cursor iCur.
0270: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61 62 20 69  .**.** If pTab i
0280: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
0290: 44 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 69 74  D table, then it
02a0: 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
02b0: 4b 45 59 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72  KEY index.** for
02c0: 20 74 68 61 74 20 74 61 62 6c 65 20 74 68 61 74   that table that
02d0: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 6f 70 65   is actually ope
02e0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
02f0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 0a 20  ite3OpenTable(. 
0300: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
0310: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
0320: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
0330: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
0340: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
0350: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
0360: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
0370: 20 69 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   iDb,        /* 
0380: 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
0390: 65 78 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44  ex in sqlite3.aD
03a0: 62 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  b[] */.  Table *
03b0: 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
03c0: 74 61 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e  table to be open
03d0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  ed */.  int opco
03e0: 64 65 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70  de      /* OP_Op
03f0: 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
0400: 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20 56  nWrite */.){.  V
0410: 64 62 65 20 2a 76 3b 0a 20 20 61 73 73 65 72 74  dbe *v;.  assert
0420: 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
0430: 62 29 20 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  b) );.  v = sqli
0440: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0450: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  e);.  assert( op
0460: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
0470: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
0480: 5f 4f 70 65 6e 52 65 61 64 20 29 3b 0a 20 20 73  _OpenRead );.  s
0490: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
04a0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
04b0: 62 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20 20  b->tnum, .      
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70               (op
04d0: 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69  code==OP_OpenWri
04e0: 74 65 29 3f 31 3a 30 2c 20 70 54 61 62 2d 3e 7a  te)?1:0, pTab->z
04f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 48 61 73  Name);.  if( Has
0500: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
0510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0520: 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 63 6f 64  dOp4Int(v, opcod
0530: 65 2c 20 69 43 75 72 2c 20 70 54 61 62 2d 3e 74  e, iCur, pTab->t
0540: 6e 75 6d 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  num, iDb, pTab->
0550: 6e 43 6f 6c 29 3b 0a 20 20 20 20 56 64 62 65 43  nCol);.    VdbeC
0560: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
0570: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
0580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64    }else{.    Ind
0590: 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
05a0: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
05b0: 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73 65  (pTab);.    asse
05c0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
05d0: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 74    assert( pPk->t
05e0: 6e 75 6d 3d 3d 70 54 61 62 2d 3e 74 6e 75 6d 20  num==pTab->tnum 
05f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
0600: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 63 6f  beAddOp3(v, opco
0610: 64 65 2c 20 69 43 75 72 2c 20 70 50 6b 2d 3e 74  de, iCur, pPk->t
0620: 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
0630: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
0640: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
0650: 50 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  Pk);.    VdbeCom
0660: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
0670: 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
0680: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
0690: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
06a0: 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
06b0: 74 79 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69  ty string associ
06c0: 61 74 65 64 20 77 69 74 68 20 69 6e 64 65 78 0a  ated with index.
06d0: 2a 2a 20 70 49 64 78 2e 20 41 20 63 6f 6c 75 6d  ** pIdx. A colum
06e0: 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
06f0: 67 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61 63  g has one charac
0700: 74 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ter for each col
0710: 75 6d 6e 20 69 6e 20 0a 2a 2a 20 74 68 65 20 74  umn in .** the t
0720: 61 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20  able, according 
0730: 74 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  to the affinity 
0740: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 3a 0a 2a  of the column:.*
0750: 2a 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72 20  *.**  Character 
0760: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66 69       Column affi
0770: 6e 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d  nity.**  -------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 41 27 20  -------.**  'A' 
07a0: 20 20 20 20 20 20 20 20 20 20 20 42 4c 4f 42 0a             BLOB.
07b0: 2a 2a 20 20 27 42 27 20 20 20 20 20 20 20 20 20  **  'B'         
07c0: 20 20 20 54 45 58 54 0a 2a 2a 20 20 27 43 27 20     TEXT.**  'C' 
07d0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45 52             NUMER
07e0: 49 43 0a 2a 2a 20 20 27 44 27 20 20 20 20 20 20  IC.**  'D'      
07f0: 20 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a 2a        INTEGER.**
0800: 20 20 27 46 27 20 20 20 20 20 20 20 20 20 20 20    'F'           
0810: 20 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 41 6e 20 65   REAL.**.** An e
0820: 78 74 72 61 20 27 44 27 20 69 73 20 61 70 70 65  xtra 'D' is appe
0830: 6e 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20  nded to the end 
0840: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  of the string to
0850: 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 72 6f   cover the.** ro
0860: 77 69 64 20 74 68 61 74 20 61 70 70 65 61 72 73  wid that appears
0870: 20 61 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   as the last col
0880: 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 69 6e 64  umn in every ind
0890: 65 78 2e 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79  ex..**.** Memory
08a0: 20 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20   for the buffer 
08b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
08c0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 61 66 66 69  olumn index affi
08d0: 6e 69 74 79 20 73 74 72 69 6e 67 0a 2a 2a 20 69  nity string.** i
08e0: 73 20 6d 61 6e 61 67 65 64 20 61 6c 6f 6e 67 20  s managed along 
08f0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0900: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
0910: 74 75 72 65 2e 20 49 74 20 77 69 6c 6c 20 62 65  ture. It will be
0920: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65  .** released whe
0930: 6e 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  n sqlite3DeleteI
0940: 6e 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64  ndex() is called
0950: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
0960: 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  *sqlite3IndexAff
0970: 69 6e 69 74 79 53 74 72 28 73 71 6c 69 74 65 33  inityStr(sqlite3
0980: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
0990: 78 29 7b 0a 20 20 69 66 28 20 21 70 49 64 78 2d  x){.  if( !pIdx-
09a0: 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20  >zColAff ){.    
09b0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  /* The first tim
09c0: 65 20 61 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  e a column affin
09d0: 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 61  ity string for a
09e0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
09f0: 78 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  x is.    ** requ
0a00: 69 72 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ired, it is allo
0a10: 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
0a20: 74 65 64 20 68 65 72 65 2e 20 49 74 20 69 73 20  ted here. It is 
0a30: 74 68 65 6e 20 73 74 6f 72 65 64 20 61 73 0a 20  then stored as. 
0a40: 20 20 20 2a 2a 20 61 20 6d 65 6d 62 65 72 20 6f     ** a member o
0a50: 66 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  f the Index stru
0a60: 63 74 75 72 65 20 66 6f 72 20 73 75 62 73 65 71  cture for subseq
0a70: 75 65 6e 74 20 75 73 65 2e 0a 20 20 20 20 2a 2a  uent use..    **
0a80: 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75  .    ** The colu
0a90: 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
0aa0: 6e 67 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  ng will eventual
0ab0: 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 62 79  ly be deleted by
0ac0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 44 65  .    ** sqliteDe
0ad0: 6c 65 74 65 49 6e 64 65 78 28 29 20 77 68 65 6e  leteIndex() when
0ae0: 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
0af0: 74 75 72 65 20 69 74 73 65 6c 66 20 69 73 20 63  ture itself is c
0b00: 6c 65 61 6e 65 64 0a 20 20 20 20 2a 2a 20 75 70  leaned.    ** up
0b10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
0b20: 20 6e 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   n;.    Table *p
0b30: 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Tab = pIdx->pTab
0b40: 6c 65 3b 0a 20 20 20 20 70 49 64 78 2d 3e 7a 43  le;.    pIdx->zC
0b50: 6f 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a 29  olAff = (char *)
0b60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
0b70: 61 77 28 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  aw(0, pIdx->nCol
0b80: 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  umn+1);.    if( 
0b90: 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29  !pIdx->zColAff )
0ba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
0bb0: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
0bc0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0bd0: 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20   }.    for(n=0; 
0be0: 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  n<pIdx->nColumn;
0bf0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   n++){.      i16
0c00: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
0c10: 75 6d 6e 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66  umn[n];.      if
0c20: 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( x>=0 ){.      
0c30: 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b    pIdx->zColAff[
0c40: 6e 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  n] = pTab->aCol[
0c50: 78 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  x].affinity;.   
0c60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3d 3d     }else if( x==
0c70: 58 4e 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  XN_ROWID ){.    
0c80: 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66      pIdx->zColAf
0c90: 66 5b 6e 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[n] = SQLITE_AF
0ca0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
0cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0cc0: 63 68 61 72 20 61 66 66 3b 0a 20 20 20 20 20 20  char aff;.      
0cd0: 20 20 61 73 73 65 72 74 28 20 78 3d 3d 58 4e 5f    assert( x==XN_
0ce0: 45 58 50 52 20 29 3b 0a 20 20 20 20 20 20 20 20  EXPR );.        
0cf0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 43  assert( pIdx->aC
0d00: 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  olExpr!=0 );.   
0d10: 20 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74       aff = sqlit
0d20: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0d30: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
0d40: 5b 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [n].pExpr);.    
0d50: 20 20 20 20 69 66 28 20 61 66 66 3d 3d 30 20 29      if( aff==0 )
0d60: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
0d70: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20  F_BLOB;.        
0d80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d  pIdx->zColAff[n]
0d90: 20 3d 20 61 66 66 3b 0a 20 20 20 20 20 20 7d 0a   = aff;.      }.
0da0: 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78 2d 3e      }.    pIdx->
0db0: 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d 20 30 3b 0a  zColAff[n] = 0;.
0dc0: 20 20 7d 0a 20 0a 20 20 72 65 74 75 72 6e 20 70    }. .  return p
0dd0: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 3b 0a 7d 0a  Idx->zColAff;.}.
0de0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
0df0: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
0e00: 6e 67 20 66 6f 72 20 74 61 62 6c 65 20 70 54 61  ng for table pTa
0e10: 62 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  b, if it has not
0e20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
0e30: 20 63 6f 6d 70 75 74 65 64 2e 20 20 41 73 20 61   computed.  As a
0e40: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  n optimization, 
0e50: 6f 6d 69 74 20 74 72 61 69 6c 69 6e 67 20 53 51  omit trailing SQ
0e60: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 61 66  LITE_AFF_BLOB af
0e70: 66 69 6e 69 74 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  finities..**.** 
0e80: 49 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  If the affinity 
0e90: 65 78 69 73 74 73 20 28 69 66 20 69 74 20 69 73  exists (if it is
0ea0: 20 6e 6f 20 65 6e 74 69 72 65 6c 79 20 53 51 4c   no entirely SQL
0eb0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 76 61 6c  ITE_AFF_BLOB val
0ec0: 75 65 73 29 20 61 6e 64 0a 2a 2a 20 69 66 20 69  ues) and.** if i
0ed0: 52 65 67 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  Reg>0 then code 
0ee0: 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
0ef0: 70 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20  pcode that will 
0f00: 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 69  set the affiniti
0f10: 65 73 0a 2a 2a 20 66 6f 72 20 72 65 67 69 73 74  es.** for regist
0f20: 65 72 20 69 52 65 67 20 61 6e 64 20 66 6f 6c 6c  er iReg and foll
0f30: 6f 77 69 6e 67 2e 20 20 4f 72 20 69 66 20 61 66  owing.  Or if af
0f40: 66 69 6e 69 74 69 65 73 20 65 78 69 73 74 73 20  finities exists 
0f50: 61 6e 64 20 69 52 65 67 3d 3d 30 2c 0a 2a 2a 20  and iReg==0,.** 
0f60: 74 68 65 6e 20 6a 75 73 74 20 73 65 74 20 74 68  then just set th
0f70: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P4 operand of 
0f80: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f 70 63  the previous opc
0f90: 6f 64 65 20 28 77 68 69 63 68 20 73 68 6f 75 6c  ode (which shoul
0fa0: 64 20 20 62 65 0a 2a 2a 20 61 6e 20 4f 50 5f 4d  d  be.** an OP_M
0fb0: 61 6b 65 52 65 63 6f 72 64 29 20 74 6f 20 74 68  akeRecord) to th
0fc0: 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  e affinity strin
0fd0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6c 75 6d  g..**.** A colum
0fe0: 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
0ff0: 67 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61 63  g has one charac
1000: 74 65 72 20 70 65 72 20 63 6f 6c 75 6d 6e 3a 0a  ter per column:.
1010: 2a 2a 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72  **.**  Character
1020: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66        Column aff
1030: 69 6e 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d  inity.**  ------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 41 27  --------.**  'A'
1060: 20 20 20 20 20 20 20 20 20 20 20 20 42 4c 4f 42              BLOB
1070: 0a 2a 2a 20 20 27 42 27 20 20 20 20 20 20 20 20  .**  'B'        
1080: 20 20 20 20 54 45 58 54 0a 2a 2a 20 20 27 43 27      TEXT.**  'C'
1090: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45              NUME
10a0: 52 49 43 0a 2a 2a 20 20 27 44 27 20 20 20 20 20  RIC.**  'D'     
10b0: 20 20 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a         INTEGER.*
10c0: 2a 20 20 27 45 27 20 20 20 20 20 20 20 20 20 20  *  'E'          
10d0: 20 20 52 45 41 4c 0a 2a 2f 0a 76 6f 69 64 20 73    REAL.*/.void s
10e0: 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
10f0: 69 74 79 28 56 64 62 65 20 2a 76 2c 20 54 61 62  ity(Vdbe *v, Tab
1100: 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 52  le *pTab, int iR
1110: 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
1120: 63 68 61 72 20 2a 7a 43 6f 6c 41 66 66 20 3d 20  char *zColAff = 
1130: 70 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 3b 0a 20  pTab->zColAff;. 
1140: 20 69 66 28 20 7a 43 6f 6c 41 66 66 3d 3d 30 20   if( zColAff==0 
1150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
1160: 64 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  db = sqlite3Vdbe
1170: 44 62 28 76 29 3b 0a 20 20 20 20 7a 43 6f 6c 41  Db(v);.    zColA
1180: 66 66 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ff = (char *)sql
1190: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
11a0: 30 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  0, pTab->nCol+1)
11b0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 41  ;.    if( !zColA
11c0: 66 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ff ){.      sqli
11d0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
11e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11f0: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
1200: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
1210: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6f   i++){.      zCo
1220: 6c 41 66 66 5b 69 5d 20 3d 20 70 54 61 62 2d 3e  lAff[i] = pTab->
1230: 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74 79  aCol[i].affinity
1240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
1250: 20 20 20 20 20 20 7a 43 6f 6c 41 66 66 5b 69 2d        zColAff[i-
1260: 2d 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  -] = 0;.    }whi
1270: 6c 65 28 20 69 3e 3d 30 20 26 26 20 7a 43 6f 6c  le( i>=0 && zCol
1280: 41 66 66 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 41  Aff[i]==SQLITE_A
1290: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 70  FF_BLOB );.    p
12a0: 54 61 62 2d 3e 7a 43 6f 6c 41 66 66 20 3d 20 7a  Tab->zColAff = z
12b0: 43 6f 6c 41 66 66 3b 0a 20 20 7d 0a 20 20 69 20  ColAff;.  }.  i 
12c0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12d0: 30 28 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66  0(zColAff);.  if
12e0: 28 20 69 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ( i ){.    if( i
12f0: 52 65 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Reg ){.      sql
1300: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1310: 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 69  , OP_Affinity, i
1320: 52 65 67 2c 20 69 2c 20 30 2c 20 7a 43 6f 6c 41  Reg, i, 0, zColA
1330: 66 66 2c 20 69 29 3b 0a 20 20 20 20 7d 65 6c 73  ff, i);.    }els
1340: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1350: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1360: 2d 31 2c 20 7a 43 6f 6c 41 66 66 2c 20 69 29 3b  -1, zColAff, i);
1370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1380: 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
1390: 65 72 6f 20 69 66 20 74 68 65 20 74 61 62 6c 65  ero if the table
13a0: 20 70 54 61 62 20 69 6e 20 64 61 74 61 62 61 73   pTab in databas
13b0: 65 20 69 44 62 20 6f 72 20 61 6e 79 20 6f 66 20  e iDb or any of 
13c0: 69 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 68  its indices.** h
13d0: 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
13e0: 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
13f0: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1400: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
1410: 6f 20 73 65 65 20 69 66 20 0a 2a 2a 20 61 20 73  o see if .** a s
1420: 74 61 74 65 6d 65 6e 74 20 6f 66 20 74 68 65 20  tatement of the 
1430: 66 6f 72 6d 20 20 22 49 4e 53 45 52 54 20 49 4e  form  "INSERT IN
1440: 54 4f 20 3c 69 44 62 2c 20 70 54 61 62 3e 20 53  TO <iDb, pTab> S
1450: 45 4c 45 43 54 20 2e 2e 2e 22 20 63 61 6e 20 0a  ELECT ..." can .
1460: 2a 2a 20 72 75 6e 20 77 69 74 68 6f 75 74 20 75  ** run without u
1470: 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
1480: 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 72   table for the r
1490: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
14a0: 4c 45 43 54 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  LECT. .*/.static
14b0: 20 69 6e 74 20 72 65 61 64 73 54 61 62 6c 65 28   int readsTable(
14c0: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
14d0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  b, Table *pTab){
14e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
14f0: 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a  ite3GetVdbe(p);.
1500: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
1510: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1520: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1530: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1540: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1550: 45 0a 20 20 56 54 61 62 6c 65 20 2a 70 56 54 61  E.  VTable *pVTa
1560: 62 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  b = IsVirtual(pT
1570: 61 62 29 20 3f 20 73 71 6c 69 74 65 33 47 65 74  ab) ? sqlite3Get
1580: 56 54 61 62 6c 65 28 70 2d 3e 64 62 2c 20 70 54  VTable(p->db, pT
1590: 61 62 29 20 3a 20 30 3b 0a 23 65 6e 64 69 66 0a  ab) : 0;.#endif.
15a0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 69 45  .  for(i=1; i<iE
15b0: 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64  nd; i++){.    Vd
15c0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69  beOp *pOp = sqli
15d0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15e0: 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i);.    assert( 
15f0: 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  pOp!=0 );.    if
1600: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
1610: 50 5f 4f 70 65 6e 52 65 61 64 20 26 26 20 70 4f  P_OpenRead && pO
1620: 70 2d 3e 70 33 3d 3d 69 44 62 20 29 7b 0a 20 20  p->p3==iDb ){.  
1630: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
1640: 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6e 75  x;.      int tnu
1650: 6d 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  m = pOp->p2;.   
1660: 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 70 54 61     if( tnum==pTa
1670: 62 2d 3e 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20  b->tnum ){.     
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1690: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70     }.      for(p
16a0: 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
16b0: 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
16c0: 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
16d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  ){.        if( t
16e0: 6e 75 6d 3d 3d 70 49 6e 64 65 78 2d 3e 74 6e 75  num==pIndex->tnu
16f0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  m ){.          r
1700: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1710: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1720: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1730: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1740: 45 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  E.    if( pOp->o
1750: 70 63 6f 64 65 3d 3d 4f 50 5f 56 4f 70 65 6e 20  pcode==OP_VOpen 
1760: 26 26 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62  && pOp->p4.pVtab
1770: 3d 3d 70 56 54 61 62 20 29 7b 0a 20 20 20 20 20  ==pVTab ){.     
1780: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1790: 2e 70 56 74 61 62 21 3d 30 20 29 3b 0a 20 20 20  .pVtab!=0 );.   
17a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
17b0: 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41 42 20  p4type==P4_VTAB 
17c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17d0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
17e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17f0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1800: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
1810: 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  MENT./*.** Locat
1820: 65 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 41  e or create an A
1830: 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72 75 63  utoincInfo struc
1840: 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
1850: 77 69 74 68 20 74 61 62 6c 65 20 70 54 61 62 0a  with table pTab.
1860: 2a 2a 20 77 68 69 63 68 20 69 73 20 69 6e 20 64  ** which is in d
1870: 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 52 65  atabase iDb.  Re
1880: 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1890: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
18a0: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 74 68 61   register.** tha
18b0: 74 20 68 6f 6c 64 73 20 74 68 65 20 6d 61 78 69  t holds the maxi
18c0: 6d 75 6d 20 72 6f 77 69 64 2e 20 20 52 65 74 75  mum rowid.  Retu
18d0: 72 6e 20 7a 65 72 6f 20 69 66 20 70 54 61 62 20  rn zero if pTab 
18e0: 69 73 20 6e 6f 74 20 61 6e 20 41 55 54 4f 49 4e  is not an AUTOIN
18f0: 43 52 45 4d 45 4e 54 0a 2a 2a 20 74 61 62 6c 65  CREMENT.** table
1900: 2e 20 20 28 41 6c 73 6f 20 72 65 74 75 72 6e 20  .  (Also return 
1910: 7a 65 72 6f 20 77 68 65 6e 20 64 6f 69 6e 67 20  zero when doing 
1920: 61 20 56 41 43 55 55 4d 20 73 69 6e 63 65 20 77  a VACUUM since w
1930: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
1940: 0a 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 41  .** update the A
1950: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 63 6f 75  UTOINCREMENT cou
1960: 6e 74 65 72 73 20 64 75 72 69 6e 67 20 61 20 56  nters during a V
1970: 41 43 55 55 4d 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ACUUM.).**.** Th
1980: 65 72 65 20 69 73 20 61 74 20 6d 6f 73 74 20 6f  ere is at most o
1990: 6e 65 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73  ne AutoincInfo s
19a0: 74 72 75 63 74 75 72 65 20 70 65 72 20 74 61 62  tructure per tab
19b0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65 0a 2a  le even if the.*
19c0: 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 69 73 20  * same table is 
19d0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 65 64 20  autoincremented 
19e0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 64  multiple times d
19f0: 75 65 20 74 6f 20 69 6e 73 65 72 74 73 20 77 69  ue to inserts wi
1a00: 74 68 69 6e 0a 2a 2a 20 74 72 69 67 67 65 72 73  thin.** triggers
1a10: 2e 20 20 41 20 6e 65 77 20 41 75 74 6f 69 6e 63  .  A new Autoinc
1a20: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
1a30: 73 20 63 72 65 61 74 65 64 20 69 66 20 74 68 69  s created if thi
1a40: 73 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73  s is the.** firs
1a50: 74 20 75 73 65 20 6f 66 20 74 61 62 6c 65 20 70  t use of table p
1a60: 54 61 62 2e 20 20 4f 6e 20 32 6e 64 20 61 6e 64  Tab.  On 2nd and
1a70: 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65 73   subsequent uses
1a80: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  , the original.*
1a90: 2a 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74  * AutoincInfo st
1aa0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 2e  ructure is used.
1ab0: 0a 2a 2a 0a 2a 2a 20 54 68 72 65 65 20 6d 65 6d  .**.** Three mem
1ac0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 61 72  ory locations ar
1ad0: 65 20 61 6c 6c 6f 63 61 74 65 64 3a 0a 2a 2a 0a  e allocated:.**.
1ae0: 2a 2a 20 20 20 28 31 29 20 20 52 65 67 69 73 74  **   (1)  Regist
1af0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  er to hold the n
1b00: 61 6d 65 20 6f 66 20 74 68 65 20 70 54 61 62 20  ame of the pTab 
1b10: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28 32 29 20  table..**   (2) 
1b20: 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c   Register to hol
1b30: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 52 4f  d the maximum RO
1b40: 57 49 44 20 6f 66 20 70 54 61 62 2e 0a 2a 2a 20  WID of pTab..** 
1b50: 20 20 28 33 29 20 20 52 65 67 69 73 74 65 72 20    (3)  Register 
1b60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 69  to hold the rowi
1b70: 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  d in sqlite_sequ
1b80: 65 6e 63 65 20 6f 66 20 70 54 61 62 0a 2a 2a 0a  ence of pTab.**.
1b90: 2a 2a 20 54 68 65 20 32 6e 64 20 72 65 67 69 73  ** The 2nd regis
1ba0: 74 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 74  ter is the one t
1bb0: 68 61 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  hat is returned.
1bc0: 20 20 54 68 61 74 20 69 73 20 61 6c 6c 20 74 68    That is all th
1bd0: 65 0a 2a 2a 20 69 6e 73 65 72 74 20 72 6f 75 74  e.** insert rout
1be0: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  ine needs to kno
1bf0: 77 20 61 62 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  w about..*/.stat
1c00: 69 63 20 69 6e 74 20 61 75 74 6f 49 6e 63 42 65  ic int autoIncBe
1c10: 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
1c20: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
1c30: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c40: 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
1c50: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1c60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c70: 68 6f 6c 64 69 6e 67 20 70 54 61 62 20 2a 2f 0a  holding pTab */.
1c80: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
1c90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
1ca0: 6c 65 20 77 65 20 61 72 65 20 77 72 69 74 69 6e  le we are writin
1cb0: 67 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g to */.){.  int
1cc0: 20 6d 65 6d 49 64 20 3d 20 30 3b 20 20 20 20 20   memId = 0;     
1cd0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1ce0: 64 69 6e 67 20 6d 61 78 69 6d 75 6d 20 72 6f 77  ding maximum row
1cf0: 69 64 20 2a 2f 0a 20 20 69 66 28 20 28 70 54 61  id */.  if( (pTa
1d00: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1d10: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
1d20: 3d 30 0a 20 20 20 26 26 20 28 70 50 61 72 73 65  =0.   && (pParse
1d30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1d40: 4c 49 54 45 5f 56 61 63 75 75 6d 29 3d 3d 30 0a  LITE_Vacuum)==0.
1d50: 20 20 29 7b 0a 20 20 20 20 50 61 72 73 65 20 2a    ){.    Parse *
1d60: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1d70: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1d80: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 41 75  (pParse);.    Au
1d90: 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 49 6e 66 6f  toincInfo *pInfo
1da0: 3b 0a 0a 20 20 20 20 70 49 6e 66 6f 20 3d 20 70  ;..    pInfo = p
1db0: 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 3b  Toplevel->pAinc;
1dc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 66  .    while( pInf
1dd0: 6f 20 26 26 20 70 49 6e 66 6f 2d 3e 70 54 61 62  o && pInfo->pTab
1de0: 21 3d 70 54 61 62 20 29 7b 20 70 49 6e 66 6f 20  !=pTab ){ pInfo 
1df0: 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65 78 74 3b 20  = pInfo->pNext; 
1e00: 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 3d  }.    if( pInfo=
1e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  =0 ){.      pInf
1e20: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
1e30: 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d  locRawNN(pParse-
1e40: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  >db, sizeof(*pIn
1e50: 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fo));.      if( 
1e60: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
1e70: 6e 20 30 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  n 0;.      pInfo
1e80: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70 6c 65  ->pNext = pTople
1e90: 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20 20 20  vel->pAinc;.    
1ea0: 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69    pToplevel->pAi
1eb0: 6e 63 20 3d 20 70 49 6e 66 6f 3b 0a 20 20 20 20  nc = pInfo;.    
1ec0: 20 20 70 49 6e 66 6f 2d 3e 70 54 61 62 20 3d 20    pInfo->pTab = 
1ed0: 70 54 61 62 3b 0a 20 20 20 20 20 20 70 49 6e 66  pTab;.      pInf
1ee0: 6f 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  o->iDb = iDb;.  
1ef0: 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e      pToplevel->n
1f00: 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  Mem++;          
1f10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1f20: 74 65 72 20 74 6f 20 68 6f 6c 64 20 6e 61 6d 65  ter to hold name
1f30: 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20   of table */.   
1f40: 20 20 20 70 49 6e 66 6f 2d 3e 72 65 67 43 74 72     pInfo->regCtr
1f50: 20 3d 20 2b 2b 70 54 6f 70 6c 65 76 65 6c 2d 3e   = ++pToplevel->
1f60: 6e 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78 20 72 6f  nMem;  /* Max ro
1f70: 77 69 64 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  wid register */.
1f80: 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1f90: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20  >nMem++;        
1fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
1fb0: 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73 65 71  id in sqlite_seq
1fc0: 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  uence */.    }. 
1fd0: 20 20 20 6d 65 6d 49 64 20 3d 20 70 49 6e 66 6f     memId = pInfo
1fe0: 2d 3e 72 65 67 43 74 72 3b 0a 20 20 7d 0a 20 20  ->regCtr;.  }.  
1ff0: 72 65 74 75 72 6e 20 6d 65 6d 49 64 3b 0a 7d 0a  return memId;.}.
2000: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2010: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2020: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69  de that will ini
2030: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 6f 66 20 74  tialize all of t
2040: 68 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 75  he.** register u
2050: 73 65 64 20 62 79 20 74 68 65 20 61 75 74 6f 69  sed by the autoi
2060: 6e 63 72 65 6d 65 6e 74 20 74 72 61 63 6b 65 72  ncrement tracker
2070: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
2080: 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  te3Autoincrement
2090: 42 65 67 69 6e 28 50 61 72 73 65 20 2a 70 50 61  Begin(Parse *pPa
20a0: 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63 49  rse){.  AutoincI
20b0: 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 20 20  nfo *p;         
20c0: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
20d0: 6e 20 61 62 6f 75 74 20 61 6e 20 41 55 54 4f 49  n about an AUTOI
20e0: 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 73 71  NCREMENT */.  sq
20f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2100: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
2110: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2120: 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ion */.  Db *pDb
2130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2140: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2150: 6f 6e 6c 79 20 61 75 74 6f 69 6e 63 20 74 61 62  only autoinc tab
2160: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 49  le */.  int memI
2170: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2180: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
2190: 6f 6c 64 69 6e 67 20 6d 61 78 20 72 6f 77 69 64  olding max rowid
21a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
21b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
21c0: 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72 20 63   /* VDBE under c
21d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  onstruction */..
21e0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
21f0: 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2200: 64 20 64 75 72 69 6e 67 20 74 72 69 67 67 65 72  d during trigger
2210: 2d 67 65 6e 65 72 61 74 69 6f 6e 2e 20 20 49 74  -generation.  It
2220: 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79 20 63 61   is.  ** only ca
2230: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 74 6f  lled from the to
2240: 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20 20 61 73 73  p-level */.  ass
2250: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 54 72  ert( pParse->pTr
2260: 69 67 67 65 72 54 61 62 3d 3d 30 20 29 3b 0a 20  iggerTab==0 );. 
2270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2280: 49 73 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  IsToplevel(pPars
2290: 65 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  e) );..  assert(
22a0: 20 76 20 29 3b 20 20 20 2f 2a 20 57 65 20 66 61   v );   /* We fa
22b0: 69 6c 65 64 20 6c 6f 6e 67 20 61 67 6f 20 69 66  iled long ago if
22c0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
22d0: 2a 2f 0a 20 20 66 6f 72 28 70 20 3d 20 70 50 61  */.  for(p = pPa
22e0: 72 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20 70  rse->pAinc; p; p
22f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   = p->pNext){.  
2300: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
2310: 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46  nt iLn = VDBE_OF
2320: 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a  FSET_LINENO(2);.
2330: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2340: 20 56 64 62 65 4f 70 4c 69 73 74 20 61 75 74 6f   VdbeOpList auto
2350: 49 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  Inc[] = {.      
2360: 2f 2a 20 30 20 20 2a 2f 20 7b 4f 50 5f 4e 75 6c  /* 0  */ {OP_Nul
2370: 6c 2c 20 20 20 20 30 2c 20 20 30 2c 20 30 7d 2c  l,    0,  0, 0},
2380: 0a 20 20 20 20 20 20 2f 2a 20 31 20 20 2a 2f 20  .      /* 1  */ 
2390: 7b 4f 50 5f 52 65 77 69 6e 64 2c 20 20 30 2c 20  {OP_Rewind,  0, 
23a0: 20 39 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a   9, 0},.      /*
23b0: 20 32 20 20 2a 2f 20 7b 4f 50 5f 43 6f 6c 75 6d   2  */ {OP_Colum
23c0: 6e 2c 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20  n,  0,  0, 0},. 
23d0: 20 20 20 20 20 2f 2a 20 33 20 20 2a 2f 20 7b 4f       /* 3  */ {O
23e0: 50 5f 4e 65 2c 20 20 20 20 20 20 30 2c 20 20 37  P_Ne,      0,  7
23f0: 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 34  , 0},.      /* 4
2400: 20 20 2a 2f 20 7b 4f 50 5f 52 6f 77 69 64 2c 20    */ {OP_Rowid, 
2410: 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20 20 20    0,  0, 0},.   
2420: 20 20 20 2f 2a 20 35 20 20 2a 2f 20 7b 4f 50 5f     /* 5  */ {OP_
2430: 43 6f 6c 75 6d 6e 2c 20 20 30 2c 20 20 31 2c 20  Column,  0,  1, 
2440: 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 36 20 20  0},.      /* 6  
2450: 2a 2f 20 7b 4f 50 5f 47 6f 74 6f 2c 20 20 20 20  */ {OP_Goto,    
2460: 30 2c 20 20 39 2c 20 30 7d 2c 0a 20 20 20 20 20  0,  9, 0},.     
2470: 20 2f 2a 20 37 20 20 2a 2f 20 7b 4f 50 5f 4e 65   /* 7  */ {OP_Ne
2480: 78 74 2c 20 20 20 20 30 2c 20 20 32 2c 20 30 7d  xt,    0,  2, 0}
2490: 2c 0a 20 20 20 20 20 20 2f 2a 20 38 20 20 2a 2f  ,.      /* 8  */
24a0: 20 7b 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c   {OP_Integer, 0,
24b0: 20 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f    0, 0},.      /
24c0: 2a 20 39 20 20 2a 2f 20 7b 4f 50 5f 43 6c 6f 73  * 9  */ {OP_Clos
24d0: 65 2c 20 20 20 30 2c 20 20 30 2c 20 30 7d 20 0a  e,   0,  0, 0} .
24e0: 20 20 20 20 7d 3b 0a 20 20 20 20 56 64 62 65 4f      };.    VdbeO
24f0: 70 20 2a 61 4f 70 3b 0a 20 20 20 20 70 44 62 20  p *aOp;.    pDb 
2500: 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  = &db->aDb[p->iD
2510: 62 5d 3b 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20  b];.    memId = 
2520: 70 2d 3e 72 65 67 43 74 72 3b 0a 20 20 20 20 61  p->regCtr;.    a
2530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2540: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2550: 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  , 0, pDb->pSchem
2560: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
2570: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2580: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44  e, 0, p->iDb, pD
2590: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
25a0: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
25b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
25c0: 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
25d0: 6d 65 6d 49 64 2d 31 2c 20 70 2d 3e 70 54 61 62  memId-1, p->pTab
25e0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 4f  ->zName);.    aO
25f0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
2600: 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61  ddOpList(v, Arra
2610: 79 53 69 7a 65 28 61 75 74 6f 49 6e 63 29 2c 20  ySize(autoInc), 
2620: 61 75 74 6f 49 6e 63 2c 20 69 4c 6e 29 3b 0a 20  autoInc, iLn);. 
2630: 20 20 20 69 66 28 20 61 4f 70 3d 3d 30 20 29 20     if( aOp==0 ) 
2640: 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f 70 5b 30  break;.    aOp[0
2650: 5d 2e 70 32 20 3d 20 6d 65 6d 49 64 3b 0a 20 20  ].p2 = memId;.  
2660: 20 20 61 4f 70 5b 30 5d 2e 70 33 20 3d 20 6d 65    aOp[0].p3 = me
2670: 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70 5b 32  mId+1;.    aOp[2
2680: 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a 20 20  ].p3 = memId;.  
2690: 20 20 61 4f 70 5b 33 5d 2e 70 31 20 3d 20 6d 65    aOp[3].p1 = me
26a0: 6d 49 64 2d 31 3b 0a 20 20 20 20 61 4f 70 5b 33  mId-1;.    aOp[3
26b0: 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b 0a 20 20  ].p3 = memId;.  
26c0: 20 20 61 4f 70 5b 33 5d 2e 70 35 20 3d 20 53 51    aOp[3].p5 = SQ
26d0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 3b  LITE_JUMPIFNULL;
26e0: 0a 20 20 20 20 61 4f 70 5b 34 5d 2e 70 32 20 3d  .    aOp[4].p2 =
26f0: 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f   memId+1;.    aO
2700: 70 5b 35 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b  p[5].p3 = memId;
2710: 0a 20 20 20 20 61 4f 70 5b 38 5d 2e 70 32 20 3d  .    aOp[8].p2 =
2720: 20 6d 65 6d 49 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f   memId;.  }.}../
2730: 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
2740: 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 66 6f  maximum rowid fo
2750: 72 20 61 6e 20 61 75 74 6f 69 6e 63 72 65 6d 65  r an autoincreme
2760: 6e 74 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2e 0a  nt calculation..
2770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2780: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
2790: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 67  led when the reg
27a0: 52 6f 77 69 64 20 72 65 67 69 73 74 65 72 20 68  Rowid register h
27b0: 6f 6c 64 73 20 61 0a 2a 2a 20 6e 65 77 20 72 6f  olds a.** new ro
27c0: 77 69 64 20 74 68 61 74 20 69 73 20 61 62 6f 75  wid that is abou
27d0: 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  t to be inserted
27e0: 2e 20 20 49 66 20 74 68 61 74 20 6e 65 77 20 72  .  If that new r
27f0: 6f 77 69 64 20 69 73 0a 2a 2a 20 6c 61 72 67 65  owid is.** large
2800: 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d  r than the maxim
2810: 75 6d 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  um rowid in the 
2820: 6d 65 6d 49 64 20 6d 65 6d 6f 72 79 20 63 65 6c  memId memory cel
2830: 6c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  l, then the.** m
2840: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20 75 70  emory cell is up
2850: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
2860: 20 76 6f 69 64 20 61 75 74 6f 49 6e 63 53 74 65   void autoIncSte
2870: 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
2880: 20 69 6e 74 20 6d 65 6d 49 64 2c 20 69 6e 74 20   int memId, int 
2890: 72 65 67 52 6f 77 69 64 29 7b 0a 20 20 69 66 28  regRowid){.  if(
28a0: 20 6d 65 6d 49 64 3e 30 20 29 7b 0a 20 20 20 20   memId>0 ){.    
28b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28c0: 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
28d0: 20 4f 50 5f 4d 65 6d 4d 61 78 2c 20 6d 65 6d 49   OP_MemMax, memI
28e0: 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  d, regRowid);.  
28f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2900: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
2910: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
2920: 64 20 74 6f 20 77 72 69 74 65 20 61 75 74 6f 69  d to write autoi
2930: 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 6d 61 78 69  ncrement.** maxi
2940: 6d 75 6d 20 72 6f 77 69 64 20 76 61 6c 75 65 73  mum rowid values
2950: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73   back into the s
2960: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 72  qlite_sequence r
2970: 65 67 69 73 74 65 72 2e 0a 2a 2a 20 45 76 65 72  egister..** Ever
2980: 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  y statement that
2990: 20 6d 69 67 68 74 20 64 6f 20 61 6e 20 49 4e 53   might do an INS
29a0: 45 52 54 20 69 6e 74 6f 20 61 6e 20 61 75 74 6f  ERT into an auto
29b0: 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 61 62  increment.** tab
29c0: 6c 65 20 28 65 69 74 68 65 72 20 64 69 72 65 63  le (either direc
29d0: 74 6c 79 20 6f 72 20 74 68 72 6f 75 67 68 20 74  tly or through t
29e0: 72 69 67 67 65 72 73 29 20 6e 65 65 64 73 20 74  riggers) needs t
29f0: 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  o call this.** r
2a00: 6f 75 74 69 6e 65 20 6a 75 73 74 20 62 65 66 6f  outine just befo
2a10: 72 65 20 74 68 65 20 22 65 78 69 74 22 20 63 6f  re the "exit" co
2a20: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  de..*/.static SQ
2a30: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
2a40: 69 64 20 61 75 74 6f 49 6e 63 72 65 6d 65 6e 74  id autoIncrement
2a50: 45 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  End(Parse *pPars
2a60: 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63 49 6e 66  e){.  AutoincInf
2a70: 6f 20 2a 70 3b 0a 20 20 56 64 62 65 20 2a 76 20  o *p;.  Vdbe *v 
2a80: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2a90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2aa0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2ab0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 66  assert( v );.  f
2ac0: 6f 72 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  or(p = pParse->p
2ad0: 41 69 6e 63 3b 20 70 3b 20 70 20 3d 20 70 2d 3e  Ainc; p; p = p->
2ae0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 73 74 61 74  pNext){.    stat
2af0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 69 4c 6e  ic const int iLn
2b00: 20 3d 20 56 44 42 45 5f 4f 46 46 53 45 54 5f 4c   = VDBE_OFFSET_L
2b10: 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20 20 73 74  INENO(2);.    st
2b20: 61 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f  atic const VdbeO
2b30: 70 4c 69 73 74 20 61 75 74 6f 49 6e 63 45 6e 64  pList autoIncEnd
2b40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20  [] = {.      /* 
2b50: 30 20 2a 2f 20 7b 4f 50 5f 4e 6f 74 4e 75 6c 6c  0 */ {OP_NotNull
2b60: 2c 20 20 20 20 20 30 2c 20 32 2c 20 30 7d 2c 0a  ,     0, 2, 0},.
2b70: 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 20 7b 4f        /* 1 */ {O
2b80: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 20 20 20 30  P_NewRowid,    0
2b90: 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f  , 0, 0},.      /
2ba0: 2a 20 32 20 2a 2f 20 7b 4f 50 5f 4d 61 6b 65 52  * 2 */ {OP_MakeR
2bb0: 65 63 6f 72 64 2c 20 20 30 2c 20 32 2c 20 30 7d  ecord,  0, 2, 0}
2bc0: 2c 0a 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 20  ,.      /* 3 */ 
2bd0: 7b 4f 50 5f 49 6e 73 65 72 74 2c 20 20 20 20 20  {OP_Insert,     
2be0: 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20 20   0, 0, 0},.     
2bf0: 20 2f 2a 20 34 20 2a 2f 20 7b 4f 50 5f 43 6c 6f   /* 4 */ {OP_Clo
2c00: 73 65 2c 20 20 20 20 20 20 20 30 2c 20 30 2c 20  se,       0, 0, 
2c10: 30 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  0}.    };.    Vd
2c20: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 44  beOp *aOp;.    D
2c30: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2c40: 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 69  b[p->iDb];.    i
2c50: 6e 74 20 69 52 65 63 3b 0a 20 20 20 20 69 6e 74  nt iRec;.    int
2c60: 20 6d 65 6d 49 64 20 3d 20 70 2d 3e 72 65 67 43   memId = p->regC
2c70: 74 72 3b 0a 0a 20 20 20 20 69 52 65 63 20 3d 20  tr;..    iRec = 
2c80: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2c90: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  g(pParse);.    a
2ca0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2cb0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2cc0: 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d  , 0, pDb->pSchem
2cd0: 61 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  a) );.    sqlite
2ce0: 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
2cf0: 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20 70 44  e, 0, p->iDb, pD
2d00: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
2d10: 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  Tab, OP_OpenWrit
2d20: 65 29 3b 0a 20 20 20 20 61 4f 70 20 3d 20 73 71  e);.    aOp = sq
2d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
2d40: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
2d50: 61 75 74 6f 49 6e 63 45 6e 64 29 2c 20 61 75 74  autoIncEnd), aut
2d60: 6f 49 6e 63 45 6e 64 2c 20 69 4c 6e 29 3b 0a 20  oIncEnd, iLn);. 
2d70: 20 20 20 69 66 28 20 61 4f 70 3d 3d 30 20 29 20     if( aOp==0 ) 
2d80: 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f 70 5b 30  break;.    aOp[0
2d90: 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a  ].p1 = memId+1;.
2da0: 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32 20 3d 20      aOp[1].p2 = 
2db0: 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70  memId+1;.    aOp
2dc0: 5b 32 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2d 31  [2].p1 = memId-1
2dd0: 3b 0a 20 20 20 20 61 4f 70 5b 32 5d 2e 70 33 20  ;.    aOp[2].p3 
2de0: 3d 20 69 52 65 63 3b 0a 20 20 20 20 61 4f 70 5b  = iRec;.    aOp[
2df0: 33 5d 2e 70 32 20 3d 20 69 52 65 63 3b 0a 20 20  3].p2 = iRec;.  
2e00: 20 20 61 4f 70 5b 33 5d 2e 70 33 20 3d 20 6d 65    aOp[3].p3 = me
2e10: 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f 70 5b 33  mId+1;.    aOp[3
2e20: 5d 2e 70 35 20 3d 20 4f 50 46 4c 41 47 5f 41 50  ].p5 = OPFLAG_AP
2e30: 50 45 4e 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  PEND;.    sqlite
2e40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
2e50: 70 50 61 72 73 65 2c 20 69 52 65 63 29 3b 0a 20  pParse, iRec);. 
2e60: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
2e70: 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e  3AutoincrementEn
2e80: 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  d(Parse *pParse)
2e90: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2ea0: 70 41 69 6e 63 20 29 20 61 75 74 6f 49 6e 63 72  pAinc ) autoIncr
2eb0: 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29  ementEnd(pParse)
2ec0: 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20  ;.}.#else./*.** 
2ed0: 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  If SQLITE_OMIT_A
2ee0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
2ef0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
2f00: 65 20 74 68 72 65 65 20 72 6f 75 74 69 6e 65 73  e three routines
2f10: 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 61 6c  .** above are al
2f20: 6c 20 6e 6f 2d 6f 70 73 0a 2a 2f 0a 23 20 64 65  l no-ops.*/.# de
2f30: 66 69 6e 65 20 61 75 74 6f 49 6e 63 42 65 67 69  fine autoIncBegi
2f40: 6e 28 41 2c 42 2c 43 29 20 28 30 29 0a 23 20 64  n(A,B,C) (0).# d
2f50: 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 53 74 65  efine autoIncSte
2f60: 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 20  p(A,B,C).#endif 
2f70: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
2f80: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a  UTOINCREMENT */.
2f90: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
2fa0: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
2fb0: 69 63 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d  ic int xferOptim
2fc0: 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  ization(.  Parse
2fd0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2fe0: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
2ff0: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
3000: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Dest,         /*
3010: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
3020: 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  e inserting into
3030: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
3040: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41  elect,      /* A
3050: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3060: 74 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20  t to use as the 
3070: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20  data source */. 
3080: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
3090: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
30a0: 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69   handle constrai
30b0: 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  nt errors */.  i
30c0: 6e 74 20 69 44 62 44 65 73 74 20 20 20 20 20 20  nt iDbDest      
30d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
30e0: 62 61 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f  base of pDest */
30f0: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .);../*.** This 
3100: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3110: 64 20 74 6f 20 68 61 6e 64 6c 65 20 53 51 4c 20  d to handle SQL 
3120: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3130: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
3140: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42   insert into TAB
3150: 4c 45 20 28 49 44 4c 49 53 54 29 20 76 61 6c 75  LE (IDLIST) valu
3160: 65 73 28 45 58 50 52 4c 49 53 54 29 2c 28 45 58  es(EXPRLIST),(EX
3170: 50 52 4c 49 53 54 29 2c 2e 2e 2e 0a 2a 2a 20 20  PRLIST),....**  
3180: 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54 41    insert into TA
3190: 42 4c 45 20 28 49 44 4c 49 53 54 29 20 73 65 6c  BLE (IDLIST) sel
31a0: 65 63 74 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74  ect.**    insert
31b0: 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c   into TABLE (IDL
31c0: 49 53 54 29 20 64 65 66 61 75 6c 74 20 76 61 6c  IST) default val
31d0: 75 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44  ues.**.** The ID
31e0: 4c 49 53 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  LIST following t
31f0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
3200: 20 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c   always optional
3210: 2e 20 20 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a  .  If omitted,.*
3220: 2a 20 74 68 65 6e 20 61 20 6c 69 73 74 20 6f 66  * then a list of
3230: 20 61 6c 6c 20 28 6e 6f 6e 2d 68 69 64 64 65 6e   all (non-hidden
3240: 29 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  ) columns for th
3250: 65 20 74 61 62 6c 65 20 69 73 20 73 75 62 73 74  e table is subst
3260: 69 74 75 74 65 64 2e 0a 2a 2a 20 54 68 65 20 49  ituted..** The I
3270: 44 4c 49 53 54 20 61 70 70 65 61 72 73 20 69 6e  DLIST appears in
3280: 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61 72   the pColumn par
3290: 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d 6e  ameter.  pColumn
32a0: 20 69 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c 49   is NULL if IDLI
32b0: 53 54 0a 2a 2a 20 69 73 20 6f 6d 69 74 74 65 64  ST.** is omitted
32c0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
32d0: 70 53 65 6c 65 63 74 20 70 61 72 61 6d 65 74 65  pSelect paramete
32e0: 72 20 68 6f 6c 64 73 20 74 68 65 20 76 61 6c 75  r holds the valu
32f0: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  es to be inserte
3300: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 66 69 72  d for the.** fir
3310: 73 74 20 74 77 6f 20 66 6f 72 6d 73 20 73 68 6f  st two forms sho
3320: 77 6e 20 61 62 6f 76 65 2e 20 20 41 20 56 41 4c  wn above.  A VAL
3330: 55 45 53 20 63 6c 61 75 73 65 20 69 73 20 72 65  UES clause is re
3340: 61 6c 6c 79 20 6a 75 73 74 20 73 68 6f 72 74 2d  ally just short-
3350: 68 61 6e 64 0a 2a 2a 20 66 6f 72 20 61 20 53 45  hand.** for a SE
3360: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
3370: 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20 46 52  hat omits the FR
3380: 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 65 76  OM clause and ev
3390: 65 72 79 74 68 69 6e 67 20 65 6c 73 65 0a 2a 2a  erything else.**
33a0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2e 20 20   that follows.  
33b0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 70  If the pSelect p
33c0: 61 72 61 6d 65 74 65 72 20 69 73 20 4e 55 4c 4c  arameter is NULL
33d0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
33e0: 74 20 74 68 65 0a 2a 2a 20 44 45 46 41 55 4c 54  t the.** DEFAULT
33f0: 20 56 41 4c 55 45 53 20 66 6f 72 6d 20 6f 66 20   VALUES form of 
3400: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
3410: 6d 65 6e 74 20 69 73 20 69 6e 74 65 6e 64 65 64  ment is intended
3420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
3430: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 6c 6c 6f   generated follo
3440: 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75 72 20 74  ws one of four t
3450: 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f 72 20 61  emplates.  For a
3460: 20 73 69 6d 70 6c 65 0a 2a 2a 20 69 6e 73 65 72   simple.** inser
3470: 74 20 77 69 74 68 20 64 61 74 61 20 63 6f 6d 69  t with data comi
3480: 6e 67 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ng from a single
3490: 2d 72 6f 77 20 56 41 4c 55 45 53 20 63 6c 61 75  -row VALUES clau
34a0: 73 65 2c 20 74 68 65 20 63 6f 64 65 20 65 78 65  se, the code exe
34b0: 63 75 74 65 73 0a 2a 2a 20 6f 6e 63 65 20 73 74  cutes.** once st
34c0: 72 61 69 67 68 74 20 64 6f 77 6e 20 74 68 72 6f  raight down thro
34d0: 75 67 68 2e 20 20 50 73 65 75 64 6f 2d 63 6f 64  ugh.  Pseudo-cod
34e0: 65 20 66 6f 6c 6c 6f 77 73 20 28 77 65 20 63 61  e follows (we ca
34f0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 74 68 65 20 22  ll this.** the "
3500: 31 73 74 20 74 65 6d 70 6c 61 74 65 22 29 3a 0a  1st template"):.
3510: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70  **.**         op
3520: 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  en write cursor 
3530: 74 6f 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69  to <table> and i
3540: 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20  ts indices.**   
3550: 20 20 20 20 20 20 70 75 74 20 56 41 4c 55 45 53        put VALUES
3560: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
3570: 6f 6e 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ons into registe
3580: 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 72  rs.**         wr
3590: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ite the resultin
35a0: 67 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 3c 74  g record into <t
35b0: 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20  able>.**        
35c0: 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 54   cleanup.**.** T
35d0: 68 65 20 74 68 72 65 65 20 72 65 6d 61 69 6e 69  he three remaini
35e0: 6e 67 20 74 65 6d 70 6c 61 74 65 73 20 61 73 73  ng templates ass
35f0: 75 6d 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ume the statemen
3600: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
3610: 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20  .**.**   INSERT 
3620: 49 4e 54 4f 20 3c 74 61 62 6c 65 3e 20 53 45 4c  INTO <table> SEL
3630: 45 43 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ECT ....**.** If
3640: 20 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61 75   the SELECT clau
3650: 73 65 20 69 73 20 6f 66 20 74 68 65 20 72 65 73  se is of the res
3660: 74 72 69 63 74 65 64 20 66 6f 72 6d 20 22 53 45  tricted form "SE
3670: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62  LECT * FROM <tab
3680: 6c 65 32 3e 22 20 2d 0a 2a 2a 20 69 6e 20 6f 74  le2>" -.** in ot
3690: 68 65 72 20 77 6f 72 64 73 20 69 66 20 74 68 65  her words if the
36a0: 20 53 45 4c 45 43 54 20 70 75 6c 6c 73 20 61 6c   SELECT pulls al
36b0: 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61  l columns from a
36c0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 0a 2a 2a   single table.**
36d0: 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
36e0: 20 57 48 45 52 45 20 6f 72 20 4c 49 4d 49 54 20   WHERE or LIMIT 
36f0: 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 4f  or GROUP BY or O
3700: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2c  RDER BY clauses,
3710: 20 61 6e 64 0a 2a 2a 20 69 66 20 3c 74 61 62 6c   and.** if <tabl
3720: 65 32 3e 20 61 6e 64 20 3c 74 61 62 6c 65 31 3e  e2> and <table1>
3730: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 74 61   are distinct ta
3740: 62 6c 65 73 20 62 75 74 20 68 61 76 65 20 69 64  bles but have id
3750: 65 6e 74 69 63 61 6c 0a 2a 2a 20 73 63 68 65 6d  entical.** schem
3760: 61 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  as, including al
3770: 6c 20 74 68 65 20 73 61 6d 65 20 69 6e 64 69 63  l the same indic
3780: 65 73 2c 20 74 68 65 6e 20 61 20 73 70 65 63 69  es, then a speci
3790: 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  al optimization.
37a0: 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 68  ** is invoked th
37b0: 61 74 20 63 6f 70 69 65 73 20 72 61 77 20 72 65  at copies raw re
37c0: 63 6f 72 64 73 20 66 72 6f 6d 20 3c 74 61 62 6c  cords from <tabl
37d0: 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c 74 61 62  e2> over to <tab
37e0: 6c 65 31 3e 2e 0a 2a 2a 20 53 65 65 20 74 68 65  le1>..** See the
37f0: 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f   xferOptimizatio
3800: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  n() function for
3810: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
3820: 69 6f 6e 20 6f 66 20 74 68 69 73 0a 2a 2a 20 74  ion of this.** t
3830: 65 6d 70 6c 61 74 65 2e 20 20 54 68 69 73 20 69  emplate.  This i
3840: 73 20 74 68 65 20 32 6e 64 20 74 65 6d 70 6c 61  s the 2nd templa
3850: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  te..**.**       
3860: 20 20 6f 70 65 6e 20 61 20 77 72 69 74 65 20 63    open a write c
3870: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3880: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 65 6e  .**         open
3890: 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20   read cursor on 
38a0: 3c 74 61 62 6c 65 32 3e 0a 2a 2a 20 20 20 20 20  <table2>.**     
38b0: 20 20 20 20 74 72 61 6e 73 66 65 72 20 61 6c 6c      transfer all
38c0: 20 72 65 63 6f 72 64 73 20 69 6e 20 3c 74 61 62   records in <tab
38d0: 6c 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c 74 61  le2> over to <ta
38e0: 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble>.**         
38f0: 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a 2a  close cursors.**
3900: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
3910: 20 69 6e 64 65 78 20 6f 6e 20 3c 74 61 62 6c 65   index on <table
3920: 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f  >.**           o
3930: 70 65 6e 20 61 20 77 72 69 74 65 20 63 75 72 73  pen a write curs
3940: 6f 72 20 6f 6e 20 74 68 65 20 3c 74 61 62 6c 65  or on the <table
3950: 3e 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 20  > index.**      
3960: 20 20 20 20 20 6f 70 65 6e 20 61 20 72 65 61 64       open a read
3970: 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 63   cursor on the c
3980: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 3c 74 61  orresponding <ta
3990: 62 6c 65 32 3e 20 69 6e 64 65 78 0a 2a 2a 20 20  ble2> index.**  
39a0: 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65           transfe
39b0: 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 66 72  r all records fr
39c0: 6f 6d 20 74 68 65 20 72 65 61 64 20 74 6f 20 74  om the read to t
39d0: 68 65 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  he write cursors
39e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6c  .**           cl
39f0: 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20  ose cursors.**  
3a00: 20 20 20 20 20 20 20 65 6e 64 20 66 6f 72 65 61         end forea
3a10: 63 68 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 72 64  ch.**.** The 3rd
3a20: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 66 6f 72   template is for
3a30: 20 77 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   when the second
3a40: 20 74 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e   template does n
3a50: 6f 74 20 61 70 70 6c 79 0a 2a 2a 20 61 6e 64 20  ot apply.** and 
3a60: 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61 75 73  the SELECT claus
3a70: 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20  e does not read 
3a80: 66 72 6f 6d 20 3c 74 61 62 6c 65 3e 20 61 74 20  from <table> at 
3a90: 61 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 54 68 65  any time..** The
3aa0: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20   generated code 
3ab0: 66 6f 6c 6c 6f 77 73 20 74 68 69 73 20 74 65 6d  follows this tem
3ac0: 70 6c 61 74 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  plate:.**.**    
3ad0: 20 20 20 20 20 58 20 3c 2d 20 41 0a 2a 2a 20 20       X <- A.**  
3ae0: 20 20 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a         goto B.**
3af0: 20 20 20 20 20 20 41 3a 20 73 65 74 75 70 20 66        A: setup f
3b00: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  or the SELECT.**
3b10: 20 20 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76           loop ov
3b20: 65 72 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  er the rows in t
3b30: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
3b40: 20 20 20 20 20 20 20 6c 6f 61 64 20 76 61 6c 75         load valu
3b50: 65 73 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  es into register
3b60: 73 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20  s R..R+n.**     
3b70: 20 20 20 20 20 20 79 69 65 6c 64 20 58 0a 2a 2a        yield X.**
3b80: 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f           end loo
3b90: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65  p.**         cle
3ba0: 61 6e 75 70 20 61 66 74 65 72 20 74 68 65 20 53  anup after the S
3bb0: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
3bc0: 20 65 6e 64 2d 63 6f 72 6f 75 74 69 6e 65 20 58   end-coroutine X
3bd0: 0a 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e  .**      B: open
3be0: 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f   write cursor to
3bf0: 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73   <table> and its
3c00: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20   indices.**     
3c10: 20 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20   C: yield X, at 
3c20: 45 4f 46 20 67 6f 74 6f 20 44 0a 2a 2a 20 20 20  EOF goto D.**   
3c30: 20 20 20 20 20 20 69 6e 73 65 72 74 20 74 68 65        insert the
3c40: 20 73 65 6c 65 63 74 20 72 65 73 75 6c 74 20 69   select result i
3c50: 6e 74 6f 20 3c 74 61 62 6c 65 3e 20 66 72 6f 6d  nto <table> from
3c60: 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20 20 20 20   R..R+n.**      
3c70: 20 20 20 67 6f 74 6f 20 43 0a 2a 2a 20 20 20 20     goto C.**    
3c80: 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a    D: cleanup.**.
3c90: 2a 2a 20 54 68 65 20 34 74 68 20 74 65 6d 70 6c  ** The 4th templ
3ca0: 61 74 65 20 69 73 20 75 73 65 64 20 69 66 20 74  ate is used if t
3cb0: 68 65 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d  he insert statem
3cc0: 65 6e 74 20 74 61 6b 65 73 20 69 74 73 0a 2a 2a  ent takes its.**
3cd0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 61 20 53   values from a S
3ce0: 45 4c 45 43 54 20 62 75 74 20 74 68 65 20 64 61  ELECT but the da
3cf0: 74 61 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ta is being inse
3d00: 72 74 65 64 20 69 6e 74 6f 20 61 20 74 61 62 6c  rted into a tabl
3d10: 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 6c 73  e.** that is als
3d20: 6f 20 72 65 61 64 20 61 73 20 70 61 72 74 20 6f  o read as part o
3d30: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 20 20 49  f the SELECT.  I
3d40: 6e 20 74 68 65 20 74 68 69 72 64 20 66 6f 72 6d  n the third form
3d50: 2c 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  ,.** we have to 
3d60: 75 73 65 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  use an intermedi
3d70: 61 74 65 20 74 61 62 6c 65 20 74 6f 20 73 74 6f  ate table to sto
3d80: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
3d90: 66 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63 74 2e  f.** the select.
3da0: 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 69    The template i
3db0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
3dc0: 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c 2d 20  **         X <- 
3dd0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74  A.**         got
3de0: 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73  o B.**      A: s
3df0: 65 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c  etup for the SEL
3e00: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c  ECT.**         l
3e10: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62  oop over the tab
3e20: 6c 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  les in the SELEC
3e30: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c  T.**           l
3e40: 6f 61 64 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  oad value into r
3e50: 65 67 69 73 74 65 72 20 52 2e 2e 52 2b 6e 0a 2a  egister R..R+n.*
3e60: 2a 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  *           yiel
3e70: 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  d X.**         e
3e80: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
3e90: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
3ea0: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3eb0: 20 20 20 20 20 20 20 65 6e 64 20 63 6f 2d 72 6f         end co-ro
3ec0: 75 74 69 6e 65 20 52 0a 2a 2a 20 20 20 20 20 20  utine R.**      
3ed0: 42 3a 20 6f 70 65 6e 20 74 65 6d 70 20 74 61 62  B: open temp tab
3ee0: 6c 65 0a 2a 2a 20 20 20 20 20 20 4c 3a 20 79 69  le.**      L: yi
3ef0: 65 6c 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f  eld X, at EOF go
3f00: 74 6f 20 4d 0a 2a 2a 20 20 20 20 20 20 20 20 20  to M.**         
3f10: 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f 6d 20  insert row from 
3f20: 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65 6d 70  R..R+n into temp
3f30: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
3f40: 20 20 67 6f 74 6f 20 4c 0a 2a 2a 20 20 20 20 20    goto L.**     
3f50: 20 4d 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63   M: open write c
3f60: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
3f70: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
3f80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 77 69  .**         rewi
3f90: 6e 64 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a  nd temp table.**
3fa0: 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70 20 6f 76        C: loop ov
3fb0: 65 72 20 72 6f 77 73 20 6f 66 20 69 6e 74 65 72  er rows of inter
3fc0: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a 2a 2a  mediate table.**
3fd0: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
3fe0: 66 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20  fer values form 
3ff0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62  intermediate tab
4000: 6c 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a  le into <table>.
4010: 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c  **         end l
4020: 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 44 3a 20 63  oop.**      D: c
4030: 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f 69 64 20 73  leanup.*/.void s
4040: 71 6c 69 74 65 33 49 6e 73 65 72 74 28 0a 20 20  qlite3Insert(.  
4050: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4060: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
4070: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
4080: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
4090: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61     /* Name of ta
40a0: 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  ble into which w
40b0: 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20  e are inserting 
40c0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
40d0: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20  lect,      /* A 
40e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
40f0: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64   to use as the d
4100: 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20  ata source */.  
4110: 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c  IdList *pColumn,
4120: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4130: 6e 61 6d 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  names correspond
4140: 69 6e 67 20 74 6f 20 49 44 4c 49 53 54 2e 20 2a  ing to IDLIST. *
4150: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20  /.  int onError 
4160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
4170: 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74   to handle const
4180: 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a  raint errors */.
4190: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
41a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
41b0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
41c0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 54  structure */.  T
41d0: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
41e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
41f0: 65 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  e to insert into
4200: 2e 20 20 61 6b 61 20 54 41 42 4c 45 20 2a 2f 0a  .  aka TABLE */.
4210: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20    char *zTab;   
4220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4230: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
4240: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
4250: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  nserting */.  in
4260: 74 20 69 2c 20 6a 2c 20 69 64 78 3b 20 20 20 20  t i, j, idx;    
4270: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4280: 74 65 72 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ters */.  Vdbe *
4290: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
42a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
42b0: 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
42c0: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
42d0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
42e0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
42f0: 70 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65  ping over indice
4300: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  s of the table *
4310: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  /.  int nColumn;
4320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4330: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
4340: 6e 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  n the data */.  
4350: 69 6e 74 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b  int nHidden = 0;
4360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4370: 6f 66 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e  of hidden column
4380: 73 20 69 66 20 54 41 42 4c 45 20 69 73 20 76 69  s if TABLE is vi
4390: 72 74 75 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  rtual */.  int i
43a0: 44 61 74 61 43 75 72 20 3d 20 30 3b 20 20 20 20  DataCur = 0;    
43b0: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
43c0: 74 68 61 74 20 69 73 20 74 68 65 20 6d 61 69 6e  that is the main
43d0: 20 64 61 74 61 20 72 65 70 6f 73 69 74 6f 72 79   data repository
43e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
43f0: 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 46  r = 0;      /* F
4400: 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
4410: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 43 6f  r */.  int ipkCo
4420: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  lumn = -1;   /* 
4430: 43 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 74  Column that is t
4440: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
4450: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69 6e 74 20  RY KEY */.  int 
4460: 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20  endOfLoop;      
4470: 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
4480: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
4490: 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a  sertion loop */.
44a0: 20 20 69 6e 74 20 73 72 63 54 61 62 20 3d 20 30    int srcTab = 0
44b0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20  ;       /* Data 
44c0: 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 69 73 20  comes from this 
44d0: 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
44e0: 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74   if >=0 */.  int
44f0: 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 30 3b   addrInsTop = 0;
4500: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 6c 61     /* Jump to la
4510: 62 65 6c 20 22 44 22 20 2a 2f 0a 20 20 69 6e 74  bel "D" */.  int
4520: 20 61 64 64 72 43 6f 6e 74 20 3d 20 30 3b 20 20   addrCont = 0;  
4530: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 69 6e 73     /* Top of ins
4540: 65 72 74 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  ert loop. Label 
4550: 22 43 22 20 69 6e 20 74 65 6d 70 6c 61 74 65 73  "C" in templates
4560: 20 33 20 61 6e 64 20 34 20 2a 2f 0a 20 20 53 65   3 and 4 */.  Se
4570: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
4580: 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
4590: 6f 6e 20 66 6f 72 20 53 45 4c 45 43 54 20 6f 6e  on for SELECT on
45a0: 20 72 68 73 20 6f 66 20 49 4e 53 45 52 54 20 2a   rhs of INSERT *
45b0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
45c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
45d0: 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 68  ex of database h
45e0: 6f 6c 64 69 6e 67 20 54 41 42 4c 45 20 2a 2f 0a  olding TABLE */.
45f0: 20 20 75 38 20 75 73 65 54 65 6d 70 54 61 62 6c    u8 useTempTabl
4600: 65 20 3d 20 30 3b 20 20 2f 2a 20 53 74 6f 72 65  e = 0;  /* Store
4610: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
4620: 69 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  in intermediate 
4630: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 61 70  table */.  u8 ap
4640: 70 65 6e 64 46 6c 61 67 20 3d 20 30 3b 20 20 20  pendFlag = 0;   
4650: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4660: 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79  insert is likely
4670: 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64   to be an append
4680: 20 2a 2f 0a 20 20 75 38 20 77 69 74 68 6f 75 74   */.  u8 without
4690: 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 30  Rowid;      /* 0
46a0: 20 66 6f 72 20 6e 6f 72 6d 61 6c 20 74 61 62 6c   for normal tabl
46b0: 65 2e 20 20 31 20 66 6f 72 20 57 49 54 48 4f 55  e.  1 for WITHOU
46c0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 2a 2f  T ROWID table */
46d0: 0a 20 20 75 38 20 62 49 64 4c 69 73 74 49 6e 4f  .  u8 bIdListInO
46e0: 72 64 65 72 3b 20 20 20 20 2f 2a 20 54 72 75 65  rder;    /* True
46f0: 20 69 66 20 49 44 4c 49 53 54 20 69 73 20 69 6e   if IDLIST is in
4700: 20 74 61 62 6c 65 20 6f 72 64 65 72 20 2a 2f 0a   table order */.
4710: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4720: 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20  t = 0;  /* List 
4730: 6f 66 20 56 41 4c 55 45 53 28 29 20 74 6f 20 62  of VALUES() to b
4740: 65 20 69 6e 73 65 72 74 65 64 20 20 2a 2f 0a 0a  e inserted  */..
4750: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
4760: 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  locations */.  i
4770: 6e 74 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  nt regFromSelect
4780: 20 3d 20 30 3b 2f 2a 20 42 61 73 65 20 72 65 67   = 0;/* Base reg
4790: 69 73 74 65 72 20 66 6f 72 20 64 61 74 61 20 63  ister for data c
47a0: 6f 6d 69 6e 67 20 66 72 6f 6d 20 53 45 4c 45 43  oming from SELEC
47b0: 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 75  T */.  int regAu
47c0: 74 6f 69 6e 63 20 3d 20 30 3b 20 20 20 2f 2a 20  toinc = 0;   /* 
47d0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
47e0: 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45   the AUTOINCREME
47f0: 4e 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  NT counter */.  
4800: 69 6e 74 20 72 65 67 52 6f 77 43 6f 75 6e 74 20  int regRowCount 
4810: 3d 20 30 3b 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  = 0;  /* Memory 
4820: 63 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 74 68  cell used for th
4830: 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f  e row counter */
4840: 0a 20 20 69 6e 74 20 72 65 67 49 6e 73 3b 20 20  .  int regIns;  
4850: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63           /* Bloc
4860: 6b 20 6f 66 20 72 65 67 73 20 68 6f 6c 64 69 6e  k of regs holdin
4870: 67 20 72 6f 77 69 64 2b 64 61 74 61 20 62 65 69  g rowid+data bei
4880: 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  ng inserted */. 
4890: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
48a0: 20 20 20 20 20 20 20 2f 2a 20 72 65 67 69 73 74         /* regist
48b0: 65 72 73 20 68 6f 6c 64 69 6e 67 20 69 6e 73 65  ers holding inse
48c0: 72 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e  rt rowid */.  in
48d0: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
48e0: 20 20 20 20 2f 2a 20 72 65 67 69 73 74 65 72 20      /* register 
48f0: 68 6f 6c 64 69 6e 67 20 66 69 72 73 74 20 63 6f  holding first co
4900: 6c 75 6d 6e 20 74 6f 20 69 6e 73 65 72 74 20 2a  lumn to insert *
4910: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
4920: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4f 6e 65   = 0;     /* One
4930: 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
4940: 74 65 64 20 74 6f 20 65 61 63 68 20 69 6e 64 65  ted to each inde
4950: 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  x */..#ifndef SQ
4960: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4970: 52 0a 20 20 69 6e 74 20 69 73 56 69 65 77 3b 20  R.  int isView; 
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 2f 2a 20 54 72 75 65 20 69 66 20 61 74 74 65 6d  /* True if attem
49a0: 70 74 69 6e 67 20 74 6f 20 69 6e 73 65 72 74 20  pting to insert 
49b0: 69 6e 74 6f 20 61 20 76 69 65 77 20 2a 2f 0a 20  into a view */. 
49c0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
49d0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
49e0: 4c 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73  List of triggers
49f0: 20 6f 6e 20 70 54 61 62 2c 20 69 66 20 72 65 71   on pTab, if req
4a00: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74  uired */.  int t
4a10: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
4a20: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
4a30: 66 20 74 72 69 67 67 65 72 20 74 69 6d 65 73 20  f trigger times 
4a40: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  */.#endif..  db 
4a50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4a60: 6d 65 6d 73 65 74 28 26 64 65 73 74 2c 20 30 2c  memset(&dest, 0,
4a70: 20 73 69 7a 65 6f 66 28 64 65 73 74 29 29 3b 0a   sizeof(dest));.
4a80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
4a90: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
4aa0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
4ab0: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
4ac0: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  p;.  }..  /* If 
4ad0: 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
4ae0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
4af0: 20 61 20 73 69 6d 70 6c 65 20 56 41 4c 55 45 53   a simple VALUES
4b00: 28 29 20 6c 69 73 74 20 77 69 74 68 20 61 0a 20  () list with a. 
4b10: 20 2a 2a 20 73 69 6e 67 6c 65 20 72 6f 77 20 28   ** single row (
4b20: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 29  the common case)
4b30: 20 74 68 65 6e 20 6b 65 65 70 20 74 68 61 74 20   then keep that 
4b40: 6f 6e 65 20 72 6f 77 20 6f 66 20 76 61 6c 75 65  one row of value
4b50: 73 0a 20 20 2a 2a 20 61 6e 64 20 64 69 73 63 61  s.  ** and disca
4b60: 72 64 20 74 68 65 20 6f 74 68 65 72 20 28 75 6e  rd the other (un
4b70: 75 73 65 64 29 20 70 61 72 74 73 20 6f 66 20 74  used) parts of t
4b80: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
4b90: 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  t.  */.  if( pSe
4ba0: 6c 65 63 74 20 26 26 20 28 70 53 65 6c 65 63 74  lect && (pSelect
4bb0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
4bc0: 56 61 6c 75 65 73 29 21 3d 30 20 26 26 20 70 53  Values)!=0 && pS
4bd0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3d 3d 30  elect->pPrior==0
4be0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
4bf0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
4c00: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 45  .    pSelect->pE
4c10: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  List = 0;.    sq
4c20: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4c30: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
4c40: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b      pSelect = 0;
4c50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
4c60: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  e the table into
4c70: 20 77 68 69 63 68 20 77 65 20 77 69 6c 6c 20 62   which we will b
4c80: 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
4c90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
4ca0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
4cb0: 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  List->nSrc==1 );
4cc0: 0a 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69  .  zTab = pTabLi
4cd0: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[0].zName;.
4ce0: 20 20 69 66 28 20 4e 45 56 45 52 28 7a 54 61 62    if( NEVER(zTab
4cf0: 3d 3d 30 29 20 29 20 67 6f 74 6f 20 69 6e 73 65  ==0) ) goto inse
4d00: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54  rt_cleanup;.  pT
4d10: 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
4d20: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
4d30: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69  , pTabList);.  i
4d40: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
4d50: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
4d60: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 44 62  eanup;.  }.  iDb
4d70: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
4d80: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
4d90: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
4da0: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
4db0: 62 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  b );.  if( sqlit
4dc0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
4dd0: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
4de0: 54 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  T, pTab->zName, 
4df0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
4e00: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
4e10: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 29  b[iDb].zDbSName)
4e20: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   ){.    goto ins
4e30: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ert_cleanup;.  }
4e40: 0a 20 20 77 69 74 68 6f 75 74 52 6f 77 69 64 20  .  withoutRowid 
4e50: 3d 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  = !HasRowid(pTab
4e60: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
4e70: 6f 75 74 20 69 66 20 77 65 20 68 61 76 65 20 61  out if we have a
4e80: 6e 79 20 74 72 69 67 67 65 72 73 20 61 6e 64 20  ny triggers and 
4e90: 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  if the table bei
4ea0: 6e 67 0a 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  ng.  ** inserted
4eb0: 20 69 6e 74 6f 20 69 73 20 61 20 76 69 65 77 0a   into is a view.
4ec0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
4ed0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
4ee0: 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
4ef0: 6c 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69  lite3TriggersExi
4f00: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  st(pParse, pTab,
4f10: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 26   TK_INSERT, 0, &
4f20: 74 6d 61 73 6b 29 3b 0a 20 20 69 73 56 69 65 77  tmask);.  isView
4f30: 20 3d 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74   = pTab->pSelect
4f40: 21 3d 30 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0;.#else.# def
4f50: 69 6e 65 20 70 54 72 69 67 67 65 72 20 30 0a 23  ine pTrigger 0.#
4f60: 20 64 65 66 69 6e 65 20 74 6d 61 73 6b 20 30 0a   define tmask 0.
4f70: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
4f80: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
4f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
4fa0: 0a 23 20 75 6e 64 65 66 20 69 73 56 69 65 77 0a  .# undef isView.
4fb0: 23 20 64 65 66 69 6e 65 20 69 73 56 69 65 77 20  # define isView 
4fc0: 30 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  0.#endif.  asser
4fd0: 74 28 20 28 70 54 72 69 67 67 65 72 20 26 26 20  t( (pTrigger && 
4fe0: 74 6d 61 73 6b 29 20 7c 7c 20 28 70 54 72 69 67  tmask) || (pTrig
4ff0: 67 65 72 3d 3d 30 20 26 26 20 74 6d 61 73 6b 3d  ger==0 && tmask=
5000: 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
5010: 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79 20 61  pTab is really a
5020: 20 76 69 65 77 2c 20 6d 61 6b 65 20 73 75 72 65   view, make sure
5030: 20 69 74 20 68 61 73 20 62 65 65 6e 20 69 6e 69   it has been ini
5040: 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 56  tialized..  ** V
5050: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
5060: 73 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  s() is a no-op i
5070: 66 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20  f pTab is not a 
5080: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  view..  */.  if(
5090: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
50a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
50b0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
50c0: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
50d0: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  nup;.  }..  /* C
50e0: 61 6e 6e 6f 74 20 69 6e 73 65 72 74 20 69 6e 74  annot insert int
50f0: 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 61  o a read-only ta
5100: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
5110: 73 71 6c 69 74 65 33 49 73 52 65 61 64 4f 6e 6c  sqlite3IsReadOnl
5120: 79 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  y(pParse, pTab, 
5130: 74 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 67 6f  tmask) ){.    go
5140: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
5150: 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  p;.  }..  /* All
5160: 6f 63 61 74 65 20 61 20 56 44 42 45 0a 20 20 2a  ocate a VDBE.  *
5170: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
5180: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
5190: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
51a0: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
51b0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
51c0: 6e 65 73 74 65 64 3d 3d 30 20 29 20 73 71 6c 69  nested==0 ) sqli
51d0: 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
51e0: 67 65 73 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ges(v);.  sqlite
51f0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
5200: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 53 65  tion(pParse, pSe
5210: 6c 65 63 74 20 7c 7c 20 70 54 72 69 67 67 65 72  lect || pTrigger
5220: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
5230: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45   SQLITE_OMIT_XFE
5240: 52 5f 4f 50 54 0a 20 20 2f 2a 20 49 66 20 74 68  R_OPT.  /* If th
5250: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
5260: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 0a  f the form.  **.
5270: 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 53 45 52    **       INSER
5280: 54 20 49 4e 54 4f 20 3c 74 61 62 6c 65 31 3e 20  T INTO <table1> 
5290: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74  SELECT * FROM <t
52a0: 61 62 6c 65 32 3e 3b 0a 20 20 2a 2a 0a 20 20 2a  able2>;.  **.  *
52b0: 2a 20 54 68 65 6e 20 73 70 65 63 69 61 6c 20 6f  * Then special o
52c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
52d0: 20 62 65 20 61 70 70 6c 69 65 64 20 74 68 61 74   be applied that
52e0: 20 6d 61 6b 65 20 74 68 65 20 74 72 61 6e 73 66   make the transf
52f0: 65 72 0a 20 20 2a 2a 20 76 65 72 79 20 66 61 73  er.  ** very fas
5300: 74 20 61 6e 64 20 77 68 69 63 68 20 72 65 64 75  t and which redu
5310: 63 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  ce fragmentation
5320: 20 6f 66 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a   of indices..  *
5330: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 74  *.  ** This is t
5340: 68 65 20 32 6e 64 20 74 65 6d 70 6c 61 74 65 2e  he 2nd template.
5350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
5360: 75 6d 6e 3d 3d 30 20 26 26 20 78 66 65 72 4f 70  umn==0 && xferOp
5370: 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73  timization(pPars
5380: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
5390: 2c 20 6f 6e 45 72 72 6f 72 2c 20 69 44 62 29 20  , onError, iDb) 
53a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
53b0: 70 54 72 69 67 67 65 72 20 29 3b 0a 20 20 20 20  pTrigger );.    
53c0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 3d 3d 30  assert( pList==0
53d0: 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   );.    goto ins
53e0: 65 72 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ert_end;.  }.#en
53f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
5400: 49 54 5f 58 46 45 52 5f 4f 50 54 20 2a 2f 0a 0a  IT_XFER_OPT */..
5410: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
5420: 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  an AUTOINCREMENT
5430: 20 74 61 62 6c 65 2c 20 6c 6f 6f 6b 20 75 70 20   table, look up 
5440: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  the sequence num
5450: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
5460: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
5470: 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65 20  table and store 
5480: 69 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  it in memory cel
5490: 6c 20 72 65 67 41 75 74 6f 69 6e 63 2e 0a 20 20  l regAutoinc..  
54a0: 2a 2f 0a 20 20 72 65 67 41 75 74 6f 69 6e 63 20  */.  regAutoinc 
54b0: 3d 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 70  = autoIncBegin(p
54c0: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
54d0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
54e0: 65 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  e registers for 
54f0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 6f 77 69  holding the rowi
5500: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f 77  d of the new row
5510: 2c 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ,.  ** the conte
5520: 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 72 6f  nt of the new ro
5530: 77 2c 20 61 6e 64 20 74 68 65 20 61 73 73 65 6d  w, and the assem
5540: 62 6c 65 64 20 72 6f 77 20 72 65 63 6f 72 64 2e  bled row record.
5550: 0a 20 20 2a 2f 0a 20 20 72 65 67 52 6f 77 69 64  .  */.  regRowid
5560: 20 3d 20 72 65 67 49 6e 73 20 3d 20 70 50 61 72   = regIns = pPar
5570: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
5580: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 54  arse->nMem += pT
5590: 61 62 2d 3e 6e 43 6f 6c 20 2b 20 31 3b 0a 20 20  ab->nCol + 1;.  
55a0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
55b0: 61 62 29 20 29 7b 0a 20 20 20 20 72 65 67 52 6f  ab) ){.    regRo
55c0: 77 69 64 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  wid++;.    pPars
55d0: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 7d 0a 20  e->nMem++;.  }. 
55e0: 20 72 65 67 44 61 74 61 20 3d 20 72 65 67 52 6f   regData = regRo
55f0: 77 69 64 2b 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  wid+1;..  /* If 
5600: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
5610: 6d 65 6e 74 20 69 6e 63 6c 75 64 65 64 20 61 6e  ment included an
5620: 20 49 44 4c 49 53 54 20 74 65 72 6d 2c 20 74 68   IDLIST term, th
5630: 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 20 20 2a  en make sure.  *
5640: 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f  * all elements o
5650: 66 20 74 68 65 20 49 44 4c 49 53 54 20 72 65 61  f the IDLIST rea
5660: 6c 6c 79 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  lly are columns 
5670: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
5680: 20 0a 20 20 2a 2a 20 72 65 6d 65 6d 62 65 72 20   .  ** remember 
5690: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
56a0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  es..  **.  ** If
56b0: 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
56c0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
56d0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 6e 64  Y KEY column and
56e0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0a 20 20 2a   that column.  *
56f0: 2a 20 69 73 20 6e 61 6d 65 64 20 69 6e 20 74 68  * is named in th
5700: 65 20 49 44 4c 49 53 54 2c 20 74 68 65 6e 20 72  e IDLIST, then r
5710: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 69 70 6b  ecord in the ipk
5720: 43 6f 6c 75 6d 6e 20 76 61 72 69 61 62 6c 65 0a  Column variable.
5730: 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
5740: 6e 74 6f 20 49 44 4c 49 53 54 20 6f 66 20 74 68  nto IDLIST of th
5750: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 63 6f  e primary key co
5760: 6c 75 6d 6e 2e 20 20 69 70 6b 43 6f 6c 75 6d 6e  lumn.  ipkColumn
5770: 20 69 73 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64   is.  ** the ind
5780: 65 78 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72  ex of the primar
5790: 79 20 6b 65 79 20 61 73 20 69 74 20 61 70 70 65  y key as it appe
57a0: 61 72 73 20 69 6e 20 49 44 4c 49 53 54 2c 20 6e  ars in IDLIST, n
57b0: 6f 74 20 61 73 0a 20 20 2a 2a 20 69 73 20 61 70  ot as.  ** is ap
57c0: 70 65 61 72 73 20 69 6e 20 74 68 65 20 6f 72 69  pears in the ori
57d0: 67 69 6e 61 6c 20 74 61 62 6c 65 2e 20 20 28 54  ginal table.  (T
57e0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
57f0: 49 4e 54 45 47 45 52 0a 20 20 2a 2a 20 50 52 49  INTEGER.  ** PRI
5800: 4d 41 52 59 20 4b 45 59 20 69 6e 20 74 68 65 20  MARY KEY in the 
5810: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 69  original table i
5820: 73 20 70 54 61 62 2d 3e 69 50 4b 65 79 2e 29 0a  s pTab->iPKey.).
5830: 20 20 2a 2f 0a 20 20 62 49 64 4c 69 73 74 49 6e    */.  bIdListIn
5840: 4f 72 64 65 72 20 3d 20 28 70 54 61 62 2d 3e 74  Order = (pTab->t
5850: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 4f 4f 4f  abFlags & TF_OOO
5860: 48 69 64 64 65 6e 29 3d 3d 30 3b 0a 20 20 69 66  Hidden)==0;.  if
5870: 28 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ( pColumn ){.   
5880: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
5890: 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  umn->nId; i++){.
58a0: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61        pColumn->a
58b0: 5b 69 5d 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20  [i].idx = -1;.  
58c0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
58d0: 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   i<pColumn->nId;
58e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
58f0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
5900: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
5910: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
5920: 49 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b  ICmp(pColumn->a[
5930: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
5940: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
5950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
5960: 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78  Column->a[i].idx
5970: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
5980: 69 66 28 20 69 21 3d 6a 20 29 20 62 49 64 4c 69  if( i!=j ) bIdLi
5990: 73 74 49 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20  stInOrder = 0;. 
59a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
59b0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
59c0: 20 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f             ipkCo
59d0: 6c 75 6d 6e 20 3d 20 69 3b 20 20 61 73 73 65 72  lumn = i;  asser
59e0: 74 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64  t( !withoutRowid
59f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
5a00: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5a10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
5a30: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
5a40: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5a50: 33 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e  3IsRowid(pColumn
5a60: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26  ->a[i].zName) &&
5a70: 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29   !withoutRowid )
5a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 70 6b 43  {.          ipkC
5a90: 6f 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20  olumn = i;.     
5aa0: 20 20 20 20 20 62 49 64 4c 69 73 74 49 6e 4f 72       bIdListInOr
5ab0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  der = 0;.       
5ac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ad0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5ae0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
5af0: 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %S has no colum
5b00: 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
5b10: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c             pTabL
5b20: 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d  ist, 0, pColumn-
5b30: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
5b40: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5b50: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
5b60: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
5b70: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
5b80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
5ba0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
5bb0: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66   many columns of
5bc0: 20 64 61 74 61 20 61 72 65 20 73 75 70 70 6c 69   data are suppli
5bd0: 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
5be0: 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20  .  ** is coming 
5bf0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
5c00: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65  atement, then ge
5c10: 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
5c20: 69 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 70 72  ine that.  ** pr
5c30: 6f 64 75 63 65 73 20 61 20 73 69 6e 67 6c 65 20  oduces a single 
5c40: 72 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43  row of the SELEC
5c50: 54 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  T on each invoca
5c60: 74 69 6f 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20  tion.  The.  ** 
5c70: 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 74 68  co-routine is th
5c80: 65 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20  e common header 
5c90: 74 6f 20 74 68 65 20 33 72 64 20 61 6e 64 20 34  to the 3rd and 4
5ca0: 74 68 20 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20  th templates..  
5cb0: 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
5cc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 61 74 61 20   ){.    /* Data 
5cd0: 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61  is coming from a
5ce0: 20 53 45 4c 45 43 54 20 6f 72 20 66 72 6f 6d 20   SELECT or from 
5cf0: 61 20 6d 75 6c 74 69 2d 72 6f 77 20 56 41 4c 55  a multi-row VALU
5d00: 45 53 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  ES clause..    *
5d10: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d  * Generate a co-
5d20: 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 74  routine to run t
5d30: 68 65 20 53 45 4c 45 43 54 2e 20 2a 2f 0a 20 20  he SELECT. */.  
5d40: 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b 20    int regYield; 
5d50: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
5d60: 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f 75  r holding co-rou
5d70: 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e 74  tine entry-point
5d80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5d90: 54 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Top;        /* T
5da0: 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75  op of the co-rou
5db0: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tine */.    int 
5dc0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5dd0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
5de0: 2f 0a 0a 20 20 20 20 72 65 67 59 69 65 6c 64 20  /..    regYield 
5df0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
5e00: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
5e10: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5e20: 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
5e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e40: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
5e50: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
5e60: 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
5e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
5e80: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
5e90: 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
5ea0: 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20   regYield);.    
5eb0: 64 65 73 74 2e 69 53 64 73 74 20 3d 20 62 49 64  dest.iSdst = bId
5ec0: 4c 69 73 74 49 6e 4f 72 64 65 72 20 3f 20 72 65  ListInOrder ? re
5ed0: 67 44 61 74 61 20 3a 20 30 3b 0a 20 20 20 20 64  gData : 0;.    d
5ee0: 65 73 74 2e 6e 53 64 73 74 20 3d 20 70 54 61 62  est.nSdst = pTab
5ef0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 72 63 20 3d  ->nCol;.    rc =
5f00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
5f10: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
5f20: 26 64 65 73 74 29 3b 0a 20 20 20 20 72 65 67 46  &dest);.    regF
5f30: 72 6f 6d 53 65 6c 65 63 74 20 3d 20 64 65 73 74  romSelect = dest
5f40: 2e 69 53 64 73 74 3b 0a 20 20 20 20 69 66 28 20  .iSdst;.    if( 
5f50: 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
5f60: 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
5f70: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 69 6e  ->nErr ) goto in
5f80: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
5f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
5fa0: 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
5fb0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 73 71 6c 69  Yield);.    sqli
5fc0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5fd0: 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b  v, addrTop - 1);
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 2f 2a 20 6c 61 62 65 6c 20         /* label 
6000: 42 3a 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  B: */.    assert
6010: 28 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ( pSelect->pELis
6020: 74 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  t );.    nColumn
6030: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
6040: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 20 20  st->nExpr;..    
6050: 2f 2a 20 53 65 74 20 75 73 65 54 65 6d 70 54 61  /* Set useTempTa
6060: 62 6c 65 20 74 6f 20 54 52 55 45 20 69 66 20 74  ble to TRUE if t
6070: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
6080: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6090: 74 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  t.    ** should 
60a0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
60b0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
60c0: 65 20 28 74 65 6d 70 6c 61 74 65 20 34 29 2e 20  e (template 4). 
60d0: 20 53 65 74 20 74 6f 0a 20 20 20 20 2a 2a 20 46   Set to.    ** F
60e0: 41 4c 53 45 20 69 66 20 65 61 63 68 20 6f 75 74  ALSE if each out
60f0: 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 53  put row of the S
6100: 45 4c 45 43 54 20 63 61 6e 20 62 65 20 77 72 69  ELECT can be wri
6110: 74 74 65 6e 20 64 69 72 65 63 74 6c 79 20 69 6e  tten directly in
6120: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 65  to.    ** the de
6130: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
6140: 28 74 65 6d 70 6c 61 74 65 20 33 29 2e 0a 20 20  (template 3)..  
6150: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 74 65    **.    ** A te
6160: 6d 70 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  mp table must be
6170: 20 75 73 65 64 20 69 66 20 74 68 65 20 74 61 62   used if the tab
6180: 6c 65 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  le being updated
6190: 20 69 73 20 61 6c 73 6f 20 6f 6e 65 0a 20 20 20   is also one.   
61a0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
61b0: 73 20 62 65 69 6e 67 20 72 65 61 64 20 62 79 20  s being read by 
61c0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
61d0: 6d 65 6e 74 2e 20 20 41 6c 73 6f 20 75 73 65 20  ment.  Also use 
61e0: 61 20 0a 20 20 20 20 2a 2a 20 74 65 6d 70 20 74  a .    ** temp t
61f0: 61 62 6c 65 20 69 6e 20 74 68 65 20 63 61 73 65  able in the case
6200: 20 6f 66 20 72 6f 77 20 74 72 69 67 67 65 72 73   of row triggers
6210: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6220: 20 70 54 72 69 67 67 65 72 20 7c 7c 20 72 65 61   pTrigger || rea
6230: 64 73 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  dsTable(pParse, 
6240: 69 44 62 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  iDb, pTab) ){.  
6250: 20 20 20 20 75 73 65 54 65 6d 70 54 61 62 6c 65      useTempTable
6260: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
6270: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
6280: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  e ){.      /* In
6290: 76 6f 6b 65 20 74 68 65 20 63 6f 72 6f 75 74 69  voke the corouti
62a0: 6e 65 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ne to extract in
62b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
62c0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
62d0: 2a 2a 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ** and add it to
62e0: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
62f0: 6c 65 20 73 72 63 54 61 62 2e 20 20 54 68 65 20  le srcTab.  The 
6300: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 20  code generated. 
6310: 20 20 20 20 20 2a 2a 20 68 65 72 65 20 69 73 20       ** here is 
6320: 66 72 6f 6d 20 74 68 65 20 34 74 68 20 74 65 6d  from the 4th tem
6330: 70 6c 61 74 65 3a 0a 20 20 20 20 20 20 2a 2a 0a  plate:.      **.
6340: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 42 3a        **      B:
6350: 20 6f 70 65 6e 20 74 65 6d 70 20 74 61 62 6c 65   open temp table
6360: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 4c  .      **      L
6370: 3a 20 79 69 65 6c 64 20 58 2c 20 67 6f 74 6f 20  : yield X, goto 
6380: 4d 20 61 74 20 45 4f 46 0a 20 20 20 20 20 20 2a  M at EOF.      *
6390: 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74  *         insert
63a0: 20 72 6f 77 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e   row from R..R+n
63b0: 20 69 6e 74 6f 20 74 65 6d 70 20 74 61 62 6c 65   into temp table
63c0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
63d0: 20 20 67 6f 74 6f 20 4c 0a 20 20 20 20 20 20 2a    goto L.      *
63e0: 2a 20 20 20 20 20 20 4d 3a 20 2e 2e 2e 0a 20 20  *      M: ....  
63f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
6400: 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20   regRec;        
6410: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
6420: 20 68 6f 6c 64 20 70 61 63 6b 65 64 20 72 65 63   hold packed rec
6430: 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ord */.      int
6440: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 3b 20 20   regTempRowid;  
6450: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f    /* Register to
6460: 20 68 6f 6c 64 20 74 65 6d 70 20 74 61 62 6c 65   hold temp table
6470: 20 52 4f 57 49 44 20 2a 2f 0a 20 20 20 20 20 20   ROWID */.      
6480: 69 6e 74 20 61 64 64 72 4c 3b 20 20 20 20 20 20  int addrL;      
6490: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 22 4c       /* Label "L
64a0: 22 20 2a 2f 0a 0a 20 20 20 20 20 20 73 72 63 54  " */..      srcT
64b0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
64c0: 62 2b 2b 3b 0a 20 20 20 20 20 20 72 65 67 52 65  b++;.      regRe
64d0: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
64e0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
64f0: 20 20 20 20 20 72 65 67 54 65 6d 70 52 6f 77 69       regTempRowi
6500: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
6510: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6530: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6540: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 73 72 63 54  nEphemeral, srcT
6550: 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ab, nColumn);.  
6560: 20 20 20 20 61 64 64 72 4c 20 3d 20 73 71 6c 69      addrL = sqli
6570: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6580: 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e   OP_Yield, dest.
6590: 69 53 44 50 61 72 6d 29 3b 20 56 64 62 65 43 6f  iSDParm); VdbeCo
65a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
65b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
65c0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
65d0: 6f 72 64 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65  ord, regFromSele
65e0: 63 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ct, nColumn, reg
65f0: 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Rec);.      sqli
6600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6610: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 73 72   OP_NewRowid, sr
6620: 63 54 61 62 2c 20 72 65 67 54 65 6d 70 52 6f 77  cTab, regTempRow
6630: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
6640: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6650: 4f 50 5f 49 6e 73 65 72 74 2c 20 73 72 63 54 61  OP_Insert, srcTa
6660: 62 2c 20 72 65 67 52 65 63 2c 20 72 65 67 54 65  b, regRec, regTe
6670: 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  mpRowid);.      
6680: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
6690: 76 2c 20 61 64 64 72 4c 29 3b 0a 20 20 20 20 20  v, addrL);.     
66a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
66b0: 48 65 72 65 28 76 2c 20 61 64 64 72 4c 29 3b 0a  Here(v, addrL);.
66c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
66d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
66e0: 73 65 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20  se, regRec);.   
66f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6700: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6710: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a   regTempRowid);.
6720: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6730: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
6740: 65 20 63 61 73 65 20 69 66 20 74 68 65 20 64 61  e case if the da
6750: 74 61 20 66 6f 72 20 74 68 65 20 49 4e 53 45 52  ta for the INSER
6760: 54 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d  T is coming from
6770: 20 61 20 0a 20 20 20 20 2a 2a 20 73 69 6e 67 6c   a .    ** singl
6780: 65 2d 72 6f 77 20 56 41 4c 55 45 53 20 63 6c 61  e-row VALUES cla
6790: 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 4e  use.    */.    N
67a0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
67b0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
67c0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
67d0: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
67e0: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
67f0: 72 63 54 61 62 20 3d 20 2d 31 3b 0a 20 20 20 20  rcTab = -1;.    
6800: 61 73 73 65 72 74 28 20 75 73 65 54 65 6d 70 54  assert( useTempT
6810: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  able==0 );.    i
6820: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
6830: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73    nColumn = pLis
6840: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
6850: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
6860: 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28  veExprListNames(
6870: 26 73 4e 43 2c 20 70 4c 69 73 74 29 20 29 7b 0a  &sNC, pList) ){.
6880: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 73          goto ins
6890: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  ert_cleanup;.   
68a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
68b0: 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20        nColumn = 
68c0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
68d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
68e0: 6f 20 49 44 4c 49 53 54 20 74 65 72 6d 20 62 75  o IDLIST term bu
68f0: 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  t the table has 
6900: 61 6e 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  an integer prima
6910: 72 79 0a 20 20 2a 2a 20 6b 65 79 2c 20 74 68 65  ry.  ** key, the
6920: 20 73 65 74 20 74 68 65 20 69 70 6b 43 6f 6c 75   set the ipkColu
6930: 6d 6e 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  mn variable to t
6940: 68 65 20 69 6e 74 65 67 65 72 20 70 72 69 6d 61  he integer prima
6950: 72 79 20 6b 65 79 20 0a 20 20 2a 2a 20 63 6f 6c  ry key .  ** col
6960: 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 74 68 65  umn index in the
6970: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6980: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f  definition..  */
6990: 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d  .  if( pColumn==
69a0: 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29  0 && nColumn>0 )
69b0: 7b 0a 20 20 20 20 69 70 6b 43 6f 6c 75 6d 6e 20  {.    ipkColumn 
69c0: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
69d0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
69e0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
69f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
6a00: 73 6f 75 72 63 65 20 64 61 74 61 20 6d 61 74 63  source data matc
6a10: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  hes the number. 
6a20: 20 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74   ** of columns t
6a30: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  o be inserted in
6a40: 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  to the table..  
6a50: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
6a60: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
6a70: 7b 0a 20 20 20 20 6e 48 69 64 64 65 6e 20 2b 3d  {.    nHidden +=
6a80: 20 28 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e   (IsHiddenColumn
6a90: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29  (&pTab->aCol[i])
6aa0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 7d 0a 20   ? 1 : 0);.  }. 
6ab0: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20   if( pColumn==0 
6ac0: 26 26 20 6e 43 6f 6c 75 6d 6e 20 26 26 20 6e 43  && nColumn && nC
6ad0: 6f 6c 75 6d 6e 21 3d 28 70 54 61 62 2d 3e 6e 43  olumn!=(pTab->nC
6ae0: 6f 6c 2d 6e 48 69 64 64 65 6e 29 20 29 7b 0a 20  ol-nHidden) ){. 
6af0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6b00: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
6b10: 20 20 20 22 74 61 62 6c 65 20 25 53 20 68 61 73     "table %S has
6b20: 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
6b30: 25 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 73  %d values were s
6b40: 75 70 70 6c 69 65 64 22 2c 0a 20 20 20 20 20 20  upplied",.      
6b50: 20 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 54   pTabList, 0, pT
6b60: 61 62 2d 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e  ab->nCol-nHidden
6b70: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
6b80: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
6b90: 6e 75 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nup;.  }.  if( p
6ba0: 43 6f 6c 75 6d 6e 21 3d 30 20 26 26 20 6e 43 6f  Column!=0 && nCo
6bb0: 6c 75 6d 6e 21 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e  lumn!=pColumn->n
6bc0: 49 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Id ){.    sqlite
6bd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6be0: 2c 20 22 25 64 20 76 61 6c 75 65 73 20 66 6f 72  , "%d values for
6bf0: 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 20 6e 43   %d columns", nC
6c00: 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 75 6d 6e 2d 3e  olumn, pColumn->
6c10: 6e 49 64 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69  nId);.    goto i
6c20: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
6c30: 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 49 6e 69   }.    .  /* Ini
6c40: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
6c50: 74 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20  t of rows to be 
6c60: 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20  inserted.  */.  
6c70: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
6c80: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
6c90: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 43 6f   ){.    regRowCo
6ca0: 75 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  unt = ++pParse->
6cb0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
6cc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6cd0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
6ce0: 67 52 6f 77 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a  gRowCount);.  }.
6cf0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6d00: 20 6e 6f 74 20 61 20 76 69 65 77 2c 20 6f 70 65   not a view, ope
6d10: 6e 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  n the table and 
6d20: 61 6e 64 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  and all indices 
6d30: 2a 2f 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  */.  if( !isView
6d40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64 78   ){.    int nIdx
6d50: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
6d60: 78 3b 0a 20 20 20 20 6e 49 64 78 20 3d 20 73 71  x;.    nIdx = sq
6d70: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e  lite3OpenTableAn
6d80: 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65 2c  dIndices(pParse,
6d90: 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72   pTab, OP_OpenWr
6da0: 69 74 65 2c 20 30 2c 20 2d 31 2c 20 30 2c 0a 20  ite, 0, -1, 0,. 
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 20 20 20 20 26 69 44 61 74 61 43 75 72 2c 20       &iDataCur, 
6de0: 26 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 61  &iIdxCur);.    a
6df0: 52 65 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  RegIdx = sqlite3
6e00: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
6e10: 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e  , sizeof(int)*(n
6e20: 49 64 78 2b 31 29 29 3b 0a 20 20 20 20 69 66 28  Idx+1));.    if(
6e30: 20 61 52 65 67 49 64 78 3d 3d 30 20 29 7b 0a 20   aRegIdx==0 ){. 
6e40: 20 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74       goto insert
6e50: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
6e60: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 64      for(i=0, pId
6e70: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
6e80: 69 3c 6e 49 64 78 3b 20 70 49 64 78 3d 70 49 64  i<nIdx; pIdx=pId
6e90: 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a  x->pNext, i++){.
6ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
6eb0: 64 78 20 29 3b 0a 20 20 20 20 20 20 61 52 65 67  dx );.      aReg
6ec0: 49 64 78 5b 69 5d 20 3d 20 2b 2b 70 50 61 72 73  Idx[i] = ++pPars
6ed0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
6ee0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
6ef0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
6f00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
6f10: 69 73 20 69 73 20 74 68 65 20 74 6f 70 20 6f 66  is is the top of
6f20: 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72 74   the main insert
6f30: 69 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 66  ion loop */.  if
6f40: 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29  ( useTempTable )
6f50: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  {.    /* This bl
6f60: 6f 63 6b 20 63 6f 64 65 73 20 74 68 65 20 74 6f  ock codes the to
6f70: 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20  p of loop only. 
6f80: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 6c 6f   The complete lo
6f90: 6f 70 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  op is the.    **
6fa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64   following pseud
6fb0: 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61 74 65 20  ocode (template 
6fc0: 34 29 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  4):.    **.    *
6fd0: 2a 20 20 20 20 20 20 20 20 20 72 65 77 69 6e 64  *         rewind
6fe0: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 69 66 20   temp table, if 
6ff0: 65 6d 70 74 79 20 67 6f 74 6f 20 44 0a 20 20 20  empty goto D.   
7000: 20 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70   **      C: loop
7010: 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69 6e   over rows of in
7020: 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65  termediate table
7030: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
7040: 20 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65    transfer value
7050: 73 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69  s form intermedi
7060: 61 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c  ate table into <
7070: 74 61 62 6c 65 3e 0a 20 20 20 20 2a 2a 20 20 20  table>.    **   
7080: 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 20        end loop. 
7090: 20 20 20 2a 2a 20 20 20 20 20 20 44 3a 20 2e 2e     **      D: ..
70a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64  ..    */.    add
70b0: 72 49 6e 73 54 6f 70 20 3d 20 73 71 6c 69 74 65  rInsTop = sqlite
70c0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
70d0: 50 5f 52 65 77 69 6e 64 2c 20 73 72 63 54 61 62  P_Rewind, srcTab
70e0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
70f0: 76 29 3b 0a 20 20 20 20 61 64 64 72 43 6f 6e 74  v);.    addrCont
7100: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7110: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
7120: 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63  }else if( pSelec
7130: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  t ){.    /* This
7140: 20 62 6c 6f 63 6b 20 63 6f 64 65 73 20 74 68 65   block codes the
7150: 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 6f 6e 6c   top of loop onl
7160: 79 2e 20 20 54 68 65 20 63 6f 6d 70 6c 65 74 65  y.  The complete
7170: 20 6c 6f 6f 70 20 69 73 20 74 68 65 0a 20 20 20   loop is the.   
7180: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73   ** following ps
7190: 65 75 64 6f 63 6f 64 65 20 28 74 65 6d 70 6c 61  eudocode (templa
71a0: 74 65 20 33 29 3a 0a 20 20 20 20 2a 2a 0a 20 20  te 3):.    **.  
71b0: 20 20 2a 2a 20 20 20 20 20 20 43 3a 20 79 69 65    **      C: yie
71c0: 6c 64 20 58 2c 20 61 74 20 45 4f 46 20 67 6f 74  ld X, at EOF got
71d0: 6f 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  o D.    **      
71e0: 20 20 20 69 6e 73 65 72 74 20 74 68 65 20 73 65     insert the se
71f0: 6c 65 63 74 20 72 65 73 75 6c 74 20 69 6e 74 6f  lect result into
7200: 20 3c 74 61 62 6c 65 3e 20 66 72 6f 6d 20 52 2e   <table> from R.
7210: 2e 52 2b 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  .R+n.    **     
7220: 20 20 20 20 67 6f 74 6f 20 43 0a 20 20 20 20 2a      goto C.    *
7230: 2a 20 20 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20  *      D: ....  
7240: 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 49 6e 73    */.    addrIns
7250: 54 6f 70 20 3d 20 61 64 64 72 43 6f 6e 74 20 3d  Top = addrCont =
7260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7270: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
7280: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
7290: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
72a0: 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 75  v);.  }..  /* Ru
72b0: 6e 20 74 68 65 20 42 45 46 4f 52 45 20 61 6e 64  n the BEFORE and
72c0: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
72d0: 67 65 72 73 2c 20 69 66 20 74 68 65 72 65 20 61  gers, if there a
72e0: 72 65 20 61 6e 79 0a 20 20 2a 2f 0a 20 20 65 6e  re any.  */.  en
72f0: 64 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  dOfLoop = sqlite
7300: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
7310: 29 3b 0a 20 20 69 66 28 20 74 6d 61 73 6b 20 26  );.  if( tmask &
7320: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20   TRIGGER_BEFORE 
7330: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6f  ){.    int regCo
7340: 6c 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ls = sqlite3GetT
7350: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7360: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a   pTab->nCol+1);.
7370: 0a 20 20 20 20 2f 2a 20 62 75 69 6c 64 20 74 68  .    /* build th
7380: 65 20 4e 45 57 2e 2a 20 72 65 66 65 72 65 6e 63  e NEW.* referenc
7390: 65 20 72 6f 77 2e 20 20 4e 6f 74 65 20 74 68 61  e row.  Note tha
73a0: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  t if there is an
73b0: 20 49 4e 54 45 47 45 52 0a 20 20 20 20 2a 2a 20   INTEGER.    ** 
73c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 74 6f  PRIMARY KEY into
73d0: 20 77 68 69 63 68 20 61 20 4e 55 4c 4c 20 69 73   which a NULL is
73e0: 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 2c   being inserted,
73f0: 20 74 68 61 74 20 4e 55 4c 4c 20 77 69 6c 6c 20   that NULL will 
7400: 62 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c  be.    ** transl
7410: 61 74 65 64 20 69 6e 74 6f 20 61 20 75 6e 69 71  ated into a uniq
7420: 75 65 20 49 44 20 66 6f 72 20 74 68 65 20 72 6f  ue ID for the ro
7430: 77 2e 20 20 42 75 74 20 6f 6e 20 61 20 42 45 46  w.  But on a BEF
7440: 4f 52 45 20 74 72 69 67 67 65 72 2c 0a 20 20 20  ORE trigger,.   
7450: 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e   ** we do not kn
7460: 6f 77 20 77 68 61 74 20 74 68 65 20 75 6e 69 71  ow what the uniq
7470: 75 65 20 49 44 20 77 69 6c 6c 20 62 65 20 28 62  ue ID will be (b
7480: 65 63 61 75 73 65 20 74 68 65 20 69 6e 73 65 72  ecause the inser
7490: 74 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  t has.    ** not
74a0: 20 68 61 70 70 65 6e 65 64 20 79 65 74 29 20 73   happened yet) s
74b0: 6f 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  o we substitute 
74c0: 61 20 72 6f 77 69 64 20 6f 66 20 2d 31 0a 20 20  a rowid of -1.  
74d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 70 6b    */.    if( ipk
74e0: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
74f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7500: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7510: 72 2c 20 2d 31 2c 20 72 65 67 43 6f 6c 73 29 3b  r, -1, regCols);
7520: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7530: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20    int addr1;.   
7540: 20 20 20 61 73 73 65 72 74 28 20 21 77 69 74 68     assert( !with
7550: 6f 75 74 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  outRowid );.    
7560: 20 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62    if( useTempTab
7570: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
7580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7590: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
75a0: 63 54 61 62 2c 20 69 70 6b 43 6f 6c 75 6d 6e 2c  cTab, ipkColumn,
75b0: 20 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20   regCols);.     
75c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
75d0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 3d  assert( pSelect=
75e0: 3d 30 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77  =0 );  /* Otherw
75f0: 69 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65  ise useTempTable
7600: 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20   is true */.    
7610: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7620: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ode(pParse, pLis
7630: 74 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e  t->a[ipkColumn].
7640: 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 29 3b  pExpr, regCols);
7650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
7660: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
7670: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
7680: 6f 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29  otNull, regCols)
7690: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
76a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
76b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
76c0: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65  _Integer, -1, re
76d0: 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  gCols);.      sq
76e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
76f0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
7700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7710: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
7720: 65 49 6e 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20  eInt, regCols); 
7730: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
7740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
7750: 61 6e 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67  annot have trigg
7760: 65 72 73 20 6f 6e 20 61 20 76 69 72 74 75 61 6c  ers on a virtual
7770: 20 74 61 62 6c 65 2e 20 49 66 20 69 74 20 77 65   table. If it we
7780: 72 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20  re possible,.   
7790: 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 77   ** this block w
77a0: 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 61 63 63  ould have to acc
77b0: 6f 75 6e 74 20 66 6f 72 20 68 69 64 64 65 6e 20  ount for hidden 
77c0: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
77d0: 20 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69     assert( !IsVi
77e0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a  rtual(pTab) );..
77f0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
7800: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74  e new column dat
7810: 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  a.    */.    for
7820: 28 69 3d 6a 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  (i=j=0; i<pTab->
7830: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7840: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b    if( pColumn ){
7850: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7860: 3b 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64  ; j<pColumn->nId
7870: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7880: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61    if( pColumn->a
7890: 5b 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65  [j].idx==i ) bre
78a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
78b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
78c0: 28 21 75 73 65 54 65 6d 70 54 61 62 6c 65 20 26  (!useTempTable &
78d0: 26 20 21 70 4c 69 73 74 29 20 7c 7c 20 28 70 43  & !pList) || (pC
78e0: 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c  olumn && j>=pCol
78f0: 75 6d 6e 2d 3e 6e 49 64 29 0a 20 20 20 20 20 20  umn->nId).      
7900: 20 20 20 20 20 20 7c 7c 20 28 70 43 6f 6c 75 6d        || (pColum
7910: 6e 3d 3d 30 20 26 26 20 49 73 4f 72 64 69 6e 61  n==0 && IsOrdina
7920: 72 79 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  ryHiddenColumn(&
7930: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 29 20  pTab->aCol[i])) 
7940: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7950: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
7960: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  e, pTab->aCol[i]
7970: 2e 70 44 66 6c 74 2c 20 72 65 67 43 6f 6c 73 2b  .pDflt, regCols+
7980: 69 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i+1);.      }els
7990: 65 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62  e if( useTempTab
79a0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
79b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
79c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
79d0: 63 54 61 62 2c 20 6a 2c 20 72 65 67 43 6f 6c 73  cTab, j, regCols
79e0: 2b 69 2b 31 29 3b 20 0a 20 20 20 20 20 20 7d 65  +i+1); .      }e
79f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7a00: 65 72 74 28 20 70 53 65 6c 65 63 74 3d 3d 30 20  ert( pSelect==0 
7a10: 29 3b 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ); /* Otherwise 
7a20: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 69 73 20  useTempTable is 
7a30: 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  true */.        
7a40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
7a50: 6e 64 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  ndCache(pParse, 
7a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  pList->a[j].pExp
7a70: 72 2c 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b  r, regCols+i+1);
7a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7a90: 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26  f( pColumn==0 &&
7aa0: 20 21 49 73 4f 72 64 69 6e 61 72 79 48 69 64 64   !IsOrdinaryHidd
7ab0: 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
7ac0: 61 43 6f 6c 5b 69 5d 29 20 29 20 6a 2b 2b 3b 0a  aCol[i]) ) j++;.
7ad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
7ae0: 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45   this is an INSE
7af0: 52 54 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74  RT on a view wit
7b00: 68 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20  h an INSTEAD OF 
7b10: 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a  INSERT trigger,.
7b20: 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74      ** do not at
7b30: 74 65 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72  tempt any conver
7b40: 73 69 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73  sions before ass
7b50: 65 6d 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f  embling the reco
7b60: 72 64 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  rd..    ** If th
7b70: 69 73 20 69 73 20 61 20 72 65 61 6c 20 74 61 62  is is a real tab
7b80: 6c 65 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76  le, attempt conv
7b90: 65 72 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69  ersions as requi
7ba0: 72 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  red by the.    *
7bb0: 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61  * table column a
7bc0: 66 66 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a  ffinities..    *
7bd0: 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  /.    if( !isVie
7be0: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
7bf0: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
7c00: 76 2c 20 70 54 61 62 2c 20 72 65 67 43 6f 6c 73  v, pTab, regCols
7c10: 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
7c20: 2f 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20 6f  /* Fire BEFORE o
7c30: 72 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  r INSTEAD OF tri
7c40: 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c  ggers */.    sql
7c50: 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67  ite3CodeRowTrigg
7c60: 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  er(pParse, pTrig
7c70: 67 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20  ger, TK_INSERT, 
7c80: 30 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52  0, TRIGGER_BEFOR
7c90: 45 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62  E, .        pTab
7ca0: 2c 20 72 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e  , regCols-pTab->
7cb0: 6e 43 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c  nCol-1, onError,
7cc0: 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20   endOfLoop);..  
7cd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7ce0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7cf0: 2c 20 72 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d  , regCols, pTab-
7d00: 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20  >nCol+1);.  }.. 
7d10: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
7d20: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  content of the n
7d30: 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
7d40: 74 20 69 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f  t into a range o
7d50: 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73  f.  ** registers
7d60: 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 72 65   beginning at re
7d70: 67 49 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gIns..  */.  if(
7d80: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
7d90: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
7da0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ab) ){.      /* 
7db0: 54 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65  The row that the
7dc0: 20 56 55 70 64 61 74 65 20 6f 70 63 6f 64 65 20   VUpdate opcode 
7dd0: 77 69 6c 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e  will delete: non
7de0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
7df0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7e00: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49  OP_Null, 0, regI
7e10: 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ns);.    }.    i
7e20: 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20  f( ipkColumn>=0 
7e30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 75 73 65  ){.      if( use
7e40: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
7e50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7e60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
7e70: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 70 6b  umn, srcTab, ipk
7e80: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64  Column, regRowid
7e90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7ea0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
7eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
7ed0: 70 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63  py, regFromSelec
7ee0: 74 2b 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67  t+ipkColumn, reg
7ef0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65  Rowid);.      }e
7f00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62  lse{.        Vdb
7f10: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
7f20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
7f30: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
7f40: 3e 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45  >a[ipkColumn].pE
7f50: 78 70 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  xpr, regRowid);.
7f60: 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71          pOp = sq
7f70: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7f80: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  , -1);.        i
7f90: 66 28 20 41 4c 57 41 59 53 28 70 4f 70 29 20 26  f( ALWAYS(pOp) &
7fa0: 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  & pOp->opcode==O
7fb0: 50 5f 4e 75 6c 6c 20 26 26 20 21 49 73 56 69 72  P_Null && !IsVir
7fc0: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
7fd0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 46 6c          appendFl
7fe0: 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ag = 1;.        
7ff0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
8000: 4f 50 5f 4e 65 77 52 6f 77 69 64 3b 0a 20 20 20  OP_NewRowid;.   
8010: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
8020: 20 69 44 61 74 61 43 75 72 3b 0a 20 20 20 20 20   iDataCur;.     
8030: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
8040: 65 67 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  egRowid;.       
8050: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 72 65 67     pOp->p3 = reg
8060: 41 75 74 6f 69 6e 63 3b 0a 20 20 20 20 20 20 20  Autoinc;.       
8070: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8080: 20 2f 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41   /* If the PRIMA
8090: 52 59 20 4b 45 59 20 65 78 70 72 65 73 73 69 6f  RY KEY expressio
80a0: 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
80b0: 75 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 0a  use OP_NewRowid.
80c0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65        ** to gene
80d0: 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 70 72  rate a unique pr
80e0: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 2e  imary key value.
80f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8100: 69 66 28 20 21 61 70 70 65 6e 64 46 6c 61 67 20  if( !appendFlag 
8110: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
8120: 64 64 72 31 3b 0a 20 20 20 20 20 20 20 20 69 66  ddr1;.        if
8130: 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
8140: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
8150: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
8160: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8170: 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 52 6f 77 69  NotNull, regRowi
8180: 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
8190: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
81a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
81b0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
81c0: 20 69 44 61 74 61 43 75 72 2c 20 72 65 67 52 6f   iDataCur, regRo
81d0: 77 69 64 2c 20 72 65 67 41 75 74 6f 69 6e 63 29  wid, regAutoinc)
81e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
81f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
8200: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
8210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8220: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
8230: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
8240: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  dr(v);.         
8250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8260: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
8270: 20 72 65 67 52 6f 77 69 64 2c 20 61 64 64 72 31   regRowid, addr1
8280: 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
8290: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
82a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
82b0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
82c0: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f  MustBeInt, regRo
82d0: 77 69 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  wid); VdbeCovera
82e0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
82f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
8300: 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
8310: 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  withoutRowid ){.
8320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8330: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
8340: 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  ll, 0, regRowid)
8350: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8370: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp3(v, OP_NewRo
8380: 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72  wid, iDataCur, r
8390: 65 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f  egRowid, regAuto
83a0: 69 6e 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65  inc);.      appe
83b0: 6e 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  ndFlag = 1;.    
83c0: 7d 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65  }.    autoIncSte
83d0: 70 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74  p(pParse, regAut
83e0: 6f 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  oinc, regRowid);
83f0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
8400: 20 64 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f   data for all co
8410: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77  lumns of the new
8420: 20 65 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e   entry, beginnin
8430: 67 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  g.    ** with th
8440: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a  e first column..
8450: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64 64      */.    nHidd
8460: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  en = 0;.    for(
8470: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
8480: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
8490: 6e 74 20 69 52 65 67 53 74 6f 72 65 20 3d 20 72  nt iRegStore = r
84a0: 65 67 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20 20  egRowid+1+i;.   
84b0: 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e     if( i==pTab->
84c0: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
84d0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
84e0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
84f0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
8500: 69 73 20 61 6c 77 61 79 73 20 61 20 4e 55 4c 4c  is always a NULL
8510: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  ..        ** Whe
8520: 6e 65 76 65 72 20 74 68 69 73 20 63 6f 6c 75 6d  never this colum
8530: 6e 20 69 73 20 72 65 61 64 2c 20 74 68 65 20 72  n is read, the r
8540: 6f 77 69 64 20 77 69 6c 6c 20 62 65 20 73 75 62  owid will be sub
8550: 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20  stituted.       
8560: 20 2a 2a 20 69 6e 20 69 74 73 20 70 6c 61 63 65   ** in its place
8570: 2e 20 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20 74  .  Hence, fill t
8580: 68 69 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  his column with 
8590: 61 20 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a  a NULL to avoid.
85a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e          ** takin
85b0: 67 20 75 70 20 64 61 74 61 20 73 70 61 63 65 20  g up data space 
85c0: 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  with information
85d0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
85e0: 20 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20   be used..      
85f0: 20 20 2a 2a 20 41 73 20 74 68 65 72 65 20 6d 61    ** As there ma
8600: 79 20 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f 70  y be shallow cop
8610: 69 65 73 20 6f 66 20 74 68 69 73 20 76 61 6c 75  ies of this valu
8620: 65 2c 20 6d 61 6b 65 20 69 74 20 61 20 73 6f 66  e, make it a sof
8630: 74 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  t-NULL */.      
8640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8650: 4f 70 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e 75  Op1(v, OP_SoftNu
8660: 6c 6c 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a  ll, iRegStore);.
8670: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8690: 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29  if( pColumn==0 )
86a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
86b0: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
86c0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a  ab->aCol[i]) ){.
86d0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31            j = -1
86e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 48 69 64  ;.          nHid
86f0: 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  den++;.        }
8700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8710: 6a 20 3d 20 69 20 2d 20 6e 48 69 64 64 65 6e 3b  j = i - nHidden;
8720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8740: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75  for(j=0; j<pColu
8750: 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  mn->nId; j++){. 
8760: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
8770: 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d  lumn->a[j].idx==
8780: 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
8790: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
87a0: 20 20 20 69 66 28 20 6a 3c 30 20 7c 7c 20 6e 43     if( j<0 || nC
87b0: 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28 70 43 6f  olumn==0 || (pCo
87c0: 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75  lumn && j>=pColu
87d0: 6d 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20 20 20 20  mn->nId) ){.    
87e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
87f0: 6f 64 65 46 61 63 74 6f 72 61 62 6c 65 28 70 50  odeFactorable(pP
8800: 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  arse, pTab->aCol
8810: 5b 69 5d 2e 70 44 66 6c 74 2c 20 69 52 65 67 53  [i].pDflt, iRegS
8820: 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  tore);.      }el
8830: 73 65 20 69 66 28 20 75 73 65 54 65 6d 70 54 61  se if( useTempTa
8840: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
8850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8860: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
8870: 72 63 54 61 62 2c 20 6a 2c 20 69 52 65 67 53 74  rcTab, j, iRegSt
8880: 6f 72 65 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c  ore); .      }el
8890: 73 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29  se if( pSelect )
88a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
88b0: 67 46 72 6f 6d 53 65 6c 65 63 74 21 3d 72 65 67  gFromSelect!=reg
88c0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
88d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88e0: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
88f0: 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b 6a   regFromSelect+j
8900: 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20  , iRegStore);.  
8910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
8920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8930: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
8940: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  rse, pList->a[j]
8950: 2e 70 45 78 70 72 2c 20 69 52 65 67 53 74 6f 72  .pExpr, iRegStor
8960: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
8970: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
8980: 74 65 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  te code to check
8990: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64   constraints and
89a0: 20 67 65 6e 65 72 61 74 65 20 69 6e 64 65 78 20   generate index 
89b0: 6b 65 79 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  keys and.    ** 
89c0: 64 6f 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e  do the insertion
89d0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
89e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
89f0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
8a00: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
8a10: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
8a20: 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
8a30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
8a40: 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
8a50: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73  , pTab);.      s
8a60: 71 6c 69 74 65 33 56 74 61 62 4d 61 6b 65 57 72  qlite3VtabMakeWr
8a70: 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  itable(pParse, p
8a80: 54 61 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tab);.      sqli
8a90: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8aa0: 20 4f 50 5f 56 55 70 64 61 74 65 2c 20 31 2c 20   OP_VUpdate, 1, 
8ab0: 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c 20 72 65  pTab->nCol+2, re
8ac0: 67 49 6e 73 2c 20 70 56 54 61 62 2c 20 50 34 5f  gIns, pVTab, P4_
8ad0: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 73 71 6c  VTAB);.      sql
8ae0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8af0: 28 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  (v, onError==OE_
8b00: 44 65 66 61 75 6c 74 20 3f 20 4f 45 5f 41 62 6f  Default ? OE_Abo
8b10: 72 74 20 3a 20 6f 6e 45 72 72 6f 72 29 3b 0a 20  rt : onError);. 
8b20: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
8b30: 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
8b40: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8b50: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
8b60: 73 52 65 70 6c 61 63 65 3b 20 20 20 20 2f 2a 20  sReplace;    /* 
8b70: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 63  Set to true if c
8b80: 6f 6e 73 74 72 61 69 6e 74 73 20 6d 61 79 20 63  onstraints may c
8b90: 61 75 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a  ause a replace *
8ba0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 55 73 65  /.      int bUse
8bb0: 53 65 65 6b 3b 20 20 20 20 20 2f 2a 20 54 72 75  Seek;     /* Tru
8bc0: 65 20 74 6f 20 75 73 65 20 4f 50 46 4c 41 47 5f  e to use OPFLAG_
8bd0: 53 45 45 4b 52 45 53 55 4c 54 20 2a 2f 0a 20 20  SEEKRESULT */.  
8be0: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
8bf0: 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
8c00: 63 6b 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  cks(pParse, pTab
8c10: 2c 20 61 52 65 67 49 64 78 2c 20 69 44 61 74 61  , aRegIdx, iData
8c20: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20  Cur, iIdxCur,.  
8c30: 20 20 20 20 20 20 20 20 72 65 67 49 6e 73 2c 20          regIns, 
8c40: 30 2c 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 2c  0, ipkColumn>=0,
8c50: 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c   onError, endOfL
8c60: 6f 6f 70 2c 20 26 69 73 52 65 70 6c 61 63 65 2c  oop, &isReplace,
8c70: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
8c80: 20 20 73 71 6c 69 74 65 33 46 6b 43 68 65 63 6b    sqlite3FkCheck
8c90: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
8ca0: 2c 20 72 65 67 49 6e 73 2c 20 30 2c 20 30 29 3b  , regIns, 0, 0);
8cb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
8cc0: 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
8cd0: 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 69 66 20  KRESULT flag if 
8ce0: 65 69 74 68 65 72 20 28 61 29 20 74 68 65 72 65  either (a) there
8cf0: 20 61 72 65 20 6e 6f 20 52 45 50 4c 41 43 45 0a   are no REPLACE.
8d00: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
8d10: 69 6e 74 73 20 6f 72 20 28 62 29 20 74 68 65 72  ints or (b) ther
8d20: 65 20 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72  e are no trigger
8d30: 73 20 61 6e 64 20 74 68 69 73 20 74 61 62 6c 65  s and this table
8d40: 20 69 73 20 6e 6f 74 20 61 0a 20 20 20 20 20 20   is not a.      
8d50: 2a 2a 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  ** parent table 
8d60: 69 6e 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  in a foreign key
8d70: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 49 74 20   constraint. It 
8d80: 69 73 20 73 61 66 65 20 74 6f 20 73 65 74 20 74  is safe to set t
8d90: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6c 61 67  he.      ** flag
8da0: 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 63   in the second c
8db0: 61 73 65 20 61 73 20 69 66 20 61 6e 79 20 52 45  ase as if any RE
8dc0: 50 4c 41 43 45 20 63 6f 6e 73 74 72 61 69 6e 74  PLACE constraint
8dd0: 20 69 73 20 68 69 74 2c 20 61 6e 0a 20 20 20 20   is hit, an.    
8de0: 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65 20 6f    ** OP_Delete o
8df0: 72 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 20 69  r OP_IdxDelete i
8e00: 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
8e10: 62 65 20 65 78 65 63 75 74 65 64 20 6f 6e 20 65  be executed on e
8e20: 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20 63 75  ach .      ** cu
8e30: 72 73 6f 72 20 74 68 61 74 20 69 73 20 64 69 73  rsor that is dis
8e40: 74 75 72 62 65 64 2e 20 41 6e 64 20 74 68 65 73  turbed. And thes
8e50: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 62  e instructions b
8e60: 6f 74 68 20 63 6c 65 61 72 20 74 68 65 0a 20 20  oth clear the.  
8e70: 20 20 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f      ** VdbeCurso
8e80: 72 2e 73 65 65 6b 52 65 73 75 6c 74 20 76 61 72  r.seekResult var
8e90: 69 61 62 6c 65 2c 20 64 69 73 61 62 6c 69 6e 67  iable, disabling
8ea0: 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
8eb0: 45 45 4b 52 45 53 55 4c 54 0a 20 20 20 20 20 20  EEKRESULT.      
8ec0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ** functionality
8ed0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 62 55 73 65  .  */.      bUse
8ee0: 53 65 65 6b 20 3d 20 28 69 73 52 65 70 6c 61 63  Seek = (isReplac
8ef0: 65 3d 3d 30 20 7c 7c 20 28 70 54 72 69 67 67 65  e==0 || (pTrigge
8f00: 72 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  r==0 &&.        
8f10: 20 20 28 28 64 62 2d 3e 66 6c 61 67 73 20 26 20    ((db->flags & 
8f20: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
8f30: 79 73 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ys)==0 || sqlite
8f40: 33 46 6b 52 65 66 65 72 65 6e 63 65 73 28 70 54  3FkReferences(pT
8f50: 61 62 29 3d 3d 30 29 0a 20 20 20 20 20 20 29 29  ab)==0).      ))
8f60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
8f70: 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f 6e  ompleteInsertion
8f80: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
8f90: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
8fa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 49  ,.          regI
8fb0: 6e 73 2c 20 61 52 65 67 49 64 78 2c 20 30 2c 20  ns, aRegIdx, 0, 
8fc0: 61 70 70 65 6e 64 46 6c 61 67 2c 20 62 55 73 65  appendFlag, bUse
8fd0: 53 65 65 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Seek.      );.  
8fe0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
8ff0: 64 61 74 65 20 74 68 65 20 63 6f 75 6e 74 20 6f  date the count o
9000: 66 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20  f rows that are 
9010: 69 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20  inserted.  */.  
9020: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
9030: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
9040: 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  s)!=0 ){.    sql
9050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9060: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67  , OP_AddImm, reg
9070: 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20  RowCount, 1);.  
9080: 7d 0a 0a 20 20 69 66 28 20 70 54 72 69 67 67 65  }..  if( pTrigge
9090: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 64 65  r ){.    /* Code
90a0: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
90b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  */.    sqlite3Co
90c0: 64 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61  deRowTrigger(pPa
90d0: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 54  rse, pTrigger, T
90e0: 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54 52 49  K_INSERT, 0, TRI
90f0: 47 47 45 52 5f 41 46 54 45 52 2c 20 0a 20 20 20  GGER_AFTER, .   
9100: 20 20 20 20 20 70 54 61 62 2c 20 72 65 67 44 61       pTab, regDa
9110: 74 61 2d 32 2d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ta-2-pTab->nCol,
9120: 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c   onError, endOfL
9130: 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oop);.  }..  /* 
9140: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
9150: 65 20 6d 61 69 6e 20 69 6e 73 65 72 74 69 6f 6e  e main insertion
9160: 20 6c 6f 6f 70 2c 20 69 66 20 74 68 65 20 64 61   loop, if the da
9170: 74 61 20 73 6f 75 72 63 65 0a 20 20 2a 2a 20 69  ta source.  ** i
9180: 73 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  s a SELECT state
9190: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
91a0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
91b0: 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c 6f 6f  abel(v, endOfLoo
91c0: 70 29 3b 0a 20 20 69 66 28 20 75 73 65 54 65 6d  p);.  if( useTem
91d0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  pTable ){.    sq
91e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
91f0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 72 63 54  v, OP_Next, srcT
9200: 61 62 2c 20 61 64 64 72 43 6f 6e 74 29 3b 20 56  ab, addrCont); V
9210: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
9230: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
9240: 6e 73 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  nsTop);.    sqli
9250: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
9260: 20 4f 50 5f 43 6c 6f 73 65 2c 20 73 72 63 54 61   OP_Close, srcTa
9270: 62 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  b);.  }else if( 
9280: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
9290: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
92a0: 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20  , addrCont);.   
92b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
92c0: 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73 54  Here(v, addrInsT
92d0: 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  op);.  }..  if( 
92e0: 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
92f0: 20 26 26 20 21 69 73 56 69 65 77 20 29 7b 0a 20   && !isView ){. 
9300: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20     /* Close all 
9310: 74 61 62 6c 65 73 20 6f 70 65 6e 65 64 20 2a 2f  tables opened */
9320: 0a 20 20 20 20 69 66 28 20 69 44 61 74 61 43 75  .    if( iDataCu
9330: 72 3c 69 49 64 78 43 75 72 20 29 20 73 71 6c 69  r<iIdxCur ) sqli
9340: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
9350: 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 61 74 61   OP_Close, iData
9360: 43 75 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 64  Cur);.    for(id
9370: 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  x=0, pIdx=pTab->
9380: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
9390: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
93a0: 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  idx++){.      sq
93b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
93c0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 64 78  v, OP_Close, idx
93d0: 2b 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 7d  +iIdxCur);.    }
93e0: 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 65 6e 64  .  }..insert_end
93f0: 3a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  :.  /* Update th
9400: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
9410: 65 20 74 61 62 6c 65 20 62 79 20 73 74 6f 72 69  e table by stori
9420: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
9430: 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d  f the.  ** maxim
9440: 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e 74 65 72  um rowid counter
9450: 20 76 61 6c 75 65 73 20 72 65 63 6f 72 64 65 64   values recorded
9460: 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67   while inserting
9470: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75 74 6f 69   into.  ** autoi
9480: 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c 65 73 2e  ncrement tables.
9490: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
94a0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26  se->nested==0 &&
94b0: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
94c0: 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rTab==0 ){.    s
94d0: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
94e0: 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29 3b 0a  entEnd(pParse);.
94f0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
9500: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9510: 20 6f 66 20 72 6f 77 73 20 69 6e 73 65 72 74 65   of rows inserte
9520: 64 2e 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  d. If this routi
9530: 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67 65 6e 65  ne is .  ** gene
9540: 72 61 74 69 6e 67 20 63 6f 64 65 20 62 65 63 61  rating code beca
9550: 75 73 65 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f  use of a call to
9560: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
9570: 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74 0a 20 20  rse(), do not.  
9580: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 61  ** invoke the ca
9590: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e  llback function.
95a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  .  */.  if( (db-
95b0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
95c0: 75 6e 74 52 6f 77 73 29 20 26 26 20 21 70 50 61  untRows) && !pPa
95d0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 21  rse->nested && !
95e0: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
95f0: 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
9600: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9610: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
9620: 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20  gRowCount, 1);. 
9630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9640: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a  tNumCols(v, 1);.
9650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
9660: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20  etColName(v, 0, 
9670: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 72  COLNAME_NAME, "r
9680: 6f 77 73 20 69 6e 73 65 72 74 65 64 22 2c 20 53  ows inserted", S
9690: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
96a0: 20 7d 0a 0a 69 6e 73 65 72 74 5f 63 6c 65 61 6e   }..insert_clean
96b0: 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  up:.  sqlite3Src
96c0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
96d0: 54 61 62 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  TabList);.  sqli
96e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
96f0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
9700: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
9710: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
9720: 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
9730: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  tDelete(db, pCol
9740: 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  umn);.  sqlite3D
9750: 62 46 72 65 65 28 64 62 2c 20 61 52 65 67 49 64  bFree(db, aRegId
9760: 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d 61 6b 65 20 73  x);.}../* Make s
9770: 75 72 65 20 22 69 73 56 69 65 77 22 20 61 6e 64  ure "isView" and
9780: 20 6f 74 68 65 72 20 6d 61 63 72 6f 73 20 64 65   other macros de
9790: 66 69 6e 65 64 20 61 62 6f 76 65 20 61 72 65 20  fined above are 
97a0: 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72  undefined. Other
97b0: 77 69 73 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79  wise.** they may
97c0: 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
97d0: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f  compilation of o
97e0: 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 69  ther functions i
97f0: 6e 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28  n this file.** (
9800: 6f 72 20 69 6e 20 61 6e 6f 74 68 65 72 20 66 69  or in another fi
9810: 6c 65 2c 20 69 66 20 74 68 69 73 20 66 69 6c 65  le, if this file
9820: 20 62 65 63 6f 6d 65 73 20 70 61 72 74 20 6f 66   becomes part of
9830: 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
9840: 6e 29 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 69  n).  */.#ifdef i
9850: 73 56 69 65 77 0a 20 23 75 6e 64 65 66 20 69 73  sView. #undef is
9860: 56 69 65 77 0a 23 65 6e 64 69 66 0a 23 69 66 64  View.#endif.#ifd
9870: 65 66 20 70 54 72 69 67 67 65 72 0a 20 23 75 6e  ef pTrigger. #un
9880: 64 65 66 20 70 54 72 69 67 67 65 72 0a 23 65 6e  def pTrigger.#en
9890: 64 69 66 0a 23 69 66 64 65 66 20 74 6d 61 73 6b  dif.#ifdef tmask
98a0: 0a 20 23 75 6e 64 65 66 20 74 6d 61 73 6b 0a 23  . #undef tmask.#
98b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  endif../*.** Mea
98c0: 6e 69 6e 67 73 20 6f 66 20 62 69 74 73 20 69 6e  nings of bits in
98d0: 20 6f 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f   of pWalker->eCo
98e0: 64 65 20 66 6f 72 20 63 68 65 63 6b 43 6f 6e 73  de for checkCons
98f0: 74 72 61 69 6e 74 55 6e 63 68 61 6e 67 65 64 28  traintUnchanged(
9900: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4b 43  ).*/.#define CKC
9910: 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e 20 20 20  NSTRNT_COLUMN   
9920: 30 78 30 31 20 20 20 20 2f 2a 20 43 48 45 43 4b  0x01    /* CHECK
9930: 20 63 6f 6e 73 74 72 61 69 6e 74 20 75 73 65 73   constraint uses
9940: 20 61 20 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75   a changing colu
9950: 6d 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4b  mn */.#define CK
9960: 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 20 20 20  CNSTRNT_ROWID   
9970: 20 30 78 30 32 20 20 20 20 2f 2a 20 43 48 45 43   0x02    /* CHEC
9980: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 66  K constraint ref
9990: 65 72 65 6e 63 65 73 20 74 68 65 20 52 4f 57 49  erences the ROWI
99a0: 44 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 69 73  D */../* This is
99b0: 20 74 68 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c   the Walker call
99c0: 62 61 63 6b 20 66 72 6f 6d 20 63 68 65 63 6b 43  back from checkC
99d0: 6f 6e 73 74 72 61 69 6e 74 55 6e 63 68 61 6e 67  onstraintUnchang
99e0: 65 64 28 29 2e 20 20 53 65 74 0a 2a 2a 20 62 69  ed().  Set.** bi
99f0: 74 20 30 78 30 31 20 6f 66 20 70 57 61 6c 6b 65  t 0x01 of pWalke
9a00: 72 2d 3e 65 43 6f 64 65 20 69 66 0a 2a 2a 20 70  r->eCode if.** p
9a10: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f  Walker->eCode to
9a20: 20 30 20 69 66 20 74 68 69 73 20 65 78 70 72 65   0 if this expre
9a30: 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72  ssion node refer
9a40: 65 6e 63 65 73 20 61 6e 79 20 6f 66 20 74 68 65  ences any of the
9a50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
9a60: 20 61 72 65 20 62 65 69 6e 67 20 6d 6f 64 69 66   are being modif
9a70: 65 64 20 62 79 20 61 6e 20 55 50 44 41 54 45 20  ed by an UPDATE 
9a80: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
9a90: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 43 6f  atic int checkCo
9aa0: 6e 73 74 72 61 69 6e 74 45 78 70 72 4e 6f 64 65  nstraintExprNode
9ab0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
9ac0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9ad0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
9ae0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
9af0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
9b00: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 7c 7c 20 70  >iColumn>=0 || p
9b10: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  Expr->iColumn==-
9b20: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  1 );.    if( pEx
9b30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
9b40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  {.      if( pWal
9b50: 6b 65 72 2d 3e 75 2e 61 69 43 6f 6c 5b 70 45 78  ker->u.aiCol[pEx
9b60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3e 3d 30 20  pr->iColumn]>=0 
9b70: 29 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b  ){.        pWalk
9b80: 65 72 2d 3e 65 43 6f 64 65 20 7c 3d 20 43 4b 43  er->eCode |= CKC
9b90: 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e 3b 0a 20  NSTRNT_COLUMN;. 
9ba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9bb0: 7b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  {.      pWalker-
9bc0: 3e 65 43 6f 64 65 20 7c 3d 20 43 4b 43 4e 53 54  >eCode |= CKCNST
9bd0: 52 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d  RNT_ROWID;.    }
9be0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
9bf0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
9c00: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
9c10: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
9c20: 20 6f 6e 20 61 20 72 6f 77 20 74 68 61 74 20 69   on a row that i
9c30: 73 20 62 65 69 6e 67 20 55 50 44 41 54 45 2d 65  s being UPDATE-e
9c40: 64 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20  d.  The.** only 
9c50: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
9c60: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
9c70: 20 55 50 44 41 54 45 20 61 72 65 20 74 68 6f 73   UPDATE are thos
9c80: 65 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 61  e for which.** a
9c90: 69 43 68 6e 67 5b 69 5d 3e 3d 30 2c 20 61 6e 64  iChng[i]>=0, and
9ca0: 20 61 6c 73 6f 20 74 68 65 20 52 4f 57 49 44 20   also the ROWID 
9cb0: 69 73 20 6d 6f 64 69 66 69 65 64 20 69 66 20 63  is modified if c
9cc0: 68 6e 67 52 6f 77 69 64 20 69 73 20 74 72 75 65  hngRowid is true
9cd0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
9ce0: 72 75 65 20 69 66 20 43 48 45 43 4b 20 63 6f 6e  rue if CHECK con
9cf0: 73 74 72 61 69 6e 74 20 70 45 78 70 72 20 64 6f  straint pExpr do
9d00: 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 79 20 6f  es not use any o
9d10: 66 20 74 68 65 0a 2a 2a 20 63 68 61 6e 67 69 6e  f the.** changin
9d20: 67 20 63 6f 6c 75 6d 6e 73 20 28 6f 72 20 74 68  g columns (or th
9d30: 65 20 72 6f 77 69 64 20 69 66 20 69 74 20 69 73  e rowid if it is
9d40: 20 63 68 61 6e 67 69 6e 67 29 2e 20 20 49 6e 20   changing).  In 
9d50: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20  other words,.** 
9d60: 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
9d70: 68 69 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  his CHECK constr
9d80: 61 69 6e 74 20 63 61 6e 20 62 65 20 73 6b 69 70  aint can be skip
9d90: 70 65 64 20 77 68 65 6e 20 76 61 6c 69 64 61 74  ped when validat
9da0: 69 6e 67 0a 2a 2a 20 74 68 65 20 6e 65 77 20 72  ing.** the new r
9db0: 6f 77 20 69 6e 20 74 68 65 20 55 50 44 41 54 45  ow in the UPDATE
9dc0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
9dd0: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 43  tatic int checkC
9de0: 6f 6e 73 74 72 61 69 6e 74 55 6e 63 68 61 6e 67  onstraintUnchang
9df0: 65 64 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ed(Expr *pExpr, 
9e00: 69 6e 74 20 2a 61 69 43 68 6e 67 2c 20 69 6e 74  int *aiChng, int
9e10: 20 63 68 6e 67 52 6f 77 69 64 29 7b 0a 20 20 57   chngRowid){.  W
9e20: 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
9e30: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
9e40: 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  w));.  w.eCode =
9e50: 20 30 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   0;.  w.xExprCal
9e60: 6c 62 61 63 6b 20 3d 20 63 68 65 63 6b 43 6f 6e  lback = checkCon
9e70: 73 74 72 61 69 6e 74 45 78 70 72 4e 6f 64 65 3b  straintExprNode;
9e80: 0a 20 20 77 2e 75 2e 61 69 43 6f 6c 20 3d 20 61  .  w.u.aiCol = a
9e90: 69 43 68 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  iChng;.  sqlite3
9ea0: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
9eb0: 70 72 29 3b 0a 20 20 69 66 28 20 21 63 68 6e 67  pr);.  if( !chng
9ec0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 74 65 73  Rowid ){.    tes
9ed0: 74 63 61 73 65 28 20 28 77 2e 65 43 6f 64 65 20  tcase( (w.eCode 
9ee0: 26 20 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49  & CKCNSTRNT_ROWI
9ef0: 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 77 2e 65  D)!=0 );.    w.e
9f00: 43 6f 64 65 20 26 3d 20 7e 43 4b 43 4e 53 54 52  Code &= ~CKCNSTR
9f10: 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
9f20: 74 65 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64  testcase( w.eCod
9f30: 65 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  e==0 );.  testca
9f40: 73 65 28 20 77 2e 65 43 6f 64 65 3d 3d 43 4b 43  se( w.eCode==CKC
9f50: 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e 20 29 3b  NSTRNT_COLUMN );
9f60: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 2e 65  .  testcase( w.e
9f70: 43 6f 64 65 3d 3d 43 4b 43 4e 53 54 52 4e 54 5f  Code==CKCNSTRNT_
9f80: 52 4f 57 49 44 20 29 3b 0a 20 20 74 65 73 74 63  ROWID );.  testc
9f90: 61 73 65 28 20 77 2e 65 43 6f 64 65 3d 3d 28 43  ase( w.eCode==(C
9fa0: 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 7c 43  KCNSTRNT_ROWID|C
9fb0: 4b 43 4e 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e 29  KCNSTRNT_COLUMN)
9fc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 21 77 2e   );.  return !w.
9fd0: 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eCode;.}../*.** 
9fe0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
9ff0: 20 64 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20 63   do constraint c
a000: 68 65 63 6b 73 20 70 72 69 6f 72 20 74 6f 20 61  hecks prior to a
a010: 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55  n INSERT or an U
a020: 50 44 41 54 45 0a 2a 2a 20 6f 6e 20 74 61 62 6c  PDATE.** on tabl
a030: 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  e pTab..**.** Th
a040: 65 20 72 65 67 4e 65 77 44 61 74 61 20 70 61 72  e regNewData par
a050: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 66 69  ameter is the fi
a060: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
a070: 61 20 72 61 6e 67 65 20 74 68 61 74 20 63 6f 6e  a range that con
a080: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74  tains.** the dat
a090: 61 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  a to be inserted
a0a0: 20 6f 72 20 74 68 65 20 64 61 74 61 20 61 66 74   or the data aft
a0b0: 65 72 20 74 68 65 20 75 70 64 61 74 65 2e 20 20  er the update.  
a0c0: 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  There will be.**
a0d0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 72 65   pTab->nCol+1 re
a0e0: 67 69 73 74 65 72 73 20 69 6e 20 74 68 69 73 20  gisters in this 
a0f0: 72 61 6e 67 65 2e 20 20 54 68 65 20 66 69 72 73  range.  The firs
a100: 74 20 72 65 67 69 73 74 65 72 20 28 74 68 65 20  t register (the 
a110: 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 72 65 67 4e  one.** that regN
a120: 65 77 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f  ewData points to
a130: 29 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74  ) will contain t
a140: 68 65 20 6e 65 77 20 72 6f 77 69 64 2c 20 6f 72  he new rowid, or
a150: 20 4e 55 4c 4c 20 69 6e 20 74 68 65 0a 2a 2a 20   NULL in the.** 
a160: 63 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f 55  case of a WITHOU
a170: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T ROWID table.  
a180: 54 68 65 20 73 65 63 6f 6e 64 20 72 65 67 69 73  The second regis
a190: 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
a1a0: 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e   will.** contain
a1b0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
a1c0: 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
a1d0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 74 68 69  column.  The thi
a1e0: 72 64 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c  rd register will
a1f0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  .** contain the 
a200: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 73  content of the s
a210: 65 63 6f 6e 64 20 74 61 62 6c 65 20 63 6f 6c 75  econd table colu
a220: 6d 6e 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  mn.  And so fort
a230: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67  h..**.** The reg
a240: 4f 6c 64 44 61 74 61 20 70 61 72 61 6d 65 74 65  OldData paramete
a250: 72 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  r is similar to 
a260: 72 65 67 4e 65 77 44 61 74 61 20 65 78 63 65 70  regNewData excep
a270: 74 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  t that it contai
a280: 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 20 70  ns.** the data p
a290: 72 69 6f 72 20 74 6f 20 61 6e 20 55 50 44 41 54  rior to an UPDAT
a2a0: 45 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 66  E rather than af
a2b0: 74 65 72 77 61 72 64 73 2e 20 20 72 65 67 4f 6c  terwards.  regOl
a2c0: 64 44 61 74 61 20 69 73 20 7a 65 72 6f 0a 2a 2a  dData is zero.**
a2d0: 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 54 2e 20   for an INSERT. 
a2e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
a2f0: 6e 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65  n distinguish be
a300: 74 77 65 65 6e 20 55 50 44 41 54 45 20 61 6e 64  tween UPDATE and
a310: 20 49 4e 53 45 52 54 20 62 79 0a 2a 2a 20 63 68   INSERT by.** ch
a320: 65 63 6b 69 6e 67 20 72 65 67 4f 6c 64 44 61 74  ecking regOldDat
a330: 61 20 66 6f 72 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  a for zero..**.*
a340: 2a 20 46 6f 72 20 61 6e 20 55 50 44 41 54 45 2c  * For an UPDATE,
a350: 20 74 68 65 20 70 6b 43 68 6e 67 20 62 6f 6f 6c   the pkChng bool
a360: 65 61 6e 20 69 73 20 74 72 75 65 20 69 66 20 74  ean is true if t
a370: 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  he true primary 
a380: 6b 65 79 20 28 74 68 65 0a 2a 2a 20 72 6f 77 69  key (the.** rowi
a390: 64 20 66 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 74  d for a normal t
a3a0: 61 62 6c 65 20 6f 72 20 74 68 65 20 50 52 49 4d  able or the PRIM
a3b0: 41 52 59 20 4b 45 59 20 66 6f 72 20 61 20 57 49  ARY KEY for a WI
a3c0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
a3d0: 65 29 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d  e).** might be m
a3e0: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 55  odified by the U
a3f0: 50 44 41 54 45 2e 20 20 49 66 20 70 6b 43 68 6e  PDATE.  If pkChn
a400: 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  g is false, then
a410: 20 74 68 65 20 6b 65 79 20 6f 66 0a 2a 2a 20 74   the key of.** t
a420: 68 65 20 69 44 61 74 61 43 75 72 20 63 6f 6e 74  he iDataCur cont
a430: 65 6e 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  ent table is gua
a440: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
a450: 63 68 61 6e 67 65 64 20 62 79 20 74 68 65 20 55  changed by the U
a460: 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  PDATE..**.** For
a470: 20 61 6e 20 49 4e 53 45 52 54 2c 20 74 68 65 20   an INSERT, the 
a480: 70 6b 43 68 6e 67 20 62 6f 6f 6c 65 61 6e 20 69  pkChng boolean i
a490: 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65 72  ndicates whether
a4a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 69   or not the rowi
a4b0: 64 0a 2a 2a 20 77 61 73 20 65 78 70 6c 69 63 69  d.** was explici
a4c0: 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 73  tly specified as
a4d0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 49 4e 53   part of the INS
a4e0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ERT statement.  
a4f0: 49 66 20 70 6b 43 68 6e 67 0a 2a 2a 20 69 73 20  If pkChng.** is 
a500: 7a 65 72 6f 2c 20 69 74 20 6d 65 61 6e 73 20 74  zero, it means t
a510: 68 61 74 20 74 68 65 20 65 69 74 68 65 72 20 72  hat the either r
a520: 6f 77 69 64 20 69 73 20 63 6f 6d 70 75 74 65 64  owid is computed
a530: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
a540: 72 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 74 61  r.** that the ta
a550: 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54  ble is a WITHOUT
a560: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61 6e 64   ROWID table and
a570: 20 68 61 73 20 6e 6f 20 72 6f 77 69 64 2e 20 20   has no rowid.  
a580: 4f 6e 20 61 6e 20 49 4e 53 45 52 54 2c 0a 2a 2a  On an INSERT,.**
a590: 20 70 6b 43 68 6e 67 20 77 69 6c 6c 20 6f 6e 6c   pkChng will onl
a5a0: 79 20 62 65 20 74 72 75 65 20 69 66 20 74 68 65  y be true if the
a5b0: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
a5c0: 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 69 6e  t provides an in
a5d0: 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 20 66  teger.** value f
a5e0: 6f 72 20 65 69 74 68 65 72 20 74 68 65 20 72 6f  or either the ro
a5f0: 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 74  wid column or it
a600: 73 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  s INTEGER PRIMAR
a610: 59 20 4b 45 59 20 61 6c 69 61 73 2e 0a 2a 2a 0a  Y KEY alias..**.
a620: 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
a630: 72 61 74 65 64 20 62 79 20 74 68 69 73 20 72 6f  rated by this ro
a640: 75 74 69 6e 65 20 77 69 6c 6c 20 73 74 6f 72 65  utine will store
a650: 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72 69   new index entri
a660: 65 73 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  es into.** regis
a670: 74 65 72 73 20 69 64 65 6e 74 69 66 69 65 64 20  ters identified 
a680: 62 79 20 61 52 65 67 49 64 78 5b 5d 2e 20 20 4e  by aRegIdx[].  N
a690: 6f 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  o index entry is
a6a0: 20 63 72 65 61 74 65 64 20 66 6f 72 0a 2a 2a 20   created for.** 
a6b0: 69 6e 64 69 63 65 73 20 77 68 65 72 65 20 61 52  indices where aR
a6c0: 65 67 49 64 78 5b 69 5d 3d 3d 30 2e 20 20 54 68  egIdx[i]==0.  Th
a6d0: 65 20 6f 72 64 65 72 20 6f 66 20 69 6e 64 69 63  e order of indic
a6e0: 65 73 20 69 6e 20 61 52 65 67 49 64 78 5b 5d 20  es in aRegIdx[] 
a6f0: 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61  is.** the same a
a700: 73 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 69  s the order of i
a710: 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 6c 69  ndices on the li
a720: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 69 6e 64  nked list of ind
a730: 69 63 65 73 0a 2a 2a 20 61 74 20 70 54 61 62 2d  ices.** at pTab-
a740: 3e 70 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  >pIndex..**.** T
a750: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68  he caller must h
a760: 61 76 65 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  ave already open
a770: 65 64 20 77 72 69 74 65 61 62 6c 65 20 63 75 72  ed writeable cur
a780: 73 6f 72 73 20 6f 6e 20 74 68 65 20 6d 61 69 6e  sors on the main
a790: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 61 6c  .** table and al
a7a0: 6c 20 61 70 70 6c 69 63 61 62 6c 65 20 69 6e 64  l applicable ind
a7b0: 69 63 65 73 20 28 74 68 61 74 20 69 73 20 74 6f  ices (that is to
a7c0: 20 73 61 79 2c 20 61 6c 6c 20 69 6e 64 69 63 65   say, all indice
a7d0: 73 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 61  s for which.** a
a7e0: 52 65 67 49 64 78 5b 5d 20 69 73 20 6e 6f 74 20  RegIdx[] is not 
a7f0: 7a 65 72 6f 29 2e 20 20 69 44 61 74 61 43 75 72  zero).  iDataCur
a800: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
a810: 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  or the main tabl
a820: 65 20 77 68 65 6e 0a 2a 2a 20 69 6e 73 65 72 74  e when.** insert
a830: 69 6e 67 20 6f 72 20 75 70 64 61 74 69 6e 67 20  ing or updating 
a840: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 6f  a rowid table, o
a850: 72 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  r the cursor for
a860: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
a870: 0a 2a 2a 20 69 6e 64 65 78 20 77 68 65 6e 20 6f  .** index when o
a880: 70 65 72 61 74 69 6e 67 20 6f 6e 20 61 20 57 49  perating on a WI
a890: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
a8a0: 65 2e 20 20 69 49 64 78 43 75 72 20 69 73 20 74  e.  iIdxCur is t
a8b0: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 66 6f 72  he cursor.** for
a8c0: 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   the first index
a8d0: 20 69 6e 20 74 68 65 20 70 54 61 62 2d 3e 70 49   in the pTab->pI
a8e0: 6e 64 65 78 20 6c 69 73 74 2e 20 20 43 75 72 73  ndex list.  Curs
a8f0: 6f 72 73 20 66 6f 72 20 6f 74 68 65 72 20 69 6e  ors for other in
a900: 64 69 63 65 73 0a 2a 2a 20 61 72 65 20 61 74 20  dices.** are at 
a910: 69 49 64 78 43 75 72 2b 4e 20 66 6f 72 20 74 68  iIdxCur+N for th
a920: 65 20 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f  e N-th element o
a930: 66 20 74 68 65 20 70 54 61 62 2d 3e 70 49 6e 64  f the pTab->pInd
a940: 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ex list..**.** T
a950: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
a960: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
a970: 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61  to check constra
a980: 69 6e 74 73 2e 20 20 4e 4f 54 20 4e 55 4c 4c 2c  ints.  NOT NULL,
a990: 0a 2a 2a 20 43 48 45 43 4b 2c 20 61 6e 64 20 55  .** CHECK, and U
a9a0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
a9b0: 73 20 61 72 65 20 61 6c 6c 20 63 68 65 63 6b 65  s are all checke
a9c0: 64 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  d.  If a constra
a9d0: 69 6e 74 20 66 61 69 6c 73 2c 0a 2a 2a 20 74 68  int fails,.** th
a9e0: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
a9f0: 74 65 20 61 63 74 69 6f 6e 20 69 73 20 70 65 72  te action is per
aa00: 66 6f 72 6d 65 64 2e 20 20 54 68 65 72 65 20 61  formed.  There a
aa10: 72 65 20 66 69 76 65 20 70 6f 73 73 69 62 6c 65  re five possible
aa20: 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a 20 52 4f 4c  .** actions: ROL
aa30: 4c 42 41 43 4b 2c 20 41 42 4f 52 54 2c 20 46 41  LBACK, ABORT, FA
aa40: 49 4c 2c 20 52 45 50 4c 41 43 45 2c 20 61 6e 64  IL, REPLACE, and
aa50: 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20 20   IGNORE..**.**  
aa60: 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
aa70: 20 41 63 74 69 6f 6e 20 20 20 20 20 20 20 57 68   Action       Wh
aa80: 61 74 20 48 61 70 70 65 6e 73 0a 2a 2a 20 20 2d  at Happens.**  -
aa90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
aaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d  ----------   ---
aab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aad0: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e 79 20 20 20  -----.**  any   
aae0: 20 20 20 20 20 20 20 20 20 20 20 52 4f 4c 4c 42             ROLLB
aaf0: 41 43 4b 20 20 20 20 20 54 68 65 20 63 75 72 72  ACK     The curr
ab00: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
ab10: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  is rolled back a
ab20: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65       sqlite3_ste
ab50: 70 28 29 20 72 65 74 75 72 6e 73 20 69 6d 6d 65  p() returns imme
ab60: 64 69 61 74 65 6c 79 20 77 69 74 68 20 61 0a 2a  diately with a.*
ab70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
aba0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
abb0: 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20  T..**.**  any   
abc0: 20 20 20 20 20 20 20 20 20 20 20 41 42 4f 52 54             ABORT
abd0: 20 20 20 20 20 20 20 20 42 61 63 6b 20 6f 75 74          Back out
abe0: 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 74 68   changes from th
abf0: 65 20 63 75 72 72 65 6e 74 20 63 6f 6d 6d 61 6e  e current comman
ac00: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 6f 6e 6c 79 20 28 64 6f 20 6e 6f 74      only (do not
ac30: 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 20 72   do a complete r
ac40: 6f 6c 6c 62 61 63 6b 29 20 74 68 65 6e 0a 2a 2a  ollback) then.**
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
ac80: 65 70 28 29 20 74 6f 20 72 65 74 75 72 6e 20 69  ep() to return i
ac90: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74               wit
acc0: 68 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  h SQLITE_CONSTRA
acd0: 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20  INT..**.**  any 
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 41 49               FAI
acf0: 4c 20 20 20 20 20 20 20 20 20 53 71 6c 69 74 65  L         Sqlite
ad00: 33 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e 73  3_step() returns
ad10: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
ad20: 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  h a.**          
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64        return cod
ad50: 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53  e of SQLITE_CONS
ad60: 54 52 41 49 4e 54 2e 20 20 54 68 65 0a 2a 2a 20  TRAINT.  The.** 
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
ad90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
ada0: 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  t rolled back an
adb0: 64 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20  d any.**        
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73 20          changes 
ade0: 74 6f 20 70 72 69 6f 72 20 72 6f 77 73 20 61 72  to prior rows ar
adf0: 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2a 0a 2a  e retained..**.*
ae00: 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20  *  any          
ae10: 20 20 20 20 49 47 4e 4f 52 45 20 20 20 20 20 20      IGNORE      
ae20: 20 54 68 65 20 61 74 74 65 6d 70 74 20 69 6e 20   The attempt in 
ae30: 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65  insert or update
ae40: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
ae70: 6f 77 20 69 73 20 73 6b 69 70 70 65 64 2c 20 77  ow is skipped, w
ae80: 69 74 68 6f 75 74 20 74 68 72 6f 77 69 6e 67 20  ithout throwing 
ae90: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 20  an error..**    
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 63              Proc
aec0: 65 73 73 69 6e 67 20 63 6f 6e 74 69 6e 75 65 73  essing continues
aed0: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 72   with the next r
aee0: 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow..**          
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 28 54 68 65 72 65 20 69 73 20        (There is 
af10: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
af20: 70 20 74 6f 20 69 67 6e 6f 72 65 44 65 73 74 2e  p to ignoreDest.
af30: 29 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20 4e 55 4c  ).**.**  NOT NUL
af40: 4c 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43  L         REPLAC
af50: 45 20 20 20 20 20 20 54 68 65 20 4e 55 4c 4c 20  E      The NULL 
af60: 76 61 6c 75 65 20 69 73 20 72 65 70 6c 61 63 65  value is replace
af70: 20 62 79 20 74 68 65 20 64 65 66 61 75 6c 74 0a   by the default.
af80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74    value for that
afb0: 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65   column.  If the
afc0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a   default value.*
afd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 61 63   is NULL, the ac
b000: 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65  tion is the same
b010: 20 61 73 20 41 42 4f 52 54 2e 0a 2a 2a 0a 2a 2a   as ABORT..**.**
b020: 20 20 55 4e 49 51 55 45 20 20 20 20 20 20 20 20    UNIQUE        
b030: 20 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20     REPLACE      
b040: 54 68 65 20 6f 74 68 65 72 20 72 6f 77 20 74 68  The other row th
b050: 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
b060: 68 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20  h the row.**    
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 62 65 69 6e              bein
b090: 67 20 69 6e 73 65 72 74 65 64 20 69 73 20 72 65  g inserted is re
b0a0: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 43 48  moved..**.**  CH
b0b0: 45 43 4b 20 20 20 20 20 20 20 20 20 20 20 20 52  ECK            R
b0c0: 45 50 4c 41 43 45 20 20 20 20 20 20 49 6c 6c 65  EPLACE      Ille
b0d0: 67 61 6c 2e 20 20 54 68 65 20 72 65 73 75 6c 74  gal.  The result
b0e0: 73 20 69 6e 20 61 6e 20 65 78 63 65 70 74 69 6f  s in an exceptio
b0f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63 68 20 61  n..**.** Which a
b100: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 73  ction to take is
b110: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
b120: 68 65 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72  he overrideError
b130: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 4f   parameter..** O
b140: 72 20 69 66 20 6f 76 65 72 72 69 64 65 45 72 72  r if overrideErr
b150: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 2c 20  or==OE_Default, 
b160: 74 68 65 6e 20 74 68 65 20 70 50 61 72 73 65 2d  then the pParse-
b170: 3e 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74  >onError paramet
b180: 65 72 0a 2a 2a 20 69 73 20 75 73 65 64 2e 20 20  er.** is used.  
b190: 4f 72 20 69 66 20 70 50 61 72 73 65 2d 3e 6f 6e  Or if pParse->on
b1a0: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
b1b0: 74 20 74 68 65 6e 20 74 68 65 20 6f 6e 45 72 72  t then the onErr
b1c0: 6f 72 20 76 61 6c 75 65 0a 2a 2a 20 66 6f 72 20  or value.** for 
b1d0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
b1e0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  s used..*/.void 
b1f0: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
b200: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
b210: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b220: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
b230: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
b240: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
b250: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
b260: 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 73 65 72  able being inser
b270: 74 65 64 20 6f 72 20 75 70 64 61 74 65 64 20 2a  ted or updated *
b280: 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78  /.  int *aRegIdx
b290: 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  ,        /* Use 
b2a0: 72 65 67 69 73 74 65 72 20 61 52 65 67 49 64 78  register aRegIdx
b2b0: 5b 69 5d 20 66 6f 72 20 69 6e 64 65 78 20 69 2e  [i] for index i.
b2c0: 20 20 30 20 66 6f 72 20 75 6e 75 73 65 64 20 2a    0 for unused *
b2d0: 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  /.  int iDataCur
b2e0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f  ,        /* Cano
b2f0: 6e 69 63 61 6c 20 64 61 74 61 20 63 75 72 73 6f  nical data curso
b300: 72 20 28 6d 61 69 6e 20 74 61 62 6c 65 20 6f 72  r (main table or
b310: 20 50 4b 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20   PK index) */.  
b320: 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20 20 20  int iIdxCur,    
b330: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
b340: 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  dex cursor */.  
b350: 69 6e 74 20 72 65 67 4e 65 77 44 61 74 61 2c 20  int regNewData, 
b360: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
b370: 67 69 73 74 65 72 20 69 6e 20 61 20 72 61 6e 67  gister in a rang
b380: 65 20 68 6f 6c 64 69 6e 67 20 76 61 6c 75 65 73  e holding values
b390: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
b3a0: 69 6e 74 20 72 65 67 4f 6c 64 44 61 74 61 2c 20  int regOldData, 
b3b0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
b3c0: 20 63 6f 6e 74 65 6e 74 2e 20 20 30 20 66 6f 72   content.  0 for
b3d0: 20 49 4e 53 45 52 54 73 20 2a 2f 0a 20 20 75 38   INSERTs */.  u8
b3e0: 20 70 6b 43 68 6e 67 2c 20 20 20 20 20 20 20 20   pkChng,        
b3f0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
b400: 66 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20 50  f the rowid or P
b410: 52 49 4d 41 52 59 20 4b 45 59 20 63 68 61 6e 67  RIMARY KEY chang
b420: 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72 72  ed */.  u8 overr
b430: 69 64 65 45 72 72 6f 72 2c 20 20 20 20 2f 2a 20  ideError,    /* 
b440: 4f 76 65 72 72 69 64 65 20 6f 6e 45 72 72 6f 72  Override onError
b450: 20 74 6f 20 74 68 69 73 20 69 66 20 6e 6f 74 20   to this if not 
b460: 4f 45 5f 44 65 66 61 75 6c 74 20 2a 2f 0a 20 20  OE_Default */.  
b470: 69 6e 74 20 69 67 6e 6f 72 65 44 65 73 74 2c 20  int ignoreDest, 
b480: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
b490: 74 68 69 73 20 6c 61 62 65 6c 20 6f 6e 20 61 6e  this label on an
b4a0: 20 4f 45 5f 49 67 6e 6f 72 65 20 72 65 73 6f 6c   OE_Ignore resol
b4b0: 75 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ution */.  int *
b4c0: 70 62 4d 61 79 52 65 70 6c 61 63 65 2c 20 20 20  pbMayReplace,   
b4d0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 74  /* OUT: Set to t
b4e0: 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69 6e  rue if constrain
b4f0: 74 20 6d 61 79 20 63 61 75 73 65 20 61 20 72 65  t may cause a re
b500: 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  place */.  int *
b510: 61 69 43 68 6e 67 20 20 20 20 20 20 20 20 20 20  aiChng          
b520: 2f 2a 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20 75  /* column i is u
b530: 6e 63 68 61 6e 67 65 64 20 69 66 20 61 69 43 68  nchanged if aiCh
b540: 6e 67 5b 69 5d 3c 30 20 2a 2f 0a 29 7b 0a 20 20  ng[i]<0 */.){.  
b550: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
b560: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64       /* VDBE und
b570: 65 72 20 63 6f 6e 73 74 72 75 74 69 6f 6e 20 2a  er constrution *
b580: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
b590: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
b5a0: 74 65 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68  ter to one of th
b5b0: 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 49  e indices */.  I
b5c0: 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
b5d0: 20 20 20 20 2f 2a 20 54 68 65 20 50 52 49 4d 41      /* The PRIMA
b5e0: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a 2f 0a  RY KEY index */.
b5f0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
b600: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
b610: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
b620: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b630: 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20          /* loop 
b640: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
b650: 20 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20   ix;            
b660: 20 20 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70 20    /* Index loop 
b670: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
b680: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
b690: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b6a0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
b6b0: 6f 6e 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  onError;        
b6c0: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
b6d0: 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67 79  olution strategy
b6e0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
b6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b700: 64 72 65 73 73 20 6f 66 20 6a 75 6d 70 20 69 6e  dress of jump in
b710: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
b720: 6e 74 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d  nt seenReplace =
b730: 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 52   0; /* True if R
b740: 45 50 4c 41 43 45 20 69 73 20 75 73 65 64 20 74  EPLACE is used t
b750: 6f 20 72 65 73 6f 6c 76 65 20 49 4e 54 20 50 4b  o resolve INT PK
b760: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
b770: 6e 74 20 6e 50 6b 46 69 65 6c 64 3b 20 20 20 20  nt nPkField;    
b780: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b790: 20 66 69 65 6c 64 73 20 69 6e 20 50 52 49 4d 41   fields in PRIMA
b7a0: 52 59 20 4b 45 59 2e 20 31 20 66 6f 72 20 52 4f  RY KEY. 1 for RO
b7b0: 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  WID tables */.  
b7c0: 69 6e 74 20 69 70 6b 54 6f 70 20 3d 20 30 3b 20  int ipkTop = 0; 
b7d0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
b7e0: 68 65 20 72 6f 77 69 64 20 63 68 61 6e 67 65 20  he rowid change 
b7f0: 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
b800: 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 42 6f 74   */.  int ipkBot
b810: 74 6f 6d 20 3d 20 30 3b 20 20 20 2f 2a 20 42 6f  tom = 0;   /* Bo
b820: 74 74 6f 6d 20 6f 66 20 74 68 65 20 72 6f 77 69  ttom of the rowi
b830: 64 20 63 68 61 6e 67 65 20 63 6f 6e 73 74 72 61  d change constra
b840: 69 6e 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75  int check */.  u
b850: 38 20 69 73 55 70 64 61 74 65 3b 20 20 20 20 20  8 isUpdate;     
b860: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
b870: 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
b880: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
b890: 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65  u8 bAffinityDone
b8a0: 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69   = 0;  /* True i
b8b0: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
b8c0: 79 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20  y operation has 
b8d0: 62 65 65 6e 20 72 75 6e 20 2a 2f 0a 0a 20 20 69  been run */..  i
b8e0: 73 55 70 64 61 74 65 20 3d 20 72 65 67 4f 6c 64  sUpdate = regOld
b8f0: 44 61 74 61 21 3d 30 3b 0a 20 20 64 62 20 3d 20  Data!=0;.  db = 
b900: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
b910: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b920: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
b930: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
b940: 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c  sert( pTab->pSel
b950: 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68  ect==0 );  /* Th
b960: 69 73 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  is table is not 
b970: 61 20 56 49 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c  a VIEW */.  nCol
b980: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
b990: 20 0a 20 20 2f 2a 20 70 50 6b 20 69 73 20 74 68   .  /* pPk is th
b9a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
b9b0: 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
b9c0: 52 4f 57 49 44 20 74 61 62 6c 65 73 20 61 6e 64  ROWID tables and
b9d0: 20 4e 55 4c 4c 20 66 6f 72 0a 20 20 2a 2a 20 6e   NULL for.  ** n
b9e0: 6f 72 6d 61 6c 20 72 6f 77 69 64 20 74 61 62 6c  ormal rowid tabl
b9f0: 65 73 2e 20 20 6e 50 6b 46 69 65 6c 64 20 69 73  es.  nPkField is
ba00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6b   the number of k
ba10: 65 79 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ey fields in the
ba20: 20 0a 20 20 2a 2a 20 70 50 6b 20 69 6e 64 65 78   .  ** pPk index
ba30: 20 6f 72 20 31 20 66 6f 72 20 61 20 72 6f 77 69   or 1 for a rowi
ba40: 64 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  d table.  In oth
ba50: 65 72 20 77 6f 72 64 73 2c 20 6e 50 6b 46 69 65  er words, nPkFie
ba60: 6c 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e  ld is the.  ** n
ba70: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
ba80: 69 6e 20 74 68 65 20 74 72 75 65 20 70 72 69 6d  in the true prim
ba90: 61 72 79 20 6b 65 79 20 6f 66 20 74 68 65 20 74  ary key of the t
baa0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 48  able. */.  if( H
bab0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
bac0: 0a 20 20 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20  .    pPk = 0;.  
bad0: 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20 31 3b 0a    nPkField = 1;.
bae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
baf0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
bb00: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
bb10: 0a 20 20 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20  .    nPkField = 
bb20: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  pPk->nKeyCol;.  
bb30: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  }..  /* Record t
bb40: 68 61 74 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  hat this module 
bb50: 68 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  has started */. 
bb60: 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
bb70: 6e 74 28 28 76 2c 20 22 42 45 47 49 4e 3a 20 47  nt((v, "BEGIN: G
bb80: 65 6e 43 6e 73 74 43 6b 73 28 25 64 2c 25 64 2c  enCnstCks(%d,%d,
bb90: 25 64 2c 25 64 2c 25 64 29 22 2c 0a 20 20 20 20  %d,%d,%d)",.    
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43   iDataCur, iIdxC
bbc0: 75 72 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20  ur, regNewData, 
bbd0: 72 65 67 4f 6c 64 44 61 74 61 2c 20 70 6b 43 68  regOldData, pkCh
bbe0: 6e 67 29 29 3b 0a 0a 20 20 2f 2a 20 54 65 73 74  ng));..  /* Test
bbf0: 20 61 6c 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f   all NOT NULL co
bc00: 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a  nstraints..  */.
bc10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
bc20: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
bc30: 20 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   i==pTab->iPKey 
bc40: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
bc50: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 57  e;        /* ROW
bc60: 49 44 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c  ID is never NULL
bc70: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
bc80: 28 20 61 69 43 68 6e 67 20 26 26 20 61 69 43 68  ( aiChng && aiCh
bc90: 6e 67 5b 69 5d 3c 30 20 29 7b 0a 20 20 20 20 20  ng[i]<0 ){.     
bca0: 20 2f 2a 20 44 6f 6e 27 74 20 62 6f 74 68 65 72   /* Don't bother
bcb0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 4e 4f   checking for NO
bcc0: 54 20 4e 55 4c 4c 20 6f 6e 20 63 6f 6c 75 6d 6e  T NULL on column
bcd0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68  s that do not ch
bce0: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ange */.      co
bcf0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
bd00: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61 62    onError = pTab
bd10: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
bd20: 6c 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72  l;.    if( onErr
bd30: 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f  or==OE_None ) co
bd40: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73  ntinue;  /* This
bd50: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 6c 6f 77   column is allow
bd60: 65 64 20 74 6f 20 62 65 20 4e 55 4c 4c 20 2a 2f  ed to be NULL */
bd70: 0a 20 20 20 20 69 66 28 20 6f 76 65 72 72 69 64  .    if( overrid
bd80: 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75  eError!=OE_Defau
bd90: 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72  lt ){.      onEr
bda0: 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72  ror = overrideEr
bdb0: 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ror;.    }else i
bdc0: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  f( onError==OE_D
bdd0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
bde0: 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
bdf0: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rt;.    }.    if
be00: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ( onError==OE_Re
be10: 70 6c 61 63 65 20 26 26 20 70 54 61 62 2d 3e 61  place && pTab->a
be20: 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30 20  Col[i].pDflt==0 
be30: 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  ){.      onError
be40: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
be50: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f   }.    assert( o
be60: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62  nError==OE_Rollb
be70: 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d  ack || onError==
be80: 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72  OE_Abort || onEr
be90: 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20  ror==OE_Fail.   
bea0: 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d       || onError=
beb0: 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e  =OE_Ignore || on
bec0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
bed0: 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  e );.    switch(
bee0: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
bef0: 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a    case OE_Abort:
bf00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf10: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
bf20: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c  ;.        /* Fal
bf30: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
bf40: 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
bf50: 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ack:.      case 
bf60: 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20  OE_Fail: {.     
bf70: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
bf80: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bf90: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
bfa0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
bfd0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
bfe0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bff0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
c000: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 2c 20 53  OP_HaltIfNull, S
c010: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c020: 5f 4e 4f 54 4e 55 4c 4c 2c 20 6f 6e 45 72 72 6f  _NOTNULL, onErro
c030: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
c050: 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20 7a 4d 73  NewData+1+i, zMs
c060: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
c070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c080: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 50  dbeChangeP5(v, P
c090: 35 5f 43 6f 6e 73 74 72 61 69 6e 74 4e 6f 74 4e  5_ConstraintNotN
c0a0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64  ull);.        Vd
c0b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c0c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
c0e0: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20   OE_Ignore: {.  
c0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c100: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
c110: 4e 75 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74 61  Null, regNewData
c120: 2b 31 2b 69 2c 20 69 67 6e 6f 72 65 44 65 73 74  +1+i, ignoreDest
c130: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
c140: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
c150: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c160: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
c170: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
c180: 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  rt( onError==OE_
c190: 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20  Replace );.     
c1a0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
c1b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c1c0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 4e  OP_NotNull, regN
c1d0: 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20  ewData+1+i);.   
c1e0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
c1f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
c200: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c210: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61  (pParse, pTab->a
c220: 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65  Col[i].pDflt, re
c230: 67 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20  gNewData+1+i);. 
c240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c250: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c260: 64 72 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  dr1);.        br
c270: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c280: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73   }.  }..  /* Tes
c290: 74 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  t all CHECK cons
c2a0: 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66  traints.  */.#if
c2b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c2c0: 5f 43 48 45 43 4b 0a 20 20 69 66 28 20 70 54 61  _CHECK.  if( pTa
c2d0: 62 2d 3e 70 43 68 65 63 6b 20 26 26 20 28 64 62  b->pCheck && (db
c2e0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
c2f0: 5f 49 67 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d  _IgnoreChecks)==
c300: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
c310: 74 20 2a 70 43 68 65 63 6b 20 3d 20 70 54 61 62  t *pCheck = pTab
c320: 2d 3e 70 43 68 65 63 6b 3b 0a 20 20 20 20 70 50  ->pCheck;.    pP
c330: 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72  arse->ckBase = r
c340: 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20 20  egNewData+1;.   
c350: 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72   onError = overr
c360: 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66  ideError!=OE_Def
c370: 61 75 6c 74 20 3f 20 6f 76 65 72 72 69 64 65 45  ault ? overrideE
c380: 72 72 6f 72 20 3a 20 4f 45 5f 41 62 6f 72 74 3b  rror : OE_Abort;
c390: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c3a0: 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 3b 20 69  pCheck->nExpr; i
c3b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  ++){.      int a
c3c0: 6c 6c 4f 6b 3b 0a 20 20 20 20 20 20 45 78 70 72  llOk;.      Expr
c3d0: 20 2a 70 45 78 70 72 20 3d 20 70 43 68 65 63 6b   *pExpr = pCheck
c3e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
c3f0: 20 20 20 20 69 66 28 20 61 69 43 68 6e 67 20 26      if( aiChng &
c400: 26 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  & checkConstrain
c410: 74 55 6e 63 68 61 6e 67 65 64 28 70 45 78 70 72  tUnchanged(pExpr
c420: 2c 20 61 69 43 68 6e 67 2c 20 70 6b 43 68 6e 67  , aiChng, pkChng
c430: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
c440: 20 20 20 20 61 6c 6c 4f 6b 20 3d 20 73 71 6c 69      allOk = sqli
c450: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
c460: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
c470: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
c480: 72 73 65 2c 20 70 45 78 70 72 2c 20 61 6c 6c 4f  rse, pExpr, allO
c490: 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  k, SQLITE_JUMPIF
c4a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28  NULL);.      if(
c4b0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e   onError==OE_Ign
c4c0: 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ore ){.        s
c4d0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
c4e0: 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20  , ignoreDest);. 
c4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c500: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
c510: 3d 20 70 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e 7a  = pCheck->a[i].z
c520: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
c530: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61  ( zName==0 ) zNa
c540: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
c550: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e  ;.        if( on
c560: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
c570: 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  e ) onError = OE
c580: 5f 41 62 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a 20  _Abort; /* IMP: 
c590: 52 2d 31 35 35 36 39 2d 36 33 36 32 35 20 2a 2f  R-15569-63625 */
c5a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c5b0: 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
c5c0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f  Parse, SQLITE_CO
c5d0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 2c 0a  NSTRAINT_CHECK,.
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
c600: 45 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c 20 50 34  Error, zName, P4
c610: 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20 20 20 20  _TRANSIENT,.    
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e            P5_Con
c640: 73 74 72 61 69 6e 74 43 68 65 63 6b 29 3b 0a 20  straintCheck);. 
c650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
c660: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
c670: 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b 0a  abel(v, allOk);.
c680: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
c690: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
c6a0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
c6b0: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 72 6f 77 69  */..  /* If rowi
c6c0: 64 20 69 73 20 63 68 61 6e 67 69 6e 67 2c 20 6d  d is changing, m
c6d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
c6e0: 20 72 6f 77 69 64 20 64 6f 65 73 20 6e 6f 74 20   rowid does not 
c6f0: 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20  previously.  ** 
c700: 65 78 69 73 74 20 69 6e 20 74 68 65 20 74 61 62  exist in the tab
c710: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
c720: 6b 43 68 6e 67 20 26 26 20 70 50 6b 3d 3d 30 20  kChng && pPk==0 
c730: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 52  ){.    int addrR
c740: 6f 77 69 64 4f 6b 20 3d 20 73 71 6c 69 74 65 33  owidOk = sqlite3
c750: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
c760: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ;..    /* Figure
c770: 20 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e   out what action
c780: 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65   to take in case
c790: 20 6f 66 20 61 20 72 6f 77 69 64 20 63 6f 6c 6c   of a rowid coll
c7a0: 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 6f 6e 45  ision */.    onE
c7b0: 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 6b 65 79  rror = pTab->key
c7c0: 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f 76  Conf;.    if( ov
c7d0: 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f  errideError!=OE_
c7e0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
c7f0: 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72   onError = overr
c800: 69 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65  ideError;.    }e
c810: 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  lse if( onError=
c820: 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
c830: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
c840: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a  E_Abort;.    }..
c850: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
c860: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 6b 43   ){.      /* pkC
c870: 68 6e 67 21 3d 30 20 64 6f 65 73 20 6e 6f 74 20  hng!=0 does not 
c880: 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 72 6f  mean that the ro
c890: 77 69 64 20 68 61 73 20 63 68 61 6e 67 65 64 2c  wid has changed,
c8a0: 20 6f 6e 6c 79 20 74 68 61 74 0a 20 20 20 20 20   only that.     
c8b0: 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 68 61 76   ** it might hav
c8c0: 65 20 63 68 61 6e 67 65 64 2e 20 20 53 6b 69 70  e changed.  Skip
c8d0: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6c 6f   the conflict lo
c8e0: 67 69 63 20 62 65 6c 6f 77 20 69 66 20 74 68 65  gic below if the
c8f0: 20 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20   rowid.      ** 
c900: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  is unchanged. */
c910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c920: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
c930: 71 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20 61  q, regNewData, a
c940: 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4f  ddrRowidOk, regO
c950: 6c 64 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  ldData);.      s
c960: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
c970: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
c980: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
c990: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c9a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
c9b0: 68 65 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  he response to a
c9c0: 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74 20   rowid conflict 
c9d0: 69 73 20 52 45 50 4c 41 43 45 20 62 75 74 20 74  is REPLACE but t
c9e0: 68 65 20 72 65 73 70 6f 6e 73 65 0a 20 20 20 20  he response.    
c9f0: 2a 2a 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ** to some other
ca00: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
ca10: 6e 74 20 69 73 20 46 41 49 4c 20 6f 72 20 49 47  nt is FAIL or IG
ca20: 4e 4f 52 45 2c 20 74 68 65 6e 20 77 65 20 6e 65  NORE, then we ne
ca30: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 66  ed.    ** to def
ca40: 65 72 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 6f  er the running o
ca50: 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6e 66  f the rowid conf
ca60: 6c 69 63 74 20 63 68 65 63 6b 69 6e 67 20 75 6e  lict checking un
ca70: 74 69 6c 20 61 66 74 65 72 0a 20 20 20 20 2a 2a  til after.    **
ca80: 20 74 68 65 20 55 4e 49 51 55 45 20 63 6f 6e 73   the UNIQUE cons
ca90: 74 72 61 69 6e 74 73 20 68 61 76 65 20 72 75 6e  traints have run
caa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
cab0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
cac0: 6c 61 63 65 20 26 26 20 6f 76 65 72 72 69 64 65  lace && override
cad0: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
cae0: 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  e ){.      for(p
caf0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
cb00: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
cb10: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
cb20: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
cb30: 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  rror==OE_Ignore 
cb40: 7c 7c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  || pIdx->onError
cb50: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
cb60: 20 20 20 20 20 20 20 69 70 6b 54 6f 70 20 3d 20         ipkTop = 
cb70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cb80: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
cb90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cbb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
cbc0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
cbd0: 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 61 6c  the new rowid al
cbe0: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
cbf0: 74 68 65 20 74 61 62 6c 65 2e 20 20 53 6b 69 70  the table.  Skip
cc00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
cc10: 6f 77 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 6c  owing conflict l
cc20: 6f 67 69 63 20 69 66 20 69 74 20 64 6f 65 73 20  ogic if it does 
cc30: 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  not. */.    sqli
cc40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cc50: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
cc60: 44 61 74 61 43 75 72 2c 20 61 64 64 72 52 6f 77  DataCur, addrRow
cc70: 69 64 4f 6b 2c 20 72 65 67 4e 65 77 44 61 74 61  idOk, regNewData
cc80: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
cc90: 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
cca0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
ccb0: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 61 20  at deals with a 
ccc0: 72 6f 77 69 64 20 63 6f 6c 6c 69 73 69 6f 6e 20  rowid collision 
ccd0: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
cce0: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
ccf0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
cd00: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f     onError = OE_
cd10: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 2f  Abort;.        /
cd20: 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
cd30: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
cd40: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
cd50: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
cd60: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  :.      case OE_
cd70: 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73  Abort:.      cas
cd80: 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20  e OE_Fail: {.   
cd90: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 69       sqlite3Rowi
cda0: 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  dConstraint(pPar
cdb0: 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 54 61  se, onError, pTa
cdc0: 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  b);.        brea
cdd0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
cde0: 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63 65   case OE_Replace
cdf0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  : {.        /* I
ce00: 66 20 74 68 65 72 65 20 61 72 65 20 44 45 4c 45  f there are DELE
ce10: 54 45 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74  TE triggers on t
ce20: 68 69 73 20 74 61 62 6c 65 20 61 6e 64 20 74 68  his table and th
ce30: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63  e.        ** rec
ce40: 75 72 73 69 76 65 2d 74 72 69 67 67 65 72 73 20  ursive-triggers 
ce50: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 63 61 6c  flag is set, cal
ce60: 6c 20 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  l GenerateRowDel
ce70: 65 74 65 28 29 20 74 6f 0a 20 20 20 20 20 20 20  ete() to.       
ce80: 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 63   ** remove the c
ce90: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 66  onflicting row f
cea0: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 54  rom the table. T
ceb0: 68 69 73 20 77 69 6c 6c 20 66 69 72 65 0a 20 20  his will fire.  
cec0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 69        ** the tri
ced0: 67 67 65 72 73 20 61 6e 64 20 72 65 6d 6f 76 65  ggers and remove
cee0: 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20   both the table 
cef0: 61 6e 64 20 69 6e 64 65 78 20 62 2d 74 72 65 65  and index b-tree
cf00: 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
cf10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
cf20: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
cf30: 65 72 65 20 61 72 65 20 6e 6f 20 74 72 69 67 67  ere are no trigg
cf40: 65 72 73 20 6f 72 20 74 68 65 20 72 65 63 75 72  ers or the recur
cf50: 73 69 76 65 2d 74 72 69 67 67 65 72 73 0a 20 20  sive-triggers.  
cf60: 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73        ** flag is
cf70: 20 6e 6f 74 20 73 65 74 2c 20 62 75 74 20 74 68   not set, but th
cf80: 65 20 74 61 62 6c 65 20 68 61 73 20 6f 6e 65 20  e table has one 
cf90: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 2c  or more indexes,
cfa0: 20 63 61 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a   call .        *
cfb0: 2a 20 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64  * GenerateRowInd
cfc0: 65 78 44 65 6c 65 74 65 28 29 2e 20 54 68 69 73  exDelete(). This
cfd0: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 69 6e 64   removes the ind
cfe0: 65 78 20 62 2d 74 72 65 65 20 65 6e 74 72 69 65  ex b-tree entrie
cff0: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  s .        ** on
d000: 6c 79 2e 20 54 68 65 20 74 61 62 6c 65 20 62 2d  ly. The table b-
d010: 74 72 65 65 20 65 6e 74 72 79 20 77 69 6c 6c 20  tree entry will 
d020: 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  be replaced by t
d030: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 0a 20 20  he new entry .  
d040: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
d050: 20 69 73 20 69 6e 73 65 72 74 65 64 2e 20 20 0a   is inserted.  .
d060: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
d070: 20 20 20 2a 2a 20 49 66 20 65 69 74 68 65 72 20     ** If either 
d080: 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74  GenerateRowDelet
d090: 65 28 29 20 6f 72 20 47 65 6e 65 72 61 74 65 52  e() or GenerateR
d0a0: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 29 20  owIndexDelete() 
d0b0: 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 20  is called,.     
d0c0: 20 20 20 2a 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b     ** also invok
d0d0: 65 20 4d 75 6c 74 69 57 72 69 74 65 28 29 20 74  e MultiWrite() t
d0e0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
d0f0: 74 68 69 73 20 56 44 42 45 20 6d 61 79 20 72 65  this VDBE may re
d100: 71 75 69 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  quire.        **
d110: 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
d120: 61 63 6b 20 28 69 66 20 74 68 65 20 73 74 61 74  ack (if the stat
d130: 65 6d 65 6e 74 20 69 73 20 61 62 6f 72 74 65 64  ement is aborted
d140: 20 61 66 74 65 72 20 74 68 65 20 64 65 6c 65 74   after the delet
d150: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b  e.        ** tak
d160: 65 73 20 70 6c 61 63 65 29 2e 20 45 61 72 6c 69  es place). Earli
d170: 65 72 20 76 65 72 73 69 6f 6e 73 20 63 61 6c 6c  er versions call
d180: 65 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57  ed sqlite3MultiW
d190: 72 69 74 65 28 29 20 72 65 67 61 72 64 6c 65 73  rite() regardles
d1a0: 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 75  s,.        ** bu
d1b0: 74 20 62 65 69 6e 67 20 6d 6f 72 65 20 73 65 6c  t being more sel
d1c0: 65 63 74 69 76 65 20 68 65 72 65 20 61 6c 6c 6f  ective here allo
d1d0: 77 73 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  ws statements li
d1e0: 6b 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ke:.        **. 
d1f0: 20 20 20 20 20 20 20 2a 2a 20 20 20 52 45 50 4c         **   REPL
d200: 41 43 45 20 49 4e 54 4f 20 74 28 72 6f 77 69 64  ACE INTO t(rowid
d210: 29 20 56 41 4c 55 45 53 28 24 6e 65 77 72 6f 77  ) VALUES($newrow
d220: 69 64 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  id).        **. 
d230: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
d240: 20 77 69 74 68 6f 75 74 20 61 20 73 74 61 74 65   without a state
d250: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 66 20  ment journal if 
d260: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 64  there are no ind
d270: 65 78 65 73 20 6f 6e 20 74 68 65 0a 20 20 20 20  exes on the.    
d280: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 0a 20 20      ** table..  
d290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d2a0: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
d2b0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
d2c0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  if( db->flags&SQ
d2d0: 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
d2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
d2f0: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
d300: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50  TriggersExist(pP
d310: 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44  arse, pTab, TK_D
d320: 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20  ELETE, 0, 0);.  
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d340: 69 66 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20  if( pTrigger || 
d350: 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65  sqlite3FkRequire
d360: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  d(pParse, pTab, 
d370: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
d380: 20 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57     sqlite3MultiW
d390: 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  rite(pParse);.  
d3a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
d3b0: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
d3c0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
d3d0: 54 72 69 67 67 65 72 2c 20 69 44 61 74 61 43 75  Trigger, iDataCu
d3e0: 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20  r, iIdxCur,.    
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
d410: 65 67 4e 65 77 44 61 74 61 2c 20 31 2c 20 30 2c  egNewData, 1, 0,
d420: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 31 2c 20   OE_Replace, 1, 
d430: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  -1);.        }el
d440: 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
d450: 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
d460: 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 20 20 20 20  TE_HOOK.        
d470: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
d480: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
d490: 20 20 20 20 2f 2a 20 54 68 69 73 20 4f 50 5f 44      /* This OP_D
d4a0: 65 6c 65 74 65 20 6f 70 63 6f 64 65 20 66 69 72  elete opcode fir
d4b0: 65 73 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  es the pre-updat
d4c0: 65 2d 68 6f 6f 6b 20 6f 6e 6c 79 2e 20 49 74 20  e-hook only. It 
d4d0: 64 6f 65 73 0a 20 20 20 20 20 20 20 20 20 20 20  does.           
d4e0: 20 2a 2a 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74   ** not modify t
d4f0: 68 65 20 62 2d 74 72 65 65 2e 20 49 74 20 69 73  he b-tree. It is
d500: 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20   more efficient 
d510: 74 6f 20 6c 65 74 20 74 68 65 20 63 6f 6d 69 6e  to let the comin
d520: 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  g.            **
d530: 20 4f 50 5f 49 6e 73 65 72 74 20 72 65 70 6c 61   OP_Insert repla
d540: 63 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ce the existing 
d550: 65 6e 74 72 79 20 74 68 61 6e 20 69 74 20 69 73  entry than it is
d560: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 20   to delete the. 
d570: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78             ** ex
d580: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 61 6e 64  isting entry and
d590: 20 74 68 65 6e 20 69 6e 73 65 72 74 20 61 20 6e   then insert a n
d5a0: 65 77 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 20  ew one. */.     
d5b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d5c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
d5d0: 65 6c 65 74 65 2c 20 69 44 61 74 61 43 75 72 2c  elete, iDataCur,
d5e0: 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 3b   OPFLAG_ISNOOP);
d5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d600: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
d610: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
d620: 70 54 61 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b  pTab, P4_TABLE);
d630: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
d640: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
d650: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
d660: 4f 4f 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOK */.         
d670: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
d680: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x ){.           
d690: 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
d6a0: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
d6b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
d6c0: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
d6d0: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54  elete(pParse, pT
d6e0: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  ab, iDataCur, iI
d6f0: 64 78 43 75 72 2c 30 2c 2d 31 29 3b 0a 20 20 20  dxCur,0,-1);.   
d700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d710: 20 7d 0a 20 20 20 20 20 20 20 20 73 65 65 6e 52   }.        seenR
d720: 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  eplace = 1;.    
d730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d740: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
d750: 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20  _Ignore: {.     
d760: 20 20 20 2f 2a 61 73 73 65 72 74 28 20 73 65 65     /*assert( see
d770: 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b 2a 2f  nReplace==0 );*/
d780: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d790: 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f  VdbeGoto(v, igno
d7a0: 72 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20  reDest);.       
d7b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d7c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d7d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d7e0: 6c 28 76 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b  l(v, addrRowidOk
d7f0: 29 3b 0a 20 20 20 20 69 66 28 20 69 70 6b 54 6f  );.    if( ipkTo
d800: 70 20 29 7b 0a 20 20 20 20 20 20 69 70 6b 42 6f  p ){.      ipkBo
d810: 74 74 6f 6d 20 3d 20 73 71 6c 69 74 65 33 56 64  ttom = sqlite3Vd
d820: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
d830: 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oto);.      sqli
d840: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d850: 76 2c 20 69 70 6b 54 6f 70 29 3b 0a 20 20 20 20  v, ipkTop);.    
d860: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  }.  }..  /* Test
d870: 20 61 6c 6c 20 55 4e 49 51 55 45 20 63 6f 6e 73   all UNIQUE cons
d880: 74 72 61 69 6e 74 73 20 62 79 20 63 72 65 61 74  traints by creat
d890: 69 6e 67 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ing entries for 
d8a0: 65 61 63 68 20 55 4e 49 51 55 45 0a 20 20 2a 2a  each UNIQUE.  **
d8b0: 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 69 6e   index and makin
d8c0: 67 20 73 75 72 65 20 74 68 61 74 20 64 75 70 6c  g sure that dupl
d8d0: 69 63 61 74 65 20 65 6e 74 72 69 65 73 20 64 6f  icate entries do
d8e0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
d8f0: 73 74 2e 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65  st..  ** Compute
d900: 20 74 68 65 20 72 65 76 69 73 65 64 20 72 65 63   the revised rec
d910: 6f 72 64 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ord entries for 
d920: 69 6e 64 69 63 65 73 20 61 73 20 77 65 20 67 6f  indices as we go
d930: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
d940: 20 6c 6f 6f 70 20 61 6c 73 6f 20 68 61 6e 64 6c   loop also handl
d950: 65 73 20 74 68 65 20 63 61 73 65 20 6f 66 20 74  es the case of t
d960: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d970: 6e 64 65 78 20 66 6f 72 20 61 0a 20 20 2a 2a 20  ndex for a.  ** 
d980: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d990: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble..  */.  for(
d9a0: 69 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  ix=0, pIdx=pTab-
d9b0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d9c0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
d9d0: 20 69 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ix++){.    int 
d9e0: 72 65 67 49 64 78 3b 20 20 20 20 20 20 20 20 20  regIdx;         
d9f0: 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 72 65 67   /* Range of reg
da00: 69 73 74 65 72 73 20 68 6f 6c 64 20 63 6f 6e 65  isters hold cone
da10: 6e 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20  nt for pIdx */. 
da20: 20 20 20 69 6e 74 20 72 65 67 52 3b 20 20 20 20     int regR;    
da30: 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
da40: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 6f   of registers ho
da50: 6c 64 69 6e 67 20 63 6f 6e 66 6c 69 63 74 69 6e  lding conflictin
da60: 67 20 50 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  g PK */.    int 
da70: 69 54 68 69 73 43 75 72 3b 20 20 20 20 20 20 20  iThisCur;       
da80: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
da90: 68 69 73 20 55 4e 49 51 55 45 20 69 6e 64 65 78  his UNIQUE index
daa0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
dab0: 55 6e 69 71 75 65 4f 6b 3b 20 20 20 20 2f 2a 20  UniqueOk;    /* 
dac0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
dad0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
dae0: 6e 74 20 69 73 20 73 61 74 69 73 66 69 65 64 20  nt is satisfied 
daf0: 2a 2f 0a 0a 20 20 20 20 69 66 28 20 61 52 65 67  */..    if( aReg
db00: 49 64 78 5b 69 78 5d 3d 3d 30 20 29 20 63 6f 6e  Idx[ix]==0 ) con
db10: 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20  tinue;  /* Skip 
db20: 69 6e 64 69 63 65 73 20 74 68 61 74 20 64 6f 20  indices that do 
db30: 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  not change */.  
db40: 20 20 69 66 28 20 62 41 66 66 69 6e 69 74 79 44    if( bAffinityD
db50: 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  one==0 ){.      
db60: 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
db70: 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 72 65  nity(v, pTab, re
db80: 67 4e 65 77 44 61 74 61 2b 31 29 3b 0a 20 20 20  gNewData+1);.   
db90: 20 20 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65     bAffinityDone
dba0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
dbb0: 69 54 68 69 73 43 75 72 20 3d 20 69 49 64 78 43  iThisCur = iIdxC
dbc0: 75 72 2b 69 78 3b 0a 20 20 20 20 61 64 64 72 55  ur+ix;.    addrU
dbd0: 6e 69 71 75 65 4f 6b 20 3d 20 73 71 6c 69 74 65  niqueOk = sqlite
dbe0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
dbf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  );..    /* Skip 
dc00: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
dc10: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
dc20: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ERE clause is no
dc30: 74 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 69 66  t true */.    if
dc40: 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
dc50: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73  Where ){.      s
dc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dc70: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
dc80: 61 52 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20  aRegIdx[ix]);.  
dc90: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 42 61      pParse->ckBa
dca0: 73 65 20 3d 20 72 65 67 4e 65 77 44 61 74 61 2b  se = regNewData+
dcb0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
dcc0: 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 70  ExprIfFalseDup(p
dcd0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 50 61  Parse, pIdx->pPa
dce0: 72 74 49 64 78 57 68 65 72 65 2c 20 61 64 64 72  rtIdxWhere, addr
dcf0: 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20 20 20  UniqueOk,.      
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d        SQLITE_JUM
dd20: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
dd30: 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d  pParse->ckBase =
dd40: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
dd50: 2a 20 43 72 65 61 74 65 20 61 20 72 65 63 6f 72  * Create a recor
dd60: 64 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  d for this index
dd70: 20 65 6e 74 72 79 20 61 73 20 69 74 20 73 68 6f   entry as it sho
dd80: 75 6c 64 20 61 70 70 65 61 72 20 61 66 74 65 72  uld appear after
dd90: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 73 65  .    ** the inse
dda0: 72 74 20 6f 72 20 75 70 64 61 74 65 2e 20 20 53  rt or update.  S
ddb0: 74 6f 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  tore that record
ddc0: 20 69 6e 20 74 68 65 20 61 52 65 67 49 64 78 5b   in the aRegIdx[
ddd0: 69 78 5d 20 72 65 67 69 73 74 65 72 0a 20 20 20  ix] register.   
dde0: 20 2a 2f 0a 20 20 20 20 72 65 67 49 64 78 20 3d   */.    regIdx =
ddf0: 20 61 52 65 67 49 64 78 5b 69 78 5d 2b 31 3b 0a   aRegIdx[ix]+1;.
de00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
de10: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
de20: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46  +){.      int iF
de30: 69 65 6c 64 20 3d 20 70 49 64 78 2d 3e 61 69 43  ield = pIdx->aiC
de40: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
de50: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28  int x;.      if(
de60: 20 69 46 69 65 6c 64 3d 3d 58 4e 5f 45 58 50 52   iField==XN_EXPR
de70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
de80: 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72 65 67  se->ckBase = reg
de90: 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20 20 20 20  NewData+1;.     
dea0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
deb0: 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
dec0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
ded0: 5b 69 5d 2e 70 45 78 70 72 2c 20 72 65 67 49 64  [i].pExpr, regId
dee0: 78 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 70 50  x+i);.        pP
def0: 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 30  arse->ckBase = 0
df00: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
df10: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 20 63 6f  mment((v, "%s co
df20: 6c 75 6d 6e 20 25 64 22 2c 20 70 49 64 78 2d 3e  lumn %d", pIdx->
df30: 7a 4e 61 6d 65 2c 20 69 29 29 3b 0a 20 20 20 20  zName, i));.    
df40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
df50: 20 69 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e 5f   if( iField==XN_
df60: 52 4f 57 49 44 20 7c 7c 20 69 46 69 65 6c 64 3d  ROWID || iField=
df70: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
df80: 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 72 65            x = re
df90: 67 4e 65 77 44 61 74 61 3b 0a 20 20 20 20 20 20  gNewData;.      
dfa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
dfb0: 20 20 20 78 20 3d 20 69 46 69 65 6c 64 20 2b 20     x = iField + 
dfc0: 72 65 67 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a  regNewData + 1;.
dfd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dfe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dff0: 4f 70 32 28 76 2c 20 69 46 69 65 6c 64 3c 30 20  Op2(v, iField<0 
e000: 3f 20 4f 50 5f 49 6e 74 43 6f 70 79 20 3a 20 4f  ? OP_IntCopy : O
e010: 50 5f 53 43 6f 70 79 2c 20 78 2c 20 72 65 67 49  P_SCopy, x, regI
e020: 64 78 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 56  dx+i);.        V
e030: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e040: 25 73 22 2c 20 69 46 69 65 6c 64 3c 30 20 3f 20  %s", iField<0 ? 
e050: 22 72 6f 77 69 64 22 20 3a 20 70 54 61 62 2d 3e  "rowid" : pTab->
e060: 61 43 6f 6c 5b 69 46 69 65 6c 64 5d 2e 7a 4e 61  aCol[iField].zNa
e070: 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  me));.      }.  
e080: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
e090: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e0a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 49  MakeRecord, regI
e0b0: 64 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  dx, pIdx->nColum
e0c0: 6e 2c 20 61 52 65 67 49 64 78 5b 69 78 5d 29 3b  n, aRegIdx[ix]);
e0d0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
e0e0: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
e0f0: 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Idx->zName));.  
e100: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
e110: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
e120: 28 70 50 61 72 73 65 2c 20 72 65 67 49 64 78 2c  (pParse, regIdx,
e130: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
e140: 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 61 6e 20 55  ..    /* In an U
e150: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c  PDATE operation,
e160: 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   if this index i
e170: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
e180: 59 20 69 6e 64 65 78 20 0a 20 20 20 20 2a 2a 20  Y index .    ** 
e190: 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
e1a0: 49 44 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ID table and the
e1b0: 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 63  re has been no c
e1c0: 68 61 6e 67 65 20 74 68 65 0a 20 20 20 20 2a 2a  hange the.    **
e1d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68   primary key, th
e1e0: 65 6e 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 20  en no collision 
e1f0: 69 73 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  is possible.  Th
e200: 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65 74 65  e collision dete
e210: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 6f 67  ction.    ** log
e220: 69 63 20 62 65 6c 6f 77 20 63 61 6e 20 61 6c 6c  ic below can all
e230: 20 62 65 20 73 6b 69 70 70 65 64 2e 20 2a 2f 0a   be skipped. */.
e240: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
e250: 20 26 26 20 70 50 6b 3d 3d 70 49 64 78 20 26 26   && pPk==pIdx &&
e260: 20 70 6b 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20   pkChng==0 ){.  
e270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
e280: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e290: 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20  ddrUniqueOk);.  
e2a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
e2b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
e2c0: 20 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e   out what action
e2d0: 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65   to take in case
e2e0: 20 74 68 65 72 65 20 69 73 20 61 20 75 6e 69 71   there is a uniq
e2f0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
e300: 2a 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  */.    onError =
e310: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a   pIdx->onError;.
e320: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
e330: 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 20 0a 20 20 20  =OE_None ){ .   
e340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e350: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
e360: 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20  drUniqueOk);.   
e370: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
e380: 20 70 49 64 78 20 69 73 20 6e 6f 74 20 61 20 55   pIdx is not a U
e390: 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20  NIQUE index */. 
e3a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 76 65     }.    if( ove
e3b0: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
e3c0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
e3d0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69  onError = overri
e3e0: 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  deError;.    }el
e3f0: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
e400: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
e410: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
e420: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20  _Abort;.    }.. 
e430: 20 20 20 69 66 28 20 69 78 3d 3d 30 20 26 26 20     if( ix==0 && 
e440: 70 50 6b 3d 3d 70 49 64 78 20 26 26 20 6f 6e 45  pPk==pIdx && onE
e450: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
e460: 20 26 26 20 70 50 6b 2d 3e 70 4e 65 78 74 3d 3d   && pPk->pNext==
e470: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
e480: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
e490: 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65  el(v, addrUnique
e4a0: 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Ok);.      conti
e4b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
e4c0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
e4d0: 20 73 65 65 20 69 66 20 74 68 65 20 6e 65 77 20   see if the new 
e4e0: 69 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c  index entry will
e4f0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
e500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e510: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 43  Op4Int(v, OP_NoC
e520: 6f 6e 66 6c 69 63 74 2c 20 69 54 68 69 73 43 75  onflict, iThisCu
e530: 72 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c  r, addrUniqueOk,
e540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e550: 20 20 20 20 20 20 20 20 20 20 72 65 67 49 64 78            regIdx
e560: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
e570: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
e580: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
e590: 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
e5a0: 6c 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f  le collisions */
e5b0: 0a 20 20 20 20 72 65 67 52 20 3d 20 28 70 49 64  .    regR = (pId
e5c0: 78 3d 3d 70 50 6b 29 20 3f 20 72 65 67 49 64 78  x==pPk) ? regIdx
e5d0: 20 3a 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   : sqlite3GetTem
e5e0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
e5f0: 50 6b 46 69 65 6c 64 29 3b 0a 20 20 20 20 69 66  PkField);.    if
e600: 28 20 69 73 55 70 64 61 74 65 20 7c 7c 20 6f 6e  ( isUpdate || on
e610: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
e620: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  e ){.      if( H
e630: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
e640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e650: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e660: 5f 49 64 78 52 6f 77 69 64 2c 20 69 54 68 69 73  _IdxRowid, iThis
e670: 43 75 72 2c 20 72 65 67 52 29 3b 0a 20 20 20 20  Cur, regR);.    
e680: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
e690: 6f 6e 6c 79 20 69 66 20 74 68 65 20 72 6f 77 69  only if the rowi
e6a0: 64 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  d of the existin
e6b0: 67 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20  g index entry.  
e6c0: 20 20 20 20 20 20 2a 2a 20 69 73 20 64 69 66 66        ** is diff
e6d0: 65 72 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 2d 72  erent from old-r
e6e0: 6f 77 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  owid */.        
e6f0: 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a  if( isUpdate ){.
e700: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e710: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e720: 50 5f 45 71 2c 20 72 65 67 52 2c 20 61 64 64 72  P_Eq, regR, addr
e730: 55 6e 69 71 75 65 4f 6b 2c 20 72 65 67 4f 6c 64  UniqueOk, regOld
e740: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
e750: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e760: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
e770: 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  OTNULL);.       
e780: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
e790: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  v);.        }.  
e7a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e7b0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
e7c0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
e7d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 72 6f   PRIMARY KEY fro
e7e0: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
e7f0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 61 6e 64   index entry and
e800: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
e810: 65 20 69 74 20 69 6e 20 72 65 67 69 73 74 65 72  e it in register
e820: 73 20 72 65 67 52 2e 2e 72 65 67 52 2b 6e 50 6b  s regR..regR+nPk
e830: 2d 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  -1 */.        if
e840: 28 20 70 49 64 78 21 3d 70 50 6b 20 29 7b 0a 20  ( pIdx!=pPk ){. 
e850: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
e860: 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; i<pPk->nKeyCol
e870: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e880: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
e890: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
e8a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
e8b0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e   = sqlite3Column
e8c0: 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70 50  OfIndex(pIdx, pP
e8d0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  k->aiColumn[i]);
e8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
e8f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e900: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 68  , OP_Column, iTh
e910: 69 73 43 75 72 2c 20 78 2c 20 72 65 67 52 2b 69  isCur, x, regR+i
e920: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
e930: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e940: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
e950: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
e970: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
e980: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65  Column[i]].zName
e990: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
e9a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e9b0: 20 20 69 66 28 20 69 73 55 70 64 61 74 65 20 29    if( isUpdate )
e9c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
e9d0: 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
e9e0: 65 73 73 69 6e 67 20 74 68 65 20 50 52 49 4d 41  essing the PRIMA
e9f0: 52 59 20 4b 45 59 20 6f 66 20 61 20 57 49 54 48  RY KEY of a WITH
ea00: 4f 55 54 20 52 4f 57 49 44 20 0a 20 20 20 20 20  OUT ROWID .     
ea10: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6f       ** table, o
ea20: 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69 66 20  nly conflict if 
ea30: 74 68 65 20 6e 65 77 20 50 52 49 4d 41 52 59 20  the new PRIMARY 
ea40: 4b 45 59 20 76 61 6c 75 65 73 20 61 72 65 20 61  KEY values are a
ea50: 63 74 75 61 6c 6c 79 0a 20 20 20 20 20 20 20 20  ctually.        
ea60: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
ea70: 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 20 20 20  rom the old..   
ea80: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
ea90: 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 55 4e 49      ** For a UNI
eaa0: 51 55 45 20 69 6e 64 65 78 2c 20 6f 6e 6c 79 20  QUE index, only 
eab0: 63 6f 6e 66 6c 69 63 74 20 69 66 20 74 68 65 20  conflict if the 
eac0: 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75  PRIMARY KEY valu
ead0: 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
eae0: 6f 66 20 74 68 65 20 6d 61 74 63 68 65 64 20 69  of the matched i
eaf0: 6e 64 65 78 20 72 6f 77 20 61 72 65 20 64 69 66  ndex row are dif
eb00: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
eb10: 6f 72 69 67 69 6e 61 6c 20 50 52 49 4d 41 52 59  original PRIMARY
eb20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4b 45  .          ** KE
eb30: 59 20 76 61 6c 75 65 73 20 6f 66 20 74 68 69 73  Y values of this
eb40: 20 72 6f 77 20 62 65 66 6f 72 65 20 74 68 65 20   row before the 
eb50: 75 70 64 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20  update.  */.    
eb60: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75        int addrJu
eb70: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
eb80: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 70  CurrentAddr(v)+p
eb90: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  Pk->nKeyCol;.   
eba0: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
ebb0: 4f 50 5f 4e 65 3b 0a 20 20 20 20 20 20 20 20 20  OP_Ne;.         
ebc0: 20 69 6e 74 20 72 65 67 43 6d 70 20 3d 20 28 49   int regCmp = (I
ebd0: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
ebe0: 28 70 49 64 78 29 20 3f 20 72 65 67 49 64 78 20  (pIdx) ? regIdx 
ebf0: 3a 20 72 65 67 52 29 3b 0a 20 20 0a 20 20 20 20  : regR);.  .    
ec00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ec10: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
ec20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
ec30: 20 63 68 61 72 20 2a 70 34 20 3d 20 28 63 68 61   char *p4 = (cha
ec40: 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  r*)sqlite3Locate
ec50: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ec60: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b  pPk->azColl[i]);
ec70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d  .            x =
ec80: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
ec90: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ];.            a
eca0: 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
ecb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
ecc0: 3d 3d 28 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 2d  ==(pPk->nKeyCol-
ecd0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
ece0: 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 61      addrJump = a
ecf0: 64 64 72 55 6e 69 71 75 65 4f 6b 3b 0a 20 20 20  ddrUniqueOk;.   
ed00: 20 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20             op = 
ed10: 4f 50 5f 45 71 3b 0a 20 20 20 20 20 20 20 20 20  OP_Eq;.         
ed20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
ed30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ed40: 70 34 28 76 2c 20 6f 70 2c 20 0a 20 20 20 20 20  p4(v, op, .     
ed50: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4f 6c             regOl
ed60: 64 44 61 74 61 2b 31 2b 78 2c 20 61 64 64 72 4a  dData+1+x, addrJ
ed70: 75 6d 70 2c 20 72 65 67 43 6d 70 2b 69 2c 20 70  ump, regCmp+i, p
ed80: 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 0a 20 20  4, P4_COLLSEQ.  
ed90: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
eda0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
edb0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
edc0: 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b  SQLITE_NOTNULL);
edd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
ede0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
edf0: 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
ee00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
ee10: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
ee20: 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Ne);.          }
ee30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ee40: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ee50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
ee60: 68 61 74 20 65 78 65 63 75 74 65 73 20 69 66 20  hat executes if 
ee70: 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e  the new index en
ee80: 74 72 79 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  try is not uniqu
ee90: 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
eea0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c   onError==OE_Rol
eeb0: 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72  lback || onError
eec0: 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e  ==OE_Abort || on
eed0: 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20  Error==OE_Fail. 
eee0: 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72 6f         || onErro
eef0: 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20  r==OE_Ignore || 
ef00: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
ef10: 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69 74 63  ace );.    switc
ef20: 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  h( onError ){.  
ef30: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c      case OE_Roll
ef40: 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65  back:.      case
ef50: 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20   OE_Abort:.     
ef60: 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b   case OE_Fail: {
ef70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ef80: 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
ef90: 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72  (pParse, onError
efa0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
efb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
efc0: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
efd0: 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  nore: {.        
efe0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
eff0: 76 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a  v, ignoreDest);.
f000: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
f020: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
f030: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
f040: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  r = 0;.        a
f050: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
f060: 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20  OE_Replace );.  
f070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 6c        sqlite3Mul
f080: 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b  tiWrite(pParse);
f090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
f0a0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
f0b0: 63 54 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20  cTriggers ){.   
f0c0: 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20         pTrigger 
f0d0: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
f0e0: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
f0f0: 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20  Tab, TK_DELETE, 
f100: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  0, 0);.        }
f110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f120: 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74  GenerateRowDelet
f130: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
f140: 70 54 72 69 67 67 65 72 2c 20 69 44 61 74 61 43  pTrigger, iDataC
f150: 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20  ur, iIdxCur,.   
f160: 20 20 20 20 20 20 20 20 20 72 65 67 52 2c 20 6e           regR, n
f170: 50 6b 46 69 65 6c 64 2c 20 30 2c 20 4f 45 5f 52  PkField, 0, OE_R
f180: 65 70 6c 61 63 65 2c 0a 20 20 20 20 20 20 20 20  eplace,.        
f190: 20 20 20 20 28 70 49 64 78 3d 3d 70 50 6b 20 3f      (pIdx==pPk ?
f1a0: 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20   ONEPASS_SINGLE 
f1b0: 3a 20 4f 4e 45 50 41 53 53 5f 4f 46 46 29 2c 20  : ONEPASS_OFF), 
f1c0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65 65  -1);.        see
f1d0: 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20  nReplace = 1;.  
f1e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f1f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
f200: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f210: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 55 6e  eLabel(v, addrUn
f220: 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 69 66 28  iqueOk);.    if(
f230: 20 72 65 67 52 21 3d 72 65 67 49 64 78 20 29 20   regR!=regIdx ) 
f240: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f250: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
f260: 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 29 3b  regR, nPkField);
f270: 0a 20 20 7d 0a 20 20 69 66 28 20 69 70 6b 54 6f  .  }.  if( ipkTo
f280: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
f290: 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 70 6b 54  VdbeGoto(v, ipkT
f2a0: 6f 70 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  op+1);.    sqlit
f2b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f2c0: 2c 20 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a 20 20  , ipkBottom);.  
f2d0: 7d 0a 20 20 0a 20 20 2a 70 62 4d 61 79 52 65 70  }.  .  *pbMayRep
f2e0: 6c 61 63 65 20 3d 20 73 65 65 6e 52 65 70 6c 61  lace = seenRepla
f2f0: 63 65 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65  ce;.  VdbeModule
f300: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 4e 44  Comment((v, "END
f310: 3a 20 47 65 6e 43 6e 73 74 43 6b 73 28 25 64 29  : GenCnstCks(%d)
f320: 22 2c 20 73 65 65 6e 52 65 70 6c 61 63 65 29 29  ", seenReplace))
f330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
f340: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
f350: 73 20 63 6f 64 65 20 74 6f 20 66 69 6e 69 73 68  s code to finish
f360: 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55   the INSERT or U
f370: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a  PDATE operation.
f380: 2a 2a 20 74 68 61 74 20 77 61 73 20 73 74 61 72  ** that was star
f390: 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63  ted by a prior c
f3a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 47 65  all to sqlite3Ge
f3b0: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
f3c0: 43 68 65 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e  Checks..** A con
f3d0: 73 65 63 75 74 69 76 65 20 72 61 6e 67 65 20 6f  secutive range o
f3e0: 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  f registers star
f3f0: 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77 44 61  ting at regNewDa
f400: 74 61 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ta contains the.
f410: 2a 2a 20 72 6f 77 69 64 20 61 6e 64 20 74 68 65  ** rowid and the
f420: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 69   content to be i
f430: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nserted..**.** T
f440: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
f450: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
f460: 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20  uld be the same 
f470: 61 73 20 74 68 65 20 66 69 72 73 74 20 73 69 78  as the first six
f480: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  .** arguments to
f490: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
f4a0: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
f4b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f4c0: 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69  3CompleteInserti
f4d0: 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
f4e0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
f4f0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
f500: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
f510: 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20  ,        /* the 
f520: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
f530: 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e   we are insertin
f540: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61  g */.  int iData
f550: 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75  Cur,       /* Cu
f560: 72 73 6f 72 20 6f 66 20 74 68 65 20 63 61 6e 6f  rsor of the cano
f570: 6e 69 63 61 6c 20 64 61 74 61 20 73 6f 75 72 63  nical data sourc
f580: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43  e */.  int iIdxC
f590: 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ur,        /* Fi
f5a0: 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72  rst index cursor
f5b0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
f5c0: 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 52 61 6e  Data,     /* Ran
f5d0: 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ge of content */
f5e0: 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c  .  int *aRegIdx,
f5f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f600: 65 72 20 75 73 65 64 20 62 79 20 65 61 63 68 20  er used by each 
f610: 69 6e 64 65 78 2e 20 20 30 20 66 6f 72 20 75 6e  index.  0 for un
f620: 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  used indices */.
f630: 20 20 69 6e 74 20 69 73 55 70 64 61 74 65 2c 20    int isUpdate, 
f640: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
f650: 72 20 55 50 44 41 54 45 2c 20 46 61 6c 73 65 20  r UPDATE, False 
f660: 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20  for INSERT */.  
f670: 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
f680: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
f690: 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  his is likely to
f6a0: 20 62 65 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f   be an append */
f6b0: 0a 20 20 69 6e 74 20 75 73 65 53 65 65 6b 52 65  .  int useSeekRe
f6c0: 73 75 6c 74 20 20 20 2f 2a 20 54 72 75 65 20 74  sult   /* True t
f6d0: 6f 20 73 65 74 20 74 68 65 20 55 53 45 53 45 45  o set the USESEE
f6e0: 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 6e 20  KRESULT flag on 
f6f0: 4f 50 5f 5b 49 64 78 5d 49 6e 73 65 72 74 20 2a  OP_[Idx]Insert *
f700: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20  /.){.  Vdbe *v; 
f710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
f720: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
f730: 73 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  s under construc
f740: 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
f750: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  *pIdx;        /*
f760: 20 41 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20   An index being 
f770: 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70 64 61  inserted or upda
f780: 74 65 64 20 2a 2f 0a 20 20 75 38 20 70 69 6b 5f  ted */.  u8 pik_
f790: 66 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20  flags;       /* 
f7a0: 66 6c 61 67 20 76 61 6c 75 65 73 20 70 61 73 73  flag values pass
f7b0: 65 64 20 74 6f 20 74 68 65 20 62 74 72 65 65 20  ed to the btree 
f7c0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20  insert */.  int 
f7d0: 72 65 67 44 61 74 61 3b 20 20 20 20 20 20 20 20  regData;        
f7e0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 72 65 67 69 73  /* Content regis
f7f0: 74 65 72 73 20 28 61 66 74 65 72 20 74 68 65 20  ters (after the 
f800: 72 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e 74 20  rowid) */.  int 
f810: 72 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20  regRec;         
f820: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
f830: 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 72 65  ing assembled re
f840: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62  cord for the tab
f850: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
f860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f870: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
f880: 20 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e   u8 bAffinityDon
f890: 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  e = 0; /* True i
f8a0: 66 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 68 61  f OP_Affinity ha
f8b0: 73 20 62 65 65 6e 20 72 75 6e 20 61 6c 72 65 61  s been run alrea
f8c0: 64 79 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c  dy */..  v = sql
f8d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f8e0: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
f8f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f900: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
f910: 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61  0 );  /* This ta
f920: 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45  ble is not a VIE
f930: 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  W */.  for(i=0, 
f940: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f950: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f960: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
f970: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
f980: 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
f990: 65 3b 0a 20 20 20 20 62 41 66 66 69 6e 69 74 79  e;.    bAffinity
f9a0: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66  Done = 1;.    if
f9b0: 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
f9c0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73  Where ){.      s
f9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f9e0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 61  (v, OP_IsNull, a
f9f0: 52 65 67 49 64 78 5b 69 5d 2c 20 73 71 6c 69 74  RegIdx[i], sqlit
fa00: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fa10: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56  r(v)+2);.      V
fa20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fa30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fa40: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
fa50: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
fa60: 69 49 64 78 43 75 72 2b 69 2c 20 61 52 65 67 49  iIdxCur+i, aRegI
fa70: 64 78 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  dx[i],.         
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 61 52 65 67 49 64 78 5b 69 5d 2b 31 2c 0a 20 20  aRegIdx[i]+1,.  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e 69         pIdx->uni
fac0: 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78 2d  qNotNull ? pIdx-
fad0: 3e 6e 4b 65 79 43 6f 6c 3a 20 70 49 64 78 2d 3e  >nKeyCol: pIdx->
fae0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 70 69  nColumn);.    pi
faf0: 6b 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  k_flags = 0;.   
fb00: 20 69 66 28 20 75 73 65 53 65 65 6b 52 65 73 75   if( useSeekResu
fb10: 6c 74 20 29 20 70 69 6b 5f 66 6c 61 67 73 20 3d  lt ) pik_flags =
fb20: 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
fb30: 45 53 55 4c 54 3b 0a 20 20 20 20 69 66 28 20 49  ESULT;.    if( I
fb40: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
fb50: 28 70 49 64 78 29 20 26 26 20 21 48 61 73 52 6f  (pIdx) && !HasRo
fb60: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
fb70: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
fb80: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 3b 0a  e->nested==0 );.
fb90: 20 20 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20        pik_flags 
fba0: 7c 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  |= OPFLAG_NCHANG
fbb0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  E;.    }.    sql
fbc0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
fbd0: 28 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a  (v, pik_flags);.
fbe0: 20 20 7d 0a 20 20 69 66 28 20 21 48 61 73 52 6f    }.  if( !HasRo
fbf0: 77 69 64 28 70 54 61 62 29 20 29 20 72 65 74 75  wid(pTab) ) retu
fc00: 72 6e 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20  rn;.  regData = 
fc10: 72 65 67 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a  regNewData + 1;.
fc20: 20 20 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74    regRec = sqlit
fc30: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
fc40: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
fc50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fc60: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 44  MakeRecord, regD
fc70: 61 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  ata, pTab->nCol,
fc80: 20 72 65 67 52 65 63 29 3b 0a 20 20 69 66 28 20   regRec);.  if( 
fc90: 21 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 29  !bAffinityDone )
fca0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66   sqlite3TableAff
fcb0: 69 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 30  inity(v, pTab, 0
fcc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
fcd0: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
fce0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  nge(pParse, regD
fcf0: 61 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  ata, pTab->nCol)
fd00: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
fd10: 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 70 69  nested ){.    pi
fd20: 6b 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  k_flags = 0;.  }
fd30: 65 6c 73 65 7b 0a 20 20 20 20 70 69 6b 5f 66 6c  else{.    pik_fl
fd40: 61 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43 48  ags = OPFLAG_NCH
fd50: 41 4e 47 45 3b 0a 20 20 20 20 70 69 6b 5f 66 6c  ANGE;.    pik_fl
fd60: 61 67 73 20 7c 3d 20 28 69 73 55 70 64 61 74 65  ags |= (isUpdate
fd70: 3f 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45  ?OPFLAG_ISUPDATE
fd80: 3a 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49  :OPFLAG_LASTROWI
fd90: 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70  D);.  }.  if( ap
fda0: 70 65 6e 64 42 69 61 73 20 29 7b 0a 20 20 20 20  pendBias ){.    
fdb0: 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46  pik_flags |= OPF
fdc0: 4c 41 47 5f 41 50 50 45 4e 44 3b 0a 20 20 7d 0a  LAG_APPEND;.  }.
fdd0: 20 20 69 66 28 20 75 73 65 53 65 65 6b 52 65 73    if( useSeekRes
fde0: 75 6c 74 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66  ult ){.    pik_f
fdf0: 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 55  lags |= OPFLAG_U
fe00: 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20 20  SESEEKRESULT;.  
fe10: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
fe20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
fe30: 72 74 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65  rt, iDataCur, re
fe40: 67 52 65 63 2c 20 72 65 67 4e 65 77 44 61 74 61  gRec, regNewData
fe50: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
fe60: 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20  ->nested ){.    
fe70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fe80: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
fe90: 20 2a 29 70 54 61 62 2c 20 50 34 5f 54 41 42 4c   *)pTab, P4_TABL
fea0: 45 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  E);.  }.  sqlite
feb0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
fec0: 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d 0a 0a   pik_flags);.}..
fed0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 63  /*.** Allocate c
fee0: 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65 20 70  ursors for the p
fef0: 54 61 62 20 74 61 62 6c 65 20 61 6e 64 20 61 6c  Tab table and al
ff00: 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e  l its indices an
ff10: 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f  d generate.** co
ff20: 64 65 20 74 6f 20 6f 70 65 6e 20 61 6e 64 20 69  de to open and i
ff30: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 6f 73 65  nitialized those
ff40: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
ff50: 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74  The cursor for t
ff60: 68 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  he object that c
ff70: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6d 70  ontains the comp
ff80: 6c 65 74 65 20 64 61 74 61 20 28 6e 6f 72 6d 61  lete data (norma
ff90: 6c 6c 79 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  lly.** the table
ffa0: 20 69 74 73 65 6c 66 2c 20 62 75 74 20 74 68 65   itself, but the
ffb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
ffc0: 65 78 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  ex in the case o
ffd0: 66 20 61 20 57 49 54 48 4f 55 54 0a 2a 2a 20 52  f a WITHOUT.** R
ffe0: 4f 57 49 44 20 74 61 62 6c 65 29 20 69 73 20 72  OWID table) is r
fff0: 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 44 61  eturned in *piDa
10000 74 61 43 75 72 2e 20 20 54 68 65 20 66 69 72 73  taCur.  The firs
10010 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  t index cursor i
10020 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
10030 20 2a 70 69 49 64 78 43 75 72 2e 20 20 54 68 65   *piIdxCur.  The
10040 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69 63   number of indic
10050 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  es is returned..
10060 2a 2a 0a 2a 2a 20 55 73 65 20 69 42 61 73 65 20  **.** Use iBase 
10070 61 73 20 74 68 65 20 66 69 72 73 74 20 63 75 72  as the first cur
10080 73 6f 72 20 28 65 69 74 68 65 72 20 74 68 65 20  sor (either the 
10090 2a 70 69 44 61 74 61 43 75 72 20 66 6f 72 20 72  *piDataCur for r
100a0 6f 77 69 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  owid tables.** o
100b0 72 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65  r the first inde
100c0 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
100d0 57 49 44 20 74 61 62 6c 65 73 29 20 69 66 20 69  WID tables) if i
100e0 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
100f0 65 2e 0a 2a 2a 20 49 66 20 69 42 61 73 65 20 69  e..** If iBase i
10100 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
10110 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e 65   allocate the ne
10120 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63 75 72  xt available cur
10130 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  sor..**.** For a
10140 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20 2a 70   rowid table, *p
10150 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20 62 65  iDataCur will be
10160 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6c 65 73   exactly one les
10170 73 20 74 68 61 6e 20 2a 70 69 49 64 78 43 75 72  s than *piIdxCur
10180 2e 0a 2a 2a 20 46 6f 72 20 61 20 57 49 54 48 4f  ..** For a WITHO
10190 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
101a0 2a 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20  *piDataCur will 
101b0 62 65 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  be somewhere in 
101c0 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f 66 20  the range.** of 
101d0 2a 70 69 49 64 78 43 75 72 73 2c 20 64 65 70 65  *piIdxCurs, depe
101e0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 72 65 20 74  nding on where t
101f0 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
10200 6e 64 65 78 20 61 70 70 65 61 72 73 20 6f 6e 20  ndex appears on 
10210 74 68 65 0a 2a 2a 20 70 54 61 62 2d 3e 70 49 6e  the.** pTab->pIn
10220 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  dex list..**.** 
10230 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
10240 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e  tual table, then
10250 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10260 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 74 68 65   a no-op and the
10270 0a 2a 2a 20 2a 70 69 44 61 74 61 43 75 72 20 61  .** *piDataCur a
10280 6e 64 20 2a 70 69 49 64 78 43 75 72 20 76 61 6c  nd *piIdxCur val
10290 75 65 73 20 61 72 65 20 6c 65 66 74 20 75 6e 69  ues are left uni
102a0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2f 0a 69  nitialized..*/.i
102b0 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  nt sqlite3OpenTa
102c0 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a 20  bleAndIndices(. 
102d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
102e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
102f0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
10300 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61  *pTab,     /* Ta
10310 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ble to be opened
10320 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
10330 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65         /* OP_Ope
10340 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
10350 57 72 69 74 65 20 2a 2f 0a 20 20 75 38 20 70 35  Write */.  u8 p5
10360 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
10370 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 4f  5 value for OP_O
10380 70 65 6e 2a 20 6f 70 63 6f 64 65 73 20 28 65 78  pen* opcodes (ex
10390 63 65 70 74 20 6f 6e 20 57 49 54 48 4f 55 54 20  cept on WITHOUT 
103a0 52 4f 57 49 44 29 20 2a 2f 0a 20 20 69 6e 74 20  ROWID) */.  int 
103b0 69 42 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  iBase,       /* 
103c0 55 73 65 20 74 68 69 73 20 66 6f 72 20 74 68 65  Use this for the
103d0 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
103e0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 2a  f there is one *
103f0 2f 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 2c  /.  u8 *aToOpen,
10400 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
10410 55 4c 4c 3a 20 62 6f 6f 6c 65 61 6e 20 66 6f 72  ULL: boolean for
10420 20 65 61 63 68 20 74 61 62 6c 65 20 61 6e 64 20   each table and 
10430 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  index */.  int *
10440 70 69 44 61 74 61 43 75 72 2c 20 20 2f 2a 20 57  piDataCur,  /* W
10450 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
10460 65 20 73 6f 75 72 63 65 20 63 75 72 73 6f 72 20  e source cursor 
10470 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
10480 20 69 6e 74 20 2a 70 69 49 64 78 43 75 72 20 20   int *piIdxCur  
10490 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
104a0 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f  irst index curso
104b0 72 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  r number here */
104c0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
104d0 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 44  nt iDb;.  int iD
104e0 61 74 61 43 75 72 3b 0a 20 20 49 6e 64 65 78 20  ataCur;.  Index 
104f0 2a 70 49 64 78 3b 0a 20 20 56 64 62 65 20 2a 76  *pIdx;.  Vdbe *v
10500 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
10510 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c 20  =OP_OpenRead || 
10520 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  op==OP_OpenWrite
10530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
10540 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c  ==OP_OpenWrite |
10550 7c 20 70 35 3d 3d 30 20 29 3b 0a 20 20 69 66 28  | p5==0 );.  if(
10560 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10570 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
10580 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10590 6f 70 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74  op for virtual t
105a0 61 62 6c 65 73 2e 20 4c 65 61 76 65 20 74 68 65  ables. Leave the
105b0 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 76   output.    ** v
105c0 61 72 69 61 62 6c 65 73 20 2a 70 69 44 61 74 61  ariables *piData
105d0 43 75 72 20 61 6e 64 20 2a 70 69 49 64 78 43 75  Cur and *piIdxCu
105e0 72 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  r uninitialized 
105f0 73 6f 20 74 68 61 74 20 76 61 6c 67 72 69 6e 64  so that valgrind
10600 0a 20 20 20 20 2a 2a 20 63 61 6e 20 64 65 74 65  .    ** can dete
10610 63 74 20 69 66 20 74 68 65 79 20 61 72 65 20 75  ct if they are u
10620 73 65 64 20 62 79 20 6d 69 73 74 61 6b 65 20 69  sed by mistake i
10630 6e 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 2a 2f  n the caller. */
10640 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10650 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
10660 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
10670 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
10680 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76 20  ->pSchema);.  v 
10690 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
106a0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
106b0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66  rt( v!=0 );.  if
106c0 28 20 69 42 61 73 65 3c 30 20 29 20 69 42 61 73  ( iBase<0 ) iBas
106d0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
106e0 3b 0a 20 20 69 44 61 74 61 43 75 72 20 3d 20 69  ;.  iDataCur = i
106f0 42 61 73 65 2b 2b 3b 0a 20 20 69 66 28 20 70 69  Base++;.  if( pi
10700 44 61 74 61 43 75 72 20 29 20 2a 70 69 44 61 74  DataCur ) *piDat
10710 61 43 75 72 20 3d 20 69 44 61 74 61 43 75 72 3b  aCur = iDataCur;
10720 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
10730 70 54 61 62 29 20 26 26 20 28 61 54 6f 4f 70 65  pTab) && (aToOpe
10740 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b  n==0 || aToOpen[
10750 30 5d 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  0]) ){.    sqlit
10760 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
10770 73 65 2c 20 69 44 61 74 61 43 75 72 2c 20 69 44  se, iDataCur, iD
10780 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
10790 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
107a0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
107b0 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
107c0 6e 75 6d 2c 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e  num, op==OP_Open
107d0 57 72 69 74 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  Write, pTab->zNa
107e0 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  me);.  }.  if( p
107f0 69 49 64 78 43 75 72 20 29 20 2a 70 69 49 64 78  iIdxCur ) *piIdx
10800 43 75 72 20 3d 20 69 42 61 73 65 3b 0a 20 20 66  Cur = iBase;.  f
10810 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(i=0, pIdx=pTa
10820 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
10830 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
10840 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  t, i++){.    int
10850 20 69 49 64 78 43 75 72 20 3d 20 69 42 61 73 65   iIdxCur = iBase
10860 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
10870 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
10880 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
10890 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
108a0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
108b0 26 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  && !HasRowid(pTa
108c0 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b) ){.      if( 
108d0 70 69 44 61 74 61 43 75 72 20 29 20 2a 70 69 44  piDataCur ) *piD
108e0 61 74 61 43 75 72 20 3d 20 69 49 64 78 43 75 72  ataCur = iIdxCur
108f0 3b 0a 20 20 20 20 20 20 70 35 20 3d 20 30 3b 0a  ;.      p5 = 0;.
10900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 54      }.    if( aT
10910 6f 4f 70 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f  oOpen==0 || aToO
10920 70 65 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20  pen[i+1] ){.    
10930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10940 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Op3(v, op, iIdxC
10950 75 72 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ur, pIdx->tnum, 
10960 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
10970 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
10980 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
10990 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
109a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
109b0 70 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  p5);.      VdbeC
109c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
109d0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
109e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
109f0 69 42 61 73 65 3e 70 50 61 72 73 65 2d 3e 6e 54  iBase>pParse->nT
10a00 61 62 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab ) pParse->nTa
10a10 62 20 3d 20 69 42 61 73 65 3b 0a 20 20 72 65 74  b = iBase;.  ret
10a20 75 72 6e 20 69 3b 0a 7d 0a 0a 0a 23 69 66 64 65  urn i;.}...#ifde
10a30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
10a40 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
10a50 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
10a60 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
10a70 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 2a 2a   whenever the.**
10a80 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
10a90 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  zation is used. 
10aa0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
10ab0 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 70 75 72  r testing.** pur
10ac0 70 6f 73 65 73 20 6f 6e 6c 79 20 2d 20 74 6f 20  poses only - to 
10ad0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 72  make sure the tr
10ae0 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
10af0 69 6f 6e 20 72 65 61 6c 6c 79 0a 2a 2a 20 69 73  ion really.** is
10b00 20 68 61 70 70 65 6e 69 6e 67 20 77 68 65 6e 20   happening when 
10b10 69 74 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  it is supposed t
10b20 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
10b30 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b  3_xferopt_count;
10b40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10b50 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 23 69 66 6e  E_TEST */...#ifn
10b60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10b70 58 46 45 52 5f 4f 50 54 0a 2f 2a 0a 2a 2a 20 43  XFER_OPT./*.** C
10b80 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
10b90 6e 64 65 78 20 70 53 72 63 20 69 73 20 63 6f 6d  ndex pSrc is com
10ba0 70 61 74 69 62 6c 65 20 61 73 20 61 20 73 6f 75  patible as a sou
10bb0 72 63 65 20 6f 66 20 64 61 74 61 0a 2a 2a 20 66  rce of data.** f
10bc0 6f 72 20 69 6e 64 65 78 20 70 44 65 73 74 20 69  or index pDest i
10bd0 6e 20 61 6e 20 69 6e 73 65 72 74 20 74 72 61 6e  n an insert tran
10be0 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  sfer optimizatio
10bf0 6e 2e 20 20 54 68 65 20 72 75 6c 65 73 0a 2a 2a  n.  The rules.**
10c00 20 66 6f 72 20 61 20 63 6f 6d 70 61 74 69 62 6c   for a compatibl
10c10 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20  e index:.**.**  
10c20 20 20 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20    *   The index 
10c30 69 73 20 6f 76 65 72 20 74 68 65 20 73 61 6d 65  is over the same
10c40 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a   set of columns.
10c50 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61  **    *   The sa
10c60 6d 65 20 44 45 53 43 20 61 6e 64 20 41 53 43 20  me DESC and ASC 
10c70 6d 61 72 6b 69 6e 67 73 20 6f 63 63 75 72 73 20  markings occurs 
10c80 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a 2a  on all columns.*
10c90 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d  *    *   The sam
10ca0 65 20 6f 6e 45 72 72 6f 72 20 70 72 6f 63 65 73  e onError proces
10cb0 73 69 6e 67 20 28 4f 45 5f 41 62 6f 72 74 2c 20  sing (OE_Abort, 
10cc0 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 0a  OE_Ignore, etc).
10cd0 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 73 61  **    *   The sa
10ce0 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
10cf0 75 65 6e 63 65 20 6f 6e 20 65 61 63 68 20 63 6f  uence on each co
10d00 6c 75 6d 6e 0a 2a 2a 20 20 20 20 2a 20 20 20 54  lumn.**    *   T
10d10 68 65 20 69 6e 64 65 78 20 68 61 73 20 74 68 65  he index has the
10d20 20 65 78 61 63 74 20 73 61 6d 65 20 57 48 45 52   exact same WHER
10d30 45 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  E clause.*/.stat
10d40 69 63 20 69 6e 74 20 78 66 65 72 43 6f 6d 70 61  ic int xferCompa
10d50 74 69 62 6c 65 49 6e 64 65 78 28 49 6e 64 65 78  tibleIndex(Index
10d60 20 2a 70 44 65 73 74 2c 20 49 6e 64 65 78 20 2a   *pDest, Index *
10d70 70 53 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pSrc){.  int i;.
10d80 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 20    assert( pDest 
10d90 26 26 20 70 53 72 63 20 29 3b 0a 20 20 61 73 73  && pSrc );.  ass
10da0 65 72 74 28 20 70 44 65 73 74 2d 3e 70 54 61 62  ert( pDest->pTab
10db0 6c 65 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c 65  le!=pSrc->pTable
10dc0 20 29 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d   );.  if( pDest-
10dd0 3e 6e 4b 65 79 43 6f 6c 21 3d 70 53 72 63 2d 3e  >nKeyCol!=pSrc->
10de0 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 72  nKeyCol ){.    r
10df0 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
10e00 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  fferent number o
10e10 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 7d  f columns */.  }
10e20 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6f 6e  .  if( pDest->on
10e30 45 72 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e 45  Error!=pSrc->onE
10e40 72 72 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rror ){.    retu
10e50 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
10e60 72 65 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72 65  rent conflict re
10e70 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67  solution strateg
10e80 69 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72  ies */.  }.  for
10e90 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 4b  (i=0; i<pSrc->nK
10ea0 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
10eb0 20 69 66 28 20 70 53 72 63 2d 3e 61 69 43 6f 6c   if( pSrc->aiCol
10ec0 75 6d 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61  umn[i]!=pDest->a
10ed0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20 20  iColumn[i] ){.  
10ee0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
10ef0 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c  /* Different col
10f00 75 6d 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a  umns indexed */.
10f10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
10f20 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3d  rc->aiColumn[i]=
10f30 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20  =XN_EXPR ){.    
10f40 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
10f50 61 43 6f 6c 45 78 70 72 21 3d 30 20 26 26 20 70  aColExpr!=0 && p
10f60 44 65 73 74 2d 3e 61 43 6f 6c 45 78 70 72 21 3d  Dest->aColExpr!=
10f70 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
10f80 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
10f90 65 28 70 53 72 63 2d 3e 61 43 6f 6c 45 78 70 72  e(pSrc->aColExpr
10fa0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  ->a[i].pExpr,.  
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
10fd0 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d  ->aColExpr->a[i]
10fe0 2e 70 45 78 70 72 2c 20 2d 31 29 21 3d 30 20 29  .pExpr, -1)!=0 )
10ff0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11000 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65   0;   /* Differe
11010 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  nt expressions i
11020 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  n the index */. 
11030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11040 20 69 66 28 20 70 53 72 63 2d 3e 61 53 6f 72 74   if( pSrc->aSort
11050 4f 72 64 65 72 5b 69 5d 21 3d 70 44 65 73 74 2d  Order[i]!=pDest-
11060 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
11070 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
11080 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74  ;   /* Different
11090 20 73 6f 72 74 20 6f 72 64 65 72 73 20 2a 2f 0a   sort orders */.
110a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
110b0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 53  lite3_stricmp(pS
110c0 72 63 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 70 44  rc->azColl[i],pD
110d0 65 73 74 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 21  est->azColl[i])!
110e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
110f0 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
11100 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
11110 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20 20 20 20  equences */.    
11120 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
11130 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
11140 53 72 63 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Src->pPartIdxWhe
11150 72 65 2c 20 70 44 65 73 74 2d 3e 70 50 61 72 74  re, pDest->pPart
11160 49 64 78 57 68 65 72 65 2c 20 2d 31 29 20 29 7b  IdxWhere, -1) ){
11170 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
11180 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20     /* Different 
11190 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 2a 2f  WHERE clauses */
111a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
111b0 20 74 65 73 74 20 61 62 6f 76 65 20 66 61 69 6c   test above fail
111c0 73 20 74 68 65 6e 20 74 68 65 20 69 6e 64 69 63  s then the indic
111d0 65 73 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61  es must be compa
111e0 74 69 62 6c 65 20 2a 2f 0a 20 20 72 65 74 75 72  tible */.  retur
111f0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  n 1;.}../*.** At
11200 74 65 6d 70 74 20 74 68 65 20 74 72 61 6e 73 66  tempt the transf
11210 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
11220 6f 6e 20 49 4e 53 45 52 54 73 20 6f 66 20 74 68  on INSERTs of th
11230 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
11240 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62   INSERT INTO tab
11250 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
11260 74 61 62 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tab2;.**.** The 
11270 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  xfer optimizatio
11280 6e 20 74 72 61 6e 73 66 65 72 73 20 72 61 77 20  n transfers raw 
11290 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 61 62  records from tab
112a0 32 20 6f 76 65 72 20 74 6f 20 74 61 62 31 2e 20  2 over to tab1. 
112b0 20 0a 2a 2a 20 43 6f 6c 75 6d 6e 73 20 61 72 65   .** Columns are
112c0 20 6e 6f 74 20 64 65 63 6f 64 65 64 20 61 6e 64   not decoded and
112d0 20 72 65 61 73 73 65 6d 62 6c 65 64 2c 20 77 68   reassembled, wh
112e0 69 63 68 20 67 72 65 61 74 6c 79 20 69 6d 70 72  ich greatly impr
112f0 6f 76 65 73 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  oves.** performa
11300 6e 63 65 2e 20 20 52 61 77 20 69 6e 64 65 78 20  nce.  Raw index 
11310 72 65 63 6f 72 64 73 20 61 72 65 20 74 72 61 6e  records are tran
11320 73 66 65 72 72 65 64 20 69 6e 20 74 68 65 20 73  sferred in the s
11330 61 6d 65 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  ame way..**.** T
11340 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61  he xfer optimiza
11350 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 61 74 74  tion is only att
11360 65 6d 70 74 65 64 20 69 66 20 74 61 62 31 20 61  empted if tab1 a
11370 6e 64 20 74 61 62 32 20 61 72 65 20 63 6f 6d 70  nd tab2 are comp
11380 61 74 69 62 6c 65 2e 0a 2a 2a 20 54 68 65 72 65  atible..** There
11390 20 61 72 65 20 6c 6f 74 73 20 6f 66 20 72 75 6c   are lots of rul
113a0 65 73 20 66 6f 72 20 64 65 74 65 72 6d 69 6e 69  es for determini
113b0 6e 67 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ng compatibility
113c0 20 2d 20 73 65 65 20 63 6f 6d 6d 65 6e 74 73 0a   - see comments.
113d0 2a 2a 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74  ** embedded in t
113e0 68 65 20 63 6f 64 65 20 66 6f 72 20 64 65 74 61  he code for deta
113f0 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ils..**.** This 
11400 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11410 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69  TRUE if the opti
11420 6d 69 7a 61 74 69 6f 6e 20 69 73 20 67 75 61 72  mization is guar
11430 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 73 65  anteed to be use
11440 64 2e 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  d..** Sometimes 
11450 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
11460 61 74 69 6f 6e 20 77 69 6c 6c 20 6f 6e 6c 79 20  ation will only 
11470 77 6f 72 6b 20 69 66 20 74 68 65 20 64 65 73 74  work if the dest
11480 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 0a 2a 2a  ination table.**
11490 20 69 73 20 65 6d 70 74 79 20 2d 20 61 20 66 61   is empty - a fa
114a0 63 74 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 6e  ctor that can on
114b0 6c 79 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64  ly be determined
114c0 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 20 20 49   at run-time.  I
114d0 6e 20 74 68 61 74 0a 2a 2a 20 63 61 73 65 2c 20  n that.** case, 
114e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  this routine gen
114f0 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
11500 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
11510 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f 0a 2a  ation but also.*
11520 2a 20 64 6f 65 73 20 61 20 74 65 73 74 20 74 6f  * does a test to
11530 20 73 65 65 20 69 66 20 74 68 65 20 64 65 73 74   see if the dest
11540 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 69 73  ination table is
11550 20 65 6d 70 74 79 20 61 6e 64 20 6a 75 6d 70 73   empty and jumps
11560 20 6f 76 65 72 20 74 68 65 0a 2a 2a 20 78 66 65   over the.** xfe
11570 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  r optimization c
11580 6f 64 65 20 69 66 20 74 68 65 20 74 65 73 74 20  ode if the test 
11590 66 61 69 6c 73 2e 20 20 49 6e 20 74 68 61 74 20  fails.  In that 
115a0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
115b0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 46 41  ne.** returns FA
115c0 4c 53 45 20 73 6f 20 74 68 61 74 20 74 68 65 20  LSE so that the 
115d0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 6e 6f 77  caller will know
115e0 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
115f0 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 6e 20   generate.** an 
11600 75 6e 6f 70 74 69 6d 69 7a 65 64 20 74 72 61 6e  unoptimized tran
11610 73 66 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  sfer.  This rout
11620 69 6e 65 20 61 6c 73 6f 20 72 65 74 75 72 6e 73  ine also returns
11630 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 0a   FALSE if there.
11640 2a 2a 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  ** is no chance 
11650 74 68 61 74 20 74 68 65 20 78 66 65 72 20 6f 70  that the xfer op
11660 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
11670 65 20 61 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a  e applied..**.**
11680 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
11690 6f 6e 20 69 73 20 70 61 72 74 69 63 75 6c 61 72  on is particular
116a0 6c 79 20 75 73 65 66 75 6c 20 61 74 20 6d 61 6b  ly useful at mak
116b0 69 6e 67 20 56 41 43 55 55 4d 20 72 75 6e 20 66  ing VACUUM run f
116c0 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
116d0 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d 69 7a   int xferOptimiz
116e0 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
116f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
11700 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
11710 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44 65   */.  Table *pDe
11720 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  st,         /* T
11730 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
11740 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 2a  inserting into *
11750 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
11760 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53  ect,      /* A S
11770 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11780 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64 61  to use as the da
11790 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69  ta source */.  i
117a0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
117b0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68       /* How to h
117c0 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  andle constraint
117d0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
117e0 20 69 44 62 44 65 73 74 20 20 20 20 20 20 20 20   iDbDest        
117f0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
11800 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a 29  se of pDest */.)
11810 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11820 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11830 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11850 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
11860 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
11870 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 53 72   */.  Table *pSr
11880 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
118a0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
118b0 63 6c 61 75 73 65 20 6f 66 20 53 45 4c 45 43 54  clause of SELECT
118c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 53 72   */.  Index *pSr
118d0 63 49 64 78 2c 20 2a 70 44 65 73 74 49 64 78 3b  cIdx, *pDestIdx;
118e0 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
118f0 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e   and destination
11900 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 73 74   indices */.  st
11910 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
11920 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 2f  m *pItem;      /
11930 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
11940 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20 2a 2f  pSelect->pSrc */
11950 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11980 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ter */.  int iDb
11990 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
119a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
119b0 20 64 61 74 61 62 61 73 65 20 6f 66 20 70 53 72   database of pSr
119c0 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63 2c  c */.  int iSrc,
119d0 20 69 44 65 73 74 3b 20 20 20 20 20 20 20 20 20   iDest;         
119e0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
119f0 72 73 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 61  rs from source a
11a00 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  nd destination *
11a10 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61  /.  int addr1, a
11a20 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
11a30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 61 64 64       /* Loop add
11a40 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
11a50 65 6d 70 74 79 44 65 73 74 54 65 73 74 20 3d 20  emptyDestTest = 
11a60 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
11a70 41 64 64 72 65 73 73 20 6f 66 20 74 65 73 74 20  Address of test 
11a80 66 6f 72 20 65 6d 70 74 79 20 70 44 65 73 74 20  for empty pDest 
11a90 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 53 72  */.  int emptySr
11aa0 63 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  cTest = 0;      
11ab0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11ac0 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70   of test for emp
11ad0 74 79 20 70 53 72 63 20 2a 2f 0a 20 20 56 64 62  ty pSrc */.  Vdb
11ae0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b00 20 54 68 65 20 56 44 42 45 20 77 65 20 61 72 65   The VDBE we are
11b10 20 62 75 69 6c 64 69 6e 67 20 2a 2f 0a 20 20 69   building */.  i
11b20 6e 74 20 72 65 67 41 75 74 6f 69 6e 63 3b 20 20  nt regAutoinc;  
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b40 2f 2a 20 4d 65 6d 6f 72 79 20 72 65 67 69 73 74  /* Memory regist
11b50 65 72 20 75 73 65 64 20 62 79 20 41 55 54 4f 49  er used by AUTOI
11b60 4e 43 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  NC */.  int dest
11b70 48 61 73 55 6e 69 71 75 65 49 64 78 20 3d 20 30  HasUniqueIdx = 0
11b80 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
11b90 20 69 66 20 70 44 65 73 74 20 68 61 73 20 61 20   if pDest has a 
11ba0 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a  UNIQUE index */.
11bb0 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 72    int regData, r
11bc0 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  egRowid;        
11bd0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
11be0 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 61 6e 64  holding data and
11bf0 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 69 66 28   rowid */..  if(
11c00 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
11c10 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
11c20 2a 20 4d 75 73 74 20 62 65 20 6f 66 20 74 68 65  * Must be of the
11c30 20 66 6f 72 6d 20 20 49 4e 53 45 52 54 20 49 4e   form  INSERT IN
11c40 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 20 2e 2e  TO ... SELECT ..
11c50 2e 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  . */.  }.  if( p
11c60 50 61 72 73 65 2d 3e 70 57 69 74 68 20 7c 7c 20  Parse->pWith || 
11c70 70 53 65 6c 65 63 74 2d 3e 70 57 69 74 68 20 29  pSelect->pWith )
11c80 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
11c90 61 74 74 65 6d 70 74 20 74 6f 20 70 72 6f 63 65  attempt to proce
11ca0 73 73 20 74 68 69 73 20 71 75 65 72 79 20 69 66  ss this query if
11cb0 20 74 68 65 72 65 20 61 72 65 20 61 6e 20 57 49   there are an WI
11cc0 54 48 20 63 6c 61 75 73 65 73 0a 20 20 20 20 2a  TH clauses.    *
11cd0 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  * attached to it
11ce0 2e 20 50 72 6f 63 65 65 64 69 6e 67 20 6d 61 79  . Proceeding may
11cf0 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 6c 73   generate a fals
11d00 65 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  e "no such table
11d10 3a 20 78 78 78 22 0a 20 20 20 20 2a 2a 20 65 72  : xxx".    ** er
11d20 72 6f 72 20 69 66 20 70 53 65 6c 65 63 74 20 72  ror if pSelect r
11d30 65 61 64 73 20 66 72 6f 6d 20 61 20 43 54 45 20  eads from a CTE 
11d40 6e 61 6d 65 64 20 22 78 78 78 22 2e 20 20 2a 2f  named "xxx".  */
11d50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11d60 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
11d70 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
11d80 73 65 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20  se, pDest) ){.  
11d90 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
11da0 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20 68   tab1 must not h
11db0 61 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  ave triggers */.
11dc0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
11dd0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
11de0 41 42 4c 45 0a 20 20 69 66 28 20 70 44 65 73 74  ABLE.  if( pDest
11df0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11e00 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 72  Virtual ){.    r
11e10 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61  eturn 0;   /* ta
11e20 62 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61  b1 must not be a
11e30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
11e40 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  /.  }.#endif.  i
11e50 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  f( onError==OE_D
11e60 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 69 66  efault ){.    if
11e70 28 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 3e 3d  ( pDest->iPKey>=
11e80 30 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 70 44  0 ) onError = pD
11e90 65 73 74 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20 20  est->keyConf;.  
11ea0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
11eb0 45 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72  E_Default ) onEr
11ec0 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
11ed0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 53 65    }.  assert(pSe
11ee0 6c 65 63 74 2d 3e 70 53 72 63 29 3b 20 20 20 2f  lect->pSrc);   /
11ef0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 65 76 65 6e  * allocated even
11f00 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11f10 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
11f20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53   if( pSelect->pS
11f30 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
11f40 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
11f50 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6d 75  * FROM clause mu
11f60 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
11f70 6f 6e 65 20 74 65 72 6d 20 2a 2f 0a 20 20 7d 0a  one term */.  }.
11f80 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
11f90 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
11fa0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
11fb0 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  0;   /* FROM cla
11fc0 75 73 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61  use cannot conta
11fd0 69 6e 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  in a subquery */
11fe0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
11ff0 63 74 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ct->pWhere ){.  
12000 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
12010 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20   SELECT may not 
12020 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
12030 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  use */.  }.  if(
12040 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72   pSelect->pOrder
12050 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
12060 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20   0;   /* SELECT 
12070 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  may not have an 
12080 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
12090 2a 2f 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e  */.  }.  /* Do n
120a0 6f 74 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20  ot need to test 
120b0 66 6f 72 20 61 20 48 41 56 49 4e 47 20 63 6c 61  for a HAVING cla
120c0 75 73 65 2e 20 20 49 66 20 48 41 56 49 4e 47 20  use.  If HAVING 
120d0 69 73 20 70 72 65 73 65 6e 74 20 62 75 74 0a 20  is present but. 
120e0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20   ** there is no 
120f0 4f 52 44 45 52 20 42 59 2c 20 77 65 20 77 69 6c  ORDER BY, we wil
12100 6c 20 67 65 74 20 61 6e 20 65 72 72 6f 72 2e 20  l get an error. 
12110 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
12120 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
12130 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
12140 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20   SELECT may not 
12150 68 61 76 65 20 61 20 47 52 4f 55 50 20 42 59 20  have a GROUP BY 
12160 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20  clause */.  }.  
12170 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4c 69  if( pSelect->pLi
12180 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
12190 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
121a0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20   may not have a 
121b0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a  LIMIT clause */.
121c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53    }.  assert( pS
121d0 65 6c 65 63 74 2d 3e 70 4f 66 66 73 65 74 3d 3d  elect->pOffset==
121e0 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  0 );  /* Must be
121f0 20 73 6f 20 69 66 20 70 4c 69 6d 69 74 3d 3d 30   so if pLimit==0
12200 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
12210 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  t->pPrior ){.   
12220 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
12230 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62  SELECT may not b
12240 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
12250 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ry */.  }.  if( 
12260 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
12270 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
12280 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12290 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79     /* SELECT may
122a0 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54   not be DISTINCT
122b0 20 2a 2f 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74   */.  }.  pEList
122c0 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
122d0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  st;.  assert( pE
122e0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  List!=0 );.  if(
122f0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
12300 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
12310 30 3b 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  0;   /* The resu
12320 6c 74 20 73 65 74 20 6d 75 73 74 20 68 61 76 65  lt set must have
12330 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6c   exactly one col
12340 75 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  umn */.  }.  ass
12350 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30  ert( pEList->a[0
12360 5d 2e 70 45 78 70 72 20 29 3b 0a 20 20 69 66 28  ].pExpr );.  if(
12370 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
12380 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45  xpr->op!=TK_ASTE
12390 52 49 53 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  RISK ){.    retu
123a0 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 72  rn 0;   /* The r
123b0 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 20 62  esult set must b
123c0 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 6f 70  e the special op
123d0 65 72 61 74 6f 72 20 22 2a 22 20 2a 2f 0a 20 20  erator "*" */.  
123e0 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
123f0 70 6f 69 6e 74 20 77 65 20 68 61 76 65 20 65 73  point we have es
12400 74 61 62 6c 69 73 68 65 64 20 74 68 61 74 20 74  tablished that t
12410 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
12420 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 72 72  of the.  ** corr
12430 65 63 74 20 73 79 6e 74 61 63 74 69 63 20 66 6f  ect syntactic fo
12440 72 6d 20 74 6f 20 70 61 72 74 69 63 69 70 61 74  rm to participat
12450 65 20 69 6e 20 74 68 69 73 20 6f 70 74 69 6d 69  e in this optimi
12460 7a 61 74 69 6f 6e 2e 20 20 4e 6f 77 0a 20 20 2a  zation.  Now.  *
12470 2a 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65  * we have to che
12480 63 6b 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  ck the semantics
12490 2e 0a 20 20 2a 2f 0a 20 20 70 49 74 65 6d 20 3d  ..  */.  pItem =
124a0 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e   pSelect->pSrc->
124b0 61 3b 0a 20 20 70 53 72 63 20 3d 20 73 71 6c 69  a;.  pSrc = sqli
124c0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
124d0 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49  em(pParse, 0, pI
124e0 74 65 6d 29 3b 0a 20 20 69 66 28 20 70 53 72 63  tem);.  if( pSrc
124f0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12500 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63  n 0;   /* FROM c
12510 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  lause does not c
12520 6f 6e 74 61 69 6e 20 61 20 72 65 61 6c 20 74 61  ontain a real ta
12530 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ble */.  }.  if(
12540 20 70 53 72 63 3d 3d 70 44 65 73 74 20 29 7b 0a   pSrc==pDest ){.
12550 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12560 2f 2a 20 74 61 62 31 20 61 6e 64 20 74 61 62 32  /* tab1 and tab2
12570 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
12580 73 61 6d 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  same table */.  
12590 7d 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64  }.  if( HasRowid
125a0 28 70 44 65 73 74 29 21 3d 48 61 73 52 6f 77 69  (pDest)!=HasRowi
125b0 64 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 72  d(pSrc) ){.    r
125c0 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 73 6f  eturn 0;   /* so
125d0 75 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61  urce and destina
125e0 74 69 6f 6e 20 6d 75 73 74 20 62 6f 74 68 20 62  tion must both b
125f0 65 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  e WITHOUT ROWID 
12600 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20 7d 0a 23 69  or not */.  }.#i
12610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12620 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
12630 20 69 66 28 20 70 53 72 63 2d 3e 74 61 62 46 6c   if( pSrc->tabFl
12640 61 67 73 20 26 20 54 46 5f 56 69 72 74 75 61 6c  ags & TF_Virtual
12650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12660 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d 75 73 74  ;   /* tab2 must
12670 20 6e 6f 74 20 62 65 20 61 20 76 69 72 74 75 61   not be a virtua
12680 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23  l table */.  }.#
12690 65 6e 64 69 66 0a 20 20 69 66 28 20 70 53 72 63  endif.  if( pSrc
126a0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
126b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
126c0 74 61 62 32 20 6d 61 79 20 6e 6f 74 20 62 65 20  tab2 may not be 
126d0 61 20 76 69 65 77 20 2a 2f 0a 20 20 7d 0a 20 20  a view */.  }.  
126e0 69 66 28 20 70 44 65 73 74 2d 3e 6e 43 6f 6c 21  if( pDest->nCol!
126f0 3d 70 53 72 63 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pSrc->nCol ){. 
12700 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
12710 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
12720 6d 6e 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  mns must be the 
12730 73 61 6d 65 20 69 6e 20 74 61 62 31 20 61 6e 64  same in tab1 and
12740 20 74 61 62 32 20 2a 2f 0a 20 20 7d 0a 20 20 69   tab2 */.  }.  i
12750 66 28 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 21  f( pDest->iPKey!
12760 3d 70 53 72 63 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pSrc->iPKey ){.
12770 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12780 2f 2a 20 42 6f 74 68 20 74 61 62 6c 65 73 20 6d  /* Both tables m
12790 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
127a0 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
127b0 59 20 4b 45 59 20 2a 2f 0a 20 20 7d 0a 20 20 66  Y KEY */.  }.  f
127c0 6f 72 28 69 3d 30 3b 20 69 3c 70 44 65 73 74 2d  or(i=0; i<pDest-
127d0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
127e0 20 43 6f 6c 75 6d 6e 20 2a 70 44 65 73 74 43 6f   Column *pDestCo
127f0 6c 20 3d 20 26 70 44 65 73 74 2d 3e 61 43 6f 6c  l = &pDest->aCol
12800 5b 69 5d 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  [i];.    Column 
12810 2a 70 53 72 63 43 6f 6c 20 3d 20 26 70 53 72 63  *pSrcCol = &pSrc
12820 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 23 69 66 64 65  ->aCol[i];.#ifde
12830 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12840 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 20  HIDDEN_COLUMNS. 
12850 20 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67     if( (db->flag
12860 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63 75 75  s & SQLITE_Vacuu
12870 6d 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 28  m)==0 .     && (
12880 70 44 65 73 74 43 6f 6c 2d 3e 63 6f 6c 46 6c 61  pDestCol->colFla
12890 67 73 20 7c 20 70 53 72 63 43 6f 6c 2d 3e 63 6f  gs | pSrcCol->co
128a0 6c 46 6c 61 67 73 29 20 26 20 43 4f 4c 46 4c 41  lFlags) & COLFLA
128b0 47 5f 48 49 44 44 45 4e 20 0a 20 20 20 20 29 7b  G_HIDDEN .    ){
128c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
128d0 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 74      /* Neither t
128e0 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 5f 5f  able may have __
128f0 68 69 64 64 65 6e 5f 5f 20 63 6f 6c 75 6d 6e 73  hidden__ columns
12900 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
12910 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 43 6f  .    if( pDestCo
12920 6c 2d 3e 61 66 66 69 6e 69 74 79 21 3d 70 53 72  l->affinity!=pSr
12930 63 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 29  cCol->affinity )
12940 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
12950 3b 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79  ;    /* Affinity
12960 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
12970 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  e on all columns
12980 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
12990 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
129a0 70 28 70 44 65 73 74 43 6f 6c 2d 3e 7a 43 6f 6c  p(pDestCol->zCol
129b0 6c 2c 20 70 53 72 63 43 6f 6c 2d 3e 7a 43 6f 6c  l, pSrcCol->zCol
129c0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
129d0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43  eturn 0;    /* C
129e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
129f0 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  e must be the sa
12a00 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e  me on all column
12a10 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  s */.    }.    i
12a20 66 28 20 70 44 65 73 74 43 6f 6c 2d 3e 6e 6f 74  f( pDestCol->not
12a30 4e 75 6c 6c 20 26 26 20 21 70 53 72 63 43 6f 6c  Null && !pSrcCol
12a40 2d 3e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  ->notNull ){.   
12a50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
12a60 2f 2a 20 74 61 62 32 20 6d 75 73 74 20 62 65 20  /* tab2 must be 
12a70 4e 4f 54 20 4e 55 4c 4c 20 69 66 20 74 61 62 31  NOT NULL if tab1
12a80 20 69 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   is */.    }.   
12a90 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
12aa0 65 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e  es for second an
12ab0 64 20 73 75 62 73 65 71 75 65 6e 74 20 63 6f 6c  d subsequent col
12ac0 75 6d 6e 73 20 6e 65 65 64 20 74 6f 20 6d 61 74  umns need to mat
12ad0 63 68 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ch. */.    if( i
12ae0 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >0 ){.      asse
12af0 72 74 28 20 70 44 65 73 74 43 6f 6c 2d 3e 70 44  rt( pDestCol->pD
12b00 66 6c 74 3d 3d 30 20 7c 7c 20 70 44 65 73 74 43  flt==0 || pDestC
12b10 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54  ol->pDflt->op==T
12b20 4b 5f 53 50 41 4e 20 29 3b 0a 20 20 20 20 20 20  K_SPAN );.      
12b30 61 73 73 65 72 74 28 20 70 53 72 63 43 6f 6c 2d  assert( pSrcCol-
12b40 3e 70 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 53 72  >pDflt==0 || pSr
12b50 63 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 6f 70 3d  cCol->pDflt->op=
12b60 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a 20 20 20 20  =TK_SPAN );.    
12b70 20 20 69 66 28 20 28 70 44 65 73 74 43 6f 6c 2d    if( (pDestCol-
12b80 3e 70 44 66 6c 74 3d 3d 30 29 21 3d 28 70 53 72  >pDflt==0)!=(pSr
12b90 63 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 29 20  cCol->pDflt==0) 
12ba0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 44 65 73  .       || (pDes
12bb0 74 43 6f 6c 2d 3e 70 44 66 6c 74 20 26 26 20 73  tCol->pDflt && s
12bc0 74 72 63 6d 70 28 70 44 65 73 74 43 6f 6c 2d 3e  trcmp(pDestCol->
12bd0 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pDflt->u.zToken,
12be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 70 53 72 63 43 6f 6c 2d          pSrcCol-
12c10 3e 70 44 66 6c 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pDflt->u.zToken
12c20 29 21 3d 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  )!=0).      ){. 
12c30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
12c40 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76      /* Default v
12c50 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68  alues must be th
12c60 65 20 73 61 6d 65 20 66 6f 72 20 61 6c 6c 20 63  e same for all c
12c70 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
12c80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
12c90 72 28 70 44 65 73 74 49 64 78 3d 70 44 65 73 74  r(pDestIdx=pDest
12ca0 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65 73 74 49  ->pIndex; pDestI
12cb0 64 78 3b 20 70 44 65 73 74 49 64 78 3d 70 44 65  dx; pDestIdx=pDe
12cc0 73 74 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  stIdx->pNext){. 
12cd0 20 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49     if( IsUniqueI
12ce0 6e 64 65 78 28 70 44 65 73 74 49 64 78 29 20 29  ndex(pDestIdx) )
12cf0 7b 0a 20 20 20 20 20 20 64 65 73 74 48 61 73 55  {.      destHasU
12d00 6e 69 71 75 65 49 64 78 20 3d 20 31 3b 0a 20 20  niqueIdx = 1;.  
12d10 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 72 63    }.    for(pSrc
12d20 49 64 78 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  Idx=pSrc->pIndex
12d30 3b 20 70 53 72 63 49 64 78 3b 20 70 53 72 63 49  ; pSrcIdx; pSrcI
12d40 64 78 3d 70 53 72 63 49 64 78 2d 3e 70 4e 65 78  dx=pSrcIdx->pNex
12d50 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 66  t){.      if( xf
12d60 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65  erCompatibleInde
12d70 78 28 70 44 65 73 74 49 64 78 2c 20 70 53 72 63  x(pDestIdx, pSrc
12d80 49 64 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  Idx) ) break;.  
12d90 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 72 63    }.    if( pSrc
12da0 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
12db0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
12dc0 70 44 65 73 74 49 64 78 20 68 61 73 20 6e 6f 20  pDestIdx has no 
12dd0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
12de0 64 65 78 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  dex in pSrc */. 
12df0 20 20 20 7d 0a 20 20 7d 0a 23 69 66 6e 64 65 66     }.  }.#ifndef
12e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
12e10 43 4b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  CK.  if( pDest->
12e20 70 43 68 65 63 6b 20 26 26 20 73 71 6c 69 74 65  pCheck && sqlite
12e30 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
12e40 28 70 53 72 63 2d 3e 70 43 68 65 63 6b 2c 70 44  (pSrc->pCheck,pD
12e50 65 73 74 2d 3e 70 43 68 65 63 6b 2c 2d 31 29 20  est->pCheck,-1) 
12e60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12e70 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 68 61 76     /* Tables hav
12e80 65 20 64 69 66 66 65 72 65 6e 74 20 43 48 45 43  e different CHEC
12e90 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  K constraints.  
12ea0 54 69 63 6b 65 74 20 23 32 32 35 32 20 2a 2f 0a  Ticket #2252 */.
12eb0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
12ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
12ed0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20  OREIGN_KEY.  /* 
12ee0 44 69 73 61 6c 6c 6f 77 20 74 68 65 20 74 72 61  Disallow the tra
12ef0 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
12f00 6f 6e 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  on if the destin
12f10 61 74 69 6f 6e 20 74 61 62 6c 65 20 63 6f 6e 73  ation table cons
12f20 74 61 69 6e 73 0a 20 20 2a 2a 20 61 6e 79 20 66  tains.  ** any f
12f30 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
12f40 72 61 69 6e 74 73 2e 20 20 54 68 69 73 20 69 73  raints.  This is
12f50 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
12f60 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
12f70 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 6d  ..  ** But the m
12f80 61 69 6e 20 62 65 6e 65 66 69 63 69 61 72 79 20  ain beneficiary 
12f90 6f 66 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  of the transfer 
12fa0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
12fb0 74 68 65 20 56 41 43 55 55 4d 20 0a 20 20 2a 2a  the VACUUM .  **
12fc0 20 63 6f 6d 6d 61 6e 64 2c 20 61 6e 64 20 74 68   command, and th
12fd0 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
12fe0 20 64 69 73 61 62 6c 65 73 20 66 6f 72 65 69 67   disables foreig
12ff0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
13000 73 2e 20 20 53 6f 0a 20 20 2a 2a 20 74 68 65 20  s.  So.  ** the 
13010 65 78 74 72 61 20 63 6f 6d 70 6c 69 63 61 74 69  extra complicati
13020 6f 6e 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  on to make this 
13030 72 75 6c 65 20 6c 65 73 73 20 72 65 73 74 72 69  rule less restri
13040 63 74 69 76 65 20 69 73 20 70 72 6f 62 61 62 6c  ctive is probabl
13050 79 0a 20 20 2a 2a 20 6e 6f 74 20 77 6f 72 74 68  y.  ** not worth
13060 20 74 68 65 20 65 66 66 6f 72 74 2e 20 20 54 69   the effort.  Ti
13070 63 6b 65 74 20 5b 36 32 38 34 64 66 38 39 64 65  cket [6284df89de
13080 62 64 66 61 36 31 64 62 38 30 37 33 65 30 36 32  bdfa61db8073e062
13090 39 30 38 61 66 30 63 39 62 36 31 31 38 65 5d 0a  908af0c9b6118e].
130a0 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e    */.  if( (db->
130b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
130c0 6f 72 65 69 67 6e 4b 65 79 73 29 21 3d 30 20 26  oreignKeys)!=0 &
130d0 26 20 70 44 65 73 74 2d 3e 70 46 4b 65 79 21 3d  & pDest->pFKey!=
130e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
130f0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
13100 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  if( (db->flags &
13110 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
13120 73 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  s)!=0 ){.    ret
13130 75 72 6e 20 30 3b 20 20 2f 2a 20 78 66 65 72 20  urn 0;  /* xfer 
13140 6f 70 74 20 64 6f 65 73 20 6e 6f 74 20 70 6c 61  opt does not pla
13150 79 20 77 65 6c 6c 20 77 69 74 68 20 50 52 41 47  y well with PRAG
13160 4d 41 20 63 6f 75 6e 74 5f 63 68 61 6e 67 65 73  MA count_changes
13170 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   */.  }..  /* If
13180 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
13190 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
131a0 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
131b0 61 74 69 6f 6e 20 69 73 20 61 74 0a 20 20 2a 2a  ation is at.  **
131c0 20 6c 65 61 73 74 20 61 20 70 6f 73 73 69 62 69   least a possibi
131d0 6c 69 74 79 2c 20 74 68 6f 75 67 68 20 69 74 20  lity, though it 
131e0 6d 69 67 68 74 20 6f 6e 6c 79 20 77 6f 72 6b 20  might only work 
131f0 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  if the destinati
13200 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74  on.  ** table (t
13210 61 62 31 29 20 69 73 20 69 6e 69 74 69 61 6c 6c  ab1) is initiall
13220 79 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 23 69  y empty..  */.#i
13230 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13240 0a 20 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  .  sqlite3_xfero
13250 70 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  pt_count++;.#end
13260 69 66 0a 20 20 69 44 62 53 72 63 20 3d 20 73 71  if.  iDbSrc = sq
13270 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
13280 65 78 28 64 62 2c 20 70 53 72 63 2d 3e 70 53 63  ex(db, pSrc->pSc
13290 68 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c  hema);.  v = sql
132a0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
132b0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
132c0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
132d0 50 61 72 73 65 2c 20 69 44 62 53 72 63 29 3b 0a  Parse, iDbSrc);.
132e0 20 20 69 53 72 63 20 3d 20 70 50 61 72 73 65 2d    iSrc = pParse-
132f0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 44 65 73 74  >nTab++;.  iDest
13300 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13310 2b 3b 0a 20 20 72 65 67 41 75 74 6f 69 6e 63 20  +;.  regAutoinc 
13320 3d 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 70  = autoIncBegin(p
13330 50 61 72 73 65 2c 20 69 44 62 44 65 73 74 2c 20  Parse, iDbDest, 
13340 70 44 65 73 74 29 3b 0a 20 20 72 65 67 44 61 74  pDest);.  regDat
13350 61 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  a = sqlite3GetTe
13360 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
13370 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
13380 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
13390 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
133a0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
133b0 2c 20 69 44 65 73 74 2c 20 69 44 62 44 65 73 74  , iDest, iDbDest
133c0 2c 20 70 44 65 73 74 2c 20 4f 50 5f 4f 70 65 6e  , pDest, OP_Open
133d0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
133e0 28 20 48 61 73 52 6f 77 69 64 28 70 44 65 73 74  ( HasRowid(pDest
133f0 29 20 7c 7c 20 64 65 73 74 48 61 73 55 6e 69 71  ) || destHasUniq
13400 75 65 49 64 78 20 29 3b 0a 20 20 69 66 28 20 28  ueIdx );.  if( (
13410 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
13420 54 45 5f 56 61 63 75 75 6d 29 3d 3d 30 20 26 26  TE_Vacuum)==0 &&
13430 20 28 0a 20 20 20 20 20 20 28 70 44 65 73 74 2d   (.      (pDest-
13440 3e 69 50 4b 65 79 3c 30 20 26 26 20 70 44 65 73  >iPKey<0 && pDes
13450 74 2d 3e 70 49 6e 64 65 78 21 3d 30 29 20 20 20  t->pIndex!=0)   
13460 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
13470 0a 20 20 20 7c 7c 20 64 65 73 74 48 61 73 55 6e  .   || destHasUn
13480 69 71 75 65 49 64 78 20 20 20 20 20 20 20 20 20  iqueIdx         
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
134b0 20 20 7c 7c 20 28 6f 6e 45 72 72 6f 72 21 3d 4f    || (onError!=O
134c0 45 5f 41 62 6f 72 74 20 26 26 20 6f 6e 45 72 72  E_Abort && onErr
134d0 6f 72 21 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 29  or!=OE_Rollback)
134e0 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 29     /* (3) */.  )
134f0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 73 6f 6d  ){.    /* In som
13500 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
13510 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
13520 72 75 6e 20 74 68 65 20 78 66 65 72 20 6f 70 74  run the xfer opt
13530 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
13540 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 64 65 73   only if the des
13550 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 69  tination table i
13560 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  s initially empt
13570 79 2e 20 55 6e 6c 65 73 73 20 74 68 65 0a 20 20  y. Unless the.  
13580 20 20 2a 2a 20 53 51 4c 49 54 45 5f 56 61 63 75    ** SQLITE_Vacu
13590 75 6d 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  um flag is set, 
135a0 74 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72  this block gener
135b0 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6d 61 6b  ates code to mak
135c0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  e.    ** that de
135d0 74 65 72 6d 69 6e 61 74 69 6f 6e 2e 20 49 66 20  termination. If 
135e0 53 51 4c 49 54 45 5f 56 61 63 75 75 6d 20 69 73  SQLITE_Vacuum is
135f0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 64   set, then the d
13600 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 2a  estination.    *
13610 2a 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79  * table is alway
13620 73 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 0a  s empty..    **.
13630 20 20 20 20 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e      ** Condition
13640 73 20 75 6e 64 65 72 20 77 68 69 63 68 20 74 68  s under which th
13650 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  e destination mu
13660 73 74 20 62 65 20 65 6d 70 74 79 3a 0a 20 20 20  st be empty:.   
13670 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54   **.    ** (1) T
13680 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 54 45 47  here is no INTEG
13690 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62  ER PRIMARY KEY b
136a0 75 74 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  ut there are ind
136b0 69 63 65 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ices..    **    
136c0 20 28 49 66 20 74 68 65 20 64 65 73 74 69 6e 61   (If the destina
136d0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e 69 74  tion is not init
136e0 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 74 68 65  ially empty, the
136f0 20 72 6f 77 69 64 20 66 69 65 6c 64 73 0a 20 20   rowid fields.  
13700 20 20 2a 2a 20 20 20 20 20 6f 66 20 69 6e 64 65    **     of inde
13710 78 20 65 6e 74 72 69 65 73 20 6d 69 67 68 74 20  x entries might 
13720 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 2e 29  need to change.)
13730 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
13740 32 29 20 54 68 65 20 64 65 73 74 69 6e 61 74 69  2) The destinati
13750 6f 6e 20 68 61 73 20 61 20 75 6e 69 71 75 65 20  on has a unique 
13760 69 6e 64 65 78 2e 20 20 28 54 68 65 20 78 66 65  index.  (The xfe
13770 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 0a  r optimization .
13780 20 20 20 20 2a 2a 20 20 20 20 20 69 73 20 75 6e      **     is un
13790 61 62 6c 65 20 74 6f 20 74 65 73 74 20 75 6e 69  able to test uni
137a0 71 75 65 6e 65 73 73 2e 29 0a 20 20 20 20 2a 2a  queness.).    **
137b0 0a 20 20 20 20 2a 2a 20 28 33 29 20 6f 6e 45 72  .    ** (3) onEr
137c0 72 6f 72 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ror is something
137d0 20 6f 74 68 65 72 20 74 68 61 6e 20 4f 45 5f 41   other than OE_A
137e0 62 6f 72 74 20 61 6e 64 20 4f 45 5f 52 6f 6c 6c  bort and OE_Roll
137f0 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
13800 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
13810 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13820 5f 52 65 77 69 6e 64 2c 20 69 44 65 73 74 2c 20  _Rewind, iDest, 
13830 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
13840 28 76 29 3b 0a 20 20 20 20 65 6d 70 74 79 44 65  (v);.    emptyDe
13850 73 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  stTest = sqlite3
13860 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
13870 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69  _Goto);.    sqli
13880 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13890 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 20  v, addr1);.  }. 
138a0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 53   if( HasRowid(pS
138b0 72 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rc) ){.    sqlit
138c0 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
138d0 73 65 2c 20 69 53 72 63 2c 20 69 44 62 53 72 63  se, iSrc, iDbSrc
138e0 2c 20 70 53 72 63 2c 20 4f 50 5f 4f 70 65 6e 52  , pSrc, OP_OpenR
138f0 65 61 64 29 3b 0a 20 20 20 20 65 6d 70 74 79 53  ead);.    emptyS
13900 72 63 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  rcTest = sqlite3
13910 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13920 5f 52 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30  _Rewind, iSrc, 0
13930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
13940 76 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73  v);.    if( pDes
13950 74 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  t->iPKey>=0 ){. 
13960 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
13970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13980 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63  , OP_Rowid, iSrc
13990 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
139a0 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
139b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
139c0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44  OP_NotExists, iD
139d0 65 73 74 2c 20 30 2c 20 72 65 67 52 6f 77 69 64  est, 0, regRowid
139e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
139f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13a00 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
13a10 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f  traint(pParse, o
13a20 6e 45 72 72 6f 72 2c 20 70 44 65 73 74 29 3b 0a  nError, pDest);.
13a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13a50 72 32 29 3b 0a 20 20 20 20 20 20 61 75 74 6f 49  r2);.      autoI
13a60 6e 63 53 74 65 70 28 70 50 61 72 73 65 2c 20 72  ncStep(pParse, r
13a70 65 67 41 75 74 6f 69 6e 63 2c 20 72 65 67 52 6f  egAutoinc, regRo
13a80 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  wid);.    }else 
13a90 69 66 28 20 70 44 65 73 74 2d 3e 70 49 6e 64 65  if( pDest->pInde
13aa0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  x==0 ){.      ad
13ab0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
13ac0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
13ad0 77 52 6f 77 69 64 2c 20 69 44 65 73 74 2c 20 72  wRowid, iDest, r
13ae0 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65  egRowid);.    }e
13af0 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 31  lse{.      addr1
13b00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13b10 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
13b20 2c 20 69 53 72 63 2c 20 72 65 67 52 6f 77 69 64  , iSrc, regRowid
13b30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13b40 20 28 70 44 65 73 74 2d 3e 74 61 62 46 6c 61 67   (pDest->tabFlag
13b50 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
13b60 6d 65 6e 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ment)==0 );.    
13b70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
13b80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
13b90 77 44 61 74 61 2c 20 69 53 72 63 2c 20 72 65 67  wData, iSrc, reg
13ba0 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
13bb0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13bc0 4f 50 5f 49 6e 73 65 72 74 2c 20 69 44 65 73 74  OP_Insert, iDest
13bd0 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 52 6f  , regData, regRo
13be0 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
13bf0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
13c00 2a 29 70 44 65 73 74 2c 20 50 34 5f 54 41 42 4c  *)pDest, P4_TABL
13c10 45 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  E);.    sqlite3V
13c20 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
13c30 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 7c 4f 50  PFLAG_NCHANGE|OP
13c40 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 7c 4f  FLAG_LASTROWID|O
13c50 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
13c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13c70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
13c80 20 69 53 72 63 2c 20 61 64 64 72 31 29 3b 20 56   iSrc, addr1); V
13c90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13cb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
13cc0 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20 20  e, iSrc, 0);.   
13cd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13ce0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
13cf0 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  iDest, 0);.  }el
13d00 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  se{.    sqlite3T
13d10 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
13d20 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74 2d   iDbDest, pDest-
13d30 3e 74 6e 75 6d 2c 20 31 2c 20 70 44 65 73 74 2d  >tnum, 1, pDest-
13d40 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
13d50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
13d60 61 72 73 65 2c 20 69 44 62 53 72 63 2c 20 70 53  arse, iDbSrc, pS
13d70 72 63 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 53 72  rc->tnum, 0, pSr
13d80 63 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  c->zName);.  }. 
13d90 20 66 6f 72 28 70 44 65 73 74 49 64 78 3d 70 44   for(pDestIdx=pD
13da0 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65  est->pIndex; pDe
13db0 73 74 49 64 78 3b 20 70 44 65 73 74 49 64 78 3d  stIdx; pDestIdx=
13dc0 70 44 65 73 74 49 64 78 2d 3e 70 4e 65 78 74 29  pDestIdx->pNext)
13dd0 7b 0a 20 20 20 20 75 38 20 69 64 78 49 6e 73 46  {.    u8 idxInsF
13de0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  lags = 0;.    fo
13df0 72 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e  r(pSrcIdx=pSrc->
13e00 70 49 6e 64 65 78 3b 20 41 4c 57 41 59 53 28 70  pIndex; ALWAYS(p
13e10 53 72 63 49 64 78 29 3b 20 70 53 72 63 49 64 78  SrcIdx); pSrcIdx
13e20 3d 70 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29  =pSrcIdx->pNext)
13e30 7b 0a 20 20 20 20 20 20 69 66 28 20 78 66 65 72  {.      if( xfer
13e40 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28  CompatibleIndex(
13e50 70 44 65 73 74 49 64 78 2c 20 70 53 72 63 49 64  pDestIdx, pSrcId
13e60 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  x) ) break;.    
13e70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  }.    assert( pS
13e80 72 63 49 64 78 20 29 3b 0a 20 20 20 20 73 71 6c  rcIdx );.    sql
13e90 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13ea0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
13eb0 53 72 63 2c 20 70 53 72 63 49 64 78 2d 3e 74 6e  Src, pSrcIdx->tn
13ec0 75 6d 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 20  um, iDbSrc);.   
13ed0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
13ee0 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
13ef0 20 70 53 72 63 49 64 78 29 3b 0a 20 20 20 20 56   pSrcIdx);.    V
13f00 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13f10 25 73 22 2c 20 70 53 72 63 49 64 78 2d 3e 7a 4e  %s", pSrcIdx->zN
13f20 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ame));.    sqlit
13f30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13f40 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 44  OP_OpenWrite, iD
13f50 65 73 74 2c 20 70 44 65 73 74 49 64 78 2d 3e 74  est, pDestIdx->t
13f60 6e 75 6d 2c 20 69 44 62 44 65 73 74 29 3b 0a 20  num, iDbDest);. 
13f70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
13f80 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
13f90 65 2c 20 70 44 65 73 74 49 64 78 29 3b 0a 20 20  e, pDestIdx);.  
13fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13fb0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
13fc0 42 55 4c 4b 43 53 52 29 3b 0a 20 20 20 20 56 64  BULKCSR);.    Vd
13fd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
13fe0 73 22 2c 20 70 44 65 73 74 49 64 78 2d 3e 7a 4e  s", pDestIdx->zN
13ff0 61 6d 65 29 29 3b 0a 20 20 20 20 61 64 64 72 31  ame));.    addr1
14000 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14010 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
14020 64 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62  d, iSrc, 0); Vdb
14030 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14040 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14050 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
14060 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 29  , iSrc, regData)
14070 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  ;.    if( db->fl
14080 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 61 63  ags & SQLITE_Vac
14090 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
140a0 54 68 69 73 20 49 4e 53 45 52 54 20 63 6f 6d 6d  This INSERT comm
140b0 61 6e 64 20 69 73 20 70 61 72 74 20 6f 66 20 61  and is part of a
140c0 20 56 41 43 55 55 4d 20 6f 70 65 72 61 74 69 6f   VACUUM operatio
140d0 6e 2c 20 77 68 69 63 68 20 67 75 61 72 61 6e 74  n, which guarant
140e0 65 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ees.      ** tha
140f0 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  t the destinatio
14100 6e 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  n table is empty
14110 2e 20 49 66 20 61 6c 6c 20 69 6e 64 65 78 65 64  . If all indexed
14120 20 63 6f 6c 75 6d 6e 73 20 75 73 65 0a 20 20 20   columns use.   
14130 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
14140 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2c  sequence BINARY,
14150 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73   then it can als
14160 6f 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  o be assumed tha
14170 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  t the.      ** i
14180 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 70 6f 70  ndex will be pop
14190 75 6c 61 74 65 64 20 62 79 20 69 6e 73 65 72 74  ulated by insert
141a0 69 6e 67 20 6b 65 79 73 20 69 6e 20 73 74 72 69  ing keys in stri
141b0 63 74 6c 79 20 73 6f 72 74 65 64 20 0a 20 20 20  ctly sorted .   
141c0 20 20 20 2a 2a 20 6f 72 64 65 72 2e 20 49 6e 20     ** order. In 
141d0 74 68 69 73 20 63 61 73 65 2c 20 69 6e 73 74 65  this case, inste
141e0 61 64 20 6f 66 20 73 65 65 6b 69 6e 67 20 77 69  ad of seeking wi
141f0 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
14200 61 73 20 70 61 72 74 0a 20 20 20 20 20 20 2a 2a  as part.      **
14210 20 6f 66 20 65 76 65 72 79 20 4f 50 5f 49 64 78   of every OP_Idx
14220 49 6e 73 65 72 74 20 6f 70 63 6f 64 65 2c 20 61  Insert opcode, a
14230 6e 20 4f 50 5f 4c 61 73 74 20 69 73 20 61 64 64  n OP_Last is add
14240 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ed before the.  
14250 20 20 20 20 2a 2a 20 4f 50 5f 49 64 78 49 6e 73      ** OP_IdxIns
14260 65 72 74 20 74 6f 20 73 65 65 6b 20 74 6f 20 74  ert to seek to t
14270 68 65 20 70 6f 69 6e 74 20 77 69 74 68 69 6e 20  he point within 
14280 74 68 65 20 62 2d 74 72 65 65 20 77 68 65 72 65  the b-tree where
14290 20 65 61 63 68 20 6b 65 79 20 0a 20 20 20 20 20   each key .     
142a0 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 69 6e   ** should be in
142b0 73 65 72 74 65 64 2e 20 54 68 69 73 20 69 73 20  serted. This is 
142c0 66 61 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a  faster..      **
142d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  .      ** If any
142e0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   of the indexed 
142f0 63 6f 6c 75 6d 6e 73 20 75 73 65 20 61 20 63 6f  columns use a co
14300 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14310 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20   other than.    
14320 20 20 2a 2a 20 42 49 4e 41 52 59 2c 20 74 68 69    ** BINARY, thi
14330 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
14340 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 69 73  s disabled. This
14350 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
14360 75 73 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6d  user .      ** m
14370 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
14380 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20  definition of a 
14390 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
143a0 63 65 20 61 6e 64 20 74 68 65 6e 20 72 75 6e 0a  ce and then run.
143b0 20 20 20 20 20 20 2a 2a 20 61 20 56 41 43 55 55        ** a VACUU
143c0 4d 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68  M command. In th
143d0 61 74 20 63 61 73 65 20 6b 65 79 73 20 6d 61 79  at case keys may
143e0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
143f0 69 6e 20 73 74 72 69 63 74 6c 79 0a 20 20 20 20  in strictly.    
14400 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
14410 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  r.  */.      for
14420 28 69 3d 30 3b 20 69 3c 70 53 72 63 49 64 78 2d  (i=0; i<pSrcIdx-
14430 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
14440 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14450 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 53 72 63  ar *zColl = pSrc
14460 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
14470 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14480 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
14490 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
144a0 2c 20 7a 43 6f 6c 6c 29 21 3d 30 0a 20 20 20 20  , zColl)!=0.    
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  || sqlite3StrBIN
144d0 41 52 59 3d 3d 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ARY==zColl );.  
144e0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
144f0 33 5f 73 74 72 69 63 6d 70 28 73 71 6c 69 74 65  3_stricmp(sqlite
14500 33 53 74 72 42 49 4e 41 52 59 2c 20 7a 43 6f 6c  3StrBINARY, zCol
14510 6c 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  l) ) break;.    
14520 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
14530 3d 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c 75 6d  =pSrcIdx->nColum
14540 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 64 78  n ){.        idx
14550 49 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41  InsFlags = OPFLA
14560 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b  G_USESEEKRESULT;
14570 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14580 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14590 5f 4c 61 73 74 2c 20 69 44 65 73 74 2c 20 30 2c  _Last, iDest, 0,
145a0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
145b0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
145c0 52 6f 77 69 64 28 70 53 72 63 29 20 26 26 20 70  Rowid(pSrc) && p
145d0 44 65 73 74 49 64 78 2d 3e 69 64 78 54 79 70 65  DestIdx->idxType
145e0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 64 78  ==2 ){.      idx
145f0 49 6e 73 46 6c 61 67 73 20 7c 3d 20 4f 50 46 4c  InsFlags |= OPFL
14600 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20  AG_NCHANGE;.    
14610 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
14630 78 49 6e 73 65 72 74 2c 20 69 44 65 73 74 2c 20  xInsert, iDest, 
14640 72 65 67 44 61 74 61 29 3b 0a 20 20 20 20 73 71  regData);.    sq
14650 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14660 35 28 76 2c 20 69 64 78 49 6e 73 46 6c 61 67 73  5(v, idxInsFlags
14670 7c 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b  |OPFLAG_APPEND);
14680 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14690 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
146a0 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31 2b 31  t, iSrc, addr1+1
146b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
146c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
146d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
146e0 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
146f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14700 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20  OP_Close, iSrc, 
14710 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
14720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14730 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29  Close, iDest, 0)
14740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6d 70 74  ;.  }.  if( empt
14750 79 53 72 63 54 65 73 74 20 29 20 73 71 6c 69 74  ySrcTest ) sqlit
14760 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14770 2c 20 65 6d 70 74 79 53 72 63 54 65 73 74 29 3b  , emptySrcTest);
14780 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
14790 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
147a0 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71   regRowid);.  sq
147b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
147c0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 44  Reg(pParse, regD
147d0 61 74 61 29 3b 0a 20 20 69 66 28 20 65 6d 70 74  ata);.  if( empt
147e0 79 44 65 73 74 54 65 73 74 20 29 7b 0a 20 20 20  yDestTest ){.   
147f0 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72   sqlite3Autoincr
14800 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29  ementEnd(pParse)
14810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14820 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61  eAddOp2(v, OP_Ha
14830 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  lt, SQLITE_OK, 0
14840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14850 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d  beJumpHere(v, em
14860 70 74 79 44 65 73 74 54 65 73 74 29 3b 0a 20 20  ptyDestTest);.  
14870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14880 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14890 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20   iDest, 0);.    
148a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
148b0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
148c0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
148d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45   SQLITE_OMIT_XFE
148e0 52 5f 4f 50 54 20 2a 2f 0a                       R_OPT */.