/ Hex Artifact Content
Login

Artifact 1f33ef4ca0553b60fff03aa171370f8709a3e945acfcc68ccafc92752d872f40:


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 6d 44 62 46 6c 61 67 73 20 26  ->db->mDbFlags &
1d40: 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 3d   DBFLAG_Vacuum)=
1d50: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 50 61 72 73  =0.  ){.    Pars
1d60: 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1d70: 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1d80: 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  vel(pParse);.   
1d90: 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 49   AutoincInfo *pI
1da0: 6e 66 6f 3b 0a 0a 20 20 20 20 70 49 6e 66 6f 20  nfo;..    pInfo 
1db0: 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41 69  = pToplevel->pAi
1dc0: 6e 63 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  nc;.    while( p
1dd0: 49 6e 66 6f 20 26 26 20 70 49 6e 66 6f 2d 3e 70  Info && pInfo->p
1de0: 54 61 62 21 3d 70 54 61 62 20 29 7b 20 70 49 6e  Tab!=pTab ){ pIn
1df0: 66 6f 20 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65 78  fo = pInfo->pNex
1e00: 74 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e  t; }.    if( pIn
1e10: 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fo==0 ){.      p
1e20: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
1e30: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72  MallocRawNN(pPar
1e40: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
1e50: 70 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  pInfo));.      i
1e60: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65  f( pInfo==0 ) re
1e70: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 70 49  turn 0;.      pI
1e80: 6e 66 6f 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f  nfo->pNext = pTo
1e90: 70 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20  plevel->pAinc;. 
1ea0: 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1eb0: 70 41 69 6e 63 20 3d 20 70 49 6e 66 6f 3b 0a 20  pAinc = pInfo;. 
1ec0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 70 54 61 62       pInfo->pTab
1ed0: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 70   = pTab;.      p
1ee0: 49 6e 66 6f 2d 3e 69 44 62 20 3d 20 69 44 62 3b  Info->iDb = iDb;
1ef0: 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1f00: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20  ->nMem++;       
1f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f20: 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6e  gister to hold n
1f30: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a  ame of table */.
1f40: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 72 65 67        pInfo->reg
1f50: 43 74 72 20 3d 20 2b 2b 70 54 6f 70 6c 65 76 65  Ctr = ++pTopleve
1f60: 6c 2d 3e 6e 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78  l->nMem;  /* Max
1f70: 20 72 6f 77 69 64 20 72 65 67 69 73 74 65 72 20   rowid register 
1f80: 2a 2f 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  */.      pToplev
1f90: 65 6c 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20  el->nMem++;     
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fb0: 52 6f 77 69 64 20 69 6e 20 73 71 6c 69 74 65 5f  Rowid in sqlite_
1fc0: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  sequence */.    
1fd0: 7d 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20 70 49  }.    memId = pI
1fe0: 6e 66 6f 2d 3e 72 65 67 43 74 72 3b 0a 20 20 7d  nfo->regCtr;.  }
1ff0: 0a 20 20 72 65 74 75 72 6e 20 6d 65 6d 49 64 3b  .  return memId;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2010: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
2020: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
2030: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 6f  initialize all o
2040: 66 20 74 68 65 0a 2a 2a 20 72 65 67 69 73 74 65  f the.** registe
2050: 72 20 75 73 65 64 20 62 79 20 74 68 65 20 61 75  r used by the au
2060: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 72 61 63  toincrement trac
2070: 6b 65 72 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ker.  .*/.void s
2080: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
2090: 65 6e 74 42 65 67 69 6e 28 50 61 72 73 65 20 2a  entBegin(Parse *
20a0: 70 50 61 72 73 65 29 7b 0a 20 20 41 75 74 6f 69  pParse){.  Autoi
20b0: 6e 63 49 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20  ncInfo *p;      
20c0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
20d0: 74 69 6f 6e 20 61 62 6f 75 74 20 61 6e 20 41 55  tion about an AU
20e0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20  TOINCREMENT */. 
20f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2100: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54  Parse->db;  /* T
2110: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
2120: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a  ection */.  Db *
2130: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
2140: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2150: 73 65 20 6f 6e 6c 79 20 61 75 74 6f 69 6e 63 20  se only autoinc 
2160: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  table */.  int m
2170: 65 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  emId;           
2180: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
2190: 72 20 68 6f 6c 64 69 6e 67 20 6d 61 78 20 72 6f  r holding max ro
21a0: 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  wid */.  Vdbe *v
21b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
21c0: 3b 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65  ;   /* VDBE unde
21d0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
21e0: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
21f0: 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
2200: 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 72 69 67  lled during trig
2210: 67 65 72 2d 67 65 6e 65 72 61 74 69 6f 6e 2e 20  ger-generation. 
2220: 20 49 74 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79   It is.  ** only
2230: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   called from the
2240: 20 74 6f 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20 20   top-level */.  
2250: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
2260: 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29  pTriggerTab==0 )
2270: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2280: 74 65 33 49 73 54 6f 70 6c 65 76 65 6c 28 70 50  te3IsToplevel(pP
2290: 61 72 73 65 29 20 29 3b 0a 0a 20 20 61 73 73 65  arse) );..  asse
22a0: 72 74 28 20 76 20 29 3b 20 20 20 2f 2a 20 57 65  rt( v );   /* We
22b0: 20 66 61 69 6c 65 64 20 6c 6f 6e 67 20 61 67 6f   failed long ago
22c0: 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
22d0: 73 6f 20 2a 2f 0a 20 20 66 6f 72 28 70 20 3d 20  so */.  for(p = 
22e0: 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3b 20 70  pParse->pAinc; p
22f0: 3b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 29 7b  ; p = p->pNext){
2300: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2310: 74 20 69 6e 74 20 69 4c 6e 20 3d 20 56 44 42 45  t int iLn = VDBE
2320: 5f 4f 46 46 53 45 54 5f 4c 49 4e 45 4e 4f 28 32  _OFFSET_LINENO(2
2330: 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  );.    static co
2340: 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 61  nst VdbeOpList a
2350: 75 74 6f 49 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20  utoInc[] = {.   
2360: 20 20 20 2f 2a 20 30 20 20 2a 2f 20 7b 4f 50 5f     /* 0  */ {OP_
2370: 4e 75 6c 6c 2c 20 20 20 20 30 2c 20 20 30 2c 20  Null,    0,  0, 
2380: 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 31 20 20  0},.      /* 1  
2390: 2a 2f 20 7b 4f 50 5f 52 65 77 69 6e 64 2c 20 20  */ {OP_Rewind,  
23a0: 30 2c 20 20 39 2c 20 30 7d 2c 0a 20 20 20 20 20  0,  9, 0},.     
23b0: 20 2f 2a 20 32 20 20 2a 2f 20 7b 4f 50 5f 43 6f   /* 2  */ {OP_Co
23c0: 6c 75 6d 6e 2c 20 20 30 2c 20 20 30 2c 20 30 7d  lumn,  0,  0, 0}
23d0: 2c 0a 20 20 20 20 20 20 2f 2a 20 33 20 20 2a 2f  ,.      /* 3  */
23e0: 20 7b 4f 50 5f 4e 65 2c 20 20 20 20 20 20 30 2c   {OP_Ne,      0,
23f0: 20 20 37 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f    7, 0},.      /
2400: 2a 20 34 20 20 2a 2f 20 7b 4f 50 5f 52 6f 77 69  * 4  */ {OP_Rowi
2410: 64 2c 20 20 20 30 2c 20 20 30 2c 20 30 7d 2c 0a  d,   0,  0, 0},.
2420: 20 20 20 20 20 20 2f 2a 20 35 20 20 2a 2f 20 7b        /* 5  */ {
2430: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 30 2c 20 20  OP_Column,  0,  
2440: 31 2c 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20  1, 0},.      /* 
2450: 36 20 20 2a 2f 20 7b 4f 50 5f 47 6f 74 6f 2c 20  6  */ {OP_Goto, 
2460: 20 20 20 30 2c 20 20 39 2c 20 30 7d 2c 0a 20 20     0,  9, 0},.  
2470: 20 20 20 20 2f 2a 20 37 20 20 2a 2f 20 7b 4f 50      /* 7  */ {OP
2480: 5f 4e 65 78 74 2c 20 20 20 20 30 2c 20 20 32 2c  _Next,    0,  2,
2490: 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 38 20   0},.      /* 8 
24a0: 20 2a 2f 20 7b 4f 50 5f 49 6e 74 65 67 65 72 2c   */ {OP_Integer,
24b0: 20 30 2c 20 20 30 2c 20 30 7d 2c 0a 20 20 20 20   0,  0, 0},.    
24c0: 20 20 2f 2a 20 39 20 20 2a 2f 20 7b 4f 50 5f 43    /* 9  */ {OP_C
24d0: 6c 6f 73 65 2c 20 20 20 30 2c 20 20 30 2c 20 30  lose,   0,  0, 0
24e0: 7d 20 0a 20 20 20 20 7d 3b 0a 20 20 20 20 56 64  } .    };.    Vd
24f0: 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20 20 20 70  beOp *aOp;.    p
2500: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d  Db = &db->aDb[p-
2510: 3e 69 44 62 5d 3b 0a 20 20 20 20 6d 65 6d 49 64  >iDb];.    memId
2520: 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b 0a 20 20   = p->regCtr;.  
2530: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2540: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
2550: 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63  (db, 0, pDb->pSc
2560: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c  hema) );.    sql
2570: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
2580: 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c  arse, 0, p->iDb,
2590: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
25a0: 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  SeqTab, OP_OpenR
25b0: 65 61 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ead);.    sqlite
25c0: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
25d0: 76 2c 20 6d 65 6d 49 64 2d 31 2c 20 70 2d 3e 70  v, memId-1, p->p
25e0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
25f0: 20 61 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   aOp = sqlite3Vd
2600: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
2610: 72 72 61 79 53 69 7a 65 28 61 75 74 6f 49 6e 63  rraySize(autoInc
2620: 29 2c 20 61 75 74 6f 49 6e 63 2c 20 69 4c 6e 29  ), autoInc, iLn)
2630: 3b 0a 20 20 20 20 69 66 28 20 61 4f 70 3d 3d 30  ;.    if( aOp==0
2640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f   ) break;.    aO
2650: 70 5b 30 5d 2e 70 32 20 3d 20 6d 65 6d 49 64 3b  p[0].p2 = memId;
2660: 0a 20 20 20 20 61 4f 70 5b 30 5d 2e 70 33 20 3d  .    aOp[0].p3 =
2670: 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f   memId+1;.    aO
2680: 70 5b 32 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b  p[2].p3 = memId;
2690: 0a 20 20 20 20 61 4f 70 5b 33 5d 2e 70 31 20 3d  .    aOp[3].p1 =
26a0: 20 6d 65 6d 49 64 2d 31 3b 0a 20 20 20 20 61 4f   memId-1;.    aO
26b0: 70 5b 33 5d 2e 70 33 20 3d 20 6d 65 6d 49 64 3b  p[3].p3 = memId;
26c0: 0a 20 20 20 20 61 4f 70 5b 33 5d 2e 70 35 20 3d  .    aOp[3].p5 =
26d0: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26e0: 4c 4c 3b 0a 20 20 20 20 61 4f 70 5b 34 5d 2e 70  LL;.    aOp[4].p
26f0: 32 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20  2 = memId+1;.   
2700: 20 61 4f 70 5b 35 5d 2e 70 33 20 3d 20 6d 65 6d   aOp[5].p3 = mem
2710: 49 64 3b 0a 20 20 20 20 61 4f 70 5b 38 5d 2e 70  Id;.    aOp[8].p
2720: 32 20 3d 20 6d 65 6d 49 64 3b 0a 20 20 7d 0a 7d  2 = memId;.  }.}
2730: 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
2740: 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  he maximum rowid
2750: 20 66 6f 72 20 61 6e 20 61 75 74 6f 69 6e 63 72   for an autoincr
2760: 65 6d 65 6e 74 20 63 61 6c 63 75 6c 61 74 69 6f  ement calculatio
2770: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
2780: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
2790: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
27a0: 72 65 67 52 6f 77 69 64 20 72 65 67 69 73 74 65  regRowid registe
27b0: 72 20 68 6f 6c 64 73 20 61 0a 2a 2a 20 6e 65 77  r holds a.** new
27c0: 20 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 61   rowid that is a
27d0: 62 6f 75 74 20 74 6f 20 62 65 20 69 6e 73 65 72  bout to be inser
27e0: 74 65 64 2e 20 20 49 66 20 74 68 61 74 20 6e 65  ted.  If that ne
27f0: 77 20 72 6f 77 69 64 20 69 73 0a 2a 2a 20 6c 61  w rowid is.** la
2800: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  rger than the ma
2810: 78 69 6d 75 6d 20 72 6f 77 69 64 20 69 6e 20 74  ximum rowid in t
2820: 68 65 20 6d 65 6d 49 64 20 6d 65 6d 6f 72 79 20  he memId memory 
2830: 63 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  cell, then the.*
2840: 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73  * memory cell is
2850: 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61   updated..*/.sta
2860: 74 69 63 20 76 6f 69 64 20 61 75 74 6f 49 6e 63  tic void autoInc
2870: 53 74 65 70 28 50 61 72 73 65 20 2a 70 50 61 72  Step(Parse *pPar
2880: 73 65 2c 20 69 6e 74 20 6d 65 6d 49 64 2c 20 69  se, int memId, i
2890: 6e 74 20 72 65 67 52 6f 77 69 64 29 7b 0a 20 20  nt regRowid){.  
28a0: 69 66 28 20 6d 65 6d 49 64 3e 30 20 29 7b 0a 20  if( memId>0 ){. 
28b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28c0: 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp2(pParse->pVd
28d0: 62 65 2c 20 4f 50 5f 4d 65 6d 4d 61 78 2c 20 6d  be, OP_MemMax, m
28e0: 65 6d 49 64 2c 20 72 65 67 52 6f 77 69 64 29 3b  emId, regRowid);
28f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2900: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2910: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
2920: 65 64 65 64 20 74 6f 20 77 72 69 74 65 20 61 75  eded to write au
2930: 74 6f 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20 6d  toincrement.** m
2940: 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 76 61 6c  aximum rowid val
2950: 75 65 73 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ues back into th
2960: 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
2970: 65 20 72 65 67 69 73 74 65 72 2e 0a 2a 2a 20 45  e register..** E
2980: 76 65 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74  very statement t
2990: 68 61 74 20 6d 69 67 68 74 20 64 6f 20 61 6e 20  hat might do an 
29a0: 49 4e 53 45 52 54 20 69 6e 74 6f 20 61 6e 20 61  INSERT into an a
29b0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 0a 2a 2a 20  utoincrement.** 
29c0: 74 61 62 6c 65 20 28 65 69 74 68 65 72 20 64 69  table (either di
29d0: 72 65 63 74 6c 79 20 6f 72 20 74 68 72 6f 75 67  rectly or throug
29e0: 68 20 74 72 69 67 67 65 72 73 29 20 6e 65 65 64  h triggers) need
29f0: 73 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  s to call this.*
2a00: 2a 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 62  * routine just b
2a10: 65 66 6f 72 65 20 74 68 65 20 22 65 78 69 74 22  efore the "exit"
2a20: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
2a30: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2a40: 20 76 6f 69 64 20 61 75 74 6f 49 6e 63 72 65 6d   void autoIncrem
2a50: 65 6e 74 45 6e 64 28 50 61 72 73 65 20 2a 70 50  entEnd(Parse *pP
2a60: 61 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e 63  arse){.  Autoinc
2a70: 49 6e 66 6f 20 2a 70 3b 0a 20 20 56 64 62 65 20  Info *p;.  Vdbe 
2a80: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2a90: 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  be;.  sqlite3 *d
2aa0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2ab0: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
2ac0: 20 20 66 6f 72 28 70 20 3d 20 70 50 61 72 73 65    for(p = pParse
2ad0: 2d 3e 70 41 69 6e 63 3b 20 70 3b 20 70 20 3d 20  ->pAinc; p; p = 
2ae0: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 73  p->pNext){.    s
2af0: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
2b00: 69 4c 6e 20 3d 20 56 44 42 45 5f 4f 46 46 53 45  iLn = VDBE_OFFSE
2b10: 54 5f 4c 49 4e 45 4e 4f 28 32 29 3b 0a 20 20 20  T_LINENO(2);.   
2b20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56 64   static const Vd
2b30: 62 65 4f 70 4c 69 73 74 20 61 75 74 6f 49 6e 63  beOpList autoInc
2b40: 45 6e 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  End[] = {.      
2b50: 2f 2a 20 30 20 2a 2f 20 7b 4f 50 5f 4e 6f 74 4e  /* 0 */ {OP_NotN
2b60: 75 6c 6c 2c 20 20 20 20 20 30 2c 20 32 2c 20 30  ull,     0, 2, 0
2b70: 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f  },.      /* 1 */
2b80: 20 7b 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 20   {OP_NewRowid,  
2b90: 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20 20 20    0, 0, 0},.    
2ba0: 20 20 2f 2a 20 32 20 2a 2f 20 7b 4f 50 5f 4d 61    /* 2 */ {OP_Ma
2bb0: 6b 65 52 65 63 6f 72 64 2c 20 20 30 2c 20 32 2c  keRecord,  0, 2,
2bc0: 20 30 7d 2c 0a 20 20 20 20 20 20 2f 2a 20 33 20   0},.      /* 3 
2bd0: 2a 2f 20 7b 4f 50 5f 49 6e 73 65 72 74 2c 20 20  */ {OP_Insert,  
2be0: 20 20 20 20 30 2c 20 30 2c 20 30 7d 2c 0a 20 20      0, 0, 0},.  
2bf0: 20 20 20 20 2f 2a 20 34 20 2a 2f 20 7b 4f 50 5f      /* 4 */ {OP_
2c00: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 30 2c 20  Close,       0, 
2c10: 30 2c 20 30 7d 0a 20 20 20 20 7d 3b 0a 20 20 20  0, 0}.    };.   
2c20: 20 56 64 62 65 4f 70 20 2a 61 4f 70 3b 0a 20 20   VdbeOp *aOp;.  
2c30: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
2c40: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a 20 20  >aDb[p->iDb];.  
2c50: 20 20 69 6e 74 20 69 52 65 63 3b 0a 20 20 20 20    int iRec;.    
2c60: 69 6e 74 20 6d 65 6d 49 64 20 3d 20 70 2d 3e 72  int memId = p->r
2c70: 65 67 43 74 72 3b 0a 0a 20 20 20 20 69 52 65 63  egCtr;..    iRec
2c80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2c90: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2ca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2cb0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
2cc0: 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70 53 63  (db, 0, pDb->pSc
2cd0: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73 71 6c  hema) );.    sql
2ce0: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
2cf0: 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c  arse, 0, p->iDb,
2d00: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
2d10: 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 57  SeqTab, OP_OpenW
2d20: 72 69 74 65 29 3b 0a 20 20 20 20 61 4f 70 20 3d  rite);.    aOp =
2d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d40: 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
2d50: 7a 65 28 61 75 74 6f 49 6e 63 45 6e 64 29 2c 20  ze(autoIncEnd), 
2d60: 61 75 74 6f 49 6e 63 45 6e 64 2c 20 69 4c 6e 29  autoIncEnd, iLn)
2d70: 3b 0a 20 20 20 20 69 66 28 20 61 4f 70 3d 3d 30  ;.    if( aOp==0
2d80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 4f   ) break;.    aO
2d90: 70 5b 30 5d 2e 70 31 20 3d 20 6d 65 6d 49 64 2b  p[0].p1 = memId+
2da0: 31 3b 0a 20 20 20 20 61 4f 70 5b 31 5d 2e 70 32  1;.    aOp[1].p2
2db0: 20 3d 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20   = memId+1;.    
2dc0: 61 4f 70 5b 32 5d 2e 70 31 20 3d 20 6d 65 6d 49  aOp[2].p1 = memI
2dd0: 64 2d 31 3b 0a 20 20 20 20 61 4f 70 5b 32 5d 2e  d-1;.    aOp[2].
2de0: 70 33 20 3d 20 69 52 65 63 3b 0a 20 20 20 20 61  p3 = iRec;.    a
2df0: 4f 70 5b 33 5d 2e 70 32 20 3d 20 69 52 65 63 3b  Op[3].p2 = iRec;
2e00: 0a 20 20 20 20 61 4f 70 5b 33 5d 2e 70 33 20 3d  .    aOp[3].p3 =
2e10: 20 6d 65 6d 49 64 2b 31 3b 0a 20 20 20 20 61 4f   memId+1;.    aO
2e20: 70 5b 33 5d 2e 70 35 20 3d 20 4f 50 46 4c 41 47  p[3].p5 = OPFLAG
2e30: 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 73 71 6c  _APPEND;.    sql
2e40: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
2e50: 65 67 28 70 50 61 72 73 65 2c 20 69 52 65 63 29  eg(pParse, iRec)
2e60: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
2e70: 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e  ite3Autoincremen
2e80: 74 45 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  tEnd(Parse *pPar
2e90: 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
2ea0: 65 2d 3e 70 41 69 6e 63 20 29 20 61 75 74 6f 49  e->pAinc ) autoI
2eb0: 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72  ncrementEnd(pPar
2ec0: 73 65 29 3b 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 0a  se);.}.#else./*.
2ed0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** If SQLITE_OMI
2ee0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  T_AUTOINCREMENT 
2ef0: 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
2f00: 20 74 68 65 20 74 68 72 65 65 20 72 6f 75 74 69   the three routi
2f10: 6e 65 73 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65  nes.** above are
2f20: 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2f 0a 23   all no-ops.*/.#
2f30: 20 64 65 66 69 6e 65 20 61 75 74 6f 49 6e 63 42   define autoIncB
2f40: 65 67 69 6e 28 41 2c 42 2c 43 29 20 28 30 29 0a  egin(A,B,C) (0).
2f50: 23 20 64 65 66 69 6e 65 20 61 75 74 6f 49 6e 63  # define autoInc
2f60: 53 74 65 70 28 41 2c 42 2c 43 29 0a 23 65 6e 64  Step(A,B,C).#end
2f70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2f80: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  T_AUTOINCREMENT 
2f90: 2a 2f 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  */.../* Forward 
2fa0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 78 66 65 72 4f 70  tatic int xferOp
2fc0: 74 69 6d 69 7a 61 74 69 6f 6e 28 0a 20 20 50 61  timization(.  Pa
2fd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2fe0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
2ff0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
3000: 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 20 20   *pDest,        
3010: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 65   /* The table we
3020: 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 69   are inserting i
3030: 6e 74 6f 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  nto */.  Select 
3040: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f  *pSelect,      /
3050: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
3060: 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20 74  ment to use as t
3070: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a  he data source *
3080: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
3090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
30a0: 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74   to handle const
30b0: 72 61 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a  raint errors */.
30c0: 20 20 69 6e 74 20 69 44 62 44 65 73 74 20 20 20    int iDbDest   
30d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
30e0: 61 74 61 62 61 73 65 20 6f 66 20 70 44 65 73 74  atabase of pDest
30f0: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.);../*.** Th
3100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
3110: 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 53  lled to handle S
3120: 51 4c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  QL of the follow
3130: 69 6e 67 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  ing forms:.**.**
3140: 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20      insert into 
3150: 54 41 42 4c 45 20 28 49 44 4c 49 53 54 29 20 76  TABLE (IDLIST) v
3160: 61 6c 75 65 73 28 45 58 50 52 4c 49 53 54 29 2c  alues(EXPRLIST),
3170: 28 45 58 50 52 4c 49 53 54 29 2c 2e 2e 2e 0a 2a  (EXPRLIST),....*
3180: 2a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  *    insert into
3190: 20 54 41 42 4c 45 20 28 49 44 4c 49 53 54 29 20   TABLE (IDLIST) 
31a0: 73 65 6c 65 63 74 0a 2a 2a 20 20 20 20 69 6e 73  select.**    ins
31b0: 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45 20 28  ert into TABLE (
31c0: 49 44 4c 49 53 54 29 20 64 65 66 61 75 6c 74 20  IDLIST) default 
31d0: 76 61 6c 75 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65  values.**.** The
31e0: 20 49 44 4c 49 53 54 20 66 6f 6c 6c 6f 77 69 6e   IDLIST followin
31f0: 67 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  g the table name
3200: 20 69 73 20 61 6c 77 61 79 73 20 6f 70 74 69 6f   is always optio
3210: 6e 61 6c 2e 20 20 49 66 20 6f 6d 69 74 74 65 64  nal.  If omitted
3220: 2c 0a 2a 2a 20 74 68 65 6e 20 61 20 6c 69 73 74  ,.** then a list
3230: 20 6f 66 20 61 6c 6c 20 28 6e 6f 6e 2d 68 69 64   of all (non-hid
3240: 64 65 6e 29 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  den) columns for
3250: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 73 75   the table is su
3260: 62 73 74 69 74 75 74 65 64 2e 0a 2a 2a 20 54 68  bstituted..** Th
3270: 65 20 49 44 4c 49 53 54 20 61 70 70 65 61 72 73  e IDLIST appears
3280: 20 69 6e 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20   in the pColumn 
3290: 70 61 72 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c  parameter.  pCol
32a0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 20 69 66 20 49  umn is NULL if I
32b0: 44 4c 49 53 54 0a 2a 2a 20 69 73 20 6f 6d 69 74  DLIST.** is omit
32c0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
32d0: 68 65 20 70 53 65 6c 65 63 74 20 70 61 72 61 6d  he pSelect param
32e0: 65 74 65 72 20 68 6f 6c 64 73 20 74 68 65 20 76  eter holds the v
32f0: 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73 65  alues to be inse
3300: 72 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  rted for the.** 
3310: 66 69 72 73 74 20 74 77 6f 20 66 6f 72 6d 73 20  first two forms 
3320: 73 68 6f 77 6e 20 61 62 6f 76 65 2e 20 20 41 20  shown above.  A 
3330: 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20 69 73  VALUES clause is
3340: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 73 68 6f   really just sho
3350: 72 74 2d 68 61 6e 64 0a 2a 2a 20 66 6f 72 20 61  rt-hand.** for a
3360: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3370: 74 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  t that omits the
3380: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64   FROM clause and
3390: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
33a0: 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  .** that follows
33b0: 2e 20 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  .  If the pSelec
33c0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 4e  t parameter is N
33d0: 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ULL, that means 
33e0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 44 45 46 41  that the.** DEFA
33f0: 55 4c 54 20 56 41 4c 55 45 53 20 66 6f 72 6d 20  ULT VALUES form 
3400: 6f 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74  of the INSERT st
3410: 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 74 65 6e  atement is inten
3420: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
3430: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
3440: 6c 6c 6f 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75  llows one of fou
3450: 72 20 74 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f  r templates.  Fo
3460: 72 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 69 6e  r a simple.** in
3470: 73 65 72 74 20 77 69 74 68 20 64 61 74 61 20 63  sert with data c
3480: 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 73 69 6e  oming from a sin
3490: 67 6c 65 2d 72 6f 77 20 56 41 4c 55 45 53 20 63  gle-row VALUES c
34a0: 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 64 65 20  lause, the code 
34b0: 65 78 65 63 75 74 65 73 0a 2a 2a 20 6f 6e 63 65  executes.** once
34c0: 20 73 74 72 61 69 67 68 74 20 64 6f 77 6e 20 74   straight down t
34d0: 68 72 6f 75 67 68 2e 20 20 50 73 65 75 64 6f 2d  hrough.  Pseudo-
34e0: 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20 28 77 65  code follows (we
34f0: 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 74 68   call this.** th
3500: 65 20 22 31 73 74 20 74 65 6d 70 6c 61 74 65 22  e "1st template"
3510: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  ):.**.**        
3520: 20 6f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73   open write curs
3530: 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61 6e  or to <table> an
3540: 64 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a  d its indices.**
3550: 20 20 20 20 20 20 20 20 20 70 75 74 20 56 41 4c           put VAL
3560: 55 45 53 20 63 6c 61 75 73 65 20 65 78 70 72 65  UES clause expre
3570: 73 73 69 6f 6e 73 20 69 6e 74 6f 20 72 65 67 69  ssions into regi
3580: 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
3590: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
35a0: 74 69 6e 67 20 72 65 63 6f 72 64 20 69 6e 74 6f  ting record into
35b0: 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20   <table>.**     
35c0: 20 20 20 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a      cleanup.**.*
35d0: 2a 20 54 68 65 20 74 68 72 65 65 20 72 65 6d 61  * The three rema
35e0: 69 6e 69 6e 67 20 74 65 6d 70 6c 61 74 65 73 20  ining templates 
35f0: 61 73 73 75 6d 65 20 74 68 65 20 73 74 61 74 65  assume the state
3600: 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
3610: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45  orm.**.**   INSE
3620: 52 54 20 49 4e 54 4f 20 3c 74 61 62 6c 65 3e 20  RT INTO <table> 
3630: 53 45 4c 45 43 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  SELECT ....**.**
3640: 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   If the SELECT c
3650: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
3660: 72 65 73 74 72 69 63 74 65 64 20 66 6f 72 6d 20  restricted form 
3670: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c  "SELECT * FROM <
3680: 74 61 62 6c 65 32 3e 22 20 2d 0a 2a 2a 20 69 6e  table2>" -.** in
3690: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
36a0: 74 68 65 20 53 45 4c 45 43 54 20 70 75 6c 6c 73  the SELECT pulls
36b0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f   all columns fro
36c0: 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  m a single table
36d0: 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 69 73  .** and there is
36e0: 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 4c 49 4d   no WHERE or LIM
36f0: 49 54 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  IT or GROUP BY o
3700: 72 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  r ORDER BY claus
3710: 65 73 2c 20 61 6e 64 0a 2a 2a 20 69 66 20 3c 74  es, and.** if <t
3720: 61 62 6c 65 32 3e 20 61 6e 64 20 3c 74 61 62 6c  able2> and <tabl
3730: 65 31 3e 20 61 72 65 20 64 69 73 74 69 6e 63 74  e1> are distinct
3740: 20 74 61 62 6c 65 73 20 62 75 74 20 68 61 76 65   tables but have
3750: 20 69 64 65 6e 74 69 63 61 6c 0a 2a 2a 20 73 63   identical.** sc
3760: 68 65 6d 61 73 2c 20 69 6e 63 6c 75 64 69 6e 67  hemas, including
3770: 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 69 6e   all the same in
3780: 64 69 63 65 73 2c 20 74 68 65 6e 20 61 20 73 70  dices, then a sp
3790: 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69  ecial optimizati
37a0: 6f 6e 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64  on.** is invoked
37b0: 20 74 68 61 74 20 63 6f 70 69 65 73 20 72 61 77   that copies raw
37c0: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 3c 74   records from <t
37d0: 61 62 6c 65 32 3e 20 6f 76 65 72 20 74 6f 20 3c  able2> over to <
37e0: 74 61 62 6c 65 31 3e 2e 0a 2a 2a 20 53 65 65 20  table1>..** See 
37f0: 74 68 65 20 78 66 65 72 4f 70 74 69 6d 69 7a 61  the xferOptimiza
3800: 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20  tion() function 
3810: 66 6f 72 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  for the implemen
3820: 74 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 0a 2a  tation of this.*
3830: 2a 20 74 65 6d 70 6c 61 74 65 2e 20 20 54 68 69  * template.  Thi
3840: 73 20 69 73 20 74 68 65 20 32 6e 64 20 74 65 6d  s is the 2nd tem
3850: 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  plate..**.**    
3860: 20 20 20 20 20 6f 70 65 6e 20 61 20 77 72 69 74       open a writ
3870: 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62  e cursor to <tab
3880: 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  le>.**         o
3890: 70 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 20  pen read cursor 
38a0: 6f 6e 20 3c 74 61 62 6c 65 32 3e 0a 2a 2a 20 20  on <table2>.**  
38b0: 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 20         transfer 
38c0: 61 6c 6c 20 72 65 63 6f 72 64 73 20 69 6e 20 3c  all records in <
38d0: 74 61 62 6c 65 32 3e 20 6f 76 65 72 20 74 6f 20  table2> over to 
38e0: 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20  <table>.**      
38f0: 20 20 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73     close cursors
3900: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 65  .**         fore
3910: 61 63 68 20 69 6e 64 65 78 20 6f 6e 20 3c 74 61  ach index on <ta
3920: 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble>.**         
3930: 20 20 6f 70 65 6e 20 61 20 77 72 69 74 65 20 63    open a write c
3940: 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 3c 74 61  ursor on the <ta
3950: 62 6c 65 3e 20 69 6e 64 65 78 0a 2a 2a 20 20 20  ble> index.**   
3960: 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20 72          open a r
3970: 65 61 64 20 63 75 72 73 6f 72 20 6f 6e 20 74 68  ead cursor on th
3980: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
3990: 3c 74 61 62 6c 65 32 3e 20 69 6e 64 65 78 0a 2a  <table2> index.*
39a0: 2a 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e  *           tran
39b0: 73 66 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73  sfer all records
39c0: 20 66 72 6f 6d 20 74 68 65 20 72 65 61 64 20 74   from the read t
39d0: 6f 20 74 68 65 20 77 72 69 74 65 20 63 75 72 73  o the write curs
39e0: 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ors.**          
39f0: 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 0a 2a   close cursors.*
3a00: 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 66 6f  *         end fo
3a10: 72 65 61 63 68 0a 2a 2a 0a 2a 2a 20 54 68 65 20  reach.**.** The 
3a20: 33 72 64 20 74 65 6d 70 6c 61 74 65 20 69 73 20  3rd template is 
3a30: 66 6f 72 20 77 68 65 6e 20 74 68 65 20 73 65 63  for when the sec
3a40: 6f 6e 64 20 74 65 6d 70 6c 61 74 65 20 64 6f 65  ond template doe
3a50: 73 20 6e 6f 74 20 61 70 70 6c 79 0a 2a 2a 20 61  s not apply.** a
3a60: 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20 63 6c  nd the SELECT cl
3a70: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 72 65  ause does not re
3a80: 61 64 20 66 72 6f 6d 20 3c 74 61 62 6c 65 3e 20  ad from <table> 
3a90: 61 74 20 61 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20  at any time..** 
3aa0: 54 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f  The generated co
3ab0: 64 65 20 66 6f 6c 6c 6f 77 73 20 74 68 69 73 20  de follows this 
3ac0: 74 65 6d 70 6c 61 74 65 3a 0a 2a 2a 0a 2a 2a 20  template:.**.** 
3ad0: 20 20 20 20 20 20 20 20 58 20 3c 2d 20 41 0a 2a          X <- A.*
3ae0: 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 42  *         goto B
3af0: 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73 65 74 75  .**      A: setu
3b00: 70 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  p for the SELECT
3b10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c 6f 6f 70  .**         loop
3b20: 20 6f 76 65 72 20 74 68 65 20 72 6f 77 73 20 69   over the rows i
3b30: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
3b40: 20 20 20 20 20 20 20 20 20 20 6c 6f 61 64 20 76            load v
3b50: 61 6c 75 65 73 20 69 6e 74 6f 20 72 65 67 69 73  alues into regis
3b60: 74 65 72 73 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20  ters R..R+n.**  
3b70: 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 58           yield X
3b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20  .**         end 
3b90: 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  loop.**         
3ba0: 63 6c 65 61 6e 75 70 20 61 66 74 65 72 20 74 68  cleanup after th
3bb0: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  e SELECT.**     
3bc0: 20 20 20 20 65 6e 64 2d 63 6f 72 6f 75 74 69 6e      end-coroutin
3bd0: 65 20 58 0a 2a 2a 20 20 20 20 20 20 42 3a 20 6f  e X.**      B: o
3be0: 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
3bf0: 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20   to <table> and 
3c00: 69 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20  its indices.**  
3c10: 20 20 20 20 43 3a 20 79 69 65 6c 64 20 58 2c 20      C: yield X, 
3c20: 61 74 20 45 4f 46 20 67 6f 74 6f 20 44 0a 2a 2a  at EOF goto D.**
3c30: 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20           insert 
3c40: 74 68 65 20 73 65 6c 65 63 74 20 72 65 73 75 6c  the select resul
3c50: 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 20 66  t into <table> f
3c60: 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 2a 2a 20 20 20  rom R..R+n.**   
3c70: 20 20 20 20 20 20 67 6f 74 6f 20 43 0a 2a 2a 20        goto C.** 
3c80: 20 20 20 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a       D: cleanup.
3c90: 2a 2a 0a 2a 2a 20 54 68 65 20 34 74 68 20 74 65  **.** The 4th te
3ca0: 6d 70 6c 61 74 65 20 69 73 20 75 73 65 64 20 69  mplate is used i
3cb0: 66 20 74 68 65 20 69 6e 73 65 72 74 20 73 74 61  f the insert sta
3cc0: 74 65 6d 65 6e 74 20 74 61 6b 65 73 20 69 74 73  tement takes its
3cd0: 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  .** values from 
3ce0: 61 20 53 45 4c 45 43 54 20 62 75 74 20 74 68 65  a SELECT but the
3cf0: 20 64 61 74 61 20 69 73 20 62 65 69 6e 67 20 69   data is being i
3d00: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 20 74  nserted into a t
3d10: 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20  able.** that is 
3d20: 61 6c 73 6f 20 72 65 61 64 20 61 73 20 70 61 72  also read as par
3d30: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
3d40: 20 20 49 6e 20 74 68 65 20 74 68 69 72 64 20 66    In the third f
3d50: 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61 76 65 20  orm,.** we have 
3d60: 74 6f 20 75 73 65 20 61 6e 20 69 6e 74 65 72 6d  to use an interm
3d70: 65 64 69 61 74 65 20 74 61 62 6c 65 20 74 6f 20  ediate table to 
3d80: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
3d90: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 6c 65  s of.** the sele
3da0: 63 74 2e 20 20 54 68 65 20 74 65 6d 70 6c 61 74  ct.  The templat
3db0: 65 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  e is like this:.
3dc0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 58 20  **.**         X 
3dd0: 3c 2d 20 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  <- A.**         
3de0: 67 6f 74 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41  goto B.**      A
3df0: 3a 20 73 65 74 75 70 20 66 6f 72 20 74 68 65 20  : setup for the 
3e00: 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
3e10: 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20    loop over the 
3e20: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 53 45  tables in the SE
3e30: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
3e40: 20 20 6c 6f 61 64 20 76 61 6c 75 65 20 69 6e 74    load value int
3e50: 6f 20 72 65 67 69 73 74 65 72 20 52 2e 2e 52 2b  o register R..R+
3e60: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 79  n.**           y
3e70: 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20 20 20 20  ield X.**       
3e80: 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20    end loop.**   
3e90: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 20 61 66        cleanup af
3ea0: 74 65 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a  ter the SELECT.*
3eb0: 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 63 6f  *         end co
3ec0: 2d 72 6f 75 74 69 6e 65 20 52 0a 2a 2a 20 20 20  -routine R.**   
3ed0: 20 20 20 42 3a 20 6f 70 65 6e 20 74 65 6d 70 20     B: open temp 
3ee0: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 4c 3a  table.**      L:
3ef0: 20 79 69 65 6c 64 20 58 2c 20 61 74 20 45 4f 46   yield X, at EOF
3f00: 20 67 6f 74 6f 20 4d 0a 2a 2a 20 20 20 20 20 20   goto M.**      
3f10: 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20 66 72     insert row fr
3f20: 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74  om R..R+n into t
3f30: 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  emp table.**    
3f40: 20 20 20 20 20 67 6f 74 6f 20 4c 0a 2a 2a 20 20       goto L.**  
3f50: 20 20 20 20 4d 3a 20 6f 70 65 6e 20 77 72 69 74      M: open writ
3f60: 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62  e cursor to <tab
3f70: 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69  le> and its indi
3f80: 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  ces.**         r
3f90: 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62 6c 65  ewind temp table
3fa0: 0a 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f 6f 70  .**      C: loop
3fb0: 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20 69 6e   over rows of in
3fc0: 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65  termediate table
3fd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 72  .**           tr
3fe0: 61 6e 73 66 65 72 20 76 61 6c 75 65 73 20 66 6f  ansfer values fo
3ff0: 72 6d 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  rm intermediate 
4000: 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74 61 62 6c  table into <tabl
4010: 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e  e>.**         en
4020: 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 44  d loop.**      D
4030: 3a 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f 69  : cleanup.*/.voi
4040: 64 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28  d sqlite3Insert(
4050: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4060: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
4070: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4080: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
4090: 74 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  t,    /* Name of
40a0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
40b0: 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69  h we are inserti
40c0: 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ng */.  Select *
40d0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
40e0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
40f0: 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20 74 68  ent to use as th
4100: 65 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f  e data source */
4110: 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f 6c 75  .  IdList *pColu
4120: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75  mn,      /* Colu
4130: 6d 6e 20 6e 61 6d 65 73 20 63 6f 72 72 65 73 70  mn names corresp
4140: 6f 6e 64 69 6e 67 20 74 6f 20 49 44 4c 49 53 54  onding to IDLIST
4150: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  . */.  int onErr
4160: 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or           /* 
4170: 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f  How to handle co
4180: 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72 73 20  nstraint errors 
4190: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
41a0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
41b0: 20 54 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   The main databa
41c0: 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  se structure */.
41d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
41e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
41f0: 61 62 6c 65 20 74 6f 20 69 6e 73 65 72 74 20 69  able to insert i
4200: 6e 74 6f 2e 20 20 61 6b 61 20 54 41 42 4c 45 20  nto.  aka TABLE 
4210: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
4230: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
4240: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
4250: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
4260: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
4270: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
4280: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
4290: 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
42a0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
42b0: 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
42c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
42d0: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
42e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
42f0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 61 74  lumns in the dat
4300: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 64 64  a */.  int nHidd
4310: 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  en = 0;      /* 
4320: 4e 75 6d 62 65 72 20 6f 66 20 68 69 64 64 65 6e  Number of hidden
4330: 20 63 6f 6c 75 6d 6e 73 20 69 66 20 54 41 42 4c   columns if TABL
4340: 45 20 69 73 20 76 69 72 74 75 61 6c 20 2a 2f 0a  E is virtual */.
4350: 20 20 69 6e 74 20 69 44 61 74 61 43 75 72 20 3d    int iDataCur =
4360: 20 30 3b 20 20 20 20 20 2f 2a 20 56 44 42 45 20   0;     /* VDBE 
4370: 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 74  cursor that is t
4380: 68 65 20 6d 61 69 6e 20 64 61 74 61 20 72 65 70  he main data rep
4390: 6f 73 69 74 6f 72 79 20 2a 2f 0a 20 20 69 6e 74  ository */.  int
43a0: 20 69 49 64 78 43 75 72 20 3d 20 30 3b 20 20 20   iIdxCur = 0;   
43b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65     /* First inde
43c0: 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  x cursor */.  in
43d0: 74 20 69 70 6b 43 6f 6c 75 6d 6e 20 3d 20 2d 31  t ipkColumn = -1
43e0: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68  ;   /* Column th
43f0: 61 74 20 69 73 20 74 68 65 20 49 4e 54 45 47 45  at is the INTEGE
4400: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
4410: 0a 20 20 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70  .  int endOfLoop
4420: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
4430: 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
4440: 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 20 6c   the insertion l
4450: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  oop */.  int src
4460: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Tab = 0;       /
4470: 2a 20 44 61 74 61 20 63 6f 6d 65 73 20 66 72 6f  * Data comes fro
4480: 6d 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  m this temporary
4490: 20 63 75 72 73 6f 72 20 69 66 20 3e 3d 30 20 2a   cursor if >=0 *
44a0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 73 54  /.  int addrInsT
44b0: 6f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 4a 75 6d  op = 0;   /* Jum
44c0: 70 20 74 6f 20 6c 61 62 65 6c 20 22 44 22 20 2a  p to label "D" *
44d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
44e0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 6f 70   = 0;     /* Top
44f0: 20 6f 66 20 69 6e 73 65 72 74 20 6c 6f 6f 70 2e   of insert loop.
4500: 20 4c 61 62 65 6c 20 22 43 22 20 69 6e 20 74 65   Label "C" in te
4510: 6d 70 6c 61 74 65 73 20 33 20 61 6e 64 20 34 20  mplates 3 and 4 
4520: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
4530: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 44 65  dest;      /* De
4540: 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 53 45  stination for SE
4550: 4c 45 43 54 20 6f 6e 20 72 68 73 20 6f 66 20 49  LECT on rhs of I
4560: 4e 53 45 52 54 20 2a 2f 0a 20 20 69 6e 74 20 69  NSERT */.  int i
4570: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4580: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
4590: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 54 41  abase holding TA
45a0: 42 4c 45 20 2a 2f 0a 20 20 75 38 20 75 73 65 54  BLE */.  u8 useT
45b0: 65 6d 70 54 61 62 6c 65 20 3d 20 30 3b 20 20 2f  empTable = 0;  /
45c0: 2a 20 53 74 6f 72 65 20 53 45 4c 45 43 54 20 72  * Store SELECT r
45d0: 65 73 75 6c 74 73 20 69 6e 20 69 6e 74 65 72 6d  esults in interm
45e0: 65 64 69 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a  ediate table */.
45f0: 20 20 75 38 20 61 70 70 65 6e 64 46 6c 61 67 20    u8 appendFlag 
4600: 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  = 0;    /* True 
4610: 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 69 73  if the insert is
4620: 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e   likely to be an
4630: 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20   append */.  u8 
4640: 77 69 74 68 6f 75 74 52 6f 77 69 64 3b 20 20 20  withoutRowid;   
4650: 20 20 20 2f 2a 20 30 20 66 6f 72 20 6e 6f 72 6d     /* 0 for norm
4660: 61 6c 20 74 61 62 6c 65 2e 20 20 31 20 66 6f 72  al table.  1 for
4670: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
4680: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 62 49 64  able */.  u8 bId
4690: 4c 69 73 74 49 6e 4f 72 64 65 72 3b 20 20 20 20  ListInOrder;    
46a0: 2f 2a 20 54 72 75 65 20 69 66 20 49 44 4c 49 53  /* True if IDLIS
46b0: 54 20 69 73 20 69 6e 20 74 61 62 6c 65 20 6f 72  T is in table or
46c0: 64 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  der */.  ExprLis
46d0: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 2f  t *pList = 0;  /
46e0: 2a 20 4c 69 73 74 20 6f 66 20 56 41 4c 55 45 53  * List of VALUES
46f0: 28 29 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  () to be inserte
4700: 64 20 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 67 69  d  */..  /* Regi
4710: 73 74 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  ster allocations
4720: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 6f   */.  int regFro
4730: 6d 53 65 6c 65 63 74 20 3d 20 30 3b 2f 2a 20 42  mSelect = 0;/* B
4740: 61 73 65 20 72 65 67 69 73 74 65 72 20 66 6f 72  ase register for
4750: 20 64 61 74 61 20 63 6f 6d 69 6e 67 20 66 72 6f   data coming fro
4760: 6d 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e  m SELECT */.  in
4770: 74 20 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 30  t regAutoinc = 0
4780: 3b 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ;   /* Register 
4790: 68 6f 6c 64 69 6e 67 20 74 68 65 20 41 55 54 4f  holding the AUTO
47a0: 49 4e 43 52 45 4d 45 4e 54 20 63 6f 75 6e 74 65  INCREMENT counte
47b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f  r */.  int regRo
47c0: 77 43 6f 75 6e 74 20 3d 20 30 3b 20 20 2f 2a 20  wCount = 0;  /* 
47d0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65 64  Memory cell used
47e0: 20 66 6f 72 20 74 68 65 20 72 6f 77 20 63 6f 75   for the row cou
47f0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nter */.  int re
4800: 67 49 6e 73 3b 20 20 20 20 20 20 20 20 20 20 20  gIns;           
4810: 2f 2a 20 42 6c 6f 63 6b 20 6f 66 20 72 65 67 73  /* Block of regs
4820: 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 2b 64   holding rowid+d
4830: 61 74 61 20 62 65 69 6e 67 20 69 6e 73 65 72 74  ata being insert
4840: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ed */.  int regR
4850: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  owid;         /*
4860: 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
4870: 6e 67 20 69 6e 73 65 72 74 20 72 6f 77 69 64 20  ng insert rowid 
4880: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
4890: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  ;          /* re
48a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 66  gister holding f
48b0: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 69  irst column to i
48c0: 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  nsert */.  int *
48d0: 61 52 65 67 49 64 78 20 3d 20 30 3b 20 20 20 20  aRegIdx = 0;    
48e0: 20 2f 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72   /* One register
48f0: 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 65 61   allocated to ea
4900: 63 68 20 69 6e 64 65 78 20 2a 2f 0a 0a 23 69 66  ch index */..#if
4910: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4920: 5f 54 52 49 47 47 45 52 0a 20 20 69 6e 74 20 69  _TRIGGER.  int i
4930: 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20 20  sView;          
4940: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4950: 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  f attempting to 
4960: 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 76 69  insert into a vi
4970: 65 77 20 2a 2f 0a 20 20 54 72 69 67 67 65 72 20  ew */.  Trigger 
4980: 2a 70 54 72 69 67 67 65 72 3b 20 20 20 20 20 20  *pTrigger;      
4990: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
49a0: 72 69 67 67 65 72 73 20 6f 6e 20 70 54 61 62 2c  riggers on pTab,
49b0: 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
49c0: 20 20 69 6e 74 20 74 6d 61 73 6b 3b 20 20 20 20    int tmask;    
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
49e0: 20 4d 61 73 6b 20 6f 66 20 74 72 69 67 67 65 72   Mask of trigger
49f0: 20 74 69 6d 65 73 20 2a 2f 0a 23 65 6e 64 69 66   times */.#endif
4a00: 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
4a10: 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  >db;.  if( pPars
4a20: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
4a30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
4a40: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
4a50: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 64 65  leanup;.  }.  de
4a60: 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 30 3b 20  st.iSDParm = 0; 
4a70: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 61 20 68   /* Suppress a h
4a80: 61 72 6d 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  armless compiler
4a90: 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 2f   warning */..  /
4aa0: 2a 20 49 66 20 74 68 65 20 53 65 6c 65 63 74 20  * If the Select 
4ab0: 6f 62 6a 65 63 74 20 69 73 20 72 65 61 6c 6c 79  object is really
4ac0: 20 6a 75 73 74 20 61 20 73 69 6d 70 6c 65 20 56   just a simple V
4ad0: 41 4c 55 45 53 28 29 20 6c 69 73 74 20 77 69 74  ALUES() list wit
4ae0: 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20  h a.  ** single 
4af0: 72 6f 77 20 28 74 68 65 20 63 6f 6d 6d 6f 6e 20  row (the common 
4b00: 63 61 73 65 29 20 74 68 65 6e 20 6b 65 65 70 20  case) then keep 
4b10: 74 68 61 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  that one row of 
4b20: 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 6e 64 20  values.  ** and 
4b30: 64 69 73 63 61 72 64 20 74 68 65 20 6f 74 68 65  discard the othe
4b40: 72 20 28 75 6e 75 73 65 64 29 20 70 61 72 74 73  r (unused) parts
4b50: 20 6f 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   of the pSelect 
4b60: 6f 62 6a 65 63 74 0a 20 20 2a 2f 0a 20 20 69 66  object.  */.  if
4b70: 28 20 70 53 65 6c 65 63 74 20 26 26 20 28 70 53  ( pSelect && (pS
4b80: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
4b90: 26 20 53 46 5f 56 61 6c 75 65 73 29 21 3d 30 20  & SF_Values)!=0 
4ba0: 26 26 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  && pSelect->pPri
4bb0: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  or==0 ){.    pLi
4bc0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
4bd0: 4c 69 73 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  List;.    pSelec
4be0: 74 2d 3e 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20  t->pEList = 0;. 
4bf0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
4c00: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
4c10: 63 74 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  ct);.    pSelect
4c20: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
4c30: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
4c40: 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77   into which we w
4c50: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
4c60: 20 6e 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   new information
4c70: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
4c80: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d   pTabList->nSrc=
4c90: 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  =1 );.  pTab = s
4ca0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
4cb0: 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 61 62  kup(pParse, pTab
4cc0: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 54 61  List);.  if( pTa
4cd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  b==0 ){.    goto
4ce0: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
4cf0: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
4d00: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
4d10: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
4d20: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
4d30: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
4d40: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4d50: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
4d60: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 70 54 61  LITE_INSERT, pTa
4d70: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  b->zName, 0,.   
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d90: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
4da0: 2e 7a 44 62 53 4e 61 6d 65 29 20 29 7b 0a 20 20  .zDbSName) ){.  
4db0: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
4dc0: 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 77 69 74  eanup;.  }.  wit
4dd0: 68 6f 75 74 52 6f 77 69 64 20 3d 20 21 48 61 73  houtRowid = !Has
4de0: 52 6f 77 69 64 28 70 54 61 62 29 3b 0a 0a 20 20  Rowid(pTab);..  
4df0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
4e00: 20 77 65 20 68 61 76 65 20 61 6e 79 20 74 72 69   we have any tri
4e10: 67 67 65 72 73 20 61 6e 64 20 69 66 20 74 68 65  ggers and if the
4e20: 20 74 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a   table being.  *
4e30: 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
4e40: 69 73 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a 23  is a view.  */.#
4e50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4e60: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 70 54 72  IT_TRIGGER.  pTr
4e70: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
4e80: 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61  riggersExist(pPa
4e90: 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 49 4e  rse, pTab, TK_IN
4ea0: 53 45 52 54 2c 20 30 2c 20 26 74 6d 61 73 6b 29  SERT, 0, &tmask)
4eb0: 3b 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54 61  ;.  isView = pTa
4ec0: 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 23  b->pSelect!=0;.#
4ed0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 54  else.# define pT
4ee0: 72 69 67 67 65 72 20 30 0a 23 20 64 65 66 69 6e  rigger 0.# defin
4ef0: 65 20 74 6d 61 73 6b 20 30 0a 23 20 64 65 66 69  e tmask 0.# defi
4f00: 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65 6e 64  ne isView 0.#end
4f10: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4f20: 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 75 6e 64  _OMIT_VIEW.# und
4f30: 65 66 20 69 73 56 69 65 77 0a 23 20 64 65 66 69  ef isView.# defi
4f40: 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65 6e 64  ne isView 0.#end
4f50: 69 66 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  if.  assert( (pT
4f60: 72 69 67 67 65 72 20 26 26 20 74 6d 61 73 6b 29  rigger && tmask)
4f70: 20 7c 7c 20 28 70 54 72 69 67 67 65 72 3d 3d 30   || (pTrigger==0
4f80: 20 26 26 20 74 6d 61 73 6b 3d 3d 30 29 20 29 3b   && tmask==0) );
4f90: 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
4fa0: 73 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 2c  s really a view,
4fb0: 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 68 61   make sure it ha
4fc0: 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
4fd0: 65 64 2e 0a 20 20 2a 2a 20 56 69 65 77 47 65 74  ed..  ** ViewGet
4fe0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 69 73  ColumnNames() is
4ff0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 70 54 61 62   a no-op if pTab
5000: 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 2e 0a   is not a view..
5010: 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
5020: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
5030: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
5040: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  b) ){.    goto i
5050: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
5060: 20 7d 0a 0a 20 20 2f 2a 20 43 61 6e 6e 6f 74 20   }..  /* Cannot 
5070: 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 72 65  insert into a re
5080: 61 64 2d 6f 6e 6c 79 20 74 61 62 6c 65 2e 0a 20  ad-only table.. 
5090: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
50a0: 33 49 73 52 65 61 64 4f 6e 6c 79 28 70 50 61 72  3IsReadOnly(pPar
50b0: 73 65 2c 20 70 54 61 62 2c 20 74 6d 61 73 6b 29  se, pTab, tmask)
50c0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73   ){.    goto ins
50d0: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ert_cleanup;.  }
50e0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
50f0: 61 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 76 20  a VDBE.  */.  v 
5100: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
5110: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
5120: 76 3d 3d 30 20 29 20 67 6f 74 6f 20 69 6e 73 65  v==0 ) goto inse
5130: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69 66  rt_cleanup;.  if
5140: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
5150: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
5160: 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76 29  eCountChanges(v)
5170: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
5180: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
5190: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 20 7c  Parse, pSelect |
51a0: 7c 20 70 54 72 69 67 67 65 72 2c 20 69 44 62 29  | pTrigger, iDb)
51b0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
51c0: 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 0a  E_OMIT_XFER_OPT.
51d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
51e0: 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
51f0: 66 6f 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  form.  **.  **  
5200: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5210: 20 3c 74 61 62 6c 65 31 3e 20 53 45 4c 45 43 54   <table1> SELECT
5220: 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 32 3e   * FROM <table2>
5230: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
5240: 20 73 70 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a   special optimiz
5250: 61 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 61 70  ations can be ap
5260: 70 6c 69 65 64 20 74 68 61 74 20 6d 61 6b 65 20  plied that make 
5270: 74 68 65 20 74 72 61 6e 73 66 65 72 0a 20 20 2a  the transfer.  *
5280: 2a 20 76 65 72 79 20 66 61 73 74 20 61 6e 64 20  * very fast and 
5290: 77 68 69 63 68 20 72 65 64 75 63 65 20 66 72 61  which reduce fra
52a0: 67 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 6e  gmentation of in
52b0: 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dices..  **.  **
52c0: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 6e 64   This is the 2nd
52d0: 20 74 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f 0a   template..  */.
52e0: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30    if( pColumn==0
52f0: 20 26 26 20 78 66 65 72 4f 70 74 69 6d 69 7a 61   && xferOptimiza
5300: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
5310: 62 2c 20 70 53 65 6c 65 63 74 2c 20 6f 6e 45 72  b, pSelect, onEr
5320: 72 6f 72 2c 20 69 44 62 29 20 29 7b 0a 20 20 20  ror, iDb) ){.   
5330: 20 61 73 73 65 72 74 28 20 21 70 54 72 69 67 67   assert( !pTrigg
5340: 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  er );.    assert
5350: 28 20 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  ( pList==0 );.  
5360: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 65 6e    goto insert_en
5370: 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  d;.  }.#endif /*
5380: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45   SQLITE_OMIT_XFE
5390: 52 5f 4f 50 54 20 2a 2f 0a 0a 20 20 2f 2a 20 49  R_OPT */..  /* I
53a0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 41 55 54  f this is an AUT
53b0: 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65  OINCREMENT table
53c0: 2c 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65  , look up the se
53d0: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e  quence number in
53e0: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
53f0: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
5400: 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
5410: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 72 65 67 41  memory cell regA
5420: 75 74 6f 69 6e 63 2e 0a 20 20 2a 2f 0a 20 20 72  utoinc..  */.  r
5430: 65 67 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f  egAutoinc = auto
5440: 49 6e 63 42 65 67 69 6e 28 70 50 61 72 73 65 2c  IncBegin(pParse,
5450: 20 69 44 62 2c 20 70 54 61 62 29 3b 0a 0a 20 20   iDb, pTab);..  
5460: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69  /* Allocate regi
5470: 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e  sters for holdin
5480: 67 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  g the rowid of t
5490: 68 65 20 6e 65 77 20 72 6f 77 2c 0a 20 20 2a 2a  he new row,.  **
54a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
54b0: 74 68 65 20 6e 65 77 20 72 6f 77 2c 20 61 6e 64  the new row, and
54c0: 20 74 68 65 20 61 73 73 65 6d 62 6c 65 64 20 72   the assembled r
54d0: 6f 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  ow record..  */.
54e0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67    regRowid = reg
54f0: 49 6e 73 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Ins = pParse->nM
5500: 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e  em+1;.  pParse->
5510: 6e 4d 65 6d 20 2b 3d 20 70 54 61 62 2d 3e 6e 43  nMem += pTab->nC
5520: 6f 6c 20 2b 20 31 3b 0a 20 20 69 66 28 20 49 73  ol + 1;.  if( Is
5530: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
5540: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 2b 2b 3b  .    regRowid++;
5550: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5560: 6d 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 67 44 61  m++;.  }.  regDa
5570: 74 61 20 3d 20 72 65 67 52 6f 77 69 64 2b 31 3b  ta = regRowid+1;
5580: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 49 4e  ..  /* If the IN
5590: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 69  SERT statement i
55a0: 6e 63 6c 75 64 65 64 20 61 6e 20 49 44 4c 49 53  ncluded an IDLIS
55b0: 54 20 74 65 72 6d 2c 20 74 68 65 6e 20 6d 61 6b  T term, then mak
55c0: 65 20 73 75 72 65 0a 20 20 2a 2a 20 61 6c 6c 20  e sure.  ** all 
55d0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
55e0: 49 44 4c 49 53 54 20 72 65 61 6c 6c 79 20 61 72  IDLIST really ar
55f0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
5600: 20 74 61 62 6c 65 20 61 6e 64 20 0a 20 20 2a 2a   table and .  **
5610: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f   remember the co
5620: 6c 75 6d 6e 20 69 6e 64 69 63 65 73 2e 0a 20 20  lumn indices..  
5630: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 74  **.  ** If the t
5640: 61 62 6c 65 20 68 61 73 20 61 6e 20 49 4e 54 45  able has an INTE
5650: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
5660: 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 61 74 20  column and that 
5670: 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 69 73 20 6e  column.  ** is n
5680: 61 6d 65 64 20 69 6e 20 74 68 65 20 49 44 4c 49  amed in the IDLI
5690: 53 54 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  ST, then record 
56a0: 69 6e 20 74 68 65 20 69 70 6b 43 6f 6c 75 6d 6e  in the ipkColumn
56b0: 20 76 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 74   variable.  ** t
56c0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 49 44  he index into ID
56d0: 4c 49 53 54 20 6f 66 20 74 68 65 20 70 72 69 6d  LIST of the prim
56e0: 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 2e 20  ary key column. 
56f0: 20 69 70 6b 43 6f 6c 75 6d 6e 20 69 73 0a 20 20   ipkColumn is.  
5700: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
5710: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
5720: 61 73 20 69 74 20 61 70 70 65 61 72 73 20 69 6e  as it appears in
5730: 20 49 44 4c 49 53 54 2c 20 6e 6f 74 20 61 73 0a   IDLIST, not as.
5740: 20 20 2a 2a 20 69 73 20 61 70 70 65 61 72 73 20    ** is appears 
5750: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
5760: 74 61 62 6c 65 2e 20 20 28 54 68 65 20 69 6e 64  table.  (The ind
5770: 65 78 20 6f 66 20 74 68 65 20 49 4e 54 45 47 45  ex of the INTEGE
5780: 52 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  R.  ** PRIMARY K
5790: 45 59 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  EY in the origin
57a0: 61 6c 20 74 61 62 6c 65 20 69 73 20 70 54 61 62  al table is pTab
57b0: 2d 3e 69 50 4b 65 79 2e 29 0a 20 20 2a 2f 0a 20  ->iPKey.).  */. 
57c0: 20 62 49 64 4c 69 73 74 49 6e 4f 72 64 65 72 20   bIdListInOrder 
57d0: 3d 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  = (pTab->tabFlag
57e0: 73 20 26 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e  s & TF_OOOHidden
57f0: 29 3d 3d 30 3b 0a 20 20 69 66 28 20 70 43 6f 6c  )==0;.  if( pCol
5800: 75 6d 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  umn ){.    for(i
5810: 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e  =0; i<pColumn->n
5820: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; i++){.      
5830: 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64  pColumn->a[i].id
5840: 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  x = -1;.    }.  
5850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
5860: 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  lumn->nId; i++){
5870: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5880: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
5890: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
58a0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
58b0: 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61  Column->a[i].zNa
58c0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
58d0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
58e0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e           pColumn
58f0: 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 6a 3b 0a  ->a[i].idx = j;.
5900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 21            if( i!
5910: 3d 6a 20 29 20 62 49 64 4c 69 73 74 49 6e 4f 72  =j ) bIdListInOr
5920: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  der = 0;.       
5930: 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e     if( j==pTab->
5940: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
5950: 20 20 20 20 20 69 70 6b 43 6f 6c 75 6d 6e 20 3d       ipkColumn =
5960: 20 69 3b 20 20 61 73 73 65 72 74 28 20 21 77 69   i;  assert( !wi
5970: 74 68 6f 75 74 52 6f 77 69 64 20 29 3b 0a 20 20  thoutRowid );.  
5980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
59a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
59b0: 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
59c0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
59d0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
59e0: 69 64 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d  id(pColumn->a[i]
59f0: 2e 7a 4e 61 6d 65 29 20 26 26 20 21 77 69 74 68  .zName) && !with
5a00: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
5a10: 20 20 20 20 20 20 69 70 6b 43 6f 6c 75 6d 6e 20        ipkColumn 
5a20: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = i;.          b
5a30: 49 64 4c 69 73 74 49 6e 4f 72 64 65 72 20 3d 20  IdListInOrder = 
5a40: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
5a50: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5a60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5a70: 73 65 2c 20 22 74 61 62 6c 65 20 25 53 20 68 61  se, "table %S ha
5a80: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
5a90: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  d %s",.         
5aa0: 20 20 20 20 20 70 54 61 62 4c 69 73 74 2c 20 30       pTabList, 0
5ab0: 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e  , pColumn->a[i].
5ac0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
5ad0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
5ae0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
5af0: 20 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74       goto insert
5b00: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
5b10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5b20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  }.  }..  /* Figu
5b30: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
5b40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
5b50: 61 72 65 20 73 75 70 70 6c 69 65 64 2e 20 20 49  are supplied.  I
5b60: 66 20 74 68 65 20 64 61 74 61 0a 20 20 2a 2a 20  f the data.  ** 
5b70: 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61  is coming from a
5b80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5b90: 74 2c 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  t, then generate
5ba0: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
5bb0: 61 74 0a 20 20 2a 2a 20 70 72 6f 64 75 63 65 73  at.  ** produces
5bc0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
5bd0: 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 65   the SELECT on e
5be0: 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ach invocation. 
5bf0: 20 54 68 65 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75   The.  ** co-rou
5c00: 74 69 6e 65 20 69 73 20 74 68 65 20 63 6f 6d 6d  tine is the comm
5c10: 6f 6e 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  on header to the
5c20: 20 33 72 64 20 61 6e 64 20 34 74 68 20 74 65 6d   3rd and 4th tem
5c30: 70 6c 61 74 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  plates..  */.  i
5c40: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
5c50: 20 20 2f 2a 20 44 61 74 61 20 69 73 20 63 6f 6d    /* Data is com
5c60: 69 6e 67 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ing from a SELEC
5c70: 54 20 6f 72 20 66 72 6f 6d 20 61 20 6d 75 6c 74  T or from a mult
5c80: 69 2d 72 6f 77 20 56 41 4c 55 45 53 20 63 6c 61  i-row VALUES cla
5c90: 75 73 65 2e 0a 20 20 20 20 2a 2a 20 47 65 6e 65  use..    ** Gene
5ca0: 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
5cb0: 65 20 74 6f 20 72 75 6e 20 74 68 65 20 53 45 4c  e to run the SEL
5cc0: 45 43 54 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ECT. */.    int 
5cd0: 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20  regYield;       
5ce0: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5cf0: 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65  ing co-routine e
5d00: 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20  ntry-point */.  
5d10: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
5d20: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
5d30: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  the co-routine *
5d40: 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  /.    int rc;   
5d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
5d60: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20  ult code */..   
5d70: 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50   regYield = ++pP
5d80: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
5d90: 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
5da0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5db0: 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c  (v) + 1;.    sql
5dc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5dd0: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
5de0: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
5df0: 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 73   addrTop);.    s
5e00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
5e10: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
5e20: 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69  Coroutine, regYi
5e30: 65 6c 64 29 3b 0a 20 20 20 20 64 65 73 74 2e 69  eld);.    dest.i
5e40: 53 64 73 74 20 3d 20 62 49 64 4c 69 73 74 49 6e  Sdst = bIdListIn
5e50: 4f 72 64 65 72 20 3f 20 72 65 67 44 61 74 61 20  Order ? regData 
5e60: 3a 20 30 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53  : 0;.    dest.nS
5e70: 64 73 74 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  dst = pTab->nCol
5e80: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
5e90: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
5ea0: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
5eb0: 3b 0a 20 20 20 20 72 65 67 46 72 6f 6d 53 65 6c  ;.    regFromSel
5ec0: 65 63 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ect = dest.iSdst
5ed0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20  ;.    if( rc || 
5ee0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5ef0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
5f00: 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63   ) goto insert_c
5f10: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c 69  leanup;.    sqli
5f20: 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
5f30: 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
5f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5f50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5f60: 72 54 6f 70 20 2d 20 31 29 3b 20 20 20 20 20 20  rTop - 1);      
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 2f 2a 20 6c 61 62 65 6c 20 42 3a 20 2a 2f 0a   /* label B: */.
5f90: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
5fa0: 65 63 74 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ect->pEList );. 
5fb0: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 53 65     nColumn = pSe
5fc0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
5fd0: 78 70 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  xpr;..    /* Set
5fe0: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 74 6f   useTempTable to
5ff0: 20 54 52 55 45 20 69 66 20 74 68 65 20 72 65 73   TRUE if the res
6000: 75 6c 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ult of the SELEC
6010: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
6020: 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  ** should be wri
6030: 74 74 65 6e 20 69 6e 74 6f 20 61 20 74 65 6d 70  tten into a temp
6040: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 74 65 6d  orary table (tem
6050: 70 6c 61 74 65 20 34 29 2e 20 20 53 65 74 20 74  plate 4).  Set t
6060: 6f 0a 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69  o.    ** FALSE i
6070: 66 20 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f  f each output ro
6080: 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  w of the SELECT 
6090: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 64  can be written d
60a0: 69 72 65 63 74 6c 79 20 69 6e 74 6f 0a 20 20 20  irectly into.   
60b0: 20 2a 2a 20 74 68 65 20 64 65 73 74 69 6e 61 74   ** the destinat
60c0: 69 6f 6e 20 74 61 62 6c 65 20 28 74 65 6d 70 6c  ion table (templ
60d0: 61 74 65 20 33 29 2e 0a 20 20 20 20 2a 2a 0a 20  ate 3)..    **. 
60e0: 20 20 20 2a 2a 20 41 20 74 65 6d 70 20 74 61 62     ** A temp tab
60f0: 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  le must be used 
6100: 69 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  if the table bei
6110: 6e 67 20 75 70 64 61 74 65 64 20 69 73 20 61 6c  ng updated is al
6120: 73 6f 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 6f 66  so one.    ** of
6130: 20 74 68 65 20 74 61 62 6c 65 73 20 62 65 69 6e   the tables bein
6140: 67 20 72 65 61 64 20 62 79 20 74 68 65 20 53 45  g read by the SE
6150: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
6160: 20 41 6c 73 6f 20 75 73 65 20 61 20 0a 20 20 20   Also use a .   
6170: 20 2a 2a 20 74 65 6d 70 20 74 61 62 6c 65 20 69   ** temp table i
6180: 6e 20 74 68 65 20 63 61 73 65 20 6f 66 20 72 6f  n the case of ro
6190: 77 20 74 72 69 67 67 65 72 73 2e 0a 20 20 20 20  w triggers..    
61a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  */.    if( pTrig
61b0: 67 65 72 20 7c 7c 20 72 65 61 64 73 54 61 62 6c  ger || readsTabl
61c0: 65 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  e(pParse, iDb, p
61d0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 75 73  Tab) ){.      us
61e0: 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 31 3b 0a  eTempTable = 1;.
61f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
6200: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
6210: 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74       /* Invoke t
6220: 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20  he coroutine to 
6230: 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
6240: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 53 45 4c  ion from the SEL
6250: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ECT.      ** and
6260: 20 61 64 64 20 69 74 20 74 6f 20 61 20 74 72 61   add it to a tra
6270: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 72 63  nsient table src
6280: 54 61 62 2e 20 20 54 68 65 20 63 6f 64 65 20 67  Tab.  The code g
6290: 65 6e 65 72 61 74 65 64 0a 20 20 20 20 20 20 2a  enerated.      *
62a0: 2a 20 68 65 72 65 20 69 73 20 66 72 6f 6d 20 74  * here is from t
62b0: 68 65 20 34 74 68 20 74 65 6d 70 6c 61 74 65 3a  he 4th template:
62c0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
62d0: 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20  **      B: open 
62e0: 74 65 6d 70 20 74 61 62 6c 65 0a 20 20 20 20 20  temp table.     
62f0: 20 2a 2a 20 20 20 20 20 20 4c 3a 20 79 69 65 6c   **      L: yiel
6300: 64 20 58 2c 20 67 6f 74 6f 20 4d 20 61 74 20 45  d X, goto M at E
6310: 4f 46 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  OF.      **     
6320: 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20 66      insert row f
6330: 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20  rom R..R+n into 
6340: 74 65 6d 70 20 74 61 62 6c 65 0a 20 20 20 20 20  temp table.     
6350: 20 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f   **         goto
6360: 20 4c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20   L.      **     
6370: 20 4d 3a 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f   M: ....      */
6380: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
6390: 63 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  c;          /* R
63a0: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
63b0: 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 2a 2f  packed record */
63c0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 54 65  .      int regTe
63d0: 6d 70 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 52  mpRowid;    /* R
63e0: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
63f0: 74 65 6d 70 20 74 61 62 6c 65 20 52 4f 57 49 44  temp table ROWID
6400: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
6410: 64 72 4c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  drL;           /
6420: 2a 20 4c 61 62 65 6c 20 22 4c 22 20 2a 2f 0a 0a  * Label "L" */..
6430: 20 20 20 20 20 20 73 72 63 54 61 62 20 3d 20 70        srcTab = p
6440: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6450: 20 20 20 20 20 72 65 67 52 65 63 20 3d 20 73 71       regRec = sq
6460: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6470: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
6480: 65 67 54 65 6d 70 52 6f 77 69 64 20 3d 20 73 71  egTempRowid = sq
6490: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
64a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
64b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
64c0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
64d0: 65 72 61 6c 2c 20 73 72 63 54 61 62 2c 20 6e 43  eral, srcTab, nC
64e0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64  olumn);.      ad
64f0: 64 72 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  drL = sqlite3Vdb
6500: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
6510: 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72  eld, dest.iSDPar
6520: 6d 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  m); VdbeCoverage
6530: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
6540: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6550: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6560: 65 67 46 72 6f 6d 53 65 6c 65 63 74 2c 20 6e 43  egFromSelect, nC
6570: 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 63 29 3b 0a  olumn, regRec);.
6580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
65a0: 77 52 6f 77 69 64 2c 20 73 72 63 54 61 62 2c 20  wRowid, srcTab, 
65b0: 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a 20  regTempRowid);. 
65c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
65d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
65e0: 65 72 74 2c 20 73 72 63 54 61 62 2c 20 72 65 67  ert, srcTab, reg
65f0: 52 65 63 2c 20 72 65 67 54 65 6d 70 52 6f 77 69  Rec, regTempRowi
6600: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
6610: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
6620: 72 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rL);.      sqlit
6630: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6640: 2c 20 61 64 64 72 4c 29 3b 0a 20 20 20 20 20 20  , addrL);.      
6650: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6660: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
6670: 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c  gRec);.      sql
6680: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6690: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 65  eg(pParse, regTe
66a0: 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  mpRowid);.    }.
66b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
66c0: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
66d0: 20 69 66 20 74 68 65 20 64 61 74 61 20 66 6f 72   if the data for
66e0: 20 74 68 65 20 49 4e 53 45 52 54 20 69 73 20 63   the INSERT is c
66f0: 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 0a 20 20  oming from a .  
6700: 20 20 2a 2a 20 73 69 6e 67 6c 65 2d 72 6f 77 20    ** single-row 
6710: 56 41 4c 55 45 53 20 63 6c 61 75 73 65 0a 20 20  VALUES clause.  
6720: 20 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e    */.    NameCon
6730: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65  text sNC;.    me
6740: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
6750: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
6760: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
6770: 72 73 65 3b 0a 20 20 20 20 73 72 63 54 61 62 20  rse;.    srcTab 
6780: 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
6790: 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 3d 3d  ( useTempTable==
67a0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0 );.    if( pLi
67b0: 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 43 6f 6c  st ){.      nCol
67c0: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
67d0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
67e0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
67f0: 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ListNames(&sNC, 
6800: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
6810: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
6820: 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
6830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6840: 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20  nColumn = 0;.   
6850: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
6860: 74 68 65 72 65 20 69 73 20 6e 6f 20 49 44 4c 49  there is no IDLI
6870: 53 54 20 74 65 72 6d 20 62 75 74 20 74 68 65 20  ST term but the 
6880: 74 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6e 74  table has an int
6890: 65 67 65 72 20 70 72 69 6d 61 72 79 0a 20 20 2a  eger primary.  *
68a0: 2a 20 6b 65 79 2c 20 74 68 65 20 73 65 74 20 74  * key, the set t
68b0: 68 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61 72  he ipkColumn var
68c0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 74  iable to the int
68d0: 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79  eger primary key
68e0: 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e   .  ** column in
68f0: 64 65 78 20 69 6e 20 74 68 65 20 6f 72 69 67 69  dex in the origi
6900: 6e 61 6c 20 74 61 62 6c 65 20 64 65 66 69 6e 69  nal table defini
6910: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
6920: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e   pColumn==0 && n
6930: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
6940: 69 70 6b 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ipkColumn = pTab
6950: 2d 3e 69 50 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  ->iPKey;.  }..  
6960: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
6970: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
6980: 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  ns in the source
6990: 20 64 61 74 61 20 6d 61 74 63 68 65 73 20 74 68   data matches th
69a0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
69b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
69c0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
69d0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66   table..  */.  f
69e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
69f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
6a00: 6e 48 69 64 64 65 6e 20 2b 3d 20 28 49 73 48 69  nHidden += (IsHi
6a10: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
6a20: 2d 3e 61 43 6f 6c 5b 69 5d 29 20 3f 20 31 20 3a  ->aCol[i]) ? 1 :
6a30: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   0);.  }.  if( p
6a40: 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43 6f  Column==0 && nCo
6a50: 6c 75 6d 6e 20 26 26 20 6e 43 6f 6c 75 6d 6e 21  lumn && nColumn!
6a60: 3d 28 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e 48 69  =(pTab->nCol-nHi
6a70: 64 64 65 6e 29 20 29 7b 0a 20 20 20 20 73 71 6c  dden) ){.    sql
6a80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6a90: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 74 61  rse, .       "ta
6aa0: 62 6c 65 20 25 53 20 68 61 73 20 25 64 20 63 6f  ble %S has %d co
6ab0: 6c 75 6d 6e 73 20 62 75 74 20 25 64 20 76 61 6c  lumns but %d val
6ac0: 75 65 73 20 77 65 72 65 20 73 75 70 70 6c 69 65  ues were supplie
6ad0: 64 22 2c 0a 20 20 20 20 20 20 20 70 54 61 62 4c  d",.       pTabL
6ae0: 69 73 74 2c 20 30 2c 20 70 54 61 62 2d 3e 6e 43  ist, 0, pTab->nC
6af0: 6f 6c 2d 6e 48 69 64 64 65 6e 2c 20 6e 43 6f 6c  ol-nHidden, nCol
6b00: 75 6d 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69  umn);.    goto i
6b10: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
6b20: 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e   }.  if( pColumn
6b30: 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 21 3d  !=0 && nColumn!=
6b40: 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20 29 7b 0a  pColumn->nId ){.
6b50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6b60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
6b70: 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
6b80: 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c 75 6d 6e 2c  lumns", nColumn,
6b90: 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 3b 0a   pColumn->nId);.
6ba0: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
6bb0: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 20  cleanup;.  }.   
6bc0: 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a   .  /* Initializ
6bd0: 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 72  e the count of r
6be0: 6f 77 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ows to be insert
6bf0: 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  ed.  */.  if( db
6c00: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
6c10: 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20  _CountRows ){.  
6c20: 20 20 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20    regRowCount = 
6c30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6c40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6c50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6c60: 67 65 72 2c 20 30 2c 20 72 65 67 52 6f 77 43 6f  ger, 0, regRowCo
6c70: 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  unt);.  }..  /* 
6c80: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
6c90: 20 76 69 65 77 2c 20 6f 70 65 6e 20 74 68 65 20   view, open the 
6ca0: 74 61 62 6c 65 20 61 6e 64 20 61 6e 64 20 61 6c  table and and al
6cb0: 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
6cc0: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
6cd0: 20 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20 20 20    int nIdx;.    
6ce0: 6e 49 64 78 20 3d 20 73 71 6c 69 74 65 33 4f 70  nIdx = sqlite3Op
6cf0: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
6d00: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  s(pParse, pTab, 
6d10: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
6d20: 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20   -1, 0,.        
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
6d50: 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75  DataCur, &iIdxCu
6d60: 72 29 3b 0a 20 20 20 20 61 52 65 67 49 64 78 20  r);.    aRegIdx 
6d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6d80: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
6d90: 66 28 69 6e 74 29 2a 28 6e 49 64 78 2b 31 29 29  f(int)*(nIdx+1))
6da0: 3b 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64  ;.    if( aRegId
6db0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  x==0 ){.      go
6dc0: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
6dd0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  p;.    }.    for
6de0: 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  (i=0, pIdx=pTab-
6df0: 3e 70 49 6e 64 65 78 3b 20 69 3c 6e 49 64 78 3b  >pIndex; i<nIdx;
6e00: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
6e10: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t, i++){.      a
6e20: 73 73 65 72 74 28 20 70 49 64 78 20 29 3b 0a 20  ssert( pIdx );. 
6e30: 20 20 20 20 20 61 52 65 67 49 64 78 5b 69 5d 20       aRegIdx[i] 
6e40: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6e50: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
6e60: 6e 4d 65 6d 20 2b 3d 20 70 49 64 78 2d 3e 6e 43  nMem += pIdx->nC
6e70: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  olumn;.    }.  }
6e80: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74  ..  /* This is t
6e90: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6d 61  he top of the ma
6ea0: 69 6e 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f  in insertion loo
6eb0: 70 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54 65  p */.  if( useTe
6ec0: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  mpTable ){.    /
6ed0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64  * This block cod
6ee0: 65 73 20 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f  es the top of lo
6ef0: 6f 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  op only.  The co
6f00: 6d 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73 20 74  mplete loop is t
6f10: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
6f20: 69 6e 67 20 70 73 65 75 64 6f 63 6f 64 65 20 28  ing pseudocode (
6f30: 74 65 6d 70 6c 61 74 65 20 34 29 3a 0a 20 20 20  template 4):.   
6f40: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
6f50: 20 20 20 72 65 77 69 6e 64 20 74 65 6d 70 20 74     rewind temp t
6f60: 61 62 6c 65 2c 20 69 66 20 65 6d 70 74 79 20 67  able, if empty g
6f70: 6f 74 6f 20 44 0a 20 20 20 20 2a 2a 20 20 20 20  oto D.    **    
6f80: 20 20 43 3a 20 6c 6f 6f 70 20 6f 76 65 72 20 72    C: loop over r
6f90: 6f 77 73 20 6f 66 20 69 6e 74 65 72 6d 65 64 69  ows of intermedi
6fa0: 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  ate table.    **
6fb0: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
6fc0: 66 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20  fer values form 
6fd0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62  intermediate tab
6fe0: 6c 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a  le into <table>.
6ff0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 65      **         e
7000: 6e 64 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 20  nd loop.    **  
7010: 20 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a      D: ....    *
7020: 2f 0a 20 20 20 20 61 64 64 72 49 6e 73 54 6f 70  /.    addrInsTop
7030: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7040: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
7050: 64 2c 20 73 72 63 54 61 62 29 3b 20 56 64 62 65  d, srcTab); Vdbe
7060: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
7070: 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
7080: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
7090: 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69  dr(v);.  }else i
70a0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
70b0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
70c0: 63 6f 64 65 73 20 74 68 65 20 74 6f 70 20 6f 66  codes the top of
70d0: 20 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20 54 68 65   loop only.  The
70e0: 20 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f 70 20 69   complete loop i
70f0: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  s the.    ** fol
7100: 6c 6f 77 69 6e 67 20 70 73 65 75 64 6f 63 6f 64  lowing pseudocod
7110: 65 20 28 74 65 6d 70 6c 61 74 65 20 33 29 3a 0a  e (template 3):.
7120: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
7130: 20 20 20 43 3a 20 79 69 65 6c 64 20 58 2c 20 61     C: yield X, a
7140: 74 20 45 4f 46 20 67 6f 74 6f 20 44 0a 20 20 20  t EOF goto D.   
7150: 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65   **         inse
7160: 72 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65  rt the select re
7170: 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65  sult into <table
7180: 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 20 20  > from R..R+n.  
7190: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74    **         got
71a0: 6f 20 43 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  o C.    **      
71b0: 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20  D: ....    */.  
71c0: 20 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 61    addrInsTop = a
71d0: 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
71e0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
71f0: 50 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53  P_Yield, dest.iS
7200: 44 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62 65  DParm);.    Vdbe
7210: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
7220: 0a 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 42  ..  /* Run the B
7230: 45 46 4f 52 45 20 61 6e 64 20 49 4e 53 54 45 41  EFORE and INSTEA
7240: 44 20 4f 46 20 74 72 69 67 67 65 72 73 2c 20 69  D OF triggers, i
7250: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 0a  f there are any.
7260: 20 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70    */.  endOfLoop
7270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
7280: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
7290: 28 20 74 6d 61 73 6b 20 26 20 54 52 49 47 47 45  ( tmask & TRIGGE
72a0: 52 5f 42 45 46 4f 52 45 20 29 7b 0a 20 20 20 20  R_BEFORE ){.    
72b0: 69 6e 74 20 72 65 67 43 6f 6c 73 20 3d 20 73 71  int regCols = sq
72c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
72d0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
72e0: 6e 43 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  nCol+1);..    /*
72f0: 20 62 75 69 6c 64 20 74 68 65 20 4e 45 57 2e 2a   build the NEW.*
7300: 20 72 65 66 65 72 65 6e 63 65 20 72 6f 77 2e 20   reference row. 
7310: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68   Note that if th
7320: 65 72 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45  ere is an INTEGE
7330: 52 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59  R.    ** PRIMARY
7340: 20 4b 45 59 20 69 6e 74 6f 20 77 68 69 63 68 20   KEY into which 
7350: 61 20 4e 55 4c 4c 20 69 73 20 62 65 69 6e 67 20  a NULL is being 
7360: 69 6e 73 65 72 74 65 64 2c 20 74 68 61 74 20 4e  inserted, that N
7370: 55 4c 4c 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ULL will be.    
7380: 2a 2a 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ** translated in
7390: 74 6f 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  to a unique ID f
73a0: 6f 72 20 74 68 65 20 72 6f 77 2e 20 20 42 75 74  or the row.  But
73b0: 20 6f 6e 20 61 20 42 45 46 4f 52 45 20 74 72 69   on a BEFORE tri
73c0: 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20 77 65 20  gger,.    ** we 
73d0: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 61 74  do not know what
73e0: 20 74 68 65 20 75 6e 69 71 75 65 20 49 44 20 77   the unique ID w
73f0: 69 6c 6c 20 62 65 20 28 62 65 63 61 75 73 65 20  ill be (because 
7400: 74 68 65 20 69 6e 73 65 72 74 20 68 61 73 0a 20  the insert has. 
7410: 20 20 20 2a 2a 20 6e 6f 74 20 68 61 70 70 65 6e     ** not happen
7420: 65 64 20 79 65 74 29 20 73 6f 20 77 65 20 73 75  ed yet) so we su
7430: 62 73 74 69 74 75 74 65 20 61 20 72 6f 77 69 64  bstitute a rowid
7440: 20 6f 66 20 2d 31 0a 20 20 20 20 2a 2f 0a 20 20   of -1.    */.  
7450: 20 20 69 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3c    if( ipkColumn<
7460: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
7470: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7480: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
7490: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 65  regCols);.    }e
74a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  lse{.      int a
74b0: 64 64 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65  ddr1;.      asse
74c0: 72 74 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69  rt( !withoutRowi
74d0: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 75  d );.      if( u
74e0: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
74f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7500: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
7510: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69  olumn, srcTab, i
7520: 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 43 6f 6c  pkColumn, regCol
7530: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
7540: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7550: 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20   pSelect==0 );  
7560: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  /* Otherwise use
7570: 54 65 6d 70 54 61 62 6c 65 20 69 73 20 74 72 75  TempTable is tru
7580: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
7590: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
75a0: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 70  rse, pList->a[ip
75b0: 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20  kColumn].pExpr, 
75c0: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  regCols);.      
75d0: 7d 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  }.      addr1 = 
75e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
75f0: 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
7600: 20 72 65 67 43 6f 6c 73 29 3b 20 56 64 62 65 43   regCols); VdbeC
7610: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7630: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7640: 72 2c 20 2d 31 2c 20 72 65 67 43 6f 6c 73 29 3b  r, -1, regCols);
7650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7660: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
7670: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
7680: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
7690: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
76a0: 65 67 43 6f 6c 73 29 3b 20 56 64 62 65 43 6f 76  egCols); VdbeCov
76b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
76c0: 0a 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68  .    /* Cannot h
76d0: 61 76 65 20 74 72 69 67 67 65 72 73 20 6f 6e 20  ave triggers on 
76e0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
76f0: 20 49 66 20 69 74 20 77 65 72 65 20 70 6f 73 73   If it were poss
7700: 69 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ible,.    ** thi
7710: 73 20 62 6c 6f 63 6b 20 77 6f 75 6c 64 20 68 61  s block would ha
7720: 76 65 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ve to account fo
7730: 72 20 68 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 2e  r hidden column.
7740: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
7750: 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  rt( !IsVirtual(p
7760: 54 61 62 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Tab) );..    /* 
7770: 43 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 63  Create the new c
7780: 6f 6c 75 6d 6e 20 64 61 74 61 0a 20 20 20 20 2a  olumn data.    *
7790: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  /.    for(i=j=0;
77a0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
77b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
77c0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
77d0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f    for(j=0; j<pCo
77e0: 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b  lumn->nId; j++){
77f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7800: 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78  Column->a[j].idx
7810: 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
7820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7830: 20 20 20 20 20 69 66 28 20 28 21 75 73 65 54 65       if( (!useTe
7840: 6d 70 54 61 62 6c 65 20 26 26 20 21 70 4c 69 73  mpTable && !pLis
7850: 74 29 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20 26  t) || (pColumn &
7860: 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49  & j>=pColumn->nI
7870: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  d).            |
7880: 7c 20 28 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26  | (pColumn==0 &&
7890: 20 49 73 4f 72 64 69 6e 61 72 79 48 69 64 64 65   IsOrdinaryHidde
78a0: 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
78b0: 43 6f 6c 5b 69 5d 29 29 20 29 7b 0a 20 20 20 20  Col[i])) ){.    
78c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
78d0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ode(pParse, pTab
78e0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c  ->aCol[i].pDflt,
78f0: 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 0a 20   regCols+i+1);. 
7900: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75       }else if( u
7910: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
7920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7930: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
7940: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a  olumn, srcTab, j
7950: 2c 20 72 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 20  , regCols+i+1); 
7960: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7980: 65 6c 65 63 74 3d 3d 30 20 29 3b 20 2f 2a 20 4f  elect==0 ); /* O
7990: 74 68 65 72 77 69 73 65 20 75 73 65 54 65 6d 70  therwise useTemp
79a0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 20 2a 2f  Table is true */
79b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
79c0: 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
79d0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
79e0: 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 72 65 67 43  a[j].pExpr, regC
79f0: 6f 6c 73 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20  ols+i+1);.      
7a00: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
7a10: 75 6d 6e 3d 3d 30 20 26 26 20 21 49 73 4f 72 64  umn==0 && !IsOrd
7a20: 69 6e 61 72 79 48 69 64 64 65 6e 43 6f 6c 75 6d  inaryHiddenColum
7a30: 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  n(&pTab->aCol[i]
7a40: 29 20 29 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  ) ) j++;.    }..
7a50: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
7a60: 73 20 61 6e 20 49 4e 53 45 52 54 20 6f 6e 20 61  s an INSERT on a
7a70: 20 76 69 65 77 20 77 69 74 68 20 61 6e 20 49 4e   view with an IN
7a80: 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20  STEAD OF INSERT 
7a90: 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a 2a 20  trigger,.    ** 
7aa0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 61  do not attempt a
7ab0: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62  ny conversions b
7ac0: 65 66 6f 72 65 20 61 73 73 65 6d 62 6c 69 6e 67  efore assembling
7ad0: 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20   the record..   
7ae0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
7af0: 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 61 74 74   real table, att
7b00: 65 6d 70 74 20 63 6f 6e 76 65 72 73 69 6f 6e 73  empt conversions
7b10: 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
7b20: 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
7b30: 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 69   column affiniti
7b40: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
7b50: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
7b60: 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
7b70: 41 66 66 69 6e 69 74 79 28 76 2c 20 70 54 61 62  Affinity(v, pTab
7b80: 2c 20 72 65 67 43 6f 6c 73 2b 31 29 3b 0a 20 20  , regCols+1);.  
7b90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65    }..    /* Fire
7ba0: 20 42 45 46 4f 52 45 20 6f 72 20 49 4e 53 54 45   BEFORE or INSTE
7bb0: 41 44 20 4f 46 20 74 72 69 67 67 65 72 73 20 2a  AD OF triggers *
7bc0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  /.    sqlite3Cod
7bd0: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
7be0: 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 54 4b  se, pTrigger, TK
7bf0: 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54 52 49 47  _INSERT, 0, TRIG
7c00: 47 45 52 5f 42 45 46 4f 52 45 2c 20 0a 20 20 20  GER_BEFORE, .   
7c10: 20 20 20 20 20 70 54 61 62 2c 20 72 65 67 43 6f       pTab, regCo
7c20: 6c 73 2d 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 2c  ls-pTab->nCol-1,
7c30: 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c   onError, endOfL
7c40: 6f 6f 70 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  oop);..    sqlit
7c50: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
7c60: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 43 6f  ge(pParse, regCo
7c70: 6c 73 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ls, pTab->nCol+1
7c80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
7c90: 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
7ca0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
7cb0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
7cc0: 61 20 72 61 6e 67 65 20 6f 66 0a 20 20 2a 2a 20  a range of.  ** 
7cd0: 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e  registers beginn
7ce0: 69 6e 67 20 61 74 20 72 65 67 49 6e 73 2e 0a 20  ing at regIns.. 
7cf0: 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 56 69 65   */.  if( !isVie
7d00: 77 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 56  w ){.    if( IsV
7d10: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
7d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
7d30: 20 74 68 61 74 20 74 68 65 20 56 55 70 64 61 74   that the VUpdat
7d40: 65 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 64 65  e opcode will de
7d50: 6c 65 74 65 3a 20 6e 6f 6e 65 20 2a 2f 0a 20 20  lete: none */.  
7d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
7d80: 2c 20 30 2c 20 72 65 67 49 6e 73 29 3b 0a 20 20  , 0, regIns);.  
7d90: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 70 6b 43    }.    if( ipkC
7da0: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
7db0: 20 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62    if( useTempTab
7dc0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
7dd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7de0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
7df0: 63 54 61 62 2c 20 69 70 6b 43 6f 6c 75 6d 6e 2c  cTab, ipkColumn,
7e00: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
7e10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c    }else if( pSel
7e20: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
7e30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7e40: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
7e50: 46 72 6f 6d 53 65 6c 65 63 74 2b 69 70 6b 43 6f  FromSelect+ipkCo
7e60: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29 3b  lumn, regRowid);
7e70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7e80: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
7e90: 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  p;.        sqlit
7ea0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
7eb0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 70 6b 43  e, pList->a[ipkC
7ec0: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72 65  olumn].pExpr, re
7ed0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
7ee0: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
7ef0: 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a  beGetOp(v, -1);.
7f00: 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57 41          if( ALWA
7f10: 59 53 28 70 4f 70 29 20 26 26 20 70 4f 70 2d 3e  YS(pOp) && pOp->
7f20: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 20  opcode==OP_Null 
7f30: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7f40: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
7f50: 20 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 31 3b   appendFlag = 1;
7f60: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
7f70: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 65 77 52  opcode = OP_NewR
7f80: 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
7f90: 70 4f 70 2d 3e 70 31 20 3d 20 69 44 61 74 61 43  pOp->p1 = iDataC
7fa0: 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
7fb0: 70 2d 3e 70 32 20 3d 20 72 65 67 52 6f 77 69 64  p->p2 = regRowid
7fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
7fd0: 3e 70 33 20 3d 20 72 65 67 41 75 74 6f 69 6e 63  >p3 = regAutoinc
7fe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7ff0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
8000: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
8010: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55  expression is NU
8020: 4c 4c 2c 20 74 68 65 6e 20 75 73 65 20 4f 50 5f  LL, then use OP_
8030: 4e 65 77 52 6f 77 69 64 0a 20 20 20 20 20 20 2a  NewRowid.      *
8040: 2a 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  * to generate a 
8050: 75 6e 69 71 75 65 20 70 72 69 6d 61 72 79 20 6b  unique primary k
8060: 65 79 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20  ey value..      
8070: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 61 70  */.      if( !ap
8080: 70 65 6e 64 46 6c 61 67 20 29 7b 0a 20 20 20 20  pendFlag ){.    
8090: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
80a0: 20 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69         if( !IsVi
80b0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
80c0: 20 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d           addr1 =
80d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
80e0: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
80f0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 20 56 64 62  , regRowid); Vdb
8100: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8110: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8120: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8130: 4e 65 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43  NewRowid, iDataC
8140: 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  ur, regRowid, re
8150: 67 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20  gAutoinc);.     
8160: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8170: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
8180: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
8190: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e{.          add
81a0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
81b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
81c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
81d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
81e0: 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 52 6f 77  P_IsNull, regRow
81f0: 69 64 2c 20 61 64 64 72 31 2b 32 29 3b 20 56 64  id, addr1+2); Vd
8200: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8230: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
8240: 6e 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 20 56  nt, regRowid); V
8250: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8260: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8270: 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
8280: 70 54 61 62 29 20 7c 7c 20 77 69 74 68 6f 75 74  pTab) || without
8290: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Rowid ){.      s
82a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
82b0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
82c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  regRowid);.    }
82d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
82e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
82f0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 44   OP_NewRowid, iD
8300: 61 74 61 43 75 72 2c 20 72 65 67 52 6f 77 69 64  ataCur, regRowid
8310: 2c 20 72 65 67 41 75 74 6f 69 6e 63 29 3b 0a 20  , regAutoinc);. 
8320: 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61 67 20       appendFlag 
8330: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 1;.    }.    a
8340: 75 74 6f 49 6e 63 53 74 65 70 28 70 50 61 72 73  utoIncStep(pPars
8350: 65 2c 20 72 65 67 41 75 74 6f 69 6e 63 2c 20 72  e, regAutoinc, r
8360: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 2f  egRowid);..    /
8370: 2a 20 43 6f 6d 70 75 74 65 20 64 61 74 61 20 66  * Compute data f
8380: 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  or all columns o
8390: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2c  f the new entry,
83a0: 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
83b0: 2a 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  * with the first
83c0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
83d0: 20 20 20 20 6e 48 69 64 64 65 6e 20 3d 20 30 3b      nHidden = 0;
83e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
83f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
8400: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67  {.      int iReg
8410: 53 74 6f 72 65 20 3d 20 72 65 67 52 6f 77 69 64  Store = regRowid
8420: 2b 31 2b 69 3b 0a 20 20 20 20 20 20 69 66 28 20  +1+i;.      if( 
8430: 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  i==pTab->iPKey )
8440: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
8450: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 4e   value of the IN
8460: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8470: 59 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61  Y column is alwa
8480: 79 73 20 61 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  ys a NULL..     
8490: 20 20 20 2a 2a 20 57 68 65 6e 65 76 65 72 20 74     ** Whenever t
84a0: 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  his column is re
84b0: 61 64 2c 20 74 68 65 20 72 6f 77 69 64 20 77 69  ad, the rowid wi
84c0: 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75 74 65  ll be substitute
84d0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
84e0: 69 74 73 20 70 6c 61 63 65 2e 20 20 48 65 6e 63  its place.  Henc
84f0: 65 2c 20 66 69 6c 6c 20 74 68 69 73 20 63 6f 6c  e, fill this col
8500: 75 6d 6e 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  umn with a NULL 
8510: 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 20 20 20  to avoid.       
8520: 20 2a 2a 20 74 61 6b 69 6e 67 20 75 70 20 64 61   ** taking up da
8530: 74 61 20 73 70 61 63 65 20 77 69 74 68 20 69 6e  ta space with in
8540: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
8550: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
8560: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 73  d..        ** As
8570: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 73 68   there may be sh
8580: 61 6c 6c 6f 77 20 63 6f 70 69 65 73 20 6f 66 20  allow copies of 
8590: 74 68 69 73 20 76 61 6c 75 65 2c 20 6d 61 6b 65  this value, make
85a0: 20 69 74 20 61 20 73 6f 66 74 2d 4e 55 4c 4c 20   it a soft-NULL 
85b0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
85c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
85d0: 4f 50 5f 53 6f 66 74 4e 75 6c 6c 2c 20 69 52 65  OP_SoftNull, iRe
85e0: 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 20  gStore);.       
85f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8600: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f   }.      if( pCo
8610: 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lumn==0 ){.     
8620: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
8630: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
8640: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
8650: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
8660: 20 20 20 20 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a       nHidden++;.
8670: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8680: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 69 20 2d           j = i -
8690: 20 6e 48 69 64 64 65 6e 3b 0a 20 20 20 20 20 20   nHidden;.      
86a0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
86b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
86c0: 3b 20 6a 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64  ; j<pColumn->nId
86d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
86e0: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61    if( pColumn->a
86f0: 5b 6a 5d 2e 69 64 78 3d 3d 69 20 29 20 62 72 65  [j].idx==i ) bre
8700: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
8710: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8720: 6a 3c 30 20 7c 7c 20 6e 43 6f 6c 75 6d 6e 3d 3d  j<0 || nColumn==
8730: 30 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20 26 26  0 || (pColumn &&
8740: 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64   j>=pColumn->nId
8750: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
8760: 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
8770: 6f 72 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  orable(pParse, p
8780: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66  Tab->aCol[i].pDf
8790: 6c 74 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a  lt, iRegStore);.
87a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
87b0: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  useTempTable ){.
87c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
87d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
87e0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
87f0: 6a 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 20 0a  j, iRegStore); .
8800: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8810: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
8820: 20 20 20 69 66 28 20 72 65 67 46 72 6f 6d 53 65     if( regFromSe
8830: 6c 65 63 74 21 3d 72 65 67 44 61 74 61 20 29 7b  lect!=regData ){
8840: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8850: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8860: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 46 72 6f  OP_SCopy, regFro
8870: 6d 53 65 6c 65 63 74 2b 6a 2c 20 69 52 65 67 53  mSelect+j, iRegS
8880: 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  tore);.        }
8890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
88a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
88b0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
88c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  ist->a[j].pExpr,
88d0: 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20   iRegStore);.   
88e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
88f0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
8900: 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72   to check constr
8910: 61 69 6e 74 73 20 61 6e 64 20 67 65 6e 65 72 61  aints and genera
8920: 74 65 20 69 6e 64 65 78 20 6b 65 79 73 20 61 6e  te index keys an
8930: 64 0a 20 20 20 20 2a 2a 20 64 6f 20 74 68 65 20  d.    ** do the 
8940: 69 6e 73 65 72 74 69 6f 6e 2e 0a 20 20 20 20 2a  insertion..    *
8950: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8960: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8970: 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
8980: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
8990: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
89a0: 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
89b0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
89c0: 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
89d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
89e0: 74 61 62 4d 61 6b 65 57 72 69 74 61 62 6c 65 28  tabMakeWritable(
89f0: 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
8a00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8a10: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 55 70  AddOp4(v, OP_VUp
8a20: 64 61 74 65 2c 20 31 2c 20 70 54 61 62 2d 3e 6e  date, 1, pTab->n
8a30: 43 6f 6c 2b 32 2c 20 72 65 67 49 6e 73 2c 20 70  Col+2, regIns, p
8a40: 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
8a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8a60: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6f 6e 45  eChangeP5(v, onE
8a70: 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
8a80: 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 6f 6e   ? OE_Abort : on
8a90: 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 73 71  Error);.      sq
8aa0: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
8ab0: 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
8ac0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8ad0: 20 20 20 20 69 6e 74 20 69 73 52 65 70 6c 61 63      int isReplac
8ae0: 65 3b 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20  e;    /* Set to 
8af0: 74 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69  true if constrai
8b00: 6e 74 73 20 6d 61 79 20 63 61 75 73 65 20 61 20  nts may cause a 
8b10: 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 20 20 20  replace */.     
8b20: 20 69 6e 74 20 62 55 73 65 53 65 65 6b 3b 20 20   int bUseSeek;  
8b30: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
8b40: 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 52 45 53  e OPFLAG_SEEKRES
8b50: 55 4c 54 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ULT */.      sql
8b60: 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
8b70: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61  traintChecks(pPa
8b80: 72 73 65 2c 20 70 54 61 62 2c 20 61 52 65 67 49  rse, pTab, aRegI
8b90: 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  dx, iDataCur, iI
8ba0: 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
8bb0: 20 72 65 67 49 6e 73 2c 20 30 2c 20 69 70 6b 43   regIns, 0, ipkC
8bc0: 6f 6c 75 6d 6e 3e 3d 30 2c 20 6f 6e 45 72 72 6f  olumn>=0, onErro
8bd0: 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 2c 20 26 69  r, endOfLoop, &i
8be0: 73 52 65 70 6c 61 63 65 2c 20 30 0a 20 20 20 20  sReplace, 0.    
8bf0: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
8c00: 65 33 46 6b 43 68 65 63 6b 28 70 50 61 72 73 65  e3FkCheck(pParse
8c10: 2c 20 70 54 61 62 2c 20 30 2c 20 72 65 67 49 6e  , pTab, 0, regIn
8c20: 73 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20  s, 0, 0);..     
8c30: 20 2f 2a 20 53 65 74 20 74 68 65 20 4f 50 46 4c   /* Set the OPFL
8c40: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
8c50: 20 66 6c 61 67 20 69 66 20 65 69 74 68 65 72 20   flag if either 
8c60: 28 61 29 20 74 68 65 72 65 20 61 72 65 20 6e 6f  (a) there are no
8c70: 20 52 45 50 4c 41 43 45 0a 20 20 20 20 20 20 2a   REPLACE.      *
8c80: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  * constraints or
8c90: 20 28 62 29 20 74 68 65 72 65 20 61 72 65 20 6e   (b) there are n
8ca0: 6f 20 74 72 69 67 67 65 72 73 20 61 6e 64 20 74  o triggers and t
8cb0: 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  his table is not
8cc0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 65   a.      ** pare
8cd0: 6e 74 20 74 61 62 6c 65 20 69 6e 20 61 20 66 6f  nt table in a fo
8ce0: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
8cf0: 61 69 6e 74 2e 20 49 74 20 69 73 20 73 61 66 65  aint. It is safe
8d00: 20 74 6f 20 73 65 74 20 74 68 65 0a 20 20 20 20   to set the.    
8d10: 20 20 2a 2a 20 66 6c 61 67 20 69 6e 20 74 68 65    ** flag in the
8d20: 20 73 65 63 6f 6e 64 20 63 61 73 65 20 61 73 20   second case as 
8d30: 69 66 20 61 6e 79 20 52 45 50 4c 41 43 45 20 63  if any REPLACE c
8d40: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 68 69 74  onstraint is hit
8d50: 2c 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 4f 50  , an.      ** OP
8d60: 5f 44 65 6c 65 74 65 20 6f 72 20 4f 50 5f 49 64  _Delete or OP_Id
8d70: 78 44 65 6c 65 74 65 20 69 6e 73 74 72 75 63 74  xDelete instruct
8d80: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 65 78 65 63  ion will be exec
8d90: 75 74 65 64 20 6f 6e 20 65 61 63 68 20 0a 20 20  uted on each .  
8da0: 20 20 20 20 2a 2a 20 63 75 72 73 6f 72 20 74 68      ** cursor th
8db0: 61 74 20 69 73 20 64 69 73 74 75 72 62 65 64 2e  at is disturbed.
8dc0: 20 41 6e 64 20 74 68 65 73 65 20 69 6e 73 74 72   And these instr
8dd0: 75 63 74 69 6f 6e 73 20 62 6f 74 68 20 63 6c 65  uctions both cle
8de0: 61 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ar the.      ** 
8df0: 56 64 62 65 43 75 72 73 6f 72 2e 73 65 65 6b 52  VdbeCursor.seekR
8e00: 65 73 75 6c 74 20 76 61 72 69 61 62 6c 65 2c 20  esult variable, 
8e10: 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 4f 50  disabling the OP
8e20: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
8e30: 4c 54 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  LT.      ** func
8e40: 74 69 6f 6e 61 6c 69 74 79 2e 20 20 2a 2f 0a 20  tionality.  */. 
8e50: 20 20 20 20 20 62 55 73 65 53 65 65 6b 20 3d 20       bUseSeek = 
8e60: 28 69 73 52 65 70 6c 61 63 65 3d 3d 30 20 7c 7c  (isReplace==0 ||
8e70: 20 28 70 54 72 69 67 67 65 72 3d 3d 30 20 26 26   (pTrigger==0 &&
8e80: 0a 20 20 20 20 20 20 20 20 20 20 28 28 64 62 2d  .          ((db-
8e90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8ea0: 46 6f 72 65 69 67 6e 4b 65 79 73 29 3d 3d 30 20  ForeignKeys)==0 
8eb0: 7c 7c 20 73 71 6c 69 74 65 33 46 6b 52 65 66 65  || sqlite3FkRefe
8ec0: 72 65 6e 63 65 73 28 70 54 61 62 29 3d 3d 30 29  rences(pTab)==0)
8ed0: 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20  .      ));.     
8ee0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65   sqlite3Complete
8ef0: 49 6e 73 65 72 74 69 6f 6e 28 70 50 61 72 73 65  Insertion(pParse
8f00: 2c 20 70 54 61 62 2c 20 69 44 61 74 61 43 75 72  , pTab, iDataCur
8f10: 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20 20  , iIdxCur,.     
8f20: 20 20 20 20 20 72 65 67 49 6e 73 2c 20 61 52 65       regIns, aRe
8f30: 67 49 64 78 2c 20 30 2c 20 61 70 70 65 6e 64 46  gIdx, 0, appendF
8f40: 6c 61 67 2c 20 62 55 73 65 53 65 65 6b 0a 20 20  lag, bUseSeek.  
8f50: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
8f60: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
8f70: 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20  e count of rows 
8f80: 74 68 61 74 20 61 72 65 20 69 6e 73 65 72 74 65  that are inserte
8f90: 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62  d.  */.  if( (db
8fa0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
8fb0: 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29  _CountRows)!=0 )
8fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8fd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
8fe0: 64 49 6d 6d 2c 20 72 65 67 52 6f 77 43 6f 75 6e  dImm, regRowCoun
8ff0: 74 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  t, 1);.  }..  if
9000: 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
9010: 20 20 2f 2a 20 43 6f 64 65 20 41 46 54 45 52 20    /* Code AFTER 
9020: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20  triggers */.    
9030: 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72  sqlite3CodeRowTr
9040: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 70 54  igger(pParse, pT
9050: 72 69 67 67 65 72 2c 20 54 4b 5f 49 4e 53 45 52  rigger, TK_INSER
9060: 54 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 41 46  T, 0, TRIGGER_AF
9070: 54 45 52 2c 20 0a 20 20 20 20 20 20 20 20 70 54  TER, .        pT
9080: 61 62 2c 20 72 65 67 44 61 74 61 2d 32 2d 70 54  ab, regData-2-pT
9090: 61 62 2d 3e 6e 43 6f 6c 2c 20 6f 6e 45 72 72 6f  ab->nCol, onErro
90a0: 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20  r, endOfLoop);. 
90b0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74   }..  /* The bot
90c0: 74 6f 6d 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tom of the main 
90d0: 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 2c 20  insertion loop, 
90e0: 69 66 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  if the data sour
90f0: 63 65 0a 20 20 2a 2a 20 69 73 20 61 20 53 45 4c  ce.  ** is a SEL
9100: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
9110: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
9120: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
9130: 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 69   endOfLoop);.  i
9140: 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  f( useTempTable 
9150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9160: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9170: 65 78 74 2c 20 73 72 63 54 61 62 2c 20 61 64 64  ext, srcTab, add
9180: 72 43 6f 6e 74 29 3b 20 56 64 62 65 43 6f 76 65  rCont); VdbeCove
9190: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
91a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
91b0: 28 76 2c 20 61 64 64 72 49 6e 73 54 6f 70 29 3b  (v, addrInsTop);
91c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
91d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
91e0: 73 65 2c 20 73 72 63 54 61 62 29 3b 0a 20 20 7d  se, srcTab);.  }
91f0: 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63 74  else if( pSelect
9200: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
9210: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 43  dbeGoto(v, addrC
9220: 6f 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ont);.    sqlite
9230: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9240: 20 61 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20 20   addrInsTop);.  
9250: 7d 0a 0a 69 6e 73 65 72 74 5f 65 6e 64 3a 0a 20  }..insert_end:. 
9260: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
9270: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
9280: 61 62 6c 65 20 62 79 20 73 74 6f 72 69 6e 67 20  able by storing 
9290: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
92a0: 68 65 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  he.  ** maximum 
92b0: 72 6f 77 69 64 20 63 6f 75 6e 74 65 72 20 76 61  rowid counter va
92c0: 6c 75 65 73 20 72 65 63 6f 72 64 65 64 20 77 68  lues recorded wh
92d0: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e  ile inserting in
92e0: 74 6f 0a 20 20 2a 2a 20 61 75 74 6f 69 6e 63 72  to.  ** autoincr
92f0: 65 6d 65 6e 74 20 74 61 62 6c 65 73 2e 0a 20 20  ement tables..  
9300: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
9310: 3e 6e 65 73 74 65 64 3d 3d 30 20 26 26 20 70 50  >nested==0 && pP
9320: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
9330: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
9340: 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  te3Autoincrement
9350: 45 6e 64 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  End(pParse);.  }
9360: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 74 75  ..  /*.  ** Retu
9370: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9380: 20 72 6f 77 73 20 69 6e 73 65 72 74 65 64 2e 20   rows inserted. 
9390: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
93a0: 69 73 20 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74  is .  ** generat
93b0: 69 6e 67 20 63 6f 64 65 20 62 65 63 61 75 73 65  ing code because
93c0: 20 6f 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   of a call to sq
93d0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
93e0: 28 29 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  (), do not.  ** 
93f0: 69 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  invoke the callb
9400: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  ack function..  
9410: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
9420: 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ags&SQLITE_Count
9430: 52 6f 77 73 29 20 26 26 20 21 70 50 61 72 73 65  Rows) && !pParse
9440: 2d 3e 6e 65 73 74 65 64 20 26 26 20 21 70 50 61  ->nested && !pPa
9450: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
9460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
9470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9480: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 6f  ResultRow, regRo
9490: 77 43 6f 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20  wCount, 1);.    
94a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
94b0: 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20  mCols(v, 1);.   
94c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
94d0: 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 43 4f 4c  olName(v, 0, COL
94e0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 22 72 6f 77 73  NAME_NAME, "rows
94f0: 20 69 6e 73 65 72 74 65 64 22 2c 20 53 51 4c 49   inserted", SQLI
9500: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
9510: 0a 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3a  .insert_cleanup:
9520: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
9530: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
9540: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
9550: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
9560: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
9570: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
9580: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
9590: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
95a0: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 75 6d 6e  lete(db, pColumn
95b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
95c0: 65 65 28 64 62 2c 20 61 52 65 67 49 64 78 29 3b  ee(db, aRegIdx);
95d0: 0a 7d 0a 0a 2f 2a 20 4d 61 6b 65 20 73 75 72 65  .}../* Make sure
95e0: 20 22 69 73 56 69 65 77 22 20 61 6e 64 20 6f 74   "isView" and ot
95f0: 68 65 72 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  her macros defin
9600: 65 64 20 61 62 6f 76 65 20 61 72 65 20 75 6e 64  ed above are und
9610: 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  efined. Otherwis
9620: 65 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 69 6e  e.** they may in
9630: 74 65 72 66 65 72 65 20 77 69 74 68 20 63 6f 6d  terfere with com
9640: 70 69 6c 61 74 69 6f 6e 20 6f 66 20 6f 74 68 65  pilation of othe
9650: 72 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  r functions in t
9660: 68 69 73 20 66 69 6c 65 0a 2a 2a 20 28 6f 72 20  his file.** (or 
9670: 69 6e 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2c  in another file,
9680: 20 69 66 20 74 68 69 73 20 66 69 6c 65 20 62 65   if this file be
9690: 63 6f 6d 65 73 20 70 61 72 74 20 6f 66 20 74 68  comes part of th
96a0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 29 2e  e amalgamation).
96b0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 69 73 56 69    */.#ifdef isVi
96c0: 65 77 0a 20 23 75 6e 64 65 66 20 69 73 56 69 65  ew. #undef isVie
96d0: 77 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  w.#endif.#ifdef 
96e0: 70 54 72 69 67 67 65 72 0a 20 23 75 6e 64 65 66  pTrigger. #undef
96f0: 20 70 54 72 69 67 67 65 72 0a 23 65 6e 64 69 66   pTrigger.#endif
9700: 0a 23 69 66 64 65 66 20 74 6d 61 73 6b 0a 20 23  .#ifdef tmask. #
9710: 75 6e 64 65 66 20 74 6d 61 73 6b 0a 23 65 6e 64  undef tmask.#end
9720: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 6e 69 6e  if../*.** Meanin
9730: 67 73 20 6f 66 20 62 69 74 73 20 69 6e 20 6f 66  gs of bits in of
9740: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
9750: 66 6f 72 20 63 68 65 63 6b 43 6f 6e 73 74 72 61  for checkConstra
9760: 69 6e 74 55 6e 63 68 61 6e 67 65 64 28 29 0a 2a  intUnchanged().*
9770: 2f 0a 23 64 65 66 69 6e 65 20 43 4b 43 4e 53 54  /.#define CKCNST
9780: 52 4e 54 5f 43 4f 4c 55 4d 4e 20 20 20 30 78 30  RNT_COLUMN   0x0
9790: 31 20 20 20 20 2f 2a 20 43 48 45 43 4b 20 63 6f  1    /* CHECK co
97a0: 6e 73 74 72 61 69 6e 74 20 75 73 65 73 20 61 20  nstraint uses a 
97b0: 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e 20  changing column 
97c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4b 43 4e 53  */.#define CKCNS
97d0: 54 52 4e 54 5f 52 4f 57 49 44 20 20 20 20 30 78  TRNT_ROWID    0x
97e0: 30 32 20 20 20 20 2f 2a 20 43 48 45 43 4b 20 63  02    /* CHECK c
97f0: 6f 6e 73 74 72 61 69 6e 74 20 72 65 66 65 72 65  onstraint refere
9800: 6e 63 65 73 20 74 68 65 20 52 4f 57 49 44 20 2a  nces the ROWID *
9810: 2f 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68  /../* This is th
9820: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
9830: 6b 20 66 72 6f 6d 20 63 68 65 63 6b 43 6f 6e 73  k from checkCons
9840: 74 72 61 69 6e 74 55 6e 63 68 61 6e 67 65 64 28  traintUnchanged(
9850: 29 2e 20 20 53 65 74 0a 2a 2a 20 62 69 74 20 30  ).  Set.** bit 0
9860: 78 30 31 20 6f 66 20 70 57 61 6c 6b 65 72 2d 3e  x01 of pWalker->
9870: 65 43 6f 64 65 20 69 66 0a 2a 2a 20 70 57 61 6c  eCode if.** pWal
9880: 6b 65 72 2d 3e 65 43 6f 64 65 20 74 6f 20 30 20  ker->eCode to 0 
9890: 69 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69  if this expressi
98a0: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 65 6e 63  on node referenc
98b0: 65 73 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a  es any of the.**
98c0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
98d0: 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 65 64 20  e being modifed 
98e0: 62 79 20 61 6e 20 55 50 44 41 54 45 20 73 74 61  by an UPDATE sta
98f0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
9900: 63 20 69 6e 74 20 63 68 65 63 6b 43 6f 6e 73 74  c int checkConst
9910: 72 61 69 6e 74 45 78 70 72 4e 6f 64 65 28 57 61  raintExprNode(Wa
9920: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
9930: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
9940: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
9950: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 61  _COLUMN ){.    a
9960: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
9970: 6f 6c 75 6d 6e 3e 3d 30 20 7c 7c 20 70 45 78 70  olumn>=0 || pExp
9980: 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  r->iColumn==-1 )
9990: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
99a0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
99b0: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
99c0: 2d 3e 75 2e 61 69 43 6f 6c 5b 70 45 78 70 72 2d  ->u.aiCol[pExpr-
99d0: 3e 69 43 6f 6c 75 6d 6e 5d 3e 3d 30 20 29 7b 0a  >iColumn]>=0 ){.
99e0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
99f0: 3e 65 43 6f 64 65 20 7c 3d 20 43 4b 43 4e 53 54  >eCode |= CKCNST
9a00: 52 4e 54 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  RNT_COLUMN;.    
9a10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9a20: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
9a30: 6f 64 65 20 7c 3d 20 43 4b 43 4e 53 54 52 4e 54  ode |= CKCNSTRNT
9a40: 5f 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20  _ROWID;.    }.  
9a50: 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
9a60: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
9a70: 2a 20 70 45 78 70 72 20 69 73 20 61 20 43 48 45  * pExpr is a CHE
9a80: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  CK constraint on
9a90: 20 61 20 72 6f 77 20 74 68 61 74 20 69 73 20 62   a row that is b
9aa0: 65 69 6e 67 20 55 50 44 41 54 45 2d 65 64 2e 20  eing UPDATE-ed. 
9ab0: 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6c   The.** only col
9ac0: 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6d 6f  umns that are mo
9ad0: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 55 50  dified by the UP
9ae0: 44 41 54 45 20 61 72 65 20 74 68 6f 73 65 20 66  DATE are those f
9af0: 6f 72 20 77 68 69 63 68 0a 2a 2a 20 61 69 43 68  or which.** aiCh
9b00: 6e 67 5b 69 5d 3e 3d 30 2c 20 61 6e 64 20 61 6c  ng[i]>=0, and al
9b10: 73 6f 20 74 68 65 20 52 4f 57 49 44 20 69 73 20  so the ROWID is 
9b20: 6d 6f 64 69 66 69 65 64 20 69 66 20 63 68 6e 67  modified if chng
9b30: 52 6f 77 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Rowid is true..*
9b40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
9b50: 20 69 66 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   if CHECK constr
9b60: 61 69 6e 74 20 70 45 78 70 72 20 64 6f 65 73 20  aint pExpr does 
9b70: 6e 6f 74 20 75 73 65 20 61 6e 79 20 6f 66 20 74  not use any of t
9b80: 68 65 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 63  he.** changing c
9b90: 6f 6c 75 6d 6e 73 20 28 6f 72 20 74 68 65 20 72  olumns (or the r
9ba0: 6f 77 69 64 20 69 66 20 69 74 20 69 73 20 63 68  owid if it is ch
9bb0: 61 6e 67 69 6e 67 29 2e 20 20 49 6e 20 6f 74 68  anging).  In oth
9bc0: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 74  er words,.** ret
9bd0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
9be0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
9bf0: 74 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  t can be skipped
9c00: 20 77 68 65 6e 20 76 61 6c 69 64 61 74 69 6e 67   when validating
9c10: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 72 6f 77 20  .** the new row 
9c20: 69 6e 20 74 68 65 20 55 50 44 41 54 45 20 73 74  in the UPDATE st
9c30: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
9c40: 69 63 20 69 6e 74 20 63 68 65 63 6b 43 6f 6e 73  ic int checkCons
9c50: 74 72 61 69 6e 74 55 6e 63 68 61 6e 67 65 64 28  traintUnchanged(
9c60: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
9c70: 20 2a 61 69 43 68 6e 67 2c 20 69 6e 74 20 63 68   *aiChng, int ch
9c80: 6e 67 52 6f 77 69 64 29 7b 0a 20 20 57 61 6c 6b  ngRowid){.  Walk
9c90: 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er w;.  memset(&
9ca0: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
9cb0: 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 3b  ;.  w.eCode = 0;
9cc0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
9cd0: 63 6b 20 3d 20 63 68 65 63 6b 43 6f 6e 73 74 72  ck = checkConstr
9ce0: 61 69 6e 74 45 78 70 72 4e 6f 64 65 3b 0a 20 20  aintExprNode;.  
9cf0: 77 2e 75 2e 61 69 43 6f 6c 20 3d 20 61 69 43 68  w.u.aiCol = aiCh
9d00: 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  ng;.  sqlite3Wal
9d10: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
9d20: 3b 0a 20 20 69 66 28 20 21 63 68 6e 67 52 6f 77  ;.  if( !chngRow
9d30: 69 64 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  id ){.    testca
9d40: 73 65 28 20 28 77 2e 65 43 6f 64 65 20 26 20 43  se( (w.eCode & C
9d50: 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 29 21  KCNSTRNT_ROWID)!
9d60: 3d 30 20 29 3b 0a 20 20 20 20 77 2e 65 43 6f 64  =0 );.    w.eCod
9d70: 65 20 26 3d 20 7e 43 4b 43 4e 53 54 52 4e 54 5f  e &= ~CKCNSTRNT_
9d80: 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 74 65 73  ROWID;.  }.  tes
9d90: 74 63 61 73 65 28 20 77 2e 65 43 6f 64 65 3d 3d  tcase( w.eCode==
9da0: 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
9db0: 20 77 2e 65 43 6f 64 65 3d 3d 43 4b 43 4e 53 54   w.eCode==CKCNST
9dc0: 52 4e 54 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  RNT_COLUMN );.  
9dd0: 74 65 73 74 63 61 73 65 28 20 77 2e 65 43 6f 64  testcase( w.eCod
9de0: 65 3d 3d 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57  e==CKCNSTRNT_ROW
9df0: 49 44 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ID );.  testcase
9e00: 28 20 77 2e 65 43 6f 64 65 3d 3d 28 43 4b 43 4e  ( w.eCode==(CKCN
9e10: 53 54 52 4e 54 5f 52 4f 57 49 44 7c 43 4b 43 4e  STRNT_ROWID|CKCN
9e20: 53 54 52 4e 54 5f 43 4f 4c 55 4d 4e 29 20 29 3b  STRNT_COLUMN) );
9e30: 0a 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f  .  return !w.eCo
9e40: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  de;.}../*.** Gen
9e50: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
9e60: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
9e70: 6b 73 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 49  ks prior to an I
9e80: 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41  NSERT or an UPDA
9e90: 54 45 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 20 70  TE.** on table p
9ea0: 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  Tab..**.** The r
9eb0: 65 67 4e 65 77 44 61 74 61 20 70 61 72 61 6d 65  egNewData parame
9ec0: 74 65 72 20 69 73 20 74 68 65 20 66 69 72 73 74  ter is the first
9ed0: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 72   register in a r
9ee0: 61 6e 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ange that contai
9ef0: 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 20 74  ns.** the data t
9f00: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 6f 72  o be inserted or
9f10: 20 74 68 65 20 64 61 74 61 20 61 66 74 65 72 20   the data after 
9f20: 74 68 65 20 75 70 64 61 74 65 2e 20 20 54 68 65  the update.  The
9f30: 72 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 70 54  re will be.** pT
9f40: 61 62 2d 3e 6e 43 6f 6c 2b 31 20 72 65 67 69 73  ab->nCol+1 regis
9f50: 74 65 72 73 20 69 6e 20 74 68 69 73 20 72 61 6e  ters in this ran
9f60: 67 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 72  ge.  The first r
9f70: 65 67 69 73 74 65 72 20 28 74 68 65 20 6f 6e 65  egister (the one
9f80: 0a 2a 2a 20 74 68 61 74 20 72 65 67 4e 65 77 44  .** that regNewD
9f90: 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 29 20 77  ata points to) w
9fa0: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
9fb0: 6e 65 77 20 72 6f 77 69 64 2c 20 6f 72 20 4e 55  new rowid, or NU
9fc0: 4c 4c 20 69 6e 20 74 68 65 0a 2a 2a 20 63 61 73  LL in the.** cas
9fd0: 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  e of a WITHOUT R
9fe0: 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 54 68 65  OWID table.  The
9ff0: 20 73 65 63 6f 6e 64 20 72 65 67 69 73 74 65 72   second register
a000: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 77 69   in the range wi
a010: 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68  ll.** contain th
a020: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
a030: 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 6f 6c   first table col
a040: 75 6d 6e 2e 20 20 54 68 65 20 74 68 69 72 64 20  umn.  The third 
a050: 72 65 67 69 73 74 65 72 20 77 69 6c 6c 0a 2a 2a  register will.**
a060: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e   contain the con
a070: 74 65 6e 74 20 6f 66 20 74 68 65 20 73 65 63 6f  tent of the seco
a080: 6e 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e  nd table column.
a090: 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a    And so forth..
a0a0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 4f 6c 64  **.** The regOld
a0b0: 44 61 74 61 20 70 61 72 61 6d 65 74 65 72 20 69  Data parameter i
a0c0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 72 65 67  s similar to reg
a0d0: 4e 65 77 44 61 74 61 20 65 78 63 65 70 74 20 74  NewData except t
a0e0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  hat it contains.
a0f0: 2a 2a 20 74 68 65 20 64 61 74 61 20 70 72 69 6f  ** the data prio
a100: 72 20 74 6f 20 61 6e 20 55 50 44 41 54 45 20 72  r to an UPDATE r
a110: 61 74 68 65 72 20 74 68 61 6e 20 61 66 74 65 72  ather than after
a120: 77 61 72 64 73 2e 20 20 72 65 67 4f 6c 64 44 61  wards.  regOldDa
a130: 74 61 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 66 6f  ta is zero.** fo
a140: 72 20 61 6e 20 49 4e 53 45 52 54 2e 20 20 54 68  r an INSERT.  Th
a150: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 64  is routine can d
a160: 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
a170: 65 6e 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  en UPDATE and IN
a180: 53 45 52 54 20 62 79 0a 2a 2a 20 63 68 65 63 6b  SERT by.** check
a190: 69 6e 67 20 72 65 67 4f 6c 64 44 61 74 61 20 66  ing regOldData f
a1a0: 6f 72 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 46  or zero..**.** F
a1b0: 6f 72 20 61 6e 20 55 50 44 41 54 45 2c 20 74 68  or an UPDATE, th
a1c0: 65 20 70 6b 43 68 6e 67 20 62 6f 6f 6c 65 61 6e  e pkChng boolean
a1d0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
a1e0: 74 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79  true primary key
a1f0: 20 28 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20 66   (the.** rowid f
a200: 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 74 61 62 6c  or a normal tabl
a210: 65 20 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59  e or the PRIMARY
a220: 20 4b 45 59 20 66 6f 72 20 61 20 57 49 54 48 4f   KEY for a WITHO
a230: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 29 0a  UT ROWID table).
a240: 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 64 69  ** might be modi
a250: 66 69 65 64 20 62 79 20 74 68 65 20 55 50 44 41  fied by the UPDA
a260: 54 45 2e 20 20 49 66 20 70 6b 43 68 6e 67 20 69  TE.  If pkChng i
a270: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
a280: 65 20 6b 65 79 20 6f 66 0a 2a 2a 20 74 68 65 20  e key of.** the 
a290: 69 44 61 74 61 43 75 72 20 63 6f 6e 74 65 6e 74  iDataCur content
a2a0: 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
a2b0: 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
a2c0: 6e 67 65 64 20 62 79 20 74 68 65 20 55 50 44 41  nged by the UPDA
a2d0: 54 45 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  TE..**.** For an
a2e0: 20 49 4e 53 45 52 54 2c 20 74 68 65 20 70 6b 43   INSERT, the pkC
a2f0: 68 6e 67 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 69  hng boolean indi
a300: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 6f 72  cates whether or
a310: 20 6e 6f 74 20 74 68 65 20 72 6f 77 69 64 0a 2a   not the rowid.*
a320: 2a 20 77 61 73 20 65 78 70 6c 69 63 69 74 6c 79  * was explicitly
a330: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
a340: 72 74 20 6f 66 20 74 68 65 20 49 4e 53 45 52 54  rt of the INSERT
a350: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 66 20   statement.  If 
a360: 70 6b 43 68 6e 67 0a 2a 2a 20 69 73 20 7a 65 72  pkChng.** is zer
a370: 6f 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  o, it means that
a380: 20 74 68 65 20 65 69 74 68 65 72 20 72 6f 77 69   the either rowi
a390: 64 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 75  d is computed au
a3a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 0a 2a  tomatically or.*
a3b0: 2a 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  * that the table
a3c0: 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f   is a WITHOUT RO
a3d0: 57 49 44 20 74 61 62 6c 65 20 61 6e 64 20 68 61  WID table and ha
a3e0: 73 20 6e 6f 20 72 6f 77 69 64 2e 20 20 4f 6e 20  s no rowid.  On 
a3f0: 61 6e 20 49 4e 53 45 52 54 2c 0a 2a 2a 20 70 6b  an INSERT,.** pk
a400: 43 68 6e 67 20 77 69 6c 6c 20 6f 6e 6c 79 20 62  Chng will only b
a410: 65 20 74 72 75 65 20 69 66 20 74 68 65 20 49 4e  e true if the IN
a420: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 70  SERT statement p
a430: 72 6f 76 69 64 65 73 20 61 6e 20 69 6e 74 65 67  rovides an integ
a440: 65 72 0a 2a 2a 20 76 61 6c 75 65 20 66 6f 72 20  er.** value for 
a450: 65 69 74 68 65 72 20 74 68 65 20 72 6f 77 69 64  either the rowid
a460: 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 74 73 20 49   column or its I
a470: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a480: 45 59 20 61 6c 69 61 73 2e 0a 2a 2a 0a 2a 2a 20  EY alias..**.** 
a490: 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
a4a0: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
a4b0: 6e 65 20 77 69 6c 6c 20 73 74 6f 72 65 20 6e 65  ne will store ne
a4c0: 77 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  w index entries 
a4d0: 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
a4e0: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
a4f0: 61 52 65 67 49 64 78 5b 5d 2e 20 20 4e 6f 20 69  aRegIdx[].  No i
a500: 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 63 72  ndex entry is cr
a510: 65 61 74 65 64 20 66 6f 72 0a 2a 2a 20 69 6e 64  eated for.** ind
a520: 69 63 65 73 20 77 68 65 72 65 20 61 52 65 67 49  ices where aRegI
a530: 64 78 5b 69 5d 3d 3d 30 2e 20 20 54 68 65 20 6f  dx[i]==0.  The o
a540: 72 64 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20  rder of indices 
a550: 69 6e 20 61 52 65 67 49 64 78 5b 5d 20 69 73 0a  in aRegIdx[] is.
a560: 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
a570: 68 65 20 6f 72 64 65 72 20 6f 66 20 69 6e 64 69  he order of indi
a580: 63 65 73 20 6f 6e 20 74 68 65 20 6c 69 6e 6b 65  ces on the linke
a590: 64 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  d list of indice
a5a0: 73 0a 2a 2a 20 61 74 20 70 54 61 62 2d 3e 70 49  s.** at pTab->pI
a5b0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ndex..**.** The 
a5c0: 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 61 76 65  caller must have
a5d0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
a5e0: 77 72 69 74 65 61 62 6c 65 20 63 75 72 73 6f 72  writeable cursor
a5f0: 73 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  s on the main.**
a600: 20 74 61 62 6c 65 20 61 6e 64 20 61 6c 6c 20 61   table and all a
a610: 70 70 6c 69 63 61 62 6c 65 20 69 6e 64 69 63 65  pplicable indice
a620: 73 20 28 74 68 61 74 20 69 73 20 74 6f 20 73 61  s (that is to sa
a630: 79 2c 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 66  y, all indices f
a640: 6f 72 20 77 68 69 63 68 0a 2a 2a 20 61 52 65 67  or which.** aReg
a650: 49 64 78 5b 5d 20 69 73 20 6e 6f 74 20 7a 65 72  Idx[] is not zer
a660: 6f 29 2e 20 20 69 44 61 74 61 43 75 72 20 69 73  o).  iDataCur is
a670: 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20   the cursor for 
a680: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 77  the main table w
a690: 68 65 6e 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  hen.** inserting
a6a0: 20 6f 72 20 75 70 64 61 74 69 6e 67 20 61 20 72   or updating a r
a6b0: 6f 77 69 64 20 74 61 62 6c 65 2c 20 6f 72 20 74  owid table, or t
a6c0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  he cursor for th
a6d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 2a 2a  e PRIMARY KEY.**
a6e0: 20 69 6e 64 65 78 20 77 68 65 6e 20 6f 70 65 72   index when oper
a6f0: 61 74 69 6e 67 20 6f 6e 20 61 20 57 49 54 48 4f  ating on a WITHO
a700: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
a710: 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20   iIdxCur is the 
a720: 63 75 72 73 6f 72 0a 2a 2a 20 66 6f 72 20 74 68  cursor.** for th
a730: 65 20 66 69 72 73 74 20 69 6e 64 65 78 20 69 6e  e first index in
a740: 20 74 68 65 20 70 54 61 62 2d 3e 70 49 6e 64 65   the pTab->pInde
a750: 78 20 6c 69 73 74 2e 20 20 43 75 72 73 6f 72 73  x list.  Cursors
a760: 20 66 6f 72 20 6f 74 68 65 72 20 69 6e 64 69 63   for other indic
a770: 65 73 0a 2a 2a 20 61 72 65 20 61 74 20 69 49 64  es.** are at iId
a780: 78 43 75 72 2b 4e 20 66 6f 72 20 74 68 65 20 4e  xCur+N for the N
a790: 2d 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  -th element of t
a7a0: 68 65 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20  he pTab->pIndex 
a7b0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
a7c0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 67 65   routine also ge
a7d0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
a7e0: 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
a7f0: 73 2e 20 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 2a 2a  s.  NOT NULL,.**
a800: 20 43 48 45 43 4b 2c 20 61 6e 64 20 55 4e 49 51   CHECK, and UNIQ
a810: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  UE constraints a
a820: 72 65 20 61 6c 6c 20 63 68 65 63 6b 65 64 2e 20  re all checked. 
a830: 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
a840: 20 66 61 69 6c 73 2c 0a 2a 2a 20 74 68 65 6e 20   fails,.** then 
a850: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
a860: 61 63 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  action is perfor
a870: 6d 65 64 2e 20 20 54 68 65 72 65 20 61 72 65 20  med.  There are 
a880: 66 69 76 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  five possible.**
a890: 20 61 63 74 69 6f 6e 73 3a 20 52 4f 4c 4c 42 41   actions: ROLLBA
a8a0: 43 4b 2c 20 41 42 4f 52 54 2c 20 46 41 49 4c 2c  CK, ABORT, FAIL,
a8b0: 20 52 45 50 4c 41 43 45 2c 20 61 6e 64 20 49 47   REPLACE, and IG
a8c0: 4e 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20 20 43 6f 6e  NORE..**.**  Con
a8d0: 73 74 72 61 69 6e 74 20 74 79 70 65 20 20 41 63  straint type  Ac
a8e0: 74 69 6f 6e 20 20 20 20 20 20 20 57 68 61 74 20  tion       What 
a8f0: 48 61 70 70 65 6e 73 0a 2a 2a 20 20 2d 2d 2d 2d  Happens.**  ----
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
a910: 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d  -------   ------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a940: 2d 2d 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20  --.**  any      
a950: 20 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b          ROLLBACK
a960: 20 20 20 20 20 54 68 65 20 63 75 72 72 65 6e 74       The current
a970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
a980: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a  rolled back and.
a990: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29    sqlite3_step()
a9c0: 20 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69 61   returns immedia
a9d0: 74 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20 20  tely with a.**  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
aa00: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
aa10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a  ITE_CONSTRAINT..
aa20: 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20  **.**  any      
aa30: 20 20 20 20 20 20 20 20 41 42 4f 52 54 20 20 20          ABORT   
aa40: 20 20 20 20 20 42 61 63 6b 20 6f 75 74 20 63 68       Back out ch
aa50: 61 6e 67 65 73 20 66 72 6f 6d 20 74 68 65 20 63  anges from the c
aa60: 75 72 72 65 6e 74 20 63 6f 6d 6d 61 6e 64 0a 2a  urrent command.*
aa70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 6f 6e 6c 79 20 28 64 6f 20 6e 6f 74 20 64 6f   only (do not do
aaa0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 72 6f 6c 6c   a complete roll
aab0: 62 61 63 6b 29 20 74 68 65 6e 0a 2a 2a 20 20 20  back) then.**   
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 75               cau
aae0: 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
aaf0: 29 20 74 6f 20 72 65 74 75 72 6e 20 69 6d 6d 65  ) to return imme
ab00: 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20 53            with S
ab30: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
ab40: 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20  ..**.**  any    
ab50: 20 20 20 20 20 20 20 20 20 20 46 41 49 4c 20 20            FAIL  
ab60: 20 20 20 20 20 20 20 53 71 6c 69 74 65 33 5f 73         Sqlite3_s
ab70: 74 65 70 28 29 20 72 65 74 75 72 6e 73 20 69 6d  tep() returns im
ab80: 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 61  mediately with a
ab90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f     return code o
abc0: 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  f SQLITE_CONSTRA
abd0: 49 4e 54 2e 20 20 54 68 65 0a 2a 2a 20 20 20 20  INT.  The.**    
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e              tran
ac00: 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 72  saction is not r
ac10: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 61  olled back and a
ac20: 6e 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ny.**           
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f 20       changes to 
ac50: 70 72 69 6f 72 20 72 6f 77 73 20 61 72 65 20 72  prior rows are r
ac60: 65 74 61 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  etained..**.**  
ac70: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
ac80: 20 49 47 4e 4f 52 45 20 20 20 20 20 20 20 54 68   IGNORE       Th
ac90: 65 20 61 74 74 65 6d 70 74 20 69 6e 20 69 6e 73  e attempt in ins
aca0: 65 72 74 20 6f 72 20 75 70 64 61 74 65 20 74 68  ert or update th
acb0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20  e current.**    
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20              row 
ace0: 69 73 20 73 6b 69 70 70 65 64 2c 20 77 69 74 68  is skipped, with
acf0: 6f 75 74 20 74 68 72 6f 77 69 6e 67 20 61 6e 20  out throwing an 
ad00: 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  error..**       
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 20 20 20 20 50 72 6f 63 65 73 73           Process
ad30: 69 6e 67 20 63 6f 6e 74 69 6e 75 65 73 20 77 69  ing continues wi
ad40: 74 68 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  th the next row.
ad50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 28 54 68 65 72 65 20 69 73 20 61 6e 20     (There is an 
ad80: 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
ad90: 6f 20 69 67 6e 6f 72 65 44 65 73 74 2e 29 0a 2a  o ignoreDest.).*
ada0: 2a 0a 2a 2a 20 20 4e 4f 54 20 4e 55 4c 4c 20 20  *.**  NOT NULL  
adb0: 20 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20         REPLACE  
adc0: 20 20 20 20 54 68 65 20 4e 55 4c 4c 20 76 61 6c      The NULL val
add0: 75 65 20 69 73 20 72 65 70 6c 61 63 65 20 62 79  ue is replace by
ade0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
ae10: 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20 63 6f  alue for that co
ae20: 6c 75 6d 6e 2e 20 20 49 66 20 74 68 65 20 64 65  lumn.  If the de
ae30: 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 20  fault value.**  
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
ae60: 20 4e 55 4c 4c 2c 20 74 68 65 20 61 63 74 69 6f   NULL, the actio
ae70: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
ae80: 20 41 42 4f 52 54 2e 0a 2a 2a 0a 2a 2a 20 20 55   ABORT..**.**  U
ae90: 4e 49 51 55 45 20 20 20 20 20 20 20 20 20 20 20  NIQUE           
aea0: 52 45 50 4c 41 43 45 20 20 20 20 20 20 54 68 65  REPLACE      The
aeb0: 20 6f 74 68 65 72 20 72 6f 77 20 74 68 61 74 20   other row that 
aec0: 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 74  conflicts with t
aed0: 68 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  he row.**       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 20 20 20 62 65 69 6e 67 20 69           being i
af00: 6e 73 65 72 74 65 64 20 69 73 20 72 65 6d 6f 76  nserted is remov
af10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 43 48 45 43 4b  ed..**.**  CHECK
af20: 20 20 20 20 20 20 20 20 20 20 20 20 52 45 50 4c              REPL
af30: 41 43 45 20 20 20 20 20 20 49 6c 6c 65 67 61 6c  ACE      Illegal
af40: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 69  .  The results i
af50: 6e 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 0a  n an exception..
af60: 2a 2a 0a 2a 2a 20 57 68 69 63 68 20 61 63 74 69  **.** Which acti
af70: 6f 6e 20 74 6f 20 74 61 6b 65 20 69 73 20 64 65  on to take is de
af80: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
af90: 6f 76 65 72 72 69 64 65 45 72 72 6f 72 20 70 61  overrideError pa
afa0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 4f 72 20 69  rameter..** Or i
afb0: 66 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3d  f overrideError=
afc0: 3d 4f 45 5f 44 65 66 61 75 6c 74 2c 20 74 68 65  =OE_Default, the
afd0: 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6f 6e  n the pParse->on
afe0: 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 0a  Error parameter.
aff0: 2a 2a 20 69 73 20 75 73 65 64 2e 20 20 4f 72 20  ** is used.  Or 
b000: 69 66 20 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72  if pParse->onErr
b010: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 74  or==OE_Default t
b020: 68 65 6e 20 74 68 65 20 6f 6e 45 72 72 6f 72 20  hen the onError 
b030: 76 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65  value.** for the
b040: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 75   constraint is u
b050: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
b060: 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
b070: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 0a 20 20  traintChecks(.  
b080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b090: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b0a0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
b0b0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
b0c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
b0d0: 65 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  e being inserted
b0e0: 20 6f 72 20 75 70 64 61 74 65 64 20 2a 2f 0a 20   or updated */. 
b0f0: 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c 20 20   int *aRegIdx,  
b100: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 72 65 67        /* Use reg
b110: 69 73 74 65 72 20 61 52 65 67 49 64 78 5b 69 5d  ister aRegIdx[i]
b120: 20 66 6f 72 20 69 6e 64 65 78 20 69 2e 20 20 30   for index i.  0
b130: 20 66 6f 72 20 75 6e 75 73 65 64 20 2a 2f 0a 20   for unused */. 
b140: 20 69 6e 74 20 69 44 61 74 61 43 75 72 2c 20 20   int iDataCur,  
b150: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
b160: 61 6c 20 64 61 74 61 20 63 75 72 73 6f 72 20 28  al data cursor (
b170: 6d 61 69 6e 20 74 61 62 6c 65 20 6f 72 20 50 4b  main table or PK
b180: 20 69 6e 64 65 78 29 20 2a 2f 0a 20 20 69 6e 74   index) */.  int
b190: 20 69 49 64 78 43 75 72 2c 20 20 20 20 20 20 20   iIdxCur,       
b1a0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78    /* First index
b1b0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
b1c0: 20 72 65 67 4e 65 77 44 61 74 61 2c 20 20 20 20   regNewData,    
b1d0: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
b1e0: 74 65 72 20 69 6e 20 61 20 72 61 6e 67 65 20 68  ter in a range h
b1f0: 6f 6c 64 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  olding values to
b200: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74   insert */.  int
b210: 20 72 65 67 4f 6c 64 44 61 74 61 2c 20 20 20 20   regOldData,    
b220: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 63 6f    /* Previous co
b230: 6e 74 65 6e 74 2e 20 20 30 20 66 6f 72 20 49 4e  ntent.  0 for IN
b240: 53 45 52 54 73 20 2a 2f 0a 20 20 75 38 20 70 6b  SERTs */.  u8 pk
b250: 43 68 6e 67 2c 20 20 20 20 20 20 20 20 20 20 20  Chng,           
b260: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  /* Non-zero if t
b270: 68 65 20 72 6f 77 69 64 20 6f 72 20 50 52 49 4d  he rowid or PRIM
b280: 41 52 59 20 4b 45 59 20 63 68 61 6e 67 65 64 20  ARY KEY changed 
b290: 2a 2f 0a 20 20 75 38 20 6f 76 65 72 72 69 64 65  */.  u8 override
b2a0: 45 72 72 6f 72 2c 20 20 20 20 2f 2a 20 4f 76 65  Error,    /* Ove
b2b0: 72 72 69 64 65 20 6f 6e 45 72 72 6f 72 20 74 6f  rride onError to
b2c0: 20 74 68 69 73 20 69 66 20 6e 6f 74 20 4f 45 5f   this if not OE_
b2d0: 44 65 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74  Default */.  int
b2e0: 20 69 67 6e 6f 72 65 44 65 73 74 2c 20 20 20 20   ignoreDest,    
b2f0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
b300: 73 20 6c 61 62 65 6c 20 6f 6e 20 61 6e 20 4f 45  s label on an OE
b310: 5f 49 67 6e 6f 72 65 20 72 65 73 6f 6c 75 74 69  _Ignore resoluti
b320: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4d  on */.  int *pbM
b330: 61 79 52 65 70 6c 61 63 65 2c 20 20 20 2f 2a 20  ayReplace,   /* 
b340: 4f 55 54 3a 20 53 65 74 20 74 6f 20 74 72 75 65  OUT: Set to true
b350: 20 69 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 6d   if constraint m
b360: 61 79 20 63 61 75 73 65 20 61 20 72 65 70 6c 61  ay cause a repla
b370: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 43  ce */.  int *aiC
b380: 68 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  hng          /* 
b390: 63 6f 6c 75 6d 6e 20 69 20 69 73 20 75 6e 63 68  column i is unch
b3a0: 61 6e 67 65 64 20 69 66 20 61 69 43 68 6e 67 5b  anged if aiChng[
b3b0: 69 5d 3c 30 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  i]<0 */.){.  Vdb
b3c0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
b3d0: 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65 72 20    /* VDBE under 
b3e0: 63 6f 6e 73 74 72 75 74 69 6f 6e 20 2a 2f 0a 20  constrution */. 
b3f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
b400: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
b410: 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   to one of the i
b420: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 49 6e 64 65  ndices */.  Inde
b430: 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20  x *pPk = 0;     
b440: 20 2f 2a 20 54 68 65 20 50 52 49 4d 41 52 59 20   /* The PRIMARY 
b450: 4b 45 59 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73  KEY index */.  s
b460: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
b470: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
b480: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
b490: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b4a0: 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63 6f 75       /* loop cou
b4b0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 78  nter */.  int ix
b4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b4d0: 2a 20 49 6e 64 65 78 20 6c 6f 6f 70 20 63 6f 75  * Index loop cou
b4e0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  nter */.  int nC
b4f0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol;            /
b500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b510: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  mns */.  int onE
b520: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rror;         /*
b530: 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
b540: 74 69 6f 6e 20 73 74 72 61 74 65 67 79 20 2a 2f  tion strategy */
b550: 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
b560: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b570: 73 73 20 6f 66 20 6a 75 6d 70 20 69 6e 73 74 72  ss of jump instr
b580: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
b590: 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 30 3b  seenReplace = 0;
b5a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 52 45 50 4c   /* True if REPL
b5b0: 41 43 45 20 69 73 20 75 73 65 64 20 74 6f 20 72  ACE is used to r
b5c0: 65 73 6f 6c 76 65 20 49 4e 54 20 50 4b 20 63 6f  esolve INT PK co
b5d0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20  nflict */.  int 
b5e0: 6e 50 6b 46 69 65 6c 64 3b 20 20 20 20 20 20 20  nPkField;       
b5f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
b600: 65 6c 64 73 20 69 6e 20 50 52 49 4d 41 52 59 20  elds in PRIMARY 
b610: 4b 45 59 2e 20 31 20 66 6f 72 20 52 4f 57 49 44  KEY. 1 for ROWID
b620: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74   tables */.  int
b630: 20 69 70 6b 54 6f 70 20 3d 20 30 3b 20 20 20 20   ipkTop = 0;    
b640: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
b650: 72 6f 77 69 64 20 63 68 61 6e 67 65 20 63 6f 6e  rowid change con
b660: 73 74 72 61 69 6e 74 20 63 68 65 63 6b 20 2a 2f  straint check */
b670: 0a 20 20 69 6e 74 20 69 70 6b 42 6f 74 74 6f 6d  .  int ipkBottom
b680: 20 3d 20 30 3b 20 20 20 2f 2a 20 42 6f 74 74 6f   = 0;   /* Botto
b690: 6d 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63  m of the rowid c
b6a0: 68 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  hange constraint
b6b0: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 38 20 69   check */.  u8 i
b6c0: 73 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20  sUpdate;        
b6d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
b6e0: 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 70   is an UPDATE op
b6f0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  eration */.  u8 
b700: 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20  bAffinityDone = 
b710: 30 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  0;  /* True if t
b720: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
b730: 70 65 72 61 74 69 6f 6e 20 68 61 73 20 62 65 65  peration has bee
b740: 6e 20 72 75 6e 20 2a 2f 0a 0a 20 20 69 73 55 70  n run */..  isUp
b750: 64 61 74 65 20 3d 20 72 65 67 4f 6c 64 44 61 74  date = regOldDat
b760: 61 21 3d 30 3b 0a 20 20 64 62 20 3d 20 70 50 61  a!=0;.  db = pPa
b770: 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73  rse->db;.  v = s
b780: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b790: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
b7a0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
b7b0: 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  t( pTab->pSelect
b7c0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20  ==0 );  /* This 
b7d0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56  table is not a V
b7e0: 49 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  IEW */.  nCol = 
b7f0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 0a 20  pTab->nCol;.  . 
b800: 20 2f 2a 20 70 50 6b 20 69 73 20 74 68 65 20 50   /* pPk is the P
b810: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
b820: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
b830: 49 44 20 74 61 62 6c 65 73 20 61 6e 64 20 4e 55  ID tables and NU
b840: 4c 4c 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d  LL for.  ** norm
b850: 61 6c 20 72 6f 77 69 64 20 74 61 62 6c 65 73 2e  al rowid tables.
b860: 20 20 6e 50 6b 46 69 65 6c 64 20 69 73 20 74 68    nPkField is th
b870: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  e number of key 
b880: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 0a 20  fields in the . 
b890: 20 2a 2a 20 70 50 6b 20 69 6e 64 65 78 20 6f 72   ** pPk index or
b8a0: 20 31 20 66 6f 72 20 61 20 72 6f 77 69 64 20 74   1 for a rowid t
b8b0: 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  able.  In other 
b8c0: 77 6f 72 64 73 2c 20 6e 50 6b 46 69 65 6c 64 20  words, nPkField 
b8d0: 69 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62  is the.  ** numb
b8e0: 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
b8f0: 74 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79  the true primary
b900: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c   key of the tabl
b910: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 48 61 73 52  e. */.  if( HasR
b920: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
b930: 20 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 6e    pPk = 0;.    n
b940: 50 6b 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 7d  PkField = 1;.  }
b950: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20  else{.    pPk = 
b960: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
b970: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
b980: 20 20 6e 50 6b 46 69 65 6c 64 20 3d 20 70 50 6b    nPkField = pPk
b990: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a 0a  ->nKeyCol;.  }..
b9a0: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 61 74    /* Record that
b9b0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
b9c0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 56 64   started */.  Vd
b9d0: 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
b9e0: 28 76 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e 43  (v, "BEGIN: GenC
b9f0: 6e 73 74 43 6b 73 28 25 64 2c 25 64 2c 25 64 2c  nstCks(%d,%d,%d,
ba00: 25 64 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20  %d,%d)",.       
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 44                iD
ba20: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c  ataCur, iIdxCur,
ba30: 20 72 65 67 4e 65 77 44 61 74 61 2c 20 72 65 67   regNewData, reg
ba40: 4f 6c 64 44 61 74 61 2c 20 70 6b 43 68 6e 67 29  OldData, pkChng)
ba50: 29 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c  );..  /* Test al
ba60: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  l NOT NULL const
ba70: 72 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 66  raints..  */.  f
ba80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
ba90: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
baa0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
bab0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
bac0: 20 20 20 20 20 20 20 2f 2a 20 52 4f 57 49 44 20         /* ROWID 
bad0: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 20 2a 2f  is never NULL */
bae0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
baf0: 69 43 68 6e 67 20 26 26 20 61 69 43 68 6e 67 5b  iChng && aiChng[
bb00: 69 5d 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  i]<0 ){.      /*
bb10: 20 44 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 68   Don't bother ch
bb20: 65 63 6b 69 6e 67 20 66 6f 72 20 4e 4f 54 20 4e  ecking for NOT N
bb30: 55 4c 4c 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 74  ULL on columns t
bb40: 68 61 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  hat do not chang
bb50: 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  e */.      conti
bb60: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  nue;.    }.    o
bb70: 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 61  nError = pTab->a
bb80: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a  Col[i].notNull;.
bb90: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
bba0: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69  =OE_None ) conti
bbb0: 6e 75 65 3b 20 20 2f 2a 20 54 68 69 73 20 63 6f  nue;  /* This co
bbc0: 6c 75 6d 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20  lumn is allowed 
bbd0: 74 6f 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  to be NULL */.  
bbe0: 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72    if( overrideEr
bbf0: 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror!=OE_Default 
bc00: 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  ){.      onError
bc10: 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72   = overrideError
bc20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bc30: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
bc40: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
bc50: 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  rror = OE_Abort;
bc60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
bc70: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
bc80: 63 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c  ce && pTab->aCol
bc90: 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b 0a  [i].pDflt==0 ){.
bca0: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20        onError = 
bcb0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  OE_Abort;.    }.
bcc0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72      assert( onEr
bcd0: 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ror==OE_Rollback
bce0: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
bcf0: 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72  Abort || onError
bd00: 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
bd10: 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45    || onError==OE
bd20: 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72  _Ignore || onErr
bd30: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
bd40: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e  ;.    switch( on
bd50: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 63  Error ){.      c
bd60: 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20  ase OE_Abort:.  
bd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79        sqlite3May
bd80: 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
bd90: 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74         /* Fall t
bda0: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 20 20  hrough */.      
bdb0: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
bdc0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  :.      case OE_
bdd0: 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20  Fail: {.        
bde0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
bdf0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
be00: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
be10: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
be40: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[i].zName);.
be50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
be60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
be70: 48 61 6c 74 49 66 4e 75 6c 6c 2c 20 53 51 4c 49  HaltIfNull, SQLI
be80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
be90: 54 4e 55 4c 4c 2c 20 6f 6e 45 72 72 6f 72 2c 0a  TNULL, onError,.
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 20 20 20 20 20 72 65 67 4e 65 77            regNew
bec0: 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20 20  Data+1+i);.     
bed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
bee0: 70 65 6e 64 50 34 28 76 2c 20 7a 4d 73 67 2c 20  pendP4(v, zMsg, 
bef0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
bf00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf10: 43 68 61 6e 67 65 50 35 28 76 2c 20 50 35 5f 43  ChangeP5(v, P5_C
bf20: 6f 6e 73 74 72 61 69 6e 74 4e 6f 74 4e 75 6c 6c  onstraintNotNull
bf30: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
bf40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
bf50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bf60: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
bf70: 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20  _Ignore: {.     
bf80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bf90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
bfa0: 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31 2b  l, regNewData+1+
bfb0: 69 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a  i, ignoreDest);.
bfc0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
bfd0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
bfe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bff0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
c000: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c010: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
c020: 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20  lace );.        
c030: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
c040: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
c050: 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 4e 65 77 44  NotNull, regNewD
c060: 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20 20 20  ata+1+i);.      
c070: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
c080: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
c090: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c0a0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  arse, pTab->aCol
c0b0: 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 4e 65  [i].pDflt, regNe
c0c0: 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20 20  wData+1+i);.    
c0d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c0e0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
c0f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c110: 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61    }..  /* Test a
c120: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
c130: 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ints.  */.#ifnde
c140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
c150: 45 43 4b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ECK.  if( pTab->
c160: 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66  pCheck && (db->f
c170: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67  lags & SQLITE_Ig
c180: 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29  noreChecks)==0 )
c190: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
c1a0: 70 43 68 65 63 6b 20 3d 20 70 54 61 62 2d 3e 70  pCheck = pTab->p
c1b0: 43 68 65 63 6b 3b 0a 20 20 20 20 70 50 61 72 73  Check;.    pPars
c1c0: 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 2d 28  e->iSelfTab = -(
c1d0: 72 65 67 4e 65 77 44 61 74 61 2b 31 29 3b 0a 20  regNewData+1);. 
c1e0: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65     onError = ove
c1f0: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
c200: 65 66 61 75 6c 74 20 3f 20 6f 76 65 72 72 69 64  efault ? overrid
c210: 65 45 72 72 6f 72 20 3a 20 4f 45 5f 41 62 6f 72  eError : OE_Abor
c220: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
c230: 69 3c 70 43 68 65 63 6b 2d 3e 6e 45 78 70 72 3b  i<pCheck->nExpr;
c240: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
c250: 20 61 6c 6c 4f 6b 3b 0a 20 20 20 20 20 20 45 78   allOk;.      Ex
c260: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 68 65  pr *pExpr = pChe
c270: 63 6b 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  ck->a[i].pExpr;.
c280: 20 20 20 20 20 20 69 66 28 20 61 69 43 68 6e 67        if( aiChng
c290: 20 26 26 20 63 68 65 63 6b 43 6f 6e 73 74 72 61   && checkConstra
c2a0: 69 6e 74 55 6e 63 68 61 6e 67 65 64 28 70 45 78  intUnchanged(pEx
c2b0: 70 72 2c 20 61 69 43 68 6e 67 2c 20 70 6b 43 68  pr, aiChng, pkCh
c2c0: 6e 67 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ng) ) continue;.
c2d0: 20 20 20 20 20 20 61 6c 6c 4f 6b 20 3d 20 73 71        allOk = sq
c2e0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
c2f0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
c300: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
c310: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 6c  Parse, pExpr, al
c320: 6c 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  lOk, SQLITE_JUMP
c330: 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69  IFNULL);.      i
c340: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49  f( onError==OE_I
c350: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
c360: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
c370: 28 76 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b  (v, ignoreDest);
c380: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c390: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
c3a0: 65 20 3d 20 70 43 68 65 63 6b 2d 3e 61 5b 69 5d  e = pCheck->a[i]
c3b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
c3c0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a  if( zName==0 ) z
c3d0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
c3e0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
c3f0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
c400: 61 63 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20  ace ) onError = 
c410: 4f 45 5f 41 62 6f 72 74 3b 20 2f 2a 20 49 4d 50  OE_Abort; /* IMP
c420: 3a 20 52 2d 31 35 35 36 39 2d 36 33 36 32 35 20  : R-15569-63625 
c430: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
c440: 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
c450: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
c460: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
c470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 6f 6e 45 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c 20  onError, zName, 
c4a0: 50 34 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20 20  P4_TRANSIENT,.  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
c4d0: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 29 3b  onstraintCheck);
c4e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
c4f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c500: 65 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29  eLabel(v, allOk)
c510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
c520: 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30  se->iSelfTab = 0
c530: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
c540: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c550: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
c560: 20 20 2f 2a 20 49 66 20 72 6f 77 69 64 20 69 73    /* If rowid is
c570: 20 63 68 61 6e 67 69 6e 67 2c 20 6d 61 6b 65 20   changing, make 
c580: 73 75 72 65 20 74 68 65 20 6e 65 77 20 72 6f 77  sure the new row
c590: 69 64 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  id does not prev
c5a0: 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 65 78 69 73  iously.  ** exis
c5b0: 74 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  t in the table..
c5c0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 6b 43 68 6e    */.  if( pkChn
c5d0: 67 20 26 26 20 70 50 6b 3d 3d 30 20 29 7b 0a 20  g && pPk==0 ){. 
c5e0: 20 20 20 69 6e 74 20 61 64 64 72 52 6f 77 69 64     int addrRowid
c5f0: 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
c600: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
c610: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
c620: 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20   what action to 
c630: 74 61 6b 65 20 69 6e 20 63 61 73 65 20 6f 66 20  take in case of 
c640: 61 20 72 6f 77 69 64 20 63 6f 6c 6c 69 73 69 6f  a rowid collisio
c650: 6e 20 2a 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72  n */.    onError
c660: 20 3d 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66   = pTab->keyConf
c670: 3b 0a 20 20 20 20 69 66 28 20 6f 76 65 72 72 69  ;.    if( overri
c680: 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61  deError!=OE_Defa
c690: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
c6a0: 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45  rror = overrideE
c6b0: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rror;.    }else 
c6c0: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
c6d0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
c6e0: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
c6f0: 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ort;.    }..    
c700: 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a  if( isUpdate ){.
c710: 20 20 20 20 20 20 2f 2a 20 70 6b 43 68 6e 67 21        /* pkChng!
c720: 3d 30 20 64 6f 65 73 20 6e 6f 74 20 6d 65 61 6e  =0 does not mean
c730: 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
c740: 68 61 73 20 63 68 61 6e 67 65 64 2c 20 6f 6e 6c  has changed, onl
c750: 79 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  y that.      ** 
c760: 69 74 20 6d 69 67 68 74 20 68 61 76 65 20 63 68  it might have ch
c770: 61 6e 67 65 64 2e 20 20 53 6b 69 70 20 74 68 65  anged.  Skip the
c780: 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67 69 63 20   conflict logic 
c790: 62 65 6c 6f 77 20 69 66 20 74 68 65 20 72 6f 77  below if the row
c7a0: 69 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  id.      ** is u
c7b0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20 20  nchanged. */.   
c7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c7d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
c7e0: 65 67 4e 65 77 44 61 74 61 2c 20 61 64 64 72 52  egNewData, addrR
c7f0: 6f 77 69 64 4f 6b 2c 20 72 65 67 4f 6c 64 44 61  owidOk, regOldDa
c800: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
c810: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
c820: 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c  , SQLITE_NOTNULL
c830: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
c840: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
c850: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72  .    /* If the r
c860: 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 72 6f 77  esponse to a row
c870: 69 64 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 52  id conflict is R
c880: 45 50 4c 41 43 45 20 62 75 74 20 74 68 65 20 72  EPLACE but the r
c890: 65 73 70 6f 6e 73 65 0a 20 20 20 20 2a 2a 20 74  esponse.    ** t
c8a0: 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 55 4e 49  o some other UNI
c8b0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  QUE constraint i
c8c0: 73 20 46 41 49 4c 20 6f 72 20 49 47 4e 4f 52 45  s FAIL or IGNORE
c8d0: 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 0a 20  , then we need. 
c8e0: 20 20 20 2a 2a 20 74 6f 20 64 65 66 65 72 20 74     ** to defer t
c8f0: 68 65 20 72 75 6e 6e 69 6e 67 20 6f 66 20 74 68  he running of th
c900: 65 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74  e rowid conflict
c910: 20 63 68 65 63 6b 69 6e 67 20 75 6e 74 69 6c 20   checking until 
c920: 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  after.    ** the
c930: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
c940: 6e 74 73 20 68 61 76 65 20 72 75 6e 2e 0a 20 20  nts have run..  
c950: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6e 45    */.    if( onE
c960: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
c970: 20 26 26 20 6f 76 65 72 72 69 64 65 45 72 72 6f   && overrideErro
c980: 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
c990: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
c9a0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
c9b0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
c9c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
c9d0: 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
c9e0: 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 70  ==OE_Ignore || p
c9f0: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
ca00: 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
ca10: 20 20 20 69 70 6b 54 6f 70 20 3d 20 73 71 6c 69     ipkTop = sqli
ca20: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
ca30: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20   OP_Goto);.     
ca40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ca60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
ca70: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
ca80: 6e 65 77 20 72 6f 77 69 64 20 61 6c 72 65 61 64  new rowid alread
ca90: 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
caa0: 74 61 62 6c 65 2e 20 20 53 6b 69 70 0a 20 20 20  table.  Skip.   
cab0: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
cac0: 67 20 63 6f 6e 66 6c 69 63 74 20 6c 6f 67 69 63  g conflict logic
cad0: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
cae0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
caf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cb00: 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 61 74 61  NotExists, iData
cb10: 43 75 72 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b  Cur, addrRowidOk
cb20: 2c 20 72 65 67 4e 65 77 44 61 74 61 29 3b 0a 20  , regNewData);. 
cb30: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
cb40: 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  v);..    /* Gene
cb50: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 64  rate code that d
cb60: 65 61 6c 73 20 77 69 74 68 20 61 20 72 6f 77 69  eals with a rowi
cb70: 64 20 63 6f 6c 6c 69 73 69 6f 6e 20 2a 2f 0a 20  d collision */. 
cb80: 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72     switch( onErr
cb90: 6f 72 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61  or ){.      defa
cba0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 6f  ult: {.        o
cbb0: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
cbc0: 74 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  t;.        /* Fa
cbd0: 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
cbe0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
cbf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
cc00: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20   OE_Rollback:.  
cc10: 20 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72      case OE_Abor
cc20: 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  t:.      case OE
cc30: 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20  _Fail: {.       
cc40: 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e   sqlite3RowidCon
cc50: 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
cc60: 6f 6e 45 72 72 6f 72 2c 20 70 54 61 62 29 3b 0a  onError, pTab);.
cc70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cc80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
cc90: 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 7b 0a  e OE_Replace: {.
cca0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
ccb0: 65 72 65 20 61 72 65 20 44 45 4c 45 54 45 20 74  ere are DELETE t
ccc0: 72 69 67 67 65 72 73 20 6f 6e 20 74 68 69 73 20  riggers on this 
ccd0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 20 20  table and the.  
cce0: 20 20 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69        ** recursi
ccf0: 76 65 2d 74 72 69 67 67 65 72 73 20 66 6c 61 67  ve-triggers flag
cd00: 20 69 73 20 73 65 74 2c 20 63 61 6c 6c 20 47 65   is set, call Ge
cd10: 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28  nerateRowDelete(
cd20: 29 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  ) to.        ** 
cd30: 72 65 6d 6f 76 65 20 74 68 65 20 63 6f 6e 66 6c  remove the confl
cd40: 69 63 74 69 6e 67 20 72 6f 77 20 66 72 6f 6d 20  icting row from 
cd50: 74 68 65 20 74 61 62 6c 65 2e 20 54 68 69 73 20  the table. This 
cd60: 77 69 6c 6c 20 66 69 72 65 0a 20 20 20 20 20 20  will fire.      
cd70: 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72    ** the trigger
cd80: 73 20 61 6e 64 20 72 65 6d 6f 76 65 20 62 6f 74  s and remove bot
cd90: 68 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  h the table and 
cda0: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e 74  index b-tree ent
cdb0: 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ries..        **
cdc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
cdd0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
cde0: 61 72 65 20 6e 6f 20 74 72 69 67 67 65 72 73 20  are no triggers 
cdf0: 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
ce00: 2d 74 72 69 67 67 65 72 73 0a 20 20 20 20 20 20  -triggers.      
ce10: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 6e 6f 74    ** flag is not
ce20: 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 74 61   set, but the ta
ce30: 62 6c 65 20 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ble has one or m
ce40: 6f 72 65 20 69 6e 64 65 78 65 73 2c 20 63 61 6c  ore indexes, cal
ce50: 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  l .        ** Ge
ce60: 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65  nerateRowIndexDe
ce70: 6c 65 74 65 28 29 2e 20 54 68 69 73 20 72 65 6d  lete(). This rem
ce80: 6f 76 65 73 20 74 68 65 20 69 6e 64 65 78 20 62  oves the index b
ce90: 2d 74 72 65 65 20 65 6e 74 72 69 65 73 20 0a 20  -tree entries . 
cea0: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 2e 20         ** only. 
ceb0: 54 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  The table b-tree
cec0: 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 72   entry will be r
ced0: 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
cee0: 65 77 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  ew entry .      
cef0: 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 69 73 20    ** when it is 
cf00: 69 6e 73 65 72 74 65 64 2e 20 20 0a 20 20 20 20  inserted.  .    
cf10: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
cf20: 2a 20 49 66 20 65 69 74 68 65 72 20 47 65 6e 65  * If either Gene
cf30: 72 61 74 65 52 6f 77 44 65 6c 65 74 65 28 29 20  rateRowDelete() 
cf40: 6f 72 20 47 65 6e 65 72 61 74 65 52 6f 77 49 6e  or GenerateRowIn
cf50: 64 65 78 44 65 6c 65 74 65 28 29 20 69 73 20 63  dexDelete() is c
cf60: 61 6c 6c 65 64 2c 0a 20 20 20 20 20 20 20 20 2a  alled,.        *
cf70: 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 20 4d 75  * also invoke Mu
cf80: 6c 74 69 57 72 69 74 65 28 29 20 74 6f 20 69 6e  ltiWrite() to in
cf90: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 69 73  dicate that this
cfa0: 20 56 44 42 45 20 6d 61 79 20 72 65 71 75 69 72   VDBE may requir
cfb0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  e.        ** sta
cfc0: 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
cfd0: 28 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e  (if the statemen
cfe0: 74 20 69 73 20 61 62 6f 72 74 65 64 20 61 66 74  t is aborted aft
cff0: 65 72 20 74 68 65 20 64 65 6c 65 74 65 0a 20 20  er the delete.  
d000: 20 20 20 20 20 20 2a 2a 20 74 61 6b 65 73 20 70        ** takes p
d010: 6c 61 63 65 29 2e 20 45 61 72 6c 69 65 72 20 76  lace). Earlier v
d020: 65 72 73 69 6f 6e 73 20 63 61 6c 6c 65 64 20 73  ersions called s
d030: 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
d040: 28 29 20 72 65 67 61 72 64 6c 65 73 73 2c 0a 20  () regardless,. 
d050: 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 62 65         ** but be
d060: 69 6e 67 20 6d 6f 72 65 20 73 65 6c 65 63 74 69  ing more selecti
d070: 76 65 20 68 65 72 65 20 61 6c 6c 6f 77 73 20 73  ve here allows s
d080: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 3a 0a  tatements like:.
d090: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
d0a0: 20 20 20 2a 2a 20 20 20 52 45 50 4c 41 43 45 20     **   REPLACE 
d0b0: 49 4e 54 4f 20 74 28 72 6f 77 69 64 29 20 56 41  INTO t(rowid) VA
d0c0: 4c 55 45 53 28 24 6e 65 77 72 6f 77 69 64 29 0a  LUES($newrowid).
d0d0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
d0e0: 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 77 69 74     ** to run wit
d0f0: 68 6f 75 74 20 61 20 73 74 61 74 65 6d 65 6e 74  hout a statement
d100: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72   journal if ther
d110: 65 20 61 72 65 20 6e 6f 20 69 6e 64 65 78 65 73  e are no indexes
d120: 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   on the.        
d130: 2a 2a 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20  ** table..      
d140: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 72 69    */.        Tri
d150: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d  gger *pTrigger =
d160: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
d170: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
d180: 5f 52 65 63 54 72 69 67 67 65 72 73 20 29 7b 0a  _RecTriggers ){.
d190: 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67            pTrigg
d1a0: 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
d1b0: 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73 65  gersExist(pParse
d1c0: 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54  , pTab, TK_DELET
d1d0: 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 0, 0);.      
d1e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d1f0: 70 54 72 69 67 67 65 72 20 7c 7c 20 73 71 6c 69  pTrigger || sqli
d200: 74 65 33 46 6b 52 65 71 75 69 72 65 64 28 70 50  te3FkRequired(pP
d210: 61 72 73 65 2c 20 70 54 61 62 2c 20 30 2c 20 30  arse, pTab, 0, 0
d220: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
d230: 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
d240: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d250: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
d260: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61  ateRowDelete(pPa
d270: 72 73 65 2c 20 70 54 61 62 2c 20 70 54 72 69 67  rse, pTab, pTrig
d280: 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c 20 69  ger, iDataCur, i
d290: 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20  IdxCur,.        
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4e 65             regNe
d2c0: 77 44 61 74 61 2c 20 31 2c 20 30 2c 20 4f 45 5f  wData, 1, 0, OE_
d2d0: 52 65 70 6c 61 63 65 2c 20 31 2c 20 2d 31 29 3b  Replace, 1, -1);
d2e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d2f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d300: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
d310: 4f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OOK.          if
d320: 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
d330: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d340: 2f 2a 20 54 68 69 73 20 4f 50 5f 44 65 6c 65 74  /* This OP_Delet
d350: 65 20 6f 70 63 6f 64 65 20 66 69 72 65 73 20 74  e opcode fires t
d360: 68 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f  he pre-update-ho
d370: 6f 6b 20 6f 6e 6c 79 2e 20 49 74 20 64 6f 65 73  ok only. It does
d380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
d390: 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 20 62  not modify the b
d3a0: 2d 74 72 65 65 2e 20 49 74 20 69 73 20 6d 6f 72  -tree. It is mor
d3b0: 65 20 65 66 66 69 63 69 65 6e 74 20 74 6f 20 6c  e efficient to l
d3c0: 65 74 20 74 68 65 20 63 6f 6d 69 6e 67 0a 20 20  et the coming.  
d3d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f            ** OP_
d3e0: 49 6e 73 65 72 74 20 72 65 70 6c 61 63 65 20 74  Insert replace t
d3f0: 68 65 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  he existing entr
d400: 79 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20  y than it is to 
d410: 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
d420: 20 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69         ** existi
d430: 6e 67 20 65 6e 74 72 79 20 61 6e 64 20 74 68 65  ng entry and the
d440: 6e 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 6f  n insert a new o
d450: 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ne. */.         
d460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d470: 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp2(v, OP_Delet
d480: 65 2c 20 69 44 61 74 61 43 75 72 2c 20 4f 50 46  e, iDataCur, OPF
d490: 4c 41 47 5f 49 53 4e 4f 4f 50 29 3b 0a 20 20 20  LAG_ISNOOP);.   
d4a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d4b0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
d4c0: 70 54 61 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b  pTab, P4_TABLE);
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
d4e0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
d4f0: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
d500: 4f 4f 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  OOK */.         
d510: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
d520: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x ){.           
d530: 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
d540: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
d550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
d560: 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44  enerateRowIndexD
d570: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54  elete(pParse, pT
d580: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  ab, iDataCur, iI
d590: 64 78 43 75 72 2c 30 2c 2d 31 29 3b 0a 20 20 20  dxCur,0,-1);.   
d5a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d5b0: 20 7d 0a 20 20 20 20 20 20 20 20 73 65 65 6e 52   }.        seenR
d5c0: 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  eplace = 1;.    
d5d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d5e0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
d5f0: 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20  _Ignore: {.     
d600: 20 20 20 2f 2a 61 73 73 65 72 74 28 20 73 65 65     /*assert( see
d610: 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b 2a 2f  nReplace==0 );*/
d620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d630: 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f  VdbeGoto(v, igno
d640: 72 65 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20  reDest);.       
d650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
d660: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d670: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d680: 6c 28 76 2c 20 61 64 64 72 52 6f 77 69 64 4f 6b  l(v, addrRowidOk
d690: 29 3b 0a 20 20 20 20 69 66 28 20 69 70 6b 54 6f  );.    if( ipkTo
d6a0: 70 20 29 7b 0a 20 20 20 20 20 20 69 70 6b 42 6f  p ){.      ipkBo
d6b0: 74 74 6f 6d 20 3d 20 73 71 6c 69 74 65 33 56 64  ttom = sqlite3Vd
d6c0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
d6d0: 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oto);.      sqli
d6e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d6f0: 76 2c 20 69 70 6b 54 6f 70 29 3b 0a 20 20 20 20  v, ipkTop);.    
d700: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74  }.  }..  /* Test
d710: 20 61 6c 6c 20 55 4e 49 51 55 45 20 63 6f 6e 73   all UNIQUE cons
d720: 74 72 61 69 6e 74 73 20 62 79 20 63 72 65 61 74  traints by creat
d730: 69 6e 67 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ing entries for 
d740: 65 61 63 68 20 55 4e 49 51 55 45 0a 20 20 2a 2a  each UNIQUE.  **
d750: 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 69 6e   index and makin
d760: 67 20 73 75 72 65 20 74 68 61 74 20 64 75 70 6c  g sure that dupl
d770: 69 63 61 74 65 20 65 6e 74 72 69 65 73 20 64 6f  icate entries do
d780: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
d790: 73 74 2e 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65  st..  ** Compute
d7a0: 20 74 68 65 20 72 65 76 69 73 65 64 20 72 65 63   the revised rec
d7b0: 6f 72 64 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ord entries for 
d7c0: 69 6e 64 69 63 65 73 20 61 73 20 77 65 20 67 6f  indices as we go
d7d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
d7e0: 20 6c 6f 6f 70 20 61 6c 73 6f 20 68 61 6e 64 6c   loop also handl
d7f0: 65 73 20 74 68 65 20 63 61 73 65 20 6f 66 20 74  es the case of t
d800: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d810: 6e 64 65 78 20 66 6f 72 20 61 0a 20 20 2a 2a 20  ndex for a.  ** 
d820: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d830: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ble..  */.  for(
d840: 69 78 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d  ix=0, pIdx=pTab-
d850: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
d860: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
d870: 20 69 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ix++){.    int 
d880: 72 65 67 49 64 78 3b 20 20 20 20 20 20 20 20 20  regIdx;         
d890: 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 72 65 67   /* Range of reg
d8a0: 69 73 74 65 72 73 20 68 6f 6c 64 20 63 6f 6e 65  isters hold cone
d8b0: 6e 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20  nt for pIdx */. 
d8c0: 20 20 20 69 6e 74 20 72 65 67 52 3b 20 20 20 20     int regR;    
d8d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
d8e0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 6f   of registers ho
d8f0: 6c 64 69 6e 67 20 63 6f 6e 66 6c 69 63 74 69 6e  lding conflictin
d900: 67 20 50 4b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  g PK */.    int 
d910: 69 54 68 69 73 43 75 72 3b 20 20 20 20 20 20 20  iThisCur;       
d920: 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74   /* Cursor for t
d930: 68 69 73 20 55 4e 49 51 55 45 20 69 6e 64 65 78  his UNIQUE index
d940: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
d950: 55 6e 69 71 75 65 4f 6b 3b 20 20 20 20 2f 2a 20  UniqueOk;    /* 
d960: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
d970: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
d980: 6e 74 20 69 73 20 73 61 74 69 73 66 69 65 64 20  nt is satisfied 
d990: 2a 2f 0a 0a 20 20 20 20 69 66 28 20 61 52 65 67  */..    if( aReg
d9a0: 49 64 78 5b 69 78 5d 3d 3d 30 20 29 20 63 6f 6e  Idx[ix]==0 ) con
d9b0: 74 69 6e 75 65 3b 20 20 2f 2a 20 53 6b 69 70 20  tinue;  /* Skip 
d9c0: 69 6e 64 69 63 65 73 20 74 68 61 74 20 64 6f 20  indices that do 
d9d0: 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  not change */.  
d9e0: 20 20 69 66 28 20 62 41 66 66 69 6e 69 74 79 44    if( bAffinityD
d9f0: 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  one==0 ){.      
da00: 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
da10: 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 72 65  nity(v, pTab, re
da20: 67 4e 65 77 44 61 74 61 2b 31 29 3b 0a 20 20 20  gNewData+1);.   
da30: 20 20 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65     bAffinityDone
da40: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
da50: 69 54 68 69 73 43 75 72 20 3d 20 69 49 64 78 43  iThisCur = iIdxC
da60: 75 72 2b 69 78 3b 0a 20 20 20 20 61 64 64 72 55  ur+ix;.    addrU
da70: 6e 69 71 75 65 4f 6b 20 3d 20 73 71 6c 69 74 65  niqueOk = sqlite
da80: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
da90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  );..    /* Skip 
daa0: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
dab0: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48  for which the WH
dac0: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ERE clause is no
dad0: 74 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 69 66  t true */.    if
dae0: 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
daf0: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73  Where ){.      s
db00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
db10: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
db20: 61 52 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20  aRegIdx[ix]);.  
db30: 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c      pParse->iSel
db40: 66 54 61 62 20 3d 20 2d 28 72 65 67 4e 65 77 44  fTab = -(regNewD
db50: 61 74 61 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  ata+1);.      sq
db60: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
db70: 44 75 70 28 70 50 61 72 73 65 2c 20 70 49 64 78  Dup(pParse, pIdx
db80: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
db90: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20   addrUniqueOk,. 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
dbc0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
dbd0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65       pParse->iSe
dbe0: 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d  lfTab = 0;.    }
dbf0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
dc00: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 69  a record for thi
dc10: 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20 61 73  s index entry as
dc20: 20 69 74 20 73 68 6f 75 6c 64 20 61 70 70 65 61   it should appea
dc30: 72 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74  r after.    ** t
dc40: 68 65 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64  he insert or upd
dc50: 61 74 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74  ate.  Store that
dc60: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 61   record in the a
dc70: 52 65 67 49 64 78 5b 69 78 5d 20 72 65 67 69 73  RegIdx[ix] regis
dc80: 74 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ter.    */.    r
dc90: 65 67 49 64 78 20 3d 20 61 52 65 67 49 64 78 5b  egIdx = aRegIdx[
dca0: 69 78 5d 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69  ix]+1;.    for(i
dcb0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
dcc0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
dcd0: 20 69 6e 74 20 69 46 69 65 6c 64 20 3d 20 70 49   int iField = pI
dce0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
dcf0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
dd00: 20 20 20 20 69 66 28 20 69 46 69 65 6c 64 3d 3d      if( iField==
dd10: 58 4e 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 20  XN_EXPR ){.     
dd20: 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
dd30: 54 61 62 20 3d 20 2d 28 72 65 67 4e 65 77 44 61  Tab = -(regNewDa
dd40: 74 61 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ta+1);.        s
dd50: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
dd60: 70 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  py(pParse, pIdx-
dd70: 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e  >aColExpr->a[i].
dd80: 70 45 78 70 72 2c 20 72 65 67 49 64 78 2b 69 29  pExpr, regIdx+i)
dd90: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
dda0: 2d 3e 69 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a  ->iSelfTab = 0;.
ddb0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
ddc0: 65 6e 74 28 28 76 2c 20 22 25 73 20 63 6f 6c 75  ent((v, "%s colu
ddd0: 6d 6e 20 25 64 22 2c 20 70 49 64 78 2d 3e 7a 4e  mn %d", pIdx->zN
dde0: 61 6d 65 2c 20 69 29 29 3b 0a 20 20 20 20 20 20  ame, i));.      
ddf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
de00: 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e 5f 52 4f  f( iField==XN_RO
de10: 57 49 44 20 7c 7c 20 69 46 69 65 6c 64 3d 3d 70  WID || iField==p
de20: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
de30: 20 20 20 20 20 20 20 20 78 20 3d 20 72 65 67 4e          x = regN
de40: 65 77 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  ewData;.        
de50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
de60: 20 78 20 3d 20 69 46 69 65 6c 64 20 2b 20 72 65   x = iField + re
de70: 67 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a 20 20  gNewData + 1;.  
de80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
de90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dea0: 32 28 76 2c 20 69 46 69 65 6c 64 3c 30 20 3f 20  2(v, iField<0 ? 
deb0: 4f 50 5f 49 6e 74 43 6f 70 79 20 3a 20 4f 50 5f  OP_IntCopy : OP_
dec0: 53 43 6f 70 79 2c 20 78 2c 20 72 65 67 49 64 78  SCopy, x, regIdx
ded0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  +i);.        Vdb
dee0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
def0: 22 2c 20 69 46 69 65 6c 64 3c 30 20 3f 20 22 72  ", iField<0 ? "r
df00: 6f 77 69 64 22 20 3a 20 70 54 61 62 2d 3e 61 43  owid" : pTab->aC
df10: 6f 6c 5b 69 46 69 65 6c 64 5d 2e 7a 4e 61 6d 65  ol[iField].zName
df20: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
df30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
df40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
df50: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 49 64 78  keRecord, regIdx
df60: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c  , pIdx->nColumn,
df70: 20 61 52 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20   aRegIdx[ix]);. 
df80: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
df90: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 49 64  v, "for %s", pId
dfa0: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64  x->zName));.#ifd
dfb0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dfc0: 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20 20 20 69  _NULL_TRIM.    i
dfd0: 66 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65  f( pIdx->idxType
dfe0: 3d 3d 32 20 29 20 73 71 6c 69 74 65 33 53 65 74  ==2 ) sqlite3Set
dff0: 4d 61 6b 65 52 65 63 6f 72 64 50 35 28 76 2c 20  MakeRecordP5(v, 
e000: 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 3b 0a 23  pIdx->pTable);.#
e010: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e  endif..    /* In
e020: 20 61 6e 20 55 50 44 41 54 45 20 6f 70 65 72 61   an UPDATE opera
e030: 74 69 6f 6e 2c 20 69 66 20 74 68 69 73 20 69 6e  tion, if this in
e040: 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
e050: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 0a 20 20  RY KEY index .  
e060: 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55    ** of a WITHOU
e070: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61 6e  T ROWID table an
e080: 64 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  d there has been
e090: 20 6e 6f 20 63 68 61 6e 67 65 20 74 68 65 0a 20   no change the. 
e0a0: 20 20 20 2a 2a 20 70 72 69 6d 61 72 79 20 6b 65     ** primary ke
e0b0: 79 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 6c 6c 69  y, then no colli
e0c0: 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  sion is possible
e0d0: 2e 20 20 54 68 65 20 63 6f 6c 6c 69 73 69 6f 6e  .  The collision
e0e0: 20 64 65 74 65 63 74 69 6f 6e 0a 20 20 20 20 2a   detection.    *
e0f0: 2a 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 63 61  * logic below ca
e100: 6e 20 61 6c 6c 20 62 65 20 73 6b 69 70 70 65 64  n all be skipped
e110: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 55  . */.    if( isU
e120: 70 64 61 74 65 20 26 26 20 70 50 6b 3d 3d 70 49  pdate && pPk==pI
e130: 64 78 20 26 26 20 70 6b 43 68 6e 67 3d 3d 30 20  dx && pkChng==0 
e140: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e150: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e160: 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b  (v, addrUniqueOk
e170: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
e180: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
e190: 20 46 69 6e 64 20 6f 75 74 20 77 68 61 74 20 61   Find out what a
e1a0: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e  ction to take in
e1b0: 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61   case there is a
e1c0: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
e1d0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 6f 6e 45 72  lict */.    onEr
e1e0: 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e 45 72  ror = pIdx->onEr
e1f0: 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45  ror;.    if( onE
e200: 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror==OE_None ){
e210: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56   .      sqlite3V
e220: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e230: 76 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29  v, addrUniqueOk)
e240: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
e250: 3b 20 20 2f 2a 20 70 49 64 78 20 69 73 20 6e 6f  ;  /* pIdx is no
e260: 74 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  t a UNIQUE index
e270: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
e280: 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21  ( overrideError!
e290: 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
e2a0: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f       onError = o
e2b0: 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20  verrideError;.  
e2c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72    }else if( onEr
e2d0: 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
e2e0: 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  ){.      onError
e2f0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
e300: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6c 6c 69   }..    /* Colli
e310: 73 69 6f 6e 20 64 65 74 65 63 74 69 6f 6e 20 6d  sion detection m
e320: 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20 69 66  ay be omitted if
e330: 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
e340: 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
e350: 20 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65      **   (1) The
e360: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
e370: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 69  tion algorithm i
e380: 73 20 52 45 50 4c 41 43 45 0a 20 20 20 20 2a 2a  s REPLACE.    **
e390: 20 20 20 28 32 29 20 54 68 65 20 74 61 62 6c 65     (2) The table
e3a0: 20 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f   is a WITHOUT RO
e3b0: 57 49 44 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  WID table.    **
e3c0: 20 20 20 28 33 29 20 54 68 65 72 65 20 61 72 65     (3) There are
e3d0: 20 6e 6f 20 73 65 63 6f 6e 64 61 72 79 20 69 6e   no secondary in
e3e0: 64 65 78 65 73 20 6f 6e 20 74 68 65 20 74 61 62  dexes on the tab
e3f0: 6c 65 0a 20 20 20 20 2a 2a 20 20 20 28 34 29 20  le.    **   (4) 
e400: 4e 6f 20 64 65 6c 65 74 65 20 74 72 69 67 67 65  No delete trigge
e410: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 66 69  rs need to be fi
e420: 72 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20  red if there is 
e430: 61 20 63 6f 6e 66 6c 69 63 74 0a 20 20 20 20 2a  a conflict.    *
e440: 2a 20 20 20 28 35 29 20 4e 6f 20 46 4b 20 63 6f  *   (5) No FK co
e450: 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
e460: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  s need to be upd
e470: 61 74 65 64 20 69 66 20 61 20 63 6f 6e 66 6c 69  ated if a confli
e480: 63 74 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  ct occurs..    *
e490: 2f 20 0a 20 20 20 20 69 66 28 20 28 69 78 3d 3d  / .    if( (ix==
e4a0: 30 20 26 26 20 70 49 64 78 2d 3e 70 4e 65 78 74  0 && pIdx->pNext
e4b0: 3d 3d 30 29 20 20 20 20 20 20 20 20 20 20 20 20  ==0)            
e4c0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74         /* Condit
e4d0: 69 6f 6e 20 33 20 2a 2f 0a 20 20 20 20 20 26 26  ion 3 */.     &&
e4e0: 20 70 50 6b 3d 3d 70 49 64 78 20 20 20 20 20 20   pPk==pIdx      
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e510: 43 6f 6e 64 69 74 69 6f 6e 20 32 20 2a 2f 0a 20  Condition 2 */. 
e520: 20 20 20 20 26 26 20 6f 6e 45 72 72 6f 72 3d 3d      && onError==
e530: 4f 45 5f 52 65 70 6c 61 63 65 20 20 20 20 20 20  OE_Replace      
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
e560: 31 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 20 30  1 */.     && ( 0
e570: 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  ==(db->flags&SQL
e580: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 29  ITE_RecTriggers)
e590: 20 7c 7c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64   ||      /* Cond
e5a0: 69 74 69 6f 6e 20 34 20 2a 2f 0a 20 20 20 20 20  ition 4 */.     
e5b0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 54       0==sqlite3T
e5c0: 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61  riggersExist(pPa
e5d0: 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45  rse, pTab, TK_DE
e5e0: 4c 45 54 45 2c 20 30 2c 20 30 29 29 0a 20 20 20  LETE, 0, 0)).   
e5f0: 20 20 26 26 20 28 20 30 3d 3d 28 64 62 2d 3e 66    && ( 0==(db->f
e600: 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 6f 72 65  lags&SQLITE_Fore
e610: 69 67 6e 4b 65 79 73 29 20 7c 7c 20 20 20 20 20  ignKeys) ||     
e620: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 35 20   /* Condition 5 
e630: 2a 2f 0a 20 20 20 20 20 20 20 20 20 28 30 3d 3d  */.         (0==
e640: 70 54 61 62 2d 3e 70 46 4b 65 79 20 26 26 20 30  pTab->pFKey && 0
e650: 3d 3d 73 71 6c 69 74 65 33 46 6b 52 65 66 65 72  ==sqlite3FkRefer
e660: 65 6e 63 65 73 28 70 54 61 62 29 29 29 0a 20 20  ences(pTab))).  
e670: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
e680: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
e690: 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65  el(v, addrUnique
e6a0: 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Ok);.      conti
e6b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
e6c0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
e6d0: 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  if the new index
e6e0: 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 75   entry will be u
e6f0: 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 73 71 6c  nique */.    sql
e700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
e710: 74 28 76 2c 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69  t(v, OP_NoConfli
e720: 63 74 2c 20 69 54 68 69 73 43 75 72 2c 20 61 64  ct, iThisCur, ad
e730: 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20  drUniqueOk,.    
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 72 65 67 49 64 78 2c 20 70 49 64       regIdx, pId
e760: 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
e770: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
e780: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
e790: 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 63 6f  ode to handle co
e7a0: 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  llisions */.    
e7b0: 72 65 67 52 20 3d 20 28 70 49 64 78 3d 3d 70 50  regR = (pIdx==pP
e7c0: 6b 29 20 3f 20 72 65 67 49 64 78 20 3a 20 73 71  k) ? regIdx : sq
e7d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
e7e0: 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 46 69 65  e(pParse, nPkFie
e7f0: 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 55  ld);.    if( isU
e800: 70 64 61 74 65 20 7c 7c 20 6f 6e 45 72 72 6f 72  pdate || onError
e810: 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  ==OE_Replace ){.
e820: 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
e830: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
e840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e850: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
e860: 6f 77 69 64 2c 20 69 54 68 69 73 43 75 72 2c 20  owid, iThisCur, 
e870: 72 65 67 52 29 3b 0a 20 20 20 20 20 20 20 20 2f  regR);.        /
e880: 2a 20 43 6f 6e 66 6c 69 63 74 20 6f 6e 6c 79 20  * Conflict only 
e890: 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  if the rowid of 
e8a0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 69 6e 64  the existing ind
e8b0: 65 78 20 65 6e 74 72 79 0a 20 20 20 20 20 20 20  ex entry.       
e8c0: 20 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74   ** is different
e8d0: 20 66 72 6f 6d 20 6f 6c 64 2d 72 6f 77 69 64 20   from old-rowid 
e8e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
e8f0: 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  sUpdate ){.     
e900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e910: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
e920: 20 72 65 67 52 2c 20 61 64 64 72 55 6e 69 71 75   regR, addrUniqu
e930: 65 4f 6b 2c 20 72 65 67 4f 6c 64 44 61 74 61 29  eOk, regOldData)
e940: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e950: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
e960: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
e970: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  L);.          Vd
e980: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e990: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e9a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
e9b0: 74 20 78 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t x;.        /* 
e9c0: 45 78 74 72 61 63 74 20 74 68 65 20 50 52 49 4d  Extract the PRIM
e9d0: 41 52 59 20 4b 45 59 20 66 72 6f 6d 20 74 68 65  ARY KEY from the
e9e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
e9f0: 78 20 65 6e 74 72 79 20 61 6e 64 0a 20 20 20 20  x entry and.    
ea00: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20      ** store it 
ea10: 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67  in registers reg
ea20: 52 2e 2e 72 65 67 52 2b 6e 50 6b 2d 31 20 2a 2f  R..regR+nPk-1 */
ea30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
ea40: 78 21 3d 70 50 6b 20 29 7b 0a 20 20 20 20 20 20  x!=pPk ){.      
ea50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ea60: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
ea70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
ea80: 73 73 65 72 74 28 20 70 50 6b 2d 3e 61 69 43 6f  ssert( pPk->aiCo
ea90: 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[i]>=0 );.  
eaa0: 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 73 71            x = sq
eab0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
eac0: 65 78 28 70 49 64 78 2c 20 70 50 6b 2d 3e 61 69  ex(pIdx, pPk->ai
ead0: 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20  Column[i]);.    
eae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
eaf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
eb00: 43 6f 6c 75 6d 6e 2c 20 69 54 68 69 73 43 75 72  Column, iThisCur
eb10: 2c 20 78 2c 20 72 65 67 52 2b 69 29 3b 0a 20 20  , x, regR+i);.  
eb20: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
eb30: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e 25 73  mment((v, "%s.%s
eb40: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
eb70: 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  Col[pPk->aiColum
eb80: 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20  n[i]].zName));. 
eb90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
eba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ebb0: 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20   isUpdate ){.   
ebc0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 63 75 72         /* If cur
ebd0: 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
ebe0: 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
ebf0: 59 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  Y of a WITHOUT R
ec00: 4f 57 49 44 20 0a 20 20 20 20 20 20 20 20 20 20  OWID .          
ec10: 2a 2a 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 63  ** table, only c
ec20: 6f 6e 66 6c 69 63 74 20 69 66 20 74 68 65 20 6e  onflict if the n
ec30: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76  ew PRIMARY KEY v
ec40: 61 6c 75 65 73 20 61 72 65 20 61 63 74 75 61 6c  alues are actual
ec50: 6c 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ly.          ** 
ec60: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
ec70: 68 65 20 6f 6c 64 2e 0a 20 20 20 20 20 20 20 20  he old..        
ec80: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
ec90: 2a 20 46 6f 72 20 61 20 55 4e 49 51 55 45 20 69  * For a UNIQUE i
eca0: 6e 64 65 78 2c 20 6f 6e 6c 79 20 63 6f 6e 66 6c  ndex, only confl
ecb0: 69 63 74 20 69 66 20 74 68 65 20 50 52 49 4d 41  ict if the PRIMA
ecc0: 52 59 20 4b 45 59 20 76 61 6c 75 65 73 0a 20 20  RY KEY values.  
ecd0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
ece0: 65 20 6d 61 74 63 68 65 64 20 69 6e 64 65 78 20  e matched index 
ecf0: 72 6f 77 20 61 72 65 20 64 69 66 66 65 72 65 6e  row are differen
ed00: 74 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69  t from the origi
ed10: 6e 61 6c 20 50 52 49 4d 41 52 59 0a 20 20 20 20  nal PRIMARY.    
ed20: 20 20 20 20 20 20 2a 2a 20 4b 45 59 20 76 61 6c        ** KEY val
ed30: 75 65 73 20 6f 66 20 74 68 69 73 20 72 6f 77 20  ues of this row 
ed40: 62 65 66 6f 72 65 20 74 68 65 20 75 70 64 61 74  before the updat
ed50: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
ed60: 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
ed70: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
ed80: 6e 74 41 64 64 72 28 76 29 2b 70 50 6b 2d 3e 6e  ntAddr(v)+pPk->n
ed90: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
eda0: 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4e 65    int op = OP_Ne
edb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
edc0: 72 65 67 43 6d 70 20 3d 20 28 49 73 50 72 69 6d  regCmp = (IsPrim
edd0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
ede0: 29 20 3f 20 72 65 67 49 64 78 20 3a 20 72 65 67  ) ? regIdx : reg
edf0: 52 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  R);.  .         
ee00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d   for(i=0; i<pPk-
ee10: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
ee30: 20 2a 70 34 20 3d 20 28 63 68 61 72 2a 29 73 71   *p4 = (char*)sq
ee40: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
ee50: 65 71 28 70 50 61 72 73 65 2c 20 70 50 6b 2d 3e  eq(pParse, pPk->
ee60: 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  azColl[i]);.    
ee70: 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
ee80: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
ee90: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
eea0: 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
eeb0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28 70 50        if( i==(pP
eec0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b  k->nKeyCol-1) ){
eed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
eee0: 64 64 72 4a 75 6d 70 20 3d 20 61 64 64 72 55 6e  ddrJump = addrUn
eef0: 69 71 75 65 4f 6b 3b 0a 20 20 20 20 20 20 20 20  iqueOk;.        
ef00: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
ef10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ef30: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ef40: 20 6f 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20   op, .          
ef50: 20 20 20 20 20 20 72 65 67 4f 6c 64 44 61 74 61        regOldData
ef60: 2b 31 2b 78 2c 20 61 64 64 72 4a 75 6d 70 2c 20  +1+x, addrJump, 
ef70: 72 65 67 43 6d 70 2b 69 2c 20 70 34 2c 20 50 34  regCmp+i, p4, P4
ef80: 5f 43 4f 4c 4c 53 45 51 0a 20 20 20 20 20 20 20  _COLLSEQ.       
ef90: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
efa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
efb0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
efc0: 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  E_NOTNULL);.    
efd0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
efe0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
eff0: 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _Eq);.          
f000: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
f010: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  (v, op==OP_Ne);.
f020: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f030: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f040: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
f050: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65  rate code that e
f060: 78 65 63 75 74 65 73 20 69 66 20 74 68 65 20 6e  xecutes if the n
f070: 65 77 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  ew index entry i
f080: 73 20 6e 6f 74 20 75 6e 69 71 75 65 20 2a 2f 0a  s not unique */.
f090: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72      assert( onEr
f0a0: 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ror==OE_Rollback
f0b0: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
f0c0: 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72  Abort || onError
f0d0: 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20  ==OE_Fail.      
f0e0: 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45    || onError==OE
f0f0: 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72  _Ignore || onErr
f100: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
f110: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e  ;.    switch( on
f120: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 63  Error ){.      c
f130: 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a  ase OE_Rollback:
f140: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 41  .      case OE_A
f150: 62 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73 65  bort:.      case
f160: 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20   OE_Fail: {.    
f170: 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
f180: 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
f190: 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 49 64  se, onError, pId
f1a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  x);.        brea
f1b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
f1c0: 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a   case OE_Ignore:
f1d0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
f1e0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 67  e3VdbeGoto(v, ig
f1f0: 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20 20  noreDest);.     
f200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f210: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
f220: 20 7b 0a 20 20 20 20 20 20 20 20 54 72 69 67 67   {.        Trigg
f230: 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 30  er *pTrigger = 0
f240: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
f250: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ( onError==OE_Re
f260: 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20  place );.       
f270: 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69   sqlite3MultiWri
f280: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
f290: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
f2a0: 73 26 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67  s&SQLITE_RecTrig
f2b0: 67 65 72 73 20 29 7b 0a 20 20 20 20 20 20 20 20  gers ){.        
f2c0: 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
f2d0: 69 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73  ite3TriggersExis
f2e0: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
f2f0: 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30 29  TK_DELETE, 0, 0)
f300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f310: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
f320: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61  ateRowDelete(pPa
f330: 72 73 65 2c 20 70 54 61 62 2c 20 70 54 72 69 67  rse, pTab, pTrig
f340: 67 65 72 2c 20 69 44 61 74 61 43 75 72 2c 20 69  ger, iDataCur, i
f350: 49 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20  IdxCur,.        
f360: 20 20 20 20 72 65 67 52 2c 20 6e 50 6b 46 69 65      regR, nPkFie
f370: 6c 64 2c 20 30 2c 20 4f 45 5f 52 65 70 6c 61 63  ld, 0, OE_Replac
f380: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  e,.            (
f390: 70 49 64 78 3d 3d 70 50 6b 20 3f 20 4f 4e 45 50  pIdx==pPk ? ONEP
f3a0: 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45  ASS_SINGLE : ONE
f3b0: 50 41 53 53 5f 4f 46 46 29 2c 20 69 54 68 69 73  PASS_OFF), iThis
f3c0: 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 73 65  Cur);.        se
f3d0: 65 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20  enReplace = 1;. 
f3e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f3f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
f400: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f410: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 55  veLabel(v, addrU
f420: 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 69 66  niqueOk);.    if
f430: 28 20 72 65 67 52 21 3d 72 65 67 49 64 78 20 29  ( regR!=regIdx )
f440: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f450: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
f460: 20 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 29   regR, nPkField)
f470: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 70 6b 54  ;.  }.  if( ipkT
f480: 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  op ){.    sqlite
f490: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 70 6b  3VdbeGoto(v, ipk
f4a0: 54 6f 70 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  Top+1);.    sqli
f4b0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f4c0: 76 2c 20 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a 20  v, ipkBottom);. 
f4d0: 20 7d 0a 20 20 0a 20 20 2a 70 62 4d 61 79 52 65   }.  .  *pbMayRe
f4e0: 70 6c 61 63 65 20 3d 20 73 65 65 6e 52 65 70 6c  place = seenRepl
f4f0: 61 63 65 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c  ace;.  VdbeModul
f500: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 4e  eComment((v, "EN
f510: 44 3a 20 47 65 6e 43 6e 73 74 43 6b 73 28 25 64  D: GenCnstCks(%d
f520: 29 22 2c 20 73 65 65 6e 52 65 70 6c 61 63 65 29  )", seenReplace)
f530: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
f540: 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 55 4c 4c 5f  ITE_ENABLE_NULL_
f550: 54 52 49 4d 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  TRIM./*.** Chang
f560: 65 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64  e the P5 operand
f570: 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 6f 70 63   on the last opc
f580: 6f 64 65 20 28 77 68 69 63 68 20 73 68 6f 75 6c  ode (which shoul
f590: 64 20 62 65 20 61 6e 20 4f 50 5f 4d 61 6b 65 52  d be an OP_MakeR
f5a0: 65 63 6f 72 64 29 0a 2a 2a 20 74 6f 20 62 65 20  ecord).** to be 
f5b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
f5c0: 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 70  lumns in table p
f5d0: 54 61 62 20 74 68 61 74 20 6d 75 73 74 20 6e 6f  Tab that must no
f5e0: 74 20 62 65 20 4e 55 4c 4c 2d 74 72 69 6d 6d 65  t be NULL-trimme
f5f0: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 20 69 66 20 6e  d..**.** Or if n
f600: 6f 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 54 61  o columns of pTa
f610: 62 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2d 74 72  b may be NULL-tr
f620: 69 6d 6d 65 64 2c 20 6c 65 61 76 65 20 50 35 20  immed, leave P5 
f630: 61 74 20 7a 65 72 6f 2e 0a 2a 2f 0a 76 6f 69 64  at zero..*/.void
f640: 20 73 71 6c 69 74 65 33 53 65 74 4d 61 6b 65 52   sqlite3SetMakeR
f650: 65 63 6f 72 64 50 35 28 56 64 62 65 20 2a 76 2c  ecordP5(Vdbe *v,
f660: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
f670: 20 75 31 36 20 69 3b 0a 0a 20 20 2f 2a 20 52 65   u16 i;..  /* Re
f680: 63 6f 72 64 73 20 77 69 74 68 20 6f 6d 69 74 74  cords with omitt
f690: 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f  ed columns are o
f6a0: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  nly allowed for 
f6b0: 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 0a 20 20  schema format.  
f6c0: 2a 2a 20 76 65 72 73 69 6f 6e 20 32 20 61 6e 64  ** version 2 and
f6d0: 20 6c 61 74 65 72 20 28 53 51 4c 69 74 65 20 76   later (SQLite v
f6e0: 65 72 73 69 6f 6e 20 33 2e 31 2e 34 2c 20 32 30  ersion 3.1.4, 20
f6f0: 30 35 2d 30 32 2d 32 30 29 2e 20 2a 2f 0a 20 20  05-02-20). */.  
f700: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
f710: 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3c 32  a->file_format<2
f720: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 6f   ) return;..  fo
f730: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  r(i=pTab->nCol-1
f740: 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
f750: 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
f760: 69 5d 2e 70 44 66 6c 74 21 3d 30 20 29 20 62 72  i].pDflt!=0 ) br
f770: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 54 61  eak;.    if( pTa
f780: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
f790: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
f7a0: 49 4d 4b 45 59 20 29 20 62 72 65 61 6b 3b 0a 20  IMKEY ) break;. 
f7b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
f7c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 69 2b 31 29  ChangeP5(v, i+1)
f7d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f7e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
f7f0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
f800: 20 66 69 6e 69 73 68 20 74 68 65 20 49 4e 53 45   finish the INSE
f810: 52 54 20 6f 72 20 55 50 44 41 54 45 20 6f 70 65  RT or UPDATE ope
f820: 72 61 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 77  ration.** that w
f830: 61 73 20 73 74 61 72 74 65 64 20 62 79 20 61 20  as started by a 
f840: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
f850: 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
f860: 73 74 72 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a  straintChecks..*
f870: 2a 20 41 20 63 6f 6e 73 65 63 75 74 69 76 65 20  * A consecutive 
f880: 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
f890: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  rs starting at r
f8a0: 65 67 4e 65 77 44 61 74 61 20 63 6f 6e 74 61 69  egNewData contai
f8b0: 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 77 69 64 20  ns the.** rowid 
f8c0: 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  and the content 
f8d0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
f8e0: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  **.** The argume
f8f0: 6e 74 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  nts to this rout
f900: 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 74 68  ine should be th
f910: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
f920: 72 73 74 20 73 69 78 0a 2a 2a 20 61 72 67 75 6d  rst six.** argum
f930: 65 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 33 47  ents to sqlite3G
f940: 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
f950: 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a 76 6f 69 64  tChecks..*/.void
f960: 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 65   sqlite3Complete
f970: 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20 50 61 72  Insertion(.  Par
f980: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
f990: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
f9a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
f9b0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
f9c0: 2f 2a 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  /* the table int
f9d0: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
f9e0: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  nserting */.  in
f9f0: 74 20 69 44 61 74 61 43 75 72 2c 20 20 20 20 20  t iDataCur,     
fa00: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
fa10: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 64 61 74  he canonical dat
fa20: 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69 6e  a source */.  in
fa30: 74 20 69 49 64 78 43 75 72 2c 20 20 20 20 20 20  t iIdxCur,      
fa40: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78    /* First index
fa50: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
fa60: 20 72 65 67 4e 65 77 44 61 74 61 2c 20 20 20 20   regNewData,    
fa70: 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 63 6f 6e   /* Range of con
fa80: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tent */.  int *a
fa90: 52 65 67 49 64 78 2c 20 20 20 20 20 20 20 2f 2a  RegIdx,       /*
faa0: 20 52 65 67 69 73 74 65 72 20 75 73 65 64 20 62   Register used b
fab0: 79 20 65 61 63 68 20 69 6e 64 65 78 2e 20 20 30  y each index.  0
fac0: 20 66 6f 72 20 75 6e 75 73 65 64 20 69 6e 64 69   for unused indi
fad0: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 75 70 64  ces */.  int upd
fae0: 61 74 65 5f 66 6c 61 67 73 2c 20 20 20 2f 2a 20  ate_flags,   /* 
faf0: 54 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 2c  True for UPDATE,
fb00: 20 46 61 6c 73 65 20 66 6f 72 20 49 4e 53 45 52   False for INSER
fb10: 54 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  T */.  int appen
fb20: 64 42 69 61 73 2c 20 20 20 20 20 2f 2a 20 54 72  dBias,     /* Tr
fb30: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
fb40: 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70  kely to be an ap
fb50: 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 75 73  pend */.  int us
fb60: 65 53 65 65 6b 52 65 73 75 6c 74 20 20 20 2f 2a  eSeekResult   /*
fb70: 20 54 72 75 65 20 74 6f 20 73 65 74 20 74 68 65   True to set the
fb80: 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66   USESEEKRESULT f
fb90: 6c 61 67 20 6f 6e 20 4f 50 5f 5b 49 64 78 5d 49  lag on OP_[Idx]I
fba0: 6e 73 65 72 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  nsert */.){.  Vd
fbb0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
fbc0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
fbd0: 61 74 65 6d 65 6e 74 73 20 75 6e 64 65 72 20 63  atements under c
fbe0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
fbf0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
fc00: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
fc10: 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
fc20: 6f 72 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  or updated */.  
fc30: 75 38 20 70 69 6b 5f 66 6c 61 67 73 3b 20 20 20  u8 pik_flags;   
fc40: 20 20 20 20 2f 2a 20 66 6c 61 67 20 76 61 6c 75      /* flag valu
fc50: 65 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  es passed to the
fc60: 20 62 74 72 65 65 20 69 6e 73 65 72 74 20 2a 2f   btree insert */
fc70: 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 3b 20  .  int regData; 
fc80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
fc90: 74 20 72 65 67 69 73 74 65 72 73 20 28 61 66 74  t registers (aft
fca0: 65 72 20 74 68 65 20 72 6f 77 69 64 29 20 2a 2f  er the rowid) */
fcb0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20  .  int regRec;  
fcc0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
fcd0: 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d  er holding assem
fce0: 62 6c 65 64 20 72 65 63 6f 72 64 20 66 6f 72 20  bled record for 
fcf0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
fd00: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fd10: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
fd20: 65 72 20 2a 2f 0a 20 20 75 38 20 62 41 66 66 69  er */.  u8 bAffi
fd30: 6e 69 74 79 44 6f 6e 65 20 3d 20 30 3b 20 2f 2a  nityDone = 0; /*
fd40: 20 54 72 75 65 20 69 66 20 4f 50 5f 41 66 66 69   True if OP_Affi
fd50: 6e 69 74 79 20 68 61 73 20 62 65 65 6e 20 72 75  nity has been ru
fd60: 6e 20 61 6c 72 65 61 64 79 20 2a 2f 0a 0a 20 20  n already */..  
fd70: 61 73 73 65 72 74 28 20 75 70 64 61 74 65 5f 66  assert( update_f
fd80: 6c 61 67 73 3d 3d 30 0a 20 20 20 20 20 20 20 7c  lags==0.       |
fd90: 7c 20 75 70 64 61 74 65 5f 66 6c 61 67 73 3d 3d  | update_flags==
fda0: 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 0a  OPFLAG_ISUPDATE.
fdb0: 20 20 20 20 20 20 20 7c 7c 20 75 70 64 61 74 65         || update
fdc0: 5f 66 6c 61 67 73 3d 3d 28 4f 50 46 4c 41 47 5f  _flags==(OPFLAG_
fdd0: 49 53 55 50 44 41 54 45 7c 4f 50 46 4c 41 47 5f  ISUPDATE|OPFLAG_
fde0: 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 0a 20 20  SAVEPOSITION).  
fdf0: 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
fe00: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
fe10: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
fe20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
fe30: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
fe40: 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c 65  ;  /* This table
fe50: 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20 2a   is not a VIEW *
fe60: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 64  /.  for(i=0, pId
fe70: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
fe80: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
fe90: 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
fea0: 20 20 69 66 28 20 61 52 65 67 49 64 78 5b 69 5d    if( aRegIdx[i]
feb0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
fec0: 20 20 20 20 62 41 66 66 69 6e 69 74 79 44 6f 6e      bAffinityDon
fed0: 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  e = 1;.    if( p
fee0: 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
fef0: 72 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  re ){.      sqli
ff00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ff10: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 61 52 65 67   OP_IsNull, aReg
ff20: 49 64 78 5b 69 5d 2c 20 73 71 6c 69 74 65 33 56  Idx[i], sqlite3V
ff30: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ff40: 29 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  )+2);.      Vdbe
ff50: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ff60: 20 7d 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73   }.    pik_flags
ff70: 20 3d 20 28 75 73 65 53 65 65 6b 52 65 73 75 6c   = (useSeekResul
ff80: 74 20 3f 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  t ? OPFLAG_USESE
ff90: 45 4b 52 45 53 55 4c 54 20 3a 20 30 29 3b 0a 20  EKRESULT : 0);. 
ffa0: 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79     if( IsPrimary
ffb0: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 26  KeyIndex(pIdx) &
ffc0: 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  & !HasRowid(pTab
ffd0: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
ffe0: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
fff0: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 69  d==0 );.      pi
10000 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41  k_flags |= OPFLA
10010 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 20  G_NCHANGE;.     
10020 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 28 75   pik_flags |= (u
10030 70 64 61 74 65 5f 66 6c 61 67 73 20 26 20 4f 50  pdate_flags & OP
10040 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
10050 4e 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N);.#ifdef SQLIT
10060 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
10070 54 45 5f 48 4f 4f 4b 0a 20 20 20 20 20 20 69 66  TE_HOOK.      if
10080 28 20 75 70 64 61 74 65 5f 66 6c 61 67 73 3d 3d  ( update_flags==
10090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
100a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
100b0 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20  , OP_InsertInt, 
100c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64  .            iId
100d0 78 43 75 72 2b 69 2c 20 61 52 65 67 49 64 78 5b  xCur+i, aRegIdx[
100e0 69 5d 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 54  i], 0, (char*)pT
100f0 61 62 2c 20 50 34 5f 54 41 42 4c 45 0a 20 20 20  ab, P4_TABLE.   
10100 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10110 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10120 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 49 53  eP5(v, OPFLAG_IS
10130 4e 4f 4f 50 29 3b 0a 20 20 20 20 20 20 7d 0a 23  NOOP);.      }.#
10140 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
10150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10160 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
10170 73 65 72 74 2c 20 69 49 64 78 43 75 72 2b 69 2c  sert, iIdxCur+i,
10180 20 61 52 65 67 49 64 78 5b 69 5d 2c 0a 20 20 20   aRegIdx[i],.   
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 61 52 65 67 49 64 78 5b 69 5d        aRegIdx[i]
101b0 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
101d0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f  x->uniqNotNull ?
101e0 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3a 20   pIdx->nKeyCol: 
101f0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
10200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10210 68 61 6e 67 65 50 35 28 76 2c 20 70 69 6b 5f 66  hangeP5(v, pik_f
10220 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
10230 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
10240 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 65 67   ) return;.  reg
10250 44 61 74 61 20 3d 20 72 65 67 4e 65 77 44 61 74  Data = regNewDat
10260 61 20 2b 20 31 3b 0a 20 20 72 65 67 52 65 63 20  a + 1;.  regRec 
10270 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
10280 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
10290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
102a0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
102b0 64 2c 20 72 65 67 44 61 74 61 2c 20 70 54 61 62  d, regData, pTab
102c0 2d 3e 6e 43 6f 6c 2c 20 72 65 67 52 65 63 29 3b  ->nCol, regRec);
102d0 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4d 61 6b  .  sqlite3SetMak
102e0 65 52 65 63 6f 72 64 50 35 28 76 2c 20 70 54 61  eRecordP5(v, pTa
102f0 62 29 3b 0a 20 20 69 66 28 20 21 62 41 66 66 69  b);.  if( !bAffi
10300 6e 69 74 79 44 6f 6e 65 20 29 7b 0a 20 20 20 20  nityDone ){.    
10310 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
10320 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 30 29  nity(v, pTab, 0)
10330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
10340 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
10350 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
10360 44 61 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  Data, pTab->nCol
10370 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
10380 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20  rse->nested ){. 
10390 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 30     pik_flags = 0
103a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
103b0 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c 41  ik_flags = OPFLA
103c0 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 70  G_NCHANGE;.    p
103d0 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 28 75 70 64  ik_flags |= (upd
103e0 61 74 65 5f 66 6c 61 67 73 3f 75 70 64 61 74 65  ate_flags?update
103f0 5f 66 6c 61 67 73 3a 4f 50 46 4c 41 47 5f 4c 41  _flags:OPFLAG_LA
10400 53 54 52 4f 57 49 44 29 3b 0a 20 20 7d 0a 20 20  STROWID);.  }.  
10410 69 66 28 20 61 70 70 65 6e 64 42 69 61 73 20 29  if( appendBias )
10420 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20  {.    pik_flags 
10430 7c 3d 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  |= OPFLAG_APPEND
10440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 53  ;.  }.  if( useS
10450 65 65 6b 52 65 73 75 6c 74 20 29 7b 0a 20 20 20  eekResult ){.   
10460 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50   pik_flags |= OP
10470 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
10480 4c 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  LT;.  }.  sqlite
10490 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
104a0 50 5f 49 6e 73 65 72 74 2c 20 69 44 61 74 61 43  P_Insert, iDataC
104b0 75 72 2c 20 72 65 67 52 65 63 2c 20 72 65 67 4e  ur, regRec, regN
104c0 65 77 44 61 74 61 29 3b 0a 20 20 69 66 28 20 21  ewData);.  if( !
104d0 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
104e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
104f0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 54 61  eAppendP4(v, pTa
10500 62 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20  b, P4_TABLE);.  
10510 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
10520 68 61 6e 67 65 50 35 28 76 2c 20 70 69 6b 5f 66  hangeP5(v, pik_f
10530 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
10540 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
10550 20 66 6f 72 20 74 68 65 20 70 54 61 62 20 74 61   for the pTab ta
10560 62 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  ble and all its 
10570 69 6e 64 69 63 65 73 20 61 6e 64 20 67 65 6e 65  indices and gene
10580 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rate.** code to 
10590 6f 70 65 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  open and initial
105a0 69 7a 65 64 20 74 68 6f 73 65 20 63 75 72 73 6f  ized those curso
105b0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  rs..**.** The cu
105c0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6f 62 6a  rsor for the obj
105d0 65 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ect that contain
105e0 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 64  s the complete d
105f0 61 74 61 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ata (normally.**
10600 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
10610 66 2c 20 62 75 74 20 74 68 65 20 50 52 49 4d 41  f, but the PRIMA
10620 52 59 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20  RY KEY index in 
10630 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49  the case of a WI
10640 54 48 4f 55 54 0a 2a 2a 20 52 4f 57 49 44 20 74  THOUT.** ROWID t
10650 61 62 6c 65 29 20 69 73 20 72 65 74 75 72 6e 65  able) is returne
10660 64 20 69 6e 20 2a 70 69 44 61 74 61 43 75 72 2e  d in *piDataCur.
10670 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 64 65    The first inde
10680 78 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 72  x cursor is.** r
10690 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 49 64  eturned in *piId
106a0 78 43 75 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  xCur.  The numbe
106b0 72 20 6f 66 20 69 6e 64 69 63 65 73 20 69 73 20  r of indices is 
106c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
106d0 55 73 65 20 69 42 61 73 65 20 61 73 20 74 68 65  Use iBase as the
106e0 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 65   first cursor (e
106f0 69 74 68 65 72 20 74 68 65 20 2a 70 69 44 61 74  ither the *piDat
10700 61 43 75 72 20 66 6f 72 20 72 6f 77 69 64 20 74  aCur for rowid t
10710 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 74 68 65 20  ables.** or the 
10720 66 69 72 73 74 20 69 6e 64 65 78 20 66 6f 72 20  first index for 
10730 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
10740 62 6c 65 73 29 20 69 66 20 69 74 20 69 73 20 6e  bles) if it is n
10750 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
10760 49 66 20 69 42 61 73 65 20 69 73 20 6e 65 67 61  If iBase is nega
10770 74 69 76 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  tive, then alloc
10780 61 74 65 20 74 68 65 20 6e 65 78 74 20 61 76 61  ate the next ava
10790 69 6c 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a  ilable cursor..*
107a0 2a 0a 2a 2a 20 46 6f 72 20 61 20 72 6f 77 69 64  *.** For a rowid
107b0 20 74 61 62 6c 65 2c 20 2a 70 69 44 61 74 61 43   table, *piDataC
107c0 75 72 20 77 69 6c 6c 20 62 65 20 65 78 61 63 74  ur will be exact
107d0 6c 79 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e  ly one less than
107e0 20 2a 70 69 49 64 78 43 75 72 2e 0a 2a 2a 20 46   *piIdxCur..** F
107f0 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
10800 49 44 20 74 61 62 6c 65 2c 20 2a 70 69 44 61 74  ID table, *piDat
10810 61 43 75 72 20 77 69 6c 6c 20 62 65 20 73 6f 6d  aCur will be som
10820 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 72 61  ewhere in the ra
10830 6e 67 65 0a 2a 2a 20 6f 66 20 2a 70 69 49 64 78  nge.** of *piIdx
10840 43 75 72 73 2c 20 64 65 70 65 6e 64 69 6e 67 20  Curs, depending 
10850 6f 6e 20 77 68 65 72 65 20 74 68 65 20 50 52 49  on where the PRI
10860 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 61  MARY KEY index a
10870 70 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a  ppears on the.**
10880 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69   pTab->pIndex li
10890 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 61  st..**.** If pTa
108a0 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
108b0 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 69 73 20  able, then this 
108c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
108d0 6f 70 20 61 6e 64 20 74 68 65 0a 2a 2a 20 2a 70  op and the.** *p
108e0 69 44 61 74 61 43 75 72 20 61 6e 64 20 2a 70 69  iDataCur and *pi
108f0 49 64 78 43 75 72 20 76 61 6c 75 65 73 20 61 72  IdxCur values ar
10900 65 20 6c 65 66 74 20 75 6e 69 6e 69 74 69 61 6c  e left uninitial
10910 69 7a 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ized..*/.int sql
10920 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64  ite3OpenTableAnd
10930 49 6e 64 69 63 65 73 28 0a 20 20 50 61 72 73 65  Indices(.  Parse
10940 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
10950 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10960 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
10970 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
10980 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
10990 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
109a0 20 2f 2a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20   /* OP_OpenRead 
109b0 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  or OP_OpenWrite 
109c0 2a 2f 0a 20 20 75 38 20 70 35 2c 20 20 20 20 20  */.  u8 p5,     
109d0 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
109e0 65 20 66 6f 72 20 4f 50 5f 4f 70 65 6e 2a 20 6f  e for OP_Open* o
109f0 70 63 6f 64 65 73 20 28 65 78 63 65 70 74 20 6f  pcodes (except o
10a00 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 29  n WITHOUT ROWID)
10a10 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
10a20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
10a30 69 73 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  is for the table
10a40 20 63 75 72 73 6f 72 2c 20 69 66 20 74 68 65 72   cursor, if ther
10a50 65 20 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38  e is one */.  u8
10a60 20 2a 61 54 6f 4f 70 65 6e 2c 20 20 20 20 20 2f   *aToOpen,     /
10a70 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 3a 20 62  * If not NULL: b
10a80 6f 6f 6c 65 61 6e 20 66 6f 72 20 65 61 63 68 20  oolean for each 
10a90 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
10aa0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 44 61 74 61  */.  int *piData
10ab0 43 75 72 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  Cur,  /* Write t
10ac0 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 75 72  he database sour
10ad0 63 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ce cursor number
10ae0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
10af0 70 69 49 64 78 43 75 72 20 20 20 20 2f 2a 20 57  piIdxCur    /* W
10b00 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 69  rite the first i
10b10 6e 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62  ndex cursor numb
10b20 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  er here */.){.  
10b30 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 44 62  int i;.  int iDb
10b40 3b 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75 72  ;.  int iDataCur
10b50 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
10b60 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
10b70 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70  ssert( op==OP_Op
10b80 65 6e 52 65 61 64 20 7c 7c 20 6f 70 3d 3d 4f 50  enRead || op==OP
10b90 5f 4f 70 65 6e 57 72 69 74 65 20 29 3b 0a 20 20  _OpenWrite );.  
10ba0 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f  assert( op==OP_O
10bb0 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 35 3d 3d  penWrite || p5==
10bc0 30 20 29 3b 0a 20 20 69 66 28 20 49 73 56 69 72  0 );.  if( IsVir
10bd0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
10be0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
10bf0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  e is a no-op for
10c00 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
10c10 20 4c 65 61 76 65 20 74 68 65 20 6f 75 74 70 75   Leave the outpu
10c20 74 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  t.    ** variabl
10c30 65 73 20 2a 70 69 44 61 74 61 43 75 72 20 61 6e  es *piDataCur an
10c40 64 20 2a 70 69 49 64 78 43 75 72 20 75 6e 69 6e  d *piIdxCur unin
10c50 69 74 69 61 6c 69 7a 65 64 20 73 6f 20 74 68 61  itialized so tha
10c60 74 20 76 61 6c 67 72 69 6e 64 0a 20 20 20 20 2a  t valgrind.    *
10c70 2a 20 63 61 6e 20 64 65 74 65 63 74 20 69 66 20  * can detect if 
10c80 74 68 65 79 20 61 72 65 20 75 73 65 64 20 62 79  they are used by
10c90 20 6d 69 73 74 61 6b 65 20 69 6e 20 74 68 65 20   mistake in the 
10ca0 63 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 72  caller. */.    r
10cb0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
10cc0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
10cd0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
10ce0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
10cf0 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ema);.  v = sqli
10d00 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
10d10 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
10d20 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 42 61 73  =0 );.  if( iBas
10d30 65 3c 30 20 29 20 69 42 61 73 65 20 3d 20 70 50  e<0 ) iBase = pP
10d40 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 69 44  arse->nTab;.  iD
10d50 61 74 61 43 75 72 20 3d 20 69 42 61 73 65 2b 2b  ataCur = iBase++
10d60 3b 0a 20 20 69 66 28 20 70 69 44 61 74 61 43 75  ;.  if( piDataCu
10d70 72 20 29 20 2a 70 69 44 61 74 61 43 75 72 20 3d  r ) *piDataCur =
10d80 20 69 44 61 74 61 43 75 72 3b 0a 20 20 69 66 28   iDataCur;.  if(
10d90 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
10da0 26 26 20 28 61 54 6f 4f 70 65 6e 3d 3d 30 20 7c  && (aToOpen==0 |
10db0 7c 20 61 54 6f 4f 70 65 6e 5b 30 5d 29 20 29 7b  | aToOpen[0]) ){
10dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
10dd0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
10de0 61 74 61 43 75 72 2c 20 69 44 62 2c 20 70 54 61  ataCur, iDb, pTa
10df0 62 2c 20 6f 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  b, op);.  }else{
10e00 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
10e10 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
10e20 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 6f  b, pTab->tnum, o
10e30 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  p==OP_OpenWrite,
10e40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10e50 20 7d 0a 20 20 69 66 28 20 70 69 49 64 78 43 75   }.  if( piIdxCu
10e60 72 20 29 20 2a 70 69 49 64 78 43 75 72 20 3d 20  r ) *piIdxCur = 
10e70 69 42 61 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  iBase;.  for(i=0
10e80 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
10e90 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
10ea0 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b  pIdx->pNext, i++
10eb0 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  ){.    int iIdxC
10ec0 75 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a 20 20  ur = iBase++;.  
10ed0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
10ee0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
10ef0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
10f00 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  ( IsPrimaryKeyIn
10f10 64 65 78 28 70 49 64 78 29 20 26 26 20 21 48 61  dex(pIdx) && !Ha
10f20 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
10f30 20 20 20 20 20 20 69 66 28 20 70 69 44 61 74 61        if( piData
10f40 43 75 72 20 29 20 2a 70 69 44 61 74 61 43 75 72  Cur ) *piDataCur
10f50 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
10f60 20 20 70 35 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    p5 = 0;.    }.
10f70 20 20 20 20 69 66 28 20 61 54 6f 4f 70 65 6e 3d      if( aToOpen=
10f80 3d 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 69 2b  =0 || aToOpen[i+
10f90 31 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  1] ){.      sqli
10fa0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10fb0 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 70 49   op, iIdxCur, pI
10fc0 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
10fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10fe0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
10ff0 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
11000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11010 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
11020 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
11030 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
11040 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
11050 20 20 7d 0a 20 20 69 66 28 20 69 42 61 73 65 3e    }.  if( iBase>
11060 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 29 20 70  pParse->nTab ) p
11070 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 42  Parse->nTab = iB
11080 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  ase;.  return i;
11090 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
110a0 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
110b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
110c0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
110d0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
110e0 76 65 72 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ver the.** trans
110f0 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
11100 20 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20   is used.  This 
11110 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
11120 69 6e 67 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20  ing.** purposes 
11130 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65 20 73  only - to make s
11140 75 72 65 20 74 68 65 20 74 72 61 6e 73 66 65 72  ure the transfer
11150 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 65   optimization re
11160 61 6c 6c 79 0a 2a 2a 20 69 73 20 68 61 70 70 65  ally.** is happe
11170 6e 69 6e 67 20 77 68 65 6e 20 69 74 20 69 73 20  ning when it is 
11180 73 75 70 70 6f 73 65 64 20 74 6f 2e 0a 2a 2f 0a  supposed to..*/.
11190 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72  int sqlite3_xfer
111a0 6f 70 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  opt_count;.#endi
111b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
111c0 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
111d0 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f  LITE_OMIT_XFER_O
111e0 50 54 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  PT./*.** Check t
111f0 6f 20 73 65 65 20 69 66 20 69 6e 64 65 78 20 70  o see if index p
11200 53 72 63 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  Src is compatibl
11210 65 20 61 73 20 61 20 73 6f 75 72 63 65 20 6f 66  e as a source of
11220 20 64 61 74 61 0a 2a 2a 20 66 6f 72 20 69 6e 64   data.** for ind
11230 65 78 20 70 44 65 73 74 20 69 6e 20 61 6e 20 69  ex pDest in an i
11240 6e 73 65 72 74 20 74 72 61 6e 73 66 65 72 20 6f  nsert transfer o
11250 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
11260 65 20 72 75 6c 65 73 0a 2a 2a 20 66 6f 72 20 61  e rules.** for a
11270 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 64 65   compatible inde
11280 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20  x:.**.**    *   
11290 54 68 65 20 69 6e 64 65 78 20 69 73 20 6f 76 65  The index is ove
112a0 72 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  r the same set o
112b0 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20  f columns.**    
112c0 2a 20 20 20 54 68 65 20 73 61 6d 65 20 44 45 53  *   The same DES
112d0 43 20 61 6e 64 20 41 53 43 20 6d 61 72 6b 69 6e  C and ASC markin
112e0 67 73 20 6f 63 63 75 72 73 20 6f 6e 20 61 6c 6c  gs occurs on all
112f0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a   columns.**    *
11300 20 20 20 54 68 65 20 73 61 6d 65 20 6f 6e 45 72     The same onEr
11310 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 28  ror processing (
11320 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
11330 6f 72 65 2c 20 65 74 63 29 0a 2a 2a 20 20 20 20  ore, etc).**    
11340 2a 20 20 20 54 68 65 20 73 61 6d 65 20 63 6f 6c  *   The same col
11350 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
11360 6f 6e 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a  on each column.*
11370 2a 20 20 20 20 2a 20 20 20 54 68 65 20 69 6e 64  *    *   The ind
11380 65 78 20 68 61 73 20 74 68 65 20 65 78 61 63 74  ex has the exact
11390 20 73 61 6d 65 20 57 48 45 52 45 20 63 6c 61 75   same WHERE clau
113a0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
113b0 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49   xferCompatibleI
113c0 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 44 65 73  ndex(Index *pDes
113d0 74 2c 20 49 6e 64 65 78 20 2a 70 53 72 63 29 7b  t, Index *pSrc){
113e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
113f0 72 74 28 20 70 44 65 73 74 20 26 26 20 70 53 72  rt( pDest && pSr
11400 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  c );.  assert( p
11410 44 65 73 74 2d 3e 70 54 61 62 6c 65 21 3d 70 53  Dest->pTable!=pS
11420 72 63 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20  rc->pTable );.  
11430 69 66 28 20 70 44 65 73 74 2d 3e 6e 4b 65 79 43  if( pDest->nKeyC
11440 6f 6c 21 3d 70 53 72 63 2d 3e 6e 4b 65 79 43 6f  ol!=pSrc->nKeyCo
11450 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
11460 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e  0;   /* Differen
11470 74 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  t number of colu
11480 6d 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  mns */.  }.  if(
11490 20 70 44 65 73 74 2d 3e 6f 6e 45 72 72 6f 72 21   pDest->onError!
114a0 3d 70 53 72 63 2d 3e 6f 6e 45 72 72 6f 72 20 29  =pSrc->onError )
114b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
114c0 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63    /* Different c
114d0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
114e0 6f 6e 20 73 74 72 61 74 65 67 69 65 73 20 2a 2f  on strategies */
114f0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
11500 69 3c 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c 3b  i<pSrc->nKeyCol;
11510 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11520 53 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Src->aiColumn[i]
11530 21 3d 70 44 65 73 74 2d 3e 61 69 43 6f 6c 75 6d  !=pDest->aiColum
11540 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72 65  n[i] ){.      re
11550 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66  turn 0;   /* Dif
11560 66 65 72 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 69  ferent columns i
11570 6e 64 65 78 65 64 20 2a 2f 0a 20 20 20 20 7d 0a  ndexed */.    }.
11580 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 69      if( pSrc->ai
11590 43 6f 6c 75 6d 6e 5b 69 5d 3d 3d 58 4e 5f 45 58  Column[i]==XN_EX
115a0 50 52 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  PR ){.      asse
115b0 72 74 28 20 70 53 72 63 2d 3e 61 43 6f 6c 45 78  rt( pSrc->aColEx
115c0 70 72 21 3d 30 20 26 26 20 70 44 65 73 74 2d 3e  pr!=0 && pDest->
115d0 61 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  aColExpr!=0 );. 
115e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
115f0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
11600 53 72 63 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Src->aColExpr->a
11610 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61          pDest->a
11640 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45  ColExpr->a[i].pE
11650 78 70 72 2c 20 2d 31 29 21 3d 30 20 29 7b 0a 20  xpr, -1)!=0 ){. 
11660 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
11670 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20     /* Different 
11680 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
11690 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
116a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
116b0 28 20 70 53 72 63 2d 3e 61 53 6f 72 74 4f 72 64  ( pSrc->aSortOrd
116c0 65 72 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61 53  er[i]!=pDest->aS
116d0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
116e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
116f0 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 73 6f   /* Different so
11700 72 74 20 6f 72 64 65 72 73 20 2a 2f 0a 20 20 20  rt orders */.   
11710 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11720 65 33 5f 73 74 72 69 63 6d 70 28 70 53 72 63 2d  e3_stricmp(pSrc-
11730 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 70 44 65 73 74  >azColl[i],pDest
11740 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 21 3d 30 20  ->azColl[i])!=0 
11750 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11760 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e  0;   /* Differen
11770 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
11780 65 6e 63 65 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  ences */.    }. 
11790 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
117a0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
117b0 53 72 63 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Src->pPartIdxWhe
117c0 72 65 2c 20 70 44 65 73 74 2d 3e 70 50 61 72 74  re, pDest->pPart
117d0 49 64 78 57 68 65 72 65 2c 20 2d 31 29 20 29 7b  IdxWhere, -1) ){
117e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
117f0 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20     /* Different 
11800 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 2a 2f  WHERE clauses */
11810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
11820 20 74 65 73 74 20 61 62 6f 76 65 20 66 61 69 6c   test above fail
11830 73 20 74 68 65 6e 20 74 68 65 20 69 6e 64 69 63  s then the indic
11840 65 73 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61  es must be compa
11850 74 69 62 6c 65 20 2a 2f 0a 20 20 72 65 74 75 72  tible */.  retur
11860 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  n 1;.}../*.** At
11870 74 65 6d 70 74 20 74 68 65 20 74 72 61 6e 73 66  tempt the transf
11880 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
11890 6f 6e 20 49 4e 53 45 52 54 73 20 6f 66 20 74 68  on INSERTs of th
118a0 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
118b0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62   INSERT INTO tab
118c0 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
118d0 74 61 62 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tab2;.**.** The 
118e0 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  xfer optimizatio
118f0 6e 20 74 72 61 6e 73 66 65 72 73 20 72 61 77 20  n transfers raw 
11900 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 61 62  records from tab
11910 32 20 6f 76 65 72 20 74 6f 20 74 61 62 31 2e 20  2 over to tab1. 
11920 20 0a 2a 2a 20 43 6f 6c 75 6d 6e 73 20 61 72 65   .** Columns are
11930 20 6e 6f 74 20 64 65 63 6f 64 65 64 20 61 6e 64   not decoded and
11940 20 72 65 61 73 73 65 6d 62 6c 65 64 2c 20 77 68   reassembled, wh
11950 69 63 68 20 67 72 65 61 74 6c 79 20 69 6d 70 72  ich greatly impr
11960 6f 76 65 73 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  oves.** performa
11970 6e 63 65 2e 20 20 52 61 77 20 69 6e 64 65 78 20  nce.  Raw index 
11980 72 65 63 6f 72 64 73 20 61 72 65 20 74 72 61 6e  records are tran
11990 73 66 65 72 72 65 64 20 69 6e 20 74 68 65 20 73  sferred in the s
119a0 61 6d 65 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  ame way..**.** T
119b0 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61  he xfer optimiza
119c0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 61 74 74  tion is only att
119d0 65 6d 70 74 65 64 20 69 66 20 74 61 62 31 20 61  empted if tab1 a
119e0 6e 64 20 74 61 62 32 20 61 72 65 20 63 6f 6d 70  nd tab2 are comp
119f0 61 74 69 62 6c 65 2e 0a 2a 2a 20 54 68 65 72 65  atible..** There
11a00 20 61 72 65 20 6c 6f 74 73 20 6f 66 20 72 75 6c   are lots of rul
11a10 65 73 20 66 6f 72 20 64 65 74 65 72 6d 69 6e 69  es for determini
11a20 6e 67 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ng compatibility
11a30 20 2d 20 73 65 65 20 63 6f 6d 6d 65 6e 74 73 0a   - see comments.
11a40 2a 2a 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74  ** embedded in t
11a50 68 65 20 63 6f 64 65 20 66 6f 72 20 64 65 74 61  he code for deta
11a60 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ils..**.** This 
11a70 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
11a80 54 52 55 45 20 69 66 20 74 68 65 20 6f 70 74 69  TRUE if the opti
11a90 6d 69 7a 61 74 69 6f 6e 20 69 73 20 67 75 61 72  mization is guar
11aa0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 73 65  anteed to be use
11ab0 64 2e 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  d..** Sometimes 
11ac0 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
11ad0 61 74 69 6f 6e 20 77 69 6c 6c 20 6f 6e 6c 79 20  ation will only 
11ae0 77 6f 72 6b 20 69 66 20 74 68 65 20 64 65 73 74  work if the dest
11af0 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 0a 2a 2a  ination table.**
11b00 20 69 73 20 65 6d 70 74 79 20 2d 20 61 20 66 61   is empty - a fa
11b10 63 74 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 6e  ctor that can on
11b20 6c 79 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64  ly be determined
11b30 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 20 20 49   at run-time.  I
11b40 6e 20 74 68 61 74 0a 2a 2a 20 63 61 73 65 2c 20  n that.** case, 
11b50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  this routine gen
11b60 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20  erates code for 
11b70 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
11b80 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f 0a 2a  ation but also.*
11b90 2a 20 64 6f 65 73 20 61 20 74 65 73 74 20 74 6f  * does a test to
11ba0 20 73 65 65 20 69 66 20 74 68 65 20 64 65 73 74   see if the dest
11bb0 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 69 73  ination table is
11bc0 20 65 6d 70 74 79 20 61 6e 64 20 6a 75 6d 70 73   empty and jumps
11bd0 20 6f 76 65 72 20 74 68 65 0a 2a 2a 20 78 66 65   over the.** xfe
11be0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  r optimization c
11bf0 6f 64 65 20 69 66 20 74 68 65 20 74 65 73 74 20  ode if the test 
11c00 66 61 69 6c 73 2e 20 20 49 6e 20 74 68 61 74 20  fails.  In that 
11c10 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
11c20 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 46 41  ne.** returns FA
11c30 4c 53 45 20 73 6f 20 74 68 61 74 20 74 68 65 20  LSE so that the 
11c40 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 6e 6f 77  caller will know
11c50 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
11c60 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 6e 20   generate.** an 
11c70 75 6e 6f 70 74 69 6d 69 7a 65 64 20 74 72 61 6e  unoptimized tran
11c80 73 66 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  sfer.  This rout
11c90 69 6e 65 20 61 6c 73 6f 20 72 65 74 75 72 6e 73  ine also returns
11ca0 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 0a   FALSE if there.
11cb0 2a 2a 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  ** is no chance 
11cc0 74 68 61 74 20 74 68 65 20 78 66 65 72 20 6f 70  that the xfer op
11cd0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
11ce0 65 20 61 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a  e applied..**.**
11cf0 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
11d00 6f 6e 20 69 73 20 70 61 72 74 69 63 75 6c 61 72  on is particular
11d10 6c 79 20 75 73 65 66 75 6c 20 61 74 20 6d 61 6b  ly useful at mak
11d20 69 6e 67 20 56 41 43 55 55 4d 20 72 75 6e 20 66  ing VACUUM run f
11d30 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
11d40 20 69 6e 74 20 78 66 65 72 4f 70 74 69 6d 69 7a   int xferOptimiz
11d50 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
11d60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
11d70 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
11d80 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44 65   */.  Table *pDe
11d90 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  st,         /* T
11da0 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
11db0 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 2a  inserting into *
11dc0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
11dd0 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53  ect,      /* A S
11de0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11df0 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 64 61  to use as the da
11e00 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69  ta source */.  i
11e10 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
11e20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68       /* How to h
11e30 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  andle constraint
11e40 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
11e50 20 69 44 62 44 65 73 74 20 20 20 20 20 20 20 20   iDbDest        
11e60 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
11e70 73 65 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a 29  se of pDest */.)
11e80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
11e90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11ea0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ec0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
11ed0 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
11ee0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 53 72   */.  Table *pSr
11ef0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11f00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
11f10 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
11f20 63 6c 61 75 73 65 20 6f 66 20 53 45 4c 45 43 54  clause of SELECT
11f30 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 53 72   */.  Index *pSr
11f40 63 49 64 78 2c 20 2a 70 44 65 73 74 49 64 78 3b  cIdx, *pDestIdx;
11f50 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
11f60 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e   and destination
11f70 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 73 74   indices */.  st
11f80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
11f90 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 2f  m *pItem;      /
11fa0 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
11fb0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20 2a 2f  pSelect->pSrc */
11fc0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11ff0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ter */.  int iDb
12000 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
12010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12020 20 64 61 74 61 62 61 73 65 20 6f 66 20 70 53 72   database of pSr
12030 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63 2c  c */.  int iSrc,
12040 20 69 44 65 73 74 3b 20 20 20 20 20 20 20 20 20   iDest;         
12050 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
12060 72 73 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 61  rs from source a
12070 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  nd destination *
12080 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61  /.  int addr1, a
12090 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
120a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 61 64 64       /* Loop add
120b0 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
120c0 65 6d 70 74 79 44 65 73 74 54 65 73 74 20 3d 20  emptyDestTest = 
120d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
120e0 41 64 64 72 65 73 73 20 6f 66 20 74 65 73 74 20  Address of test 
120f0 66 6f 72 20 65 6d 70 74 79 20 70 44 65 73 74 20  for empty pDest 
12100 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 53 72  */.  int emptySr
12110 63 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  cTest = 0;      
12120 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12130 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70   of test for emp
12140 74 79 20 70 53 72 63 20 2a 2f 0a 20 20 56 64 62  ty pSrc */.  Vdb
12150 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12170 20 54 68 65 20 56 44 42 45 20 77 65 20 61 72 65   The VDBE we are
12180 20 62 75 69 6c 64 69 6e 67 20 2a 2f 0a 20 20 69   building */.  i
12190 6e 74 20 72 65 67 41 75 74 6f 69 6e 63 3b 20 20  nt regAutoinc;  
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 2f 2a 20 4d 65 6d 6f 72 79 20 72 65 67 69 73 74  /* Memory regist
121c0 65 72 20 75 73 65 64 20 62 79 20 41 55 54 4f 49  er used by AUTOI
121d0 4e 43 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  NC */.  int dest
121e0 48 61 73 55 6e 69 71 75 65 49 64 78 20 3d 20 30  HasUniqueIdx = 0
121f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
12200 20 69 66 20 70 44 65 73 74 20 68 61 73 20 61 20   if pDest has a 
12210 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a  UNIQUE index */.
12220 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 72    int regData, r
12230 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  egRowid;        
12240 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
12250 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 61 6e 64  holding data and
12260 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 69 66 28   rowid */..  if(
12270 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
12280 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
12290 2a 20 4d 75 73 74 20 62 65 20 6f 66 20 74 68 65  * Must be of the
122a0 20 66 6f 72 6d 20 20 49 4e 53 45 52 54 20 49 4e   form  INSERT IN
122b0 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 20 2e 2e  TO ... SELECT ..
122c0 2e 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  . */.  }.  if( p
122d0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 7c 7c 20  Parse->pWith || 
122e0 70 53 65 6c 65 63 74 2d 3e 70 57 69 74 68 20 29  pSelect->pWith )
122f0 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  {.    /* Do not 
12300 61 74 74 65 6d 70 74 20 74 6f 20 70 72 6f 63 65  attempt to proce
12310 73 73 20 74 68 69 73 20 71 75 65 72 79 20 69 66  ss this query if
12320 20 74 68 65 72 65 20 61 72 65 20 61 6e 20 57 49   there are an WI
12330 54 48 20 63 6c 61 75 73 65 73 0a 20 20 20 20 2a  TH clauses.    *
12340 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74  * attached to it
12350 2e 20 50 72 6f 63 65 65 64 69 6e 67 20 6d 61 79  . Proceeding may
12360 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 6c 73   generate a fals
12370 65 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  e "no such table
12380 3a 20 78 78 78 22 0a 20 20 20 20 2a 2a 20 65 72  : xxx".    ** er
12390 72 6f 72 20 69 66 20 70 53 65 6c 65 63 74 20 72  ror if pSelect r
123a0 65 61 64 73 20 66 72 6f 6d 20 61 20 43 54 45 20  eads from a CTE 
123b0 6e 61 6d 65 64 20 22 78 78 78 22 2e 20 20 2a 2f  named "xxx".  */
123c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
123d0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
123e0 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
123f0 73 65 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20  se, pDest) ){.  
12400 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
12410 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20 68   tab1 must not h
12420 61 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  ave triggers */.
12430 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12440 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12450 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72  ABLE.  if( IsVir
12460 74 75 61 6c 28 70 44 65 73 74 29 20 29 7b 0a 20  tual(pDest) ){. 
12470 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
12480 2a 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20  * tab1 must not 
12490 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
124a0 6c 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66  le */.  }.#endif
124b0 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  .  if( onError==
124c0 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
124d0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b    if( pDest->iPK
124e0 65 79 3e 3d 30 20 29 20 6f 6e 45 72 72 6f 72 20  ey>=0 ) onError 
124f0 3d 20 70 44 65 73 74 2d 3e 6b 65 79 43 6f 6e 66  = pDest->keyConf
12500 3b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  ;.    if( onErro
12510 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 20  r==OE_Default ) 
12520 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f  onError = OE_Abo
12530 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rt;.  }.  assert
12540 28 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  (pSelect->pSrc);
12550 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 64 20     /* allocated 
12560 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 69 73  even if there is
12570 20 6e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   no FROM clause 
12580 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
12590 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
125a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
125b0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
125c0 65 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  e must have exac
125d0 74 6c 79 20 6f 6e 65 20 74 65 72 6d 20 2a 2f 0a  tly one term */.
125e0 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
125f0 74 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  t->pSrc->a[0].pS
12600 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74  elect ){.    ret
12610 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d  urn 0;   /* FROM
12620 20 63 6c 61 75 73 65 20 63 61 6e 6e 6f 74 20 63   clause cannot c
12630 6f 6e 74 61 69 6e 20 61 20 73 75 62 71 75 65 72  ontain a subquer
12640 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  y */.  }.  if( p
12650 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 20 29  Select->pWhere )
12660 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
12670 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
12680 6e 6f 74 20 68 61 76 65 20 61 20 57 48 45 52 45  not have a WHERE
12690 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20   clause */.  }. 
126a0 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f   if( pSelect->pO
126b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
126c0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c  turn 0;   /* SEL
126d0 45 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ECT may not have
126e0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
126f0 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 2f 2a 20  use */.  }.  /* 
12700 44 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 74  Do not need to t
12710 65 73 74 20 66 6f 72 20 61 20 48 41 56 49 4e 47  est for a HAVING
12720 20 63 6c 61 75 73 65 2e 20 20 49 66 20 48 41 56   clause.  If HAV
12730 49 4e 47 20 69 73 20 70 72 65 73 65 6e 74 20 62  ING is present b
12740 75 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ut.  ** there is
12750 20 6e 6f 20 4f 52 44 45 52 20 42 59 2c 20 77 65   no ORDER BY, we
12760 20 77 69 6c 6c 20 67 65 74 20 61 6e 20 65 72 72   will get an err
12770 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  or. */.  if( pSe
12780 6c 65 63 74 2d 3e 70 47 72 6f 75 70 42 79 20 29  lect->pGroupBy )
12790 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
127a0 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
127b0 6e 6f 74 20 68 61 76 65 20 61 20 47 52 4f 55 50  not have a GROUP
127c0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
127d0 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
127e0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
127f0 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45  eturn 0;   /* SE
12800 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76  LECT may not hav
12810 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
12820 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
12830 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 66 66 73  ( pSelect->pOffs
12840 65 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4d 75 73  et==0 );  /* Mus
12850 74 20 62 65 20 73 6f 20 69 66 20 70 4c 69 6d 69  t be so if pLimi
12860 74 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 70 53  t==0 */.  if( pS
12870 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
12880 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
12890 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e   /* SELECT may n
128a0 6f 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  ot be a compound
128b0 20 71 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20   query */.  }.  
128c0 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  if( pSelect->sel
128d0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
128e0 6e 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nct ){.    retur
128f0 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54  n 0;   /* SELECT
12900 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
12910 49 4e 43 54 20 2a 2f 0a 20 20 7d 0a 20 20 70 45  INCT */.  }.  pE
12920 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
12930 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
12940 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
12950 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
12960 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74  pr!=1 ){.    ret
12970 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  urn 0;   /* The 
12980 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 20  result set must 
12990 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
129a0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 7d 0a 20   column */.  }. 
129b0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
129c0 3e 61 5b 30 5d 2e 70 45 78 70 72 20 29 3b 0a 20  >a[0].pExpr );. 
129d0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
129e0 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
129f0 41 53 54 45 52 49 53 4b 20 29 7b 0a 20 20 20 20  ASTERISK ){.    
12a00 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54  return 0;   /* T
12a10 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75  he result set mu
12a20 73 74 20 62 65 20 74 68 65 20 73 70 65 63 69 61  st be the specia
12a30 6c 20 6f 70 65 72 61 74 6f 72 20 22 2a 22 20 2a  l operator "*" *
12a40 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  /.  }..  /* At t
12a50 68 69 73 20 70 6f 69 6e 74 20 77 65 20 68 61 76  his point we hav
12a60 65 20 65 73 74 61 62 6c 69 73 68 65 64 20 74 68  e established th
12a70 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
12a80 20 69 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20   is of the.  ** 
12a90 63 6f 72 72 65 63 74 20 73 79 6e 74 61 63 74 69  correct syntacti
12aa0 63 20 66 6f 72 6d 20 74 6f 20 70 61 72 74 69 63  c form to partic
12ab0 69 70 61 74 65 20 69 6e 20 74 68 69 73 20 6f 70  ipate in this op
12ac0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 4e 6f 77  timization.  Now
12ad0 0a 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f  .  ** we have to
12ae0 20 63 68 65 63 6b 20 74 68 65 20 73 65 6d 61 6e   check the seman
12af0 74 69 63 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 74  tics..  */.  pIt
12b00 65 6d 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  em = pSelect->pS
12b10 72 63 2d 3e 61 3b 0a 20 20 70 53 72 63 20 3d 20  rc->a;.  pSrc = 
12b20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
12b30 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
12b40 2c 20 70 49 74 65 6d 29 3b 0a 20 20 69 66 28 20  , pItem);.  if( 
12b50 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pSrc==0 ){.    r
12b60 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 46 52  eturn 0;   /* FR
12b70 4f 4d 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  OM clause does n
12b80 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 61  ot contain a rea
12b90 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20  l table */.  }. 
12ba0 20 69 66 28 20 70 53 72 63 3d 3d 70 44 65 73 74   if( pSrc==pDest
12bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12bc0 3b 20 20 20 2f 2a 20 74 61 62 31 20 61 6e 64 20  ;   /* tab1 and 
12bd0 74 61 62 32 20 6d 61 79 20 6e 6f 74 20 62 65 20  tab2 may not be 
12be0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 2a  the same table *
12bf0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 48 61 73 52  /.  }.  if( HasR
12c00 6f 77 69 64 28 70 44 65 73 74 29 21 3d 48 61 73  owid(pDest)!=Has
12c10 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a 20  Rowid(pSrc) ){. 
12c20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
12c30 2a 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65 73  * source and des
12c40 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 6f  tination must bo
12c50 74 68 20 62 65 20 57 49 54 48 4f 55 54 20 52 4f  th be WITHOUT RO
12c60 57 49 44 20 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20  WID or not */.  
12c70 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
12c80 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12c90 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
12ca0 61 6c 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  al(pSrc) ){.    
12cb0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74  return 0;   /* t
12cc0 61 62 32 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ab2 must not be 
12cd0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
12ce0 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  */.  }.#endif.  
12cf0 69 66 28 20 70 53 72 63 2d 3e 70 53 65 6c 65 63  if( pSrc->pSelec
12d00 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
12d10 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d 61 79  0;   /* tab2 may
12d20 20 6e 6f 74 20 62 65 20 61 20 76 69 65 77 20 2a   not be a view *
12d30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  /.  }.  if( pDes
12d40 74 2d 3e 6e 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e  t->nCol!=pSrc->n
12d50 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Col ){.    retur
12d60 6e 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n 0;   /* Number
12d70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74   of columns must
12d80 20 62 65 20 74 68 65 20 73 61 6d 65 20 69 6e 20   be the same in 
12d90 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 2a 2f  tab1 and tab2 */
12da0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74  .  }.  if( pDest
12db0 2d 3e 69 50 4b 65 79 21 3d 70 53 72 63 2d 3e 69  ->iPKey!=pSrc->i
12dc0 50 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  PKey ){.    retu
12dd0 72 6e 20 30 3b 20 20 20 2f 2a 20 42 6f 74 68 20  rn 0;   /* Both 
12de0 74 61 62 6c 65 73 20 6d 75 73 74 20 68 61 76 65  tables must have
12df0 20 74 68 65 20 73 61 6d 65 20 49 4e 54 45 47 45   the same INTEGE
12e00 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
12e10 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
12e20 69 3c 70 44 65 73 74 2d 3e 6e 43 6f 6c 3b 20 69  i<pDest->nCol; i
12e30 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ++){.    Column 
12e40 2a 70 44 65 73 74 43 6f 6c 20 3d 20 26 70 44 65  *pDestCol = &pDe
12e50 73 74 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  st->aCol[i];.   
12e60 20 43 6f 6c 75 6d 6e 20 2a 70 53 72 63 43 6f 6c   Column *pSrcCol
12e70 20 3d 20 26 70 53 72 63 2d 3e 61 43 6f 6c 5b 69   = &pSrc->aCol[i
12e80 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
12e90 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43  _ENABLE_HIDDEN_C
12ea0 4f 4c 55 4d 4e 53 0a 20 20 20 20 69 66 28 20 28  OLUMNS.    if( (
12eb0 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44  db->mDbFlags & D
12ec0 42 46 4c 41 47 5f 56 61 63 75 75 6d 29 3d 3d 30  BFLAG_Vacuum)==0
12ed0 20 0a 20 20 20 20 20 26 26 20 28 70 44 65 73 74   .     && (pDest
12ee0 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 20  Col->colFlags | 
12ef0 70 53 72 63 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  pSrcCol->colFlag
12f00 73 29 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44  s) & COLFLAG_HID
12f10 44 45 4e 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  DEN .    ){.    
12f20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
12f30 2a 20 4e 65 69 74 68 65 72 20 74 61 62 6c 65 20  * Neither table 
12f40 6d 61 79 20 68 61 76 65 20 5f 5f 68 69 64 64 65  may have __hidde
12f50 6e 5f 5f 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  n__ columns */. 
12f60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12f70 69 66 28 20 70 44 65 73 74 43 6f 6c 2d 3e 61 66  if( pDestCol->af
12f80 66 69 6e 69 74 79 21 3d 70 53 72 63 43 6f 6c 2d  finity!=pSrcCol-
12f90 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  >affinity ){.   
12fa0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
12fb0 2f 2a 20 41 66 66 69 6e 69 74 79 20 6d 75 73 74  /* Affinity must
12fc0 20 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20   be the same on 
12fd0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  all columns */. 
12fe0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12ff0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 65  ite3_stricmp(pDe
13000 73 74 43 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20 70 53  stCol->zColl, pS
13010 72 63 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 21 3d 30  rcCol->zColl)!=0
13020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13030 20 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74   0;    /* Collat
13040 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ing sequence mus
13050 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e  t be the same on
13060 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   all columns */.
13070 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44      }.    if( pD
13080 65 73 74 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20  estCol->notNull 
13090 26 26 20 21 70 53 72 63 43 6f 6c 2d 3e 6e 6f 74  && !pSrcCol->not
130a0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Null ){.      re
130b0 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 74 61  turn 0;    /* ta
130c0 62 32 20 6d 75 73 74 20 62 65 20 4e 4f 54 20 4e  b2 must be NOT N
130d0 55 4c 4c 20 69 66 20 74 61 62 31 20 69 73 20 2a  ULL if tab1 is *
130e0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  /.    }.    /* D
130f0 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f  efault values fo
13100 72 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  r second and sub
13110 73 65 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73 20  sequent columns 
13120 6e 65 65 64 20 74 6f 20 6d 61 74 63 68 2e 20 2a  need to match. *
13130 2f 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  /.    if( i>0 ){
13140 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13150 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d  DestCol->pDflt==
13160 30 20 7c 7c 20 70 44 65 73 74 43 6f 6c 2d 3e 70  0 || pDestCol->p
13170 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41  Dflt->op==TK_SPA
13180 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  N );.      asser
13190 74 28 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c  t( pSrcCol->pDfl
131a0 74 3d 3d 30 20 7c 7c 20 70 53 72 63 43 6f 6c 2d  t==0 || pSrcCol-
131b0 3e 70 44 66 6c 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pDflt->op==TK_S
131c0 50 41 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  PAN );.      if(
131d0 20 28 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c   (pDestCol->pDfl
131e0 74 3d 3d 30 29 21 3d 28 70 53 72 63 43 6f 6c 2d  t==0)!=(pSrcCol-
131f0 3e 70 44 66 6c 74 3d 3d 30 29 20 0a 20 20 20 20  >pDflt==0) .    
13200 20 20 20 7c 7c 20 28 70 44 65 73 74 43 6f 6c 2d     || (pDestCol-
13210 3e 70 44 66 6c 74 20 26 26 20 73 74 72 63 6d 70  >pDflt && strcmp
13220 28 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74  (pDestCol->pDflt
13230 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 0a 20 20 20 20  ->u.zToken,.    
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c     pSrcCol->pDfl
13270 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 29  t->u.zToken)!=0)
13280 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13290 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
132a0 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 73  * Default values
132b0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
132c0 65 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  e for all column
132d0 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s */.      }.   
132e0 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44 65   }.  }.  for(pDe
132f0 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e  stIdx=pDest->pIn
13300 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b 20 70  dex; pDestIdx; p
13310 44 65 73 74 49 64 78 3d 70 44 65 73 74 49 64 78  DestIdx=pDestIdx
13320 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
13330 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
13340 70 44 65 73 74 49 64 78 29 20 29 7b 0a 20 20 20  pDestIdx) ){.   
13350 20 20 20 64 65 73 74 48 61 73 55 6e 69 71 75 65     destHasUnique
13360 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Idx = 1;.    }. 
13370 20 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70     for(pSrcIdx=p
13380 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53 72  Src->pIndex; pSr
13390 63 49 64 78 3b 20 70 53 72 63 49 64 78 3d 70 53  cIdx; pSrcIdx=pS
133a0 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  rcIdx->pNext){. 
133b0 20 20 20 20 20 69 66 28 20 78 66 65 72 43 6f 6d       if( xferCom
133c0 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70 44 65  patibleIndex(pDe
133d0 73 74 49 64 78 2c 20 70 53 72 63 49 64 78 29 20  stIdx, pSrcIdx) 
133e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
133f0 20 20 20 69 66 28 20 70 53 72 63 49 64 78 3d 3d     if( pSrcIdx==
13400 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13410 6e 20 30 3b 20 20 20 20 2f 2a 20 70 44 65 73 74  n 0;    /* pDest
13420 49 64 78 20 68 61 73 20 6e 6f 20 63 6f 72 72 65  Idx has no corre
13430 73 70 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20 69  sponding index i
13440 6e 20 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d 0a  n pSrc */.    }.
13450 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13460 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
13470 69 66 28 20 70 44 65 73 74 2d 3e 70 43 68 65 63  if( pDest->pChec
13480 6b 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  k && sqlite3Expr
13490 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 53 72 63  ListCompare(pSrc
134a0 2d 3e 70 43 68 65 63 6b 2c 70 44 65 73 74 2d 3e  ->pCheck,pDest->
134b0 70 43 68 65 63 6b 2c 2d 31 29 20 29 7b 0a 20 20  pCheck,-1) ){.  
134c0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
134d0 20 54 61 62 6c 65 73 20 68 61 76 65 20 64 69 66   Tables have dif
134e0 66 65 72 65 6e 74 20 43 48 45 43 4b 20 63 6f 6e  ferent CHECK con
134f0 73 74 72 61 69 6e 74 73 2e 20 20 54 69 63 6b 65  straints.  Ticke
13500 74 20 23 32 32 35 32 20 2a 2f 0a 20 20 7d 0a 23  t #2252 */.  }.#
13510 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
13520 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
13530 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 69 73 61 6c  N_KEY.  /* Disal
13540 6c 6f 77 20 74 68 65 20 74 72 61 6e 73 66 65 72  low the transfer
13550 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
13560 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
13570 20 74 61 62 6c 65 20 63 6f 6e 73 74 61 69 6e 73   table constains
13580 0a 20 20 2a 2a 20 61 6e 79 20 66 6f 72 65 69 67  .  ** any foreig
13590 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
135a0 73 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  s.  This is more
135b0 20 72 65 73 74 72 69 63 74 69 76 65 20 74 68 61   restrictive tha
135c0 6e 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  n necessary..  *
135d0 2a 20 42 75 74 20 74 68 65 20 6d 61 69 6e 20 62  * But the main b
135e0 65 6e 65 66 69 63 69 61 72 79 20 6f 66 20 74 68  eneficiary of th
135f0 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
13600 69 7a 61 74 69 6f 6e 20 69 73 20 74 68 65 20 56  ization is the V
13610 41 43 55 55 4d 20 0a 20 20 2a 2a 20 63 6f 6d 6d  ACUUM .  ** comm
13620 61 6e 64 2c 20 61 6e 64 20 74 68 65 20 56 41 43  and, and the VAC
13630 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 64 69 73 61  UUM command disa
13640 62 6c 65 73 20 66 6f 72 65 69 67 6e 20 6b 65 79  bles foreign key
13650 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 53   constraints.  S
13660 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 74 72 61  o.  ** the extra
13670 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 74 6f   complication to
13680 20 6d 61 6b 65 20 74 68 69 73 20 72 75 6c 65 20   make this rule 
13690 6c 65 73 73 20 72 65 73 74 72 69 63 74 69 76 65  less restrictive
136a0 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 2a   is probably.  *
136b0 2a 20 6e 6f 74 20 77 6f 72 74 68 20 74 68 65 20  * not worth the 
136c0 65 66 66 6f 72 74 2e 20 20 54 69 63 6b 65 74 20  effort.  Ticket 
136d0 5b 36 32 38 34 64 66 38 39 64 65 62 64 66 61 36  [6284df89debdfa6
136e0 31 64 62 38 30 37 33 65 30 36 32 39 30 38 61 66  1db8073e062908af
136f0 30 63 39 62 36 31 31 38 65 5d 0a 20 20 2a 2f 0a  0c9b6118e].  */.
13700 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
13710 20 26 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   & SQLITE_Foreig
13720 6e 4b 65 79 73 29 21 3d 30 20 26 26 20 70 44 65  nKeys)!=0 && pDe
13730 73 74 2d 3e 70 46 4b 65 79 21 3d 30 20 29 7b 0a  st->pFKey!=0 ){.
13740 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
13750 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28  }.#endif.  if( (
13760 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
13770 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30  TE_CountRows)!=0
13780 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
13790 3b 20 20 2f 2a 20 78 66 65 72 20 6f 70 74 20 64  ;  /* xfer opt d
137a0 6f 65 73 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c  oes not play wel
137b0 6c 20 77 69 74 68 20 50 52 41 47 4d 41 20 63 6f  l with PRAGMA co
137c0 75 6e 74 5f 63 68 61 6e 67 65 73 20 2a 2f 0a 20  unt_changes */. 
137d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
137e0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
137f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 78  means that the x
13800 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
13810 20 69 73 20 61 74 0a 20 20 2a 2a 20 6c 65 61 73   is at.  ** leas
13820 74 20 61 20 70 6f 73 73 69 62 69 6c 69 74 79 2c  t a possibility,
13830 20 74 68 6f 75 67 68 20 69 74 20 6d 69 67 68 74   though it might
13840 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74 68   only work if th
13850 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20 20  e destination.  
13860 2a 2a 20 74 61 62 6c 65 20 28 74 61 62 31 29 20  ** table (tab1) 
13870 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  is initially emp
13880 74 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ty..  */.#ifdef 
13890 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
138a0 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
138b0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
138c0 69 44 62 53 72 63 20 3d 20 73 71 6c 69 74 65 33  iDbSrc = sqlite3
138d0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
138e0 2c 20 70 53 72 63 2d 3e 70 53 63 68 65 6d 61 29  , pSrc->pSchema)
138f0 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
13900 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13910 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
13920 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
13930 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 69 53 72  , iDbSrc);.  iSr
13940 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  c = pParse->nTab
13950 2b 2b 3b 0a 20 20 69 44 65 73 74 20 3d 20 70 50  ++;.  iDest = pP
13960 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13970 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 61 75 74  regAutoinc = aut
13980 6f 49 6e 63 42 65 67 69 6e 28 70 50 61 72 73 65  oIncBegin(pParse
13990 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74  , iDbDest, pDest
139a0 29 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20 73  );.  regData = s
139b0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
139c0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52  (pParse);.  regR
139d0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
139e0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
139f0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  ;.  sqlite3OpenT
13a00 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 65  able(pParse, iDe
13a10 73 74 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65  st, iDbDest, pDe
13a20 73 74 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  st, OP_OpenWrite
13a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 48 61 73  );.  assert( Has
13a40 52 6f 77 69 64 28 70 44 65 73 74 29 20 7c 7c 20  Rowid(pDest) || 
13a50 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78  destHasUniqueIdx
13a60 20 29 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   );.  if( (db->m
13a70 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
13a80 5f 56 61 63 75 75 6d 29 3d 3d 30 20 26 26 20 28  _Vacuum)==0 && (
13a90 0a 20 20 20 20 20 20 28 70 44 65 73 74 2d 3e 69  .      (pDest->i
13aa0 50 4b 65 79 3c 30 20 26 26 20 70 44 65 73 74 2d  PKey<0 && pDest-
13ab0 3e 70 49 6e 64 65 78 21 3d 30 29 20 20 20 20 20  >pIndex!=0)     
13ac0 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
13ad0 20 20 7c 7c 20 64 65 73 74 48 61 73 55 6e 69 71    || destHasUniq
13ae0 75 65 49 64 78 20 20 20 20 20 20 20 20 20 20 20  ueIdx           
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
13b10 7c 7c 20 28 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  || (onError!=OE_
13b20 41 62 6f 72 74 20 26 26 20 6f 6e 45 72 72 6f 72  Abort && onError
13b30 21 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 29 20 20  !=OE_Rollback)  
13b40 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 29 29 7b   /* (3) */.  )){
13b50 0a 20 20 20 20 2f 2a 20 49 6e 20 73 6f 6d 65 20  .    /* In some 
13b60 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 77  circumstances, w
13b70 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 75  e are able to ru
13b80 6e 20 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d  n the xfer optim
13b90 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  ization.    ** o
13ba0 6e 6c 79 20 69 66 20 74 68 65 20 64 65 73 74 69  nly if the desti
13bb0 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 69 73 20  nation table is 
13bc0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
13bd0 20 55 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20   Unless the.    
13be0 2a 2a 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d  ** DBFLAG_Vacuum
13bf0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
13c00 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74  is block generat
13c10 65 73 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 0a  es code to make.
13c20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 74 65      ** that dete
13c30 72 6d 69 6e 61 74 69 6f 6e 2e 20 49 66 20 44 42  rmination. If DB
13c40 46 4c 41 47 5f 56 61 63 75 75 6d 20 69 73 20 73  FLAG_Vacuum is s
13c50 65 74 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  et, then the des
13c60 74 69 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  tination.    ** 
13c70 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
13c80 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  empty..    **.  
13c90 20 20 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20    ** Conditions 
13ca0 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20  under which the 
13cb0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
13cc0 20 62 65 20 65 6d 70 74 79 3a 0a 20 20 20 20 2a   be empty:.    *
13cd0 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54 68 65  *.    ** (1) The
13ce0 72 65 20 69 73 20 6e 6f 20 49 4e 54 45 47 45 52  re is no INTEGER
13cf0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 75 74   PRIMARY KEY but
13d00 20 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63   there are indic
13d10 65 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20 20 28  es..    **     (
13d20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
13d30 6f 6e 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  on is not initia
13d40 6c 6c 79 20 65 6d 70 74 79 2c 20 74 68 65 20 72  lly empty, the r
13d50 6f 77 69 64 20 66 69 65 6c 64 73 0a 20 20 20 20  owid fields.    
13d60 2a 2a 20 20 20 20 20 6f 66 20 69 6e 64 65 78 20  **     of index 
13d70 65 6e 74 72 69 65 73 20 6d 69 67 68 74 20 6e 65  entries might ne
13d80 65 64 20 74 6f 20 63 68 61 6e 67 65 2e 29 0a 20  ed to change.). 
13d90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 32 29     **.    ** (2)
13da0 20 54 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   The destination
13db0 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 69 6e   has a unique in
13dc0 64 65 78 2e 20 20 28 54 68 65 20 78 66 65 72 20  dex.  (The xfer 
13dd0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 0a 20 20  optimization .  
13de0 20 20 2a 2a 20 20 20 20 20 69 73 20 75 6e 61 62    **     is unab
13df0 6c 65 20 74 6f 20 74 65 73 74 20 75 6e 69 71 75  le to test uniqu
13e00 65 6e 65 73 73 2e 29 0a 20 20 20 20 2a 2a 0a 20  eness.).    **. 
13e10 20 20 20 2a 2a 20 28 33 29 20 6f 6e 45 72 72 6f     ** (3) onErro
13e20 72 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  r is something o
13e30 74 68 65 72 20 74 68 61 6e 20 4f 45 5f 41 62 6f  ther than OE_Abo
13e40 72 74 20 61 6e 64 20 4f 45 5f 52 6f 6c 6c 62 61  rt and OE_Rollba
13e50 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ck..    */.    a
13e60 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
13e70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13e80 65 77 69 6e 64 2c 20 69 44 65 73 74 2c 20 30 29  ewind, iDest, 0)
13e90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13ea0 29 3b 0a 20 20 20 20 65 6d 70 74 79 44 65 73 74  );.    emptyDest
13eb0 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
13ec0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
13ed0 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
13ee0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13ef0 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 20 20 69   addr1);.  }.  i
13f00 66 28 20 48 61 73 52 6f 77 69 64 28 70 53 72 63  f( HasRowid(pSrc
13f10 29 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 73 46  ) ){.    u8 insF
13f20 6c 61 67 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  lags;.    sqlite
13f30 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
13f40 65 2c 20 69 53 72 63 2c 20 69 44 62 53 72 63 2c  e, iSrc, iDbSrc,
13f50 20 70 53 72 63 2c 20 4f 50 5f 4f 70 65 6e 52 65   pSrc, OP_OpenRe
13f60 61 64 29 3b 0a 20 20 20 20 65 6d 70 74 79 53 72  ad);.    emptySr
13f70 63 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  cTest = sqlite3V
13f80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13f90 52 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30 29  Rewind, iSrc, 0)
13fa0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
13fb0 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  );.    if( pDest
13fc0 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
13fd0 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
13fe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13ff0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63 2c   OP_Rowid, iSrc,
14000 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
14010 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
14020 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14030 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 65  P_NotExists, iDe
14040 73 74 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  st, 0, regRowid)
14050 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
14060 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
14070 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74  qlite3RowidConst
14080 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e  raint(pParse, on
14090 45 72 72 6f 72 2c 20 70 44 65 73 74 29 3b 0a 20  Error, pDest);. 
140a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
140b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
140c0 32 29 3b 0a 20 20 20 20 20 20 61 75 74 6f 49 6e  2);.      autoIn
140d0 63 53 74 65 70 28 70 50 61 72 73 65 2c 20 72 65  cStep(pParse, re
140e0 67 41 75 74 6f 69 6e 63 2c 20 72 65 67 52 6f 77  gAutoinc, regRow
140f0 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  id);.    }else i
14100 66 28 20 70 44 65 73 74 2d 3e 70 49 6e 64 65 78  f( pDest->pIndex
14110 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  ==0 ){.      add
14120 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
14130 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
14140 52 6f 77 69 64 2c 20 69 44 65 73 74 2c 20 72 65  Rowid, iDest, re
14150 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  gRowid);.    }el
14160 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20  se{.      addr1 
14170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14180 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
14190 20 69 53 72 63 2c 20 72 65 67 52 6f 77 69 64 29   iSrc, regRowid)
141a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
141b0 28 70 44 65 73 74 2d 3e 74 61 62 46 6c 61 67 73  (pDest->tabFlags
141c0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
141d0 65 6e 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ent)==0 );.    }
141e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
141f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77  AddOp3(v, OP_Row
14200 44 61 74 61 2c 20 69 53 72 63 2c 20 72 65 67 44  Data, iSrc, regD
14210 61 74 61 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ata, 1);.    if(
14220 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20   db->mDbFlags & 
14230 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 20 29 7b  DBFLAG_Vacuum ){
14240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14250 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
14260 65 65 6b 45 6e 64 2c 20 69 44 65 73 74 29 3b 0a  eekEnd, iDest);.
14270 20 20 20 20 20 20 69 6e 73 46 6c 61 67 73 20 3d        insFlags =
14280 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 7c   OPFLAG_NCHANGE|
14290 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44  OPFLAG_LASTROWID
142a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
142b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 46               OPF
142c0 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41  LAG_APPEND|OPFLA
142d0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b  G_USESEEKRESULT;
142e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
142f0 20 20 69 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46    insFlags = OPF
14300 4c 41 47 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c  LAG_NCHANGE|OPFL
14310 41 47 5f 4c 41 53 54 52 4f 57 49 44 7c 4f 50 46  AG_LASTROWID|OPF
14320 4c 41 47 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20  LAG_APPEND;.    
14330 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14340 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e  eAddOp4(v, OP_In
14350 73 65 72 74 2c 20 69 44 65 73 74 2c 20 72 65 67  sert, iDest, reg
14360 44 61 74 61 2c 20 72 65 67 52 6f 77 69 64 2c 0a  Data, regRowid,.
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65        (char*)pDe
14390 73 74 2c 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20  st, P4_TABLE);. 
143a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
143b0 61 6e 67 65 50 35 28 76 2c 20 69 6e 73 46 6c 61  angeP5(v, insFla
143c0 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gs);.    sqlite3
143d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
143e0 5f 4e 65 78 74 2c 20 69 53 72 63 2c 20 61 64 64  _Next, iSrc, add
143f0 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r1); VdbeCoverag
14400 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
14410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14420 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30  P_Close, iSrc, 0
14430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14440 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
14450 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b  lose, iDest, 0);
14460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
14470 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
14480 50 61 72 73 65 2c 20 69 44 62 44 65 73 74 2c 20  Parse, iDbDest, 
14490 70 44 65 73 74 2d 3e 74 6e 75 6d 2c 20 31 2c 20  pDest->tnum, 1, 
144a0 70 44 65 73 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pDest->zName);. 
144b0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
144c0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 53  ock(pParse, iDbS
144d0 72 63 2c 20 70 53 72 63 2d 3e 74 6e 75 6d 2c 20  rc, pSrc->tnum, 
144e0 30 2c 20 70 53 72 63 2d 3e 7a 4e 61 6d 65 29 3b  0, pSrc->zName);
144f0 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44 65 73 74  .  }.  for(pDest
14500 49 64 78 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65  Idx=pDest->pInde
14510 78 3b 20 70 44 65 73 74 49 64 78 3b 20 70 44 65  x; pDestIdx; pDe
14520 73 74 49 64 78 3d 70 44 65 73 74 49 64 78 2d 3e  stIdx=pDestIdx->
14530 70 4e 65 78 74 29 7b 0a 20 20 20 20 75 38 20 69  pNext){.    u8 i
14540 64 78 49 6e 73 46 6c 61 67 73 20 3d 20 30 3b 0a  dxInsFlags = 0;.
14550 20 20 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d      for(pSrcIdx=
14560 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 41 4c  pSrc->pIndex; AL
14570 57 41 59 53 28 70 53 72 63 49 64 78 29 3b 20 70  WAYS(pSrcIdx); p
14580 53 72 63 49 64 78 3d 70 53 72 63 49 64 78 2d 3e  SrcIdx=pSrcIdx->
14590 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
145a0 28 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65  ( xferCompatible
145b0 49 6e 64 65 78 28 70 44 65 73 74 49 64 78 2c 20  Index(pDestIdx, 
145c0 70 53 72 63 49 64 78 29 20 29 20 62 72 65 61 6b  pSrcIdx) ) break
145d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
145e0 72 74 28 20 70 53 72 63 49 64 78 20 29 3b 0a 20  rt( pSrcIdx );. 
145f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14600 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp3(v, OP_OpenR
14610 65 61 64 2c 20 69 53 72 63 2c 20 70 53 72 63 49  ead, iSrc, pSrcI
14620 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 53 72 63  dx->tnum, iDbSrc
14630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14640 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
14650 50 61 72 73 65 2c 20 70 53 72 63 49 64 78 29 3b  Parse, pSrcIdx);
14660 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
14670 28 28 76 2c 20 22 25 73 22 2c 20 70 53 72 63 49  ((v, "%s", pSrcI
14680 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
14690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
146a0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
146b0 74 65 2c 20 69 44 65 73 74 2c 20 70 44 65 73 74  te, iDest, pDest
146c0 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 44 65  Idx->tnum, iDbDe
146d0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
146e0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
146f0 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 49 64  (pParse, pDestId
14700 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  x);.    sqlite3V
14710 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
14720 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 29 3b 0a  PFLAG_BULKCSR);.
14730 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14740 28 76 2c 20 22 25 73 22 2c 20 70 44 65 73 74 49  (v, "%s", pDestI
14750 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
14760 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
14770 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14780 5f 52 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30  _Rewind, iSrc, 0
14790 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
147a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
147b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
147c0 52 6f 77 44 61 74 61 2c 20 69 53 72 63 2c 20 72  RowData, iSrc, r
147d0 65 67 44 61 74 61 2c 20 31 29 3b 0a 20 20 20 20  egData, 1);.    
147e0 69 66 28 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  if( db->mDbFlags
147f0 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
14800 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
14810 73 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64  s INSERT command
14820 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 56 41   is part of a VA
14830 43 55 55 4d 20 6f 70 65 72 61 74 69 6f 6e 2c 20  CUUM operation, 
14840 77 68 69 63 68 20 67 75 61 72 61 6e 74 65 65 73  which guarantees
14850 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
14860 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
14870 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49  able is empty. I
14880 66 20 61 6c 6c 20 69 6e 64 65 78 65 64 20 63 6f  f all indexed co
14890 6c 75 6d 6e 73 20 75 73 65 0a 20 20 20 20 20 20  lumns use.      
148a0 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ** collation seq
148b0 75 65 6e 63 65 20 42 49 4e 41 52 59 2c 20 74 68  uence BINARY, th
148c0 65 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62  en it can also b
148d0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
148e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  he.      ** inde
148f0 78 20 77 69 6c 6c 20 62 65 20 70 6f 70 75 6c 61  x will be popula
14900 74 65 64 20 62 79 20 69 6e 73 65 72 74 69 6e 67  ted by inserting
14910 20 6b 65 79 73 20 69 6e 20 73 74 72 69 63 74 6c   keys in strictl
14920 79 20 73 6f 72 74 65 64 20 0a 20 20 20 20 20 20  y sorted .      
14930 2a 2a 20 6f 72 64 65 72 2e 20 49 6e 20 74 68 69  ** order. In thi
14940 73 20 63 61 73 65 2c 20 69 6e 73 74 65 61 64 20  s case, instead 
14950 6f 66 20 73 65 65 6b 69 6e 67 20 77 69 74 68 69  of seeking withi
14960 6e 20 74 68 65 20 62 2d 74 72 65 65 20 61 73 20  n the b-tree as 
14970 70 61 72 74 0a 20 20 20 20 20 20 2a 2a 20 6f 66  part.      ** of
14980 20 65 76 65 72 79 20 4f 50 5f 49 64 78 49 6e 73   every OP_IdxIns
14990 65 72 74 20 6f 70 63 6f 64 65 2c 20 61 6e 20 4f  ert opcode, an O
149a0 50 5f 53 65 65 6b 45 6e 64 20 69 73 20 61 64 64  P_SeekEnd is add
149b0 65 64 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ed before the.  
149c0 20 20 20 20 2a 2a 20 4f 50 5f 49 64 78 49 6e 73      ** OP_IdxIns
149d0 65 72 74 20 74 6f 20 73 65 65 6b 20 74 6f 20 74  ert to seek to t
149e0 68 65 20 70 6f 69 6e 74 20 77 69 74 68 69 6e 20  he point within 
149f0 74 68 65 20 62 2d 74 72 65 65 20 77 68 65 72 65  the b-tree where
14a00 20 65 61 63 68 20 6b 65 79 20 0a 20 20 20 20 20   each key .     
14a10 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 69 6e   ** should be in
14a20 73 65 72 74 65 64 2e 20 54 68 69 73 20 69 73 20  serted. This is 
14a30 66 61 73 74 65 72 2e 0a 20 20 20 20 20 20 2a 2a  faster..      **
14a40 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  .      ** If any
14a50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   of the indexed 
14a60 63 6f 6c 75 6d 6e 73 20 75 73 65 20 61 20 63 6f  columns use a co
14a70 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14a80 20 6f 74 68 65 72 20 74 68 61 6e 0a 20 20 20 20   other than.    
14a90 20 20 2a 2a 20 42 49 4e 41 52 59 2c 20 74 68 69    ** BINARY, thi
14aa0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
14ab0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 69 73  s disabled. This
14ac0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
14ad0 75 73 65 72 20 0a 20 20 20 20 20 20 2a 2a 20 6d  user .      ** m
14ae0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
14af0 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 61 20  definition of a 
14b00 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14b10 63 65 20 61 6e 64 20 74 68 65 6e 20 72 75 6e 0a  ce and then run.
14b20 20 20 20 20 20 20 2a 2a 20 61 20 56 41 43 55 55        ** a VACUU
14b30 4d 20 63 6f 6d 6d 61 6e 64 2e 20 49 6e 20 74 68  M command. In th
14b40 61 74 20 63 61 73 65 20 6b 65 79 73 20 6d 61 79  at case keys may
14b50 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
14b60 69 6e 20 73 74 72 69 63 74 6c 79 0a 20 20 20 20  in strictly.    
14b70 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
14b80 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  r.  */.      for
14b90 28 69 3d 30 3b 20 69 3c 70 53 72 63 49 64 78 2d  (i=0; i<pSrcIdx-
14ba0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
14bb0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
14bc0 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 53 72 63  ar *zColl = pSrc
14bd0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  Idx->azColl[i];.
14be0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14bf0 74 65 33 5f 73 74 72 69 63 6d 70 28 73 71 6c 69  te3_stricmp(sqli
14c00 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 7a 43  te3StrBINARY, zC
14c10 6f 6c 6c 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  oll) ) break;.  
14c20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14c30 69 3d 3d 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c  i==pSrcIdx->nCol
14c40 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
14c50 64 78 49 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46  dxInsFlags = OPF
14c60 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
14c70 54 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  T;.        sqlit
14c80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14c90 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 44 65 73  OP_SeekEnd, iDes
14ca0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14cb0 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
14cc0 77 69 64 28 70 53 72 63 29 20 26 26 20 70 44 65  wid(pSrc) && pDe
14cd0 73 74 49 64 78 2d 3e 69 64 78 54 79 70 65 3d 3d  stIdx->idxType==
14ce0 32 20 29 7b 0a 20 20 20 20 20 20 69 64 78 49 6e  2 ){.      idxIn
14cf0 73 46 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47  sFlags |= OPFLAG
14d00 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 7d 0a  _NCHANGE;.    }.
14d10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14d20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
14d30 6e 73 65 72 74 2c 20 69 44 65 73 74 2c 20 72 65  nsert, iDest, re
14d40 67 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69  gData);.    sqli
14d50 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
14d60 76 2c 20 69 64 78 49 6e 73 46 6c 61 67 73 7c 4f  v, idxInsFlags|O
14d70 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
14d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d90 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
14da0 20 69 53 72 63 2c 20 61 64 64 72 31 2b 31 29 3b   iSrc, addr1+1);
14db0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14dc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14dd0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14de0 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
14df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14e00 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30 29  _Close, iSrc, 0)
14e10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14e20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
14e30 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a  ose, iDest, 0);.
14e40 20 20 7d 0a 20 20 69 66 28 20 65 6d 70 74 79 53    }.  if( emptyS
14e50 72 63 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  rcTest ) sqlite3
14e60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14e70 65 6d 70 74 79 53 72 63 54 65 73 74 29 3b 0a 20  emptySrcTest);. 
14e80 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14e90 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14ea0 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
14eb0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14ec0 67 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  g(pParse, regDat
14ed0 61 29 3b 0a 20 20 69 66 28 20 65 6d 70 74 79 44  a);.  if( emptyD
14ee0 65 73 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  estTest ){.    s
14ef0 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
14f00 65 6e 74 45 6e 64 28 70 50 61 72 73 65 29 3b 0a  entEnd(pParse);.
14f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14f20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
14f30 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
14f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14f50 4a 75 6d 70 48 65 72 65 28 76 2c 20 65 6d 70 74  JumpHere(v, empt
14f60 79 44 65 73 74 54 65 73 74 29 3b 0a 20 20 20 20  yDestTest);.    
14f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f80 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  2(v, OP_Close, i
14f90 44 65 73 74 2c 20 30 29 3b 0a 20 20 20 20 72 65  Dest, 0);.    re
14fa0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
14fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14fc0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
14fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f  QLITE_OMIT_XFER_
14fe0 4f 50 54 20 2a 2f 0a                             OPT */.