/ Hex Artifact Content
Login

Artifact cb67cc56ef2ddd13e6944b2c0dd08a920bcd9503230adef8b9928d338097c722:


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 61 73 73 65 72 74 28 20          assert( 
7f10: 70 4f 70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  pOp!=0 );.      
7f20: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
7f30: 65 3d 3d 4f 50 5f 4e 75 6c 6c 20 26 26 20 21 49  e==OP_Null && !I
7f40: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
7f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
7f60: 6e 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  ndFlag = 1;.    
7f70: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
7f80: 65 20 3d 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3b  e = OP_NewRowid;
7f90: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
7fa0: 70 31 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20  p1 = iDataCur;. 
7fb0: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
7fc0: 20 3d 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 20   = regRowid;.   
7fd0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d         pOp->p3 =
7fe0: 20 72 65 67 41 75 74 6f 69 6e 63 3b 0a 20 20 20   regAutoinc;.   
7ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8000: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50       /* If the P
8010: 52 49 4d 41 52 59 20 4b 45 59 20 65 78 70 72 65  RIMARY KEY expre
8020: 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 74  ssion is NULL, t
8030: 68 65 6e 20 75 73 65 20 4f 50 5f 4e 65 77 52 6f  hen use OP_NewRo
8040: 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  wid.      ** to 
8050: 67 65 6e 65 72 61 74 65 20 61 20 75 6e 69 71 75  generate a uniqu
8060: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61  e primary key va
8070: 6c 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lue..      */.  
8080: 20 20 20 20 69 66 28 20 21 61 70 70 65 6e 64 46      if( !appendF
8090: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  lag ){.        i
80a0: 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 20 20  nt addr1;.      
80b0: 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
80c0: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
80d0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
80e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
80f0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67   OP_NotNull, reg
8100: 52 6f 77 69 64 29 3b 20 56 64 62 65 43 6f 76 65  Rowid); VdbeCove
8110: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
8120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8130: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp3(v, OP_NewRo
8140: 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72  wid, iDataCur, r
8150: 65 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f  egRowid, regAuto
8160: 69 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  inc);.          
8170: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8180: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
8190: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
81a0: 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d 20          addr1 = 
81b0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
81c0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
81d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
81e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
81f0: 75 6c 6c 2c 20 72 65 67 52 6f 77 69 64 2c 20 61  ull, regRowid, a
8200: 64 64 72 31 2b 32 29 3b 20 56 64 62 65 43 6f 76  ddr1+2); VdbeCov
8210: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
8220: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
8230: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8240: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
8250: 65 67 52 6f 77 69 64 29 3b 20 56 64 62 65 43 6f  egRowid); VdbeCo
8260: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
8270: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
8280: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
8290: 20 7c 7c 20 77 69 74 68 6f 75 74 52 6f 77 69 64   || withoutRowid
82a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
82b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
82c0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f  P_Null, 0, regRo
82d0: 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
82e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
82f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
8300: 65 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43 75  ewRowid, iDataCu
8310: 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67  r, regRowid, reg
8320: 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20  Autoinc);.      
8330: 61 70 70 65 6e 64 46 6c 61 67 20 3d 20 31 3b 0a  appendFlag = 1;.
8340: 20 20 20 20 7d 0a 20 20 20 20 61 75 74 6f 49 6e      }.    autoIn
8350: 63 53 74 65 70 28 70 50 61 72 73 65 2c 20 72 65  cStep(pParse, re
8360: 67 41 75 74 6f 69 6e 63 2c 20 72 65 67 52 6f 77  gAutoinc, regRow
8370: 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  id);..    /* Com
8380: 70 75 74 65 20 64 61 74 61 20 66 6f 72 20 61 6c  pute data for al
8390: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
83a0: 20 6e 65 77 20 65 6e 74 72 79 2c 20 62 65 67 69   new entry, begi
83b0: 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 77 69 74  nning.    ** wit
83c0: 68 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  h the first colu
83d0: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  mn..    */.    n
83e0: 48 69 64 64 65 6e 20 3d 20 30 3b 0a 20 20 20 20  Hidden = 0;.    
83f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
8400: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
8410: 20 20 20 69 6e 74 20 69 52 65 67 53 74 6f 72 65     int iRegStore
8420: 20 3d 20 72 65 67 52 6f 77 69 64 2b 31 2b 69 3b   = regRowid+1+i;
8430: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54  .      if( i==pT
8440: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
8450: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
8460: 65 20 6f 66 20 74 68 65 20 49 4e 54 45 47 45 52  e of the INTEGER
8470: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
8480: 75 6d 6e 20 69 73 20 61 6c 77 61 79 73 20 61 20  umn is always a 
8490: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2a  NULL..        **
84a0: 20 57 68 65 6e 65 76 65 72 20 74 68 69 73 20 63   Whenever this c
84b0: 6f 6c 75 6d 6e 20 69 73 20 72 65 61 64 2c 20 74  olumn is read, t
84c0: 68 65 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65  he rowid will be
84d0: 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20   substituted.   
84e0: 20 20 20 20 20 2a 2a 20 69 6e 20 69 74 73 20 70       ** in its p
84f0: 6c 61 63 65 2e 20 20 48 65 6e 63 65 2c 20 66 69  lace.  Hence, fi
8500: 6c 6c 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 77  ll this column w
8510: 69 74 68 20 61 20 4e 55 4c 4c 20 74 6f 20 61 76  ith a NULL to av
8520: 6f 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  oid.        ** t
8530: 61 6b 69 6e 67 20 75 70 20 64 61 74 61 20 73 70  aking up data sp
8540: 61 63 65 20 77 69 74 68 20 69 6e 66 6f 72 6d 61  ace with informa
8550: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 6e  tion that will n
8560: 65 76 65 72 20 62 65 20 75 73 65 64 2e 0a 20 20  ever be used..  
8570: 20 20 20 20 20 20 2a 2a 20 41 73 20 74 68 65 72        ** As ther
8580: 65 20 6d 61 79 20 62 65 20 73 68 61 6c 6c 6f 77  e may be shallow
8590: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 69 73 20   copies of this 
85a0: 76 61 6c 75 65 2c 20 6d 61 6b 65 20 69 74 20 61  value, make it a
85b0: 20 73 6f 66 74 2d 4e 55 4c 4c 20 2a 2f 0a 20 20   soft-NULL */.  
85c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
85d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 6f  eAddOp1(v, OP_So
85e0: 66 74 4e 75 6c 6c 2c 20 69 52 65 67 53 74 6f 72  ftNull, iRegStor
85f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  e);.        cont
8600: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
8610: 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d      if( pColumn=
8620: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
8630: 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  ( IsHiddenColumn
8640: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29  (&pTab->aCol[i])
8650: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 20   ){.          j 
8660: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
8670: 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20  nHidden++;.     
8680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8690: 20 20 20 20 6a 20 3d 20 69 20 2d 20 6e 48 69 64      j = i - nHid
86a0: 64 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  den;.        }. 
86b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
86c0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
86d0: 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b  Column->nId; j++
86e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
86f0: 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69   pColumn->a[j].i
8700: 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  dx==i ) break;. 
8710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8720: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 7c  .      if( j<0 |
8730: 7c 20 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20  | nColumn==0 || 
8740: 28 70 43 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70  (pColumn && j>=p
8750: 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 20 29 7b 0a  Column->nId) ){.
8760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8770: 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c  xprCodeFactorabl
8780: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
8790: 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 69  aCol[i].pDflt, i
87a0: 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20  RegStore);.     
87b0: 20 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65   }else if( useTe
87c0: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
87d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
87f0: 6e 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 69 52  n, srcTab, j, iR
8800: 65 67 53 74 6f 72 65 29 3b 20 0a 20 20 20 20 20  egStore); .     
8810: 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65   }else if( pSele
8820: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ct ){.        if
8830: 28 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 21  ( regFromSelect!
8840: 3d 72 65 67 44 61 74 61 20 29 7b 0a 20 20 20 20  =regData ){.    
8850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8860: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
8870: 6f 70 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65  opy, regFromSele
8880: 63 74 2b 6a 2c 20 69 52 65 67 53 74 6f 72 65 29  ct+j, iRegStore)
8890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
88a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
88b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
88c0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
88d0: 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 52 65 67  a[j].pExpr, iReg
88e0: 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Store);.      }.
88f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
8900: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
8910: 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
8920: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 69 6e   and generate in
8930: 64 65 78 20 6b 65 79 73 20 61 6e 64 0a 20 20 20  dex keys and.   
8940: 20 2a 2a 20 64 6f 20 74 68 65 20 69 6e 73 65 72   ** do the inser
8950: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  tion..    */.#if
8960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8970: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
8980: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
8990: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
89a0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62  onst char *pVTab
89b0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
89c0: 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c  )sqlite3GetVTabl
89d0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
89e0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61     sqlite3VtabMa
89f0: 6b 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73  keWritable(pPars
8a00: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  e, pTab);.      
8a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8a20: 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74 65 2c  4(v, OP_VUpdate,
8a30: 20 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32   1, pTab->nCol+2
8a40: 2c 20 72 65 67 49 6e 73 2c 20 70 56 54 61 62 2c  , regIns, pVTab,
8a50: 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20   P4_VTAB);.     
8a60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8a70: 67 65 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72 3d  geP5(v, onError=
8a80: 3d 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f 45  =OE_Default ? OE
8a90: 5f 41 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f 72  _Abort : onError
8aa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8ab0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
8ac0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
8ad0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  if.    {.      i
8ae0: 6e 74 20 69 73 52 65 70 6c 61 63 65 3b 20 20 20  nt isReplace;   
8af0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
8b00: 69 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6d  if constraints m
8b10: 61 79 20 63 61 75 73 65 20 61 20 72 65 70 6c 61  ay cause a repla
8b20: 63 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ce */.      int 
8b30: 62 55 73 65 53 65 65 6b 3b 20 20 20 20 20 2f 2a  bUseSeek;     /*
8b40: 20 54 72 75 65 20 74 6f 20 75 73 65 20 4f 50 46   True to use OPF
8b50: 4c 41 47 5f 53 45 45 4b 52 45 53 55 4c 54 20 2a  LAG_SEEKRESULT *
8b60: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
8b70: 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
8b80: 74 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20  tChecks(pParse, 
8b90: 70 54 61 62 2c 20 61 52 65 67 49 64 78 2c 20 69  pTab, aRegIdx, i
8ba0: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
8bb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 49  ,.          regI
8bc0: 6e 73 2c 20 30 2c 20 69 70 6b 43 6f 6c 75 6d 6e  ns, 0, ipkColumn
8bd0: 3e 3d 30 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e  >=0, onError, en
8be0: 64 4f 66 4c 6f 6f 70 2c 20 26 69 73 52 65 70 6c  dOfLoop, &isRepl
8bf0: 61 63 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ace, 0.      );.
8c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43        sqlite3FkC
8c10: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61  heck(pParse, pTa
8c20: 62 2c 20 30 2c 20 72 65 67 49 6e 73 2c 20 30 2c  b, 0, regIns, 0,
8c30: 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53   0);..      /* S
8c40: 65 74 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  et the OPFLAG_US
8c50: 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
8c60: 20 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74   if either (a) t
8c70: 68 65 72 65 20 61 72 65 20 6e 6f 20 52 45 50 4c  here are no REPL
8c80: 41 43 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ACE.      ** con
8c90: 73 74 72 61 69 6e 74 73 20 6f 72 20 28 62 29 20  straints or (b) 
8ca0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 69  there are no tri
8cb0: 67 67 65 72 73 20 61 6e 64 20 74 68 69 73 20 74  ggers and this t
8cc0: 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 0a 20 20  able is not a.  
8cd0: 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 74 61      ** parent ta
8ce0: 62 6c 65 20 69 6e 20 61 20 66 6f 72 65 69 67 6e  ble in a foreign
8cf0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2e   key constraint.
8d00: 20 49 74 20 69 73 20 73 61 66 65 20 74 6f 20 73   It is safe to s
8d10: 65 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  et the.      ** 
8d20: 66 6c 61 67 20 69 6e 20 74 68 65 20 73 65 63 6f  flag in the seco
8d30: 6e 64 20 63 61 73 65 20 61 73 20 69 66 20 61 6e  nd case as if an
8d40: 79 20 52 45 50 4c 41 43 45 20 63 6f 6e 73 74 72  y REPLACE constr
8d50: 61 69 6e 74 20 69 73 20 68 69 74 2c 20 61 6e 0a  aint is hit, an.
8d60: 20 20 20 20 20 20 2a 2a 20 4f 50 5f 44 65 6c 65        ** OP_Dele
8d70: 74 65 20 6f 72 20 4f 50 5f 49 64 78 44 65 6c 65  te or OP_IdxDele
8d80: 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  te instruction w
8d90: 69 6c 6c 20 62 65 20 65 78 65 63 75 74 65 64 20  ill be executed 
8da0: 6f 6e 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  on each .      *
8db0: 2a 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  * cursor that is
8dc0: 20 64 69 73 74 75 72 62 65 64 2e 20 41 6e 64 20   disturbed. And 
8dd0: 74 68 65 73 65 20 69 6e 73 74 72 75 63 74 69 6f  these instructio
8de0: 6e 73 20 62 6f 74 68 20 63 6c 65 61 72 20 74 68  ns both clear th
8df0: 65 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43  e.      ** VdbeC
8e00: 75 72 73 6f 72 2e 73 65 65 6b 52 65 73 75 6c 74  ursor.seekResult
8e10: 20 76 61 72 69 61 62 6c 65 2c 20 64 69 73 61 62   variable, disab
8e20: 6c 69 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f  ling the OPFLAG_
8e30: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 0a 20 20  USESEEKRESULT.  
8e40: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 61      ** functiona
8e50: 6c 69 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  lity.  */.      
8e60: 62 55 73 65 53 65 65 6b 20 3d 20 28 69 73 52 65  bUseSeek = (isRe
8e70: 70 6c 61 63 65 3d 3d 30 20 7c 7c 20 28 70 54 72  place==0 || (pTr
8e80: 69 67 67 65 72 3d 3d 30 20 26 26 0a 20 20 20 20  igger==0 &&.    
8e90: 20 20 20 20 20 20 28 28 64 62 2d 3e 66 6c 61 67        ((db->flag
8ea0: 73 20 26 20 53 51 4c 49 54 45 5f 46 6f 72 65 69  s & SQLITE_Forei
8eb0: 67 6e 4b 65 79 73 29 3d 3d 30 20 7c 7c 20 73 71  gnKeys)==0 || sq
8ec0: 6c 69 74 65 33 46 6b 52 65 66 65 72 65 6e 63 65  lite3FkReference
8ed0: 73 28 70 54 61 62 29 3d 3d 30 29 0a 20 20 20 20  s(pTab)==0).    
8ee0: 20 20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69    ));.      sqli
8ef0: 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  te3CompleteInser
8f00: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
8f10: 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64  b, iDataCur, iId
8f20: 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  xCur,.          
8f30: 72 65 67 49 6e 73 2c 20 61 52 65 67 49 64 78 2c  regIns, aRegIdx,
8f40: 20 30 2c 20 61 70 70 65 6e 64 46 6c 61 67 2c 20   0, appendFlag, 
8f50: 62 55 73 65 53 65 65 6b 0a 20 20 20 20 20 20 29  bUseSeek.      )
8f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8f70: 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f 75  * Update the cou
8f80: 6e 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  nt of rows that 
8f90: 61 72 65 20 69 6e 73 65 72 74 65 64 0a 20 20 2a  are inserted.  *
8fa0: 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  /.  if( (db->fla
8fb0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e  gs & SQLITE_Coun
8fc0: 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20 20  tRows)!=0 ){.   
8fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8fe0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
8ff0: 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29   regRowCount, 1)
9000: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 72  ;.  }..  if( pTr
9010: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  igger ){.    /* 
9020: 43 6f 64 65 20 41 46 54 45 52 20 74 72 69 67 67  Code AFTER trigg
9030: 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ers */.    sqlit
9040: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
9050: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
9060: 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c  r, TK_INSERT, 0,
9070: 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c 20   TRIGGER_AFTER, 
9080: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 72  .        pTab, r
9090: 65 67 44 61 74 61 2d 32 2d 70 54 61 62 2d 3e 6e  egData-2-pTab->n
90a0: 43 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e  Col, onError, en
90b0: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a 20  dOfLoop);.  }.. 
90c0: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
90d0: 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65 72  f the main inser
90e0: 74 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66 20 74 68  tion loop, if th
90f0: 65 20 64 61 74 61 20 73 6f 75 72 63 65 0a 20 20  e data source.  
9100: 2a 2a 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  ** is a SELECT s
9110: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
9120: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9130: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f  lveLabel(v, endO
9140: 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75 73  fLoop);.  if( us
9150: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
9160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9170: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
9180: 73 72 63 54 61 62 2c 20 61 64 64 72 43 6f 6e 74  srcTab, addrCont
9190: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
91a0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
91b0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
91c0: 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20 20 20 20  ddrInsTop);.    
91d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
91e0: 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 73  1(v, OP_Close, s
91f0: 72 63 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 20  rcTab);.  }else 
9200: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
9210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
9220: 74 6f 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  to(v, addrCont);
9230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9240: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
9250: 49 6e 73 54 6f 70 29 3b 0a 20 20 7d 0a 0a 69 6e  InsTop);.  }..in
9260: 73 65 72 74 5f 65 6e 64 3a 0a 20 20 2f 2a 20 55  sert_end:.  /* U
9270: 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
9280: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
9290: 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65 20 63  by storing the c
92a0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 20 20  ontent of the.  
92b0: 2a 2a 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  ** maximum rowid
92c0: 20 63 6f 75 6e 74 65 72 20 76 61 6c 75 65 73 20   counter values 
92d0: 72 65 63 6f 72 64 65 64 20 77 68 69 6c 65 20 69  recorded while i
92e0: 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20  nserting into.  
92f0: 2a 2a 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  ** autoincrement
9300: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
9310: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
9320: 65 64 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ed==0 && pParse-
9330: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
9340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
9350: 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70  toincrementEnd(p
9360: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
9370: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
9380: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
9390: 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 74 68   inserted. If th
93a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20  is routine is . 
93b0: 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63   ** generating c
93c0: 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61  ode because of a
93d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
93e0: 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64  NestedParse(), d
93f0: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b  o not.  ** invok
9400: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
9410: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
9420: 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53  if( (db->flags&S
9430: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29  QLITE_CountRows)
9440: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 6e 65 73   && !pParse->nes
9450: 74 65 64 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ted && !pParse->
9460: 70 54 72 69 67 67 65 72 54 61 62 20 29 7b 0a 20  pTriggerTab ){. 
9470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9480: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9490: 74 52 6f 77 2c 20 72 65 67 52 6f 77 43 6f 75 6e  tRow, regRowCoun
94a0: 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 1);.    sqlit
94b0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
94c0: 28 76 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  (v, 1);.    sqli
94d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
94e0: 65 28 76 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, 0, COLNAME_
94f0: 4e 41 4d 45 2c 20 22 72 6f 77 73 20 69 6e 73 65  NAME, "rows inse
9500: 72 74 65 64 22 2c 20 53 51 4c 49 54 45 5f 53 54  rted", SQLITE_ST
9510: 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65  ATIC);.  }..inse
9520: 72 74 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  rt_cleanup:.  sq
9530: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
9540: 74 65 28 64 62 2c 20 70 54 61 62 4c 69 73 74 29  te(db, pTabList)
9550: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
9560: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
9570: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
9580: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
9590: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
95a0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
95b0: 64 62 2c 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20  db, pColumn);.  
95c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
95d0: 2c 20 61 52 65 67 49 64 78 29 3b 0a 7d 0a 0a 2f  , aRegIdx);.}../
95e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 22 69 73 56  * Make sure "isV
95f0: 69 65 77 22 20 61 6e 64 20 6f 74 68 65 72 20 6d  iew" and other m
9600: 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 61 62  acros defined ab
9610: 6f 76 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ove are undefine
9620: 64 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  d. Otherwise.** 
9630: 74 68 65 79 20 6d 61 79 20 69 6e 74 65 72 66 65  they may interfe
9640: 72 65 20 77 69 74 68 20 63 6f 6d 70 69 6c 61 74  re with compilat
9650: 69 6f 6e 20 6f 66 20 6f 74 68 65 72 20 66 75 6e  ion of other fun
9660: 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66  ctions in this f
9670: 69 6c 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61 6e  ile.** (or in an
9680: 6f 74 68 65 72 20 66 69 6c 65 2c 20 69 66 20 74  other file, if t
9690: 68 69 73 20 66 69 6c 65 20 62 65 63 6f 6d 65 73  his file becomes
96a0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 61 6d 61   part of the ama
96b0: 6c 67 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a  lgamation).  */.
96c0: 23 69 66 64 65 66 20 69 73 56 69 65 77 0a 20 23  #ifdef isView. #
96d0: 75 6e 64 65 66 20 69 73 56 69 65 77 0a 23 65 6e  undef isView.#en
96e0: 64 69 66 0a 23 69 66 64 65 66 20 70 54 72 69 67  dif.#ifdef pTrig
96f0: 67 65 72 0a 20 23 75 6e 64 65 66 20 70 54 72 69  ger. #undef pTri
9700: 67 67 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 64  gger.#endif.#ifd
9710: 65 66 20 74 6d 61 73 6b 0a 20 23 75 6e 64 65 66  ef tmask. #undef
9720: 20 74 6d 61 73 6b 0a 23 65 6e 64 69 66 0a 0a 2f   tmask.#endif../
9730: 2a 0a 2a 2a 20 4d 65 61 6e 69 6e 67 73 20 6f 66  *.** Meanings of
9740: 20 62 69 74 73 20 69 6e 20 6f 66 20 70 57 61 6c   bits in of pWal
9750: 6b 65 72 2d 3e 65 43 6f 64 65 20 66 6f 72 20 63  ker->eCode for c
9760: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e  heckConstraintUn
9770: 63 68 61 6e 67 65 64 28 29 0a 2a 2f 0a 23 64 65  changed().*/.#de
9780: 66 69 6e 65 20 43 4b 43 4e 53 54 52 4e 54 5f 43  fine CKCNSTRNT_C
9790: 4f 4c 55 4d 4e 20 20 20 30 78 30 31 20 20 20 20  OLUMN   0x01    
97a0: 2f 2a 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  /* CHECK constra
97b0: 69 6e 74 20 75 73 65 73 20 61 20 63 68 61 6e 67  int uses a chang
97c0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 23 64  ing column */.#d
97d0: 65 66 69 6e 65 20 43 4b 43 4e 53 54 52 4e 54 5f  efine CKCNSTRNT_
97e0: 52 4f 57 49 44 20 20 20 20 30 78 30 32 20 20 20  ROWID    0x02   
97f0: 20 2f 2a 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   /* CHECK constr
9800: 61 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  aint references 
9810: 74 68 65 20 52 4f 57 49 44 20 2a 2f 0a 0a 2f 2a  the ROWID */../*
9820: 20 54 68 69 73 20 69 73 20 74 68 65 20 57 61 6c   This is the Wal
9830: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f  ker callback fro
9840: 6d 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  m checkConstrain
9850: 74 55 6e 63 68 61 6e 67 65 64 28 29 2e 20 20 53  tUnchanged().  S
9860: 65 74 0a 2a 2a 20 62 69 74 20 30 78 30 31 20 6f  et.** bit 0x01 o
9870: 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  f pWalker->eCode
9880: 20 69 66 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e   if.** pWalker->
9890: 65 43 6f 64 65 20 74 6f 20 30 20 69 66 20 74 68  eCode to 0 if th
98a0: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  is expression no
98b0: 64 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  de references an
98c0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  y of the.** colu
98d0: 6d 6e 73 20 74 68 61 74 20 61 72 65 20 62 65 69  mns that are bei
98e0: 6e 67 20 6d 6f 64 69 66 65 64 20 62 79 20 61 6e  ng modifed by an
98f0: 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
9900: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9910: 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74   checkConstraint
9920: 45 78 70 72 4e 6f 64 65 28 57 61 6c 6b 65 72 20  ExprNode(Walker 
9930: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
9940: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
9950: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
9960: 4d 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  MN ){.    assert
9970: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
9980: 3e 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  >=0 || pExpr->iC
9990: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20  olumn==-1 );.   
99a0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
99b0: 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
99c0: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 61  if( pWalker->u.a
99d0: 69 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  iCol[pExpr->iCol
99e0: 75 6d 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  umn]>=0 ){.     
99f0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
9a00: 65 20 7c 3d 20 43 4b 43 4e 53 54 52 4e 54 5f 43  e |= CKCNSTRNT_C
9a10: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  OLUMN;.      }. 
9a20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9a30: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 7c  pWalker->eCode |
9a40: 3d 20 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49  = CKCNSTRNT_ROWI
9a50: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  D;.    }.  }.  r
9a60: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
9a70: 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ue;.}../*.** pEx
9a80: 70 72 20 69 73 20 61 20 43 48 45 43 4b 20 63 6f  pr is a CHECK co
9a90: 6e 73 74 72 61 69 6e 74 20 6f 6e 20 61 20 72 6f  nstraint on a ro
9aa0: 77 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  w that is being 
9ab0: 55 50 44 41 54 45 2d 65 64 2e 20 20 54 68 65 0a  UPDATE-ed.  The.
9ac0: 2a 2a 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ** only columns 
9ad0: 74 68 61 74 20 61 72 65 20 6d 6f 64 69 66 69 65  that are modifie
9ae0: 64 20 62 79 20 74 68 65 20 55 50 44 41 54 45 20  d by the UPDATE 
9af0: 61 72 65 20 74 68 6f 73 65 20 66 6f 72 20 77 68  are those for wh
9b00: 69 63 68 0a 2a 2a 20 61 69 43 68 6e 67 5b 69 5d  ich.** aiChng[i]
9b10: 3e 3d 30 2c 20 61 6e 64 20 61 6c 73 6f 20 74 68  >=0, and also th
9b20: 65 20 52 4f 57 49 44 20 69 73 20 6d 6f 64 69 66  e ROWID is modif
9b30: 69 65 64 20 69 66 20 63 68 6e 67 52 6f 77 69 64  ied if chngRowid
9b40: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
9b50: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 43  Return true if C
9b60: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
9b70: 70 45 78 70 72 20 64 6f 65 73 20 6e 6f 74 20 75  pExpr does not u
9b80: 73 65 20 61 6e 79 20 6f 66 20 74 68 65 0a 2a 2a  se any of the.**
9b90: 20 63 68 61 6e 67 69 6e 67 20 63 6f 6c 75 6d 6e   changing column
9ba0: 73 20 28 6f 72 20 74 68 65 20 72 6f 77 69 64 20  s (or the rowid 
9bb0: 69 66 20 69 74 20 69 73 20 63 68 61 6e 67 69 6e  if it is changin
9bc0: 67 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  g).  In other wo
9bd0: 72 64 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 74  rds,.** return t
9be0: 72 75 65 20 69 66 20 74 68 69 73 20 43 48 45 43  rue if this CHEC
9bf0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  K constraint can
9c00: 20 62 65 20 73 6b 69 70 70 65 64 20 77 68 65 6e   be skipped when
9c10: 20 76 61 6c 69 64 61 74 69 6e 67 0a 2a 2a 20 74   validating.** t
9c20: 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 20 74 68  he new row in th
9c30: 65 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  e UPDATE stateme
9c40: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
9c50: 74 20 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  t checkConstrain
9c60: 74 55 6e 63 68 61 6e 67 65 64 28 45 78 70 72 20  tUnchanged(Expr 
9c70: 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 61 69 43  *pExpr, int *aiC
9c80: 68 6e 67 2c 20 69 6e 74 20 63 68 6e 67 52 6f 77  hng, int chngRow
9c90: 69 64 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  id){.  Walker w;
9ca0: 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
9cb0: 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
9cc0: 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
9cd0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
9ce0: 63 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 45  checkConstraintE
9cf0: 78 70 72 4e 6f 64 65 3b 0a 20 20 77 2e 75 2e 61  xprNode;.  w.u.a
9d00: 69 43 6f 6c 20 3d 20 61 69 43 68 6e 67 3b 0a 20  iCol = aiChng;. 
9d10: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
9d20: 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  (&w, pExpr);.  i
9d30: 66 28 20 21 63 68 6e 67 52 6f 77 69 64 20 29 7b  f( !chngRowid ){
9d40: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
9d50: 77 2e 65 43 6f 64 65 20 26 20 43 4b 43 4e 53 54  w.eCode & CKCNST
9d60: 52 4e 54 5f 52 4f 57 49 44 29 21 3d 30 20 29 3b  RNT_ROWID)!=0 );
9d70: 0a 20 20 20 20 77 2e 65 43 6f 64 65 20 26 3d 20  .    w.eCode &= 
9d80: 7e 43 4b 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44  ~CKCNSTRNT_ROWID
9d90: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
9da0: 28 20 77 2e 65 43 6f 64 65 3d 3d 30 20 29 3b 0a  ( w.eCode==0 );.
9db0: 20 20 74 65 73 74 63 61 73 65 28 20 77 2e 65 43    testcase( w.eC
9dc0: 6f 64 65 3d 3d 43 4b 43 4e 53 54 52 4e 54 5f 43  ode==CKCNSTRNT_C
9dd0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 74 65 73 74 63  OLUMN );.  testc
9de0: 61 73 65 28 20 77 2e 65 43 6f 64 65 3d 3d 43 4b  ase( w.eCode==CK
9df0: 43 4e 53 54 52 4e 54 5f 52 4f 57 49 44 20 29 3b  CNSTRNT_ROWID );
9e00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 2e 65  .  testcase( w.e
9e10: 43 6f 64 65 3d 3d 28 43 4b 43 4e 53 54 52 4e 54  Code==(CKCNSTRNT
9e20: 5f 52 4f 57 49 44 7c 43 4b 43 4e 53 54 52 4e 54  _ROWID|CKCNSTRNT
9e30: 5f 43 4f 4c 55 4d 4e 29 20 29 3b 0a 20 20 72 65  _COLUMN) );.  re
9e40: 74 75 72 6e 20 21 77 2e 65 43 6f 64 65 3b 0a 7d  turn !w.eCode;.}
9e50: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9e60: 20 63 6f 64 65 20 74 6f 20 64 6f 20 63 6f 6e 73   code to do cons
9e70: 74 72 61 69 6e 74 20 63 68 65 63 6b 73 20 70 72  traint checks pr
9e80: 69 6f 72 20 74 6f 20 61 6e 20 49 4e 53 45 52 54  ior to an INSERT
9e90: 20 6f 72 20 61 6e 20 55 50 44 41 54 45 0a 2a 2a   or an UPDATE.**
9ea0: 20 6f 6e 20 74 61 62 6c 65 20 70 54 61 62 2e 0a   on table pTab..
9eb0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 4e 65 77  **.** The regNew
9ec0: 44 61 74 61 20 70 61 72 61 6d 65 74 65 72 20 69  Data parameter i
9ed0: 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  s the first regi
9ee0: 73 74 65 72 20 69 6e 20 61 20 72 61 6e 67 65 20  ster in a range 
9ef0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
9f00: 20 74 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   the data to be 
9f10: 69 6e 73 65 72 74 65 64 20 6f 72 20 74 68 65 20  inserted or the 
9f20: 64 61 74 61 20 61 66 74 65 72 20 74 68 65 20 75  data after the u
9f30: 70 64 61 74 65 2e 20 20 54 68 65 72 65 20 77 69  pdate.  There wi
9f40: 6c 6c 20 62 65 0a 2a 2a 20 70 54 61 62 2d 3e 6e  ll be.** pTab->n
9f50: 43 6f 6c 2b 31 20 72 65 67 69 73 74 65 72 73 20  Col+1 registers 
9f60: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2e 20 20  in this range.  
9f70: 54 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  The first regist
9f80: 65 72 20 28 74 68 65 20 6f 6e 65 0a 2a 2a 20 74  er (the one.** t
9f90: 68 61 74 20 72 65 67 4e 65 77 44 61 74 61 20 70  hat regNewData p
9fa0: 6f 69 6e 74 73 20 74 6f 29 20 77 69 6c 6c 20 63  oints to) will c
9fb0: 6f 6e 74 61 69 6e 20 74 68 65 20 6e 65 77 20 72  ontain the new r
9fc0: 6f 77 69 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 6e  owid, or NULL in
9fd0: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 6f 66 20   the.** case of 
9fe0: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
9ff0: 74 61 62 6c 65 2e 20 20 54 68 65 20 73 65 63 6f  table.  The seco
a000: 6e 64 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  nd register in t
a010: 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 0a 2a 2a  he range will.**
a020: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 6f 6e   contain the con
a030: 74 65 6e 74 20 6f 66 20 74 68 65 20 66 69 72 73  tent of the firs
a040: 74 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20  t table column. 
a050: 20 54 68 65 20 74 68 69 72 64 20 72 65 67 69 73   The third regis
a060: 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74  ter will.** cont
a070: 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ain the content 
a080: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 74 61  of the second ta
a090: 62 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 41 6e 64  ble column.  And
a0a0: 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a   so forth..**.**
a0b0: 20 54 68 65 20 72 65 67 4f 6c 64 44 61 74 61 20   The regOldData 
a0c0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 69 6d  parameter is sim
a0d0: 69 6c 61 72 20 74 6f 20 72 65 67 4e 65 77 44 61  ilar to regNewDa
a0e0: 74 61 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ta except that i
a0f0: 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
a100: 65 20 64 61 74 61 20 70 72 69 6f 72 20 74 6f 20  e data prior to 
a110: 61 6e 20 55 50 44 41 54 45 20 72 61 74 68 65 72  an UPDATE rather
a120: 20 74 68 61 6e 20 61 66 74 65 72 77 61 72 64 73   than afterwards
a130: 2e 20 20 72 65 67 4f 6c 64 44 61 74 61 20 69 73  .  regOldData is
a140: 20 7a 65 72 6f 0a 2a 2a 20 66 6f 72 20 61 6e 20   zero.** for an 
a150: 49 4e 53 45 52 54 2e 20 20 54 68 69 73 20 72 6f  INSERT.  This ro
a160: 75 74 69 6e 65 20 63 61 6e 20 64 69 73 74 69 6e  utine can distin
a170: 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 55 50  guish between UP
a180: 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20  DATE and INSERT 
a190: 62 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 72  by.** checking r
a1a0: 65 67 4f 6c 64 44 61 74 61 20 66 6f 72 20 7a 65  egOldData for ze
a1b0: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  ro..**.** For an
a1c0: 20 55 50 44 41 54 45 2c 20 74 68 65 20 70 6b 43   UPDATE, the pkC
a1d0: 68 6e 67 20 62 6f 6f 6c 65 61 6e 20 69 73 20 74  hng boolean is t
a1e0: 72 75 65 20 69 66 20 74 68 65 20 74 72 75 65 20  rue if the true 
a1f0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 74 68 65  primary key (the
a200: 0a 2a 2a 20 72 6f 77 69 64 20 66 6f 72 20 61 20  .** rowid for a 
a210: 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 20 6f 72 20  normal table or 
a220: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a230: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
a240: 57 49 44 20 74 61 62 6c 65 29 0a 2a 2a 20 6d 69  WID table).** mi
a250: 67 68 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  ght be modified 
a260: 62 79 20 74 68 65 20 55 50 44 41 54 45 2e 20 20  by the UPDATE.  
a270: 49 66 20 70 6b 43 68 6e 67 20 69 73 20 66 61 6c  If pkChng is fal
a280: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79  se, then the key
a290: 20 6f 66 0a 2a 2a 20 74 68 65 20 69 44 61 74 61   of.** the iData
a2a0: 43 75 72 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  Cur content tabl
a2b0: 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
a2c0: 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65 64 20  to be unchanged 
a2d0: 62 79 20 74 68 65 20 55 50 44 41 54 45 2e 0a 2a  by the UPDATE..*
a2e0: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 53 45  *.** For an INSE
a2f0: 52 54 2c 20 74 68 65 20 70 6b 43 68 6e 67 20 62  RT, the pkChng b
a300: 6f 6f 6c 65 61 6e 20 69 6e 64 69 63 61 74 65 73  oolean indicates
a310: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a320: 74 68 65 20 72 6f 77 69 64 0a 2a 2a 20 77 61 73  the rowid.** was
a330: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
a340: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
a350: 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74   the INSERT stat
a360: 65 6d 65 6e 74 2e 20 20 49 66 20 70 6b 43 68 6e  ement.  If pkChn
a370: 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 69 74  g.** is zero, it
a380: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
a390: 65 69 74 68 65 72 20 72 6f 77 69 64 20 69 73 20  either rowid is 
a3a0: 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74  computed automat
a3b0: 69 63 61 6c 6c 79 20 6f 72 0a 2a 2a 20 74 68 61  ically or.** tha
a3c0: 74 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  t the table is a
a3d0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
a3e0: 61 62 6c 65 20 61 6e 64 20 68 61 73 20 6e 6f 20  able and has no 
a3f0: 72 6f 77 69 64 2e 20 20 4f 6e 20 61 6e 20 49 4e  rowid.  On an IN
a400: 53 45 52 54 2c 0a 2a 2a 20 70 6b 43 68 6e 67 20  SERT,.** pkChng 
a410: 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 74 72 75  will only be tru
a420: 65 20 69 66 20 74 68 65 20 49 4e 53 45 52 54 20  e if the INSERT 
a430: 73 74 61 74 65 6d 65 6e 74 20 70 72 6f 76 69 64  statement provid
a440: 65 73 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a 2a  es an integer.**
a450: 20 76 61 6c 75 65 20 66 6f 72 20 65 69 74 68 65   value for eithe
a460: 72 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  r the rowid colu
a470: 6d 6e 20 6f 72 20 69 74 73 20 49 4e 54 45 47 45  mn or its INTEGE
a480: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6c  R PRIMARY KEY al
a490: 69 61 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ias..**.** The c
a4a0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
a4b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
a4c0: 6c 6c 20 73 74 6f 72 65 20 6e 65 77 20 69 6e 64  ll store new ind
a4d0: 65 78 20 65 6e 74 72 69 65 73 20 69 6e 74 6f 0a  ex entries into.
a4e0: 2a 2a 20 72 65 67 69 73 74 65 72 73 20 69 64 65  ** registers ide
a4f0: 6e 74 69 66 69 65 64 20 62 79 20 61 52 65 67 49  ntified by aRegI
a500: 64 78 5b 5d 2e 20 20 4e 6f 20 69 6e 64 65 78 20  dx[].  No index 
a510: 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
a520: 20 66 6f 72 0a 2a 2a 20 69 6e 64 69 63 65 73 20   for.** indices 
a530: 77 68 65 72 65 20 61 52 65 67 49 64 78 5b 69 5d  where aRegIdx[i]
a540: 3d 3d 30 2e 20 20 54 68 65 20 6f 72 64 65 72 20  ==0.  The order 
a550: 6f 66 20 69 6e 64 69 63 65 73 20 69 6e 20 61 52  of indices in aR
a560: 65 67 49 64 78 5b 5d 20 69 73 0a 2a 2a 20 74 68  egIdx[] is.** th
a570: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72  e same as the or
a580: 64 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20 6f  der of indices o
a590: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
a5a0: 74 20 6f 66 20 69 6e 64 69 63 65 73 0a 2a 2a 20  t of indices.** 
a5b0: 61 74 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2e  at pTab->pIndex.
a5c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
a5d0: 72 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  r must have alre
a5e0: 61 64 79 20 6f 70 65 6e 65 64 20 77 72 69 74 65  ady opened write
a5f0: 61 62 6c 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  able cursors on 
a600: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 74 61 62 6c  the main.** tabl
a610: 65 20 61 6e 64 20 61 6c 6c 20 61 70 70 6c 69 63  e and all applic
a620: 61 62 6c 65 20 69 6e 64 69 63 65 73 20 28 74 68  able indices (th
a630: 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20 61 6c  at is to say, al
a640: 6c 20 69 6e 64 69 63 65 73 20 66 6f 72 20 77 68  l indices for wh
a650: 69 63 68 0a 2a 2a 20 61 52 65 67 49 64 78 5b 5d  ich.** aRegIdx[]
a660: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 29 2e 20 20   is not zero).  
a670: 69 44 61 74 61 43 75 72 20 69 73 20 74 68 65 20  iDataCur is the 
a680: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6d  cursor for the m
a690: 61 69 6e 20 74 61 62 6c 65 20 77 68 65 6e 0a 2a  ain table when.*
a6a0: 2a 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 20 75  * inserting or u
a6b0: 70 64 61 74 69 6e 67 20 61 20 72 6f 77 69 64 20  pdating a rowid 
a6c0: 74 61 62 6c 65 2c 20 6f 72 20 74 68 65 20 63 75  table, or the cu
a6d0: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 50 52 49  rsor for the PRI
a6e0: 4d 41 52 59 20 4b 45 59 0a 2a 2a 20 69 6e 64 65  MARY KEY.** inde
a6f0: 78 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67  x when operating
a700: 20 6f 6e 20 61 20 57 49 54 48 4f 55 54 20 52 4f   on a WITHOUT RO
a710: 57 49 44 20 74 61 62 6c 65 2e 20 20 69 49 64 78  WID table.  iIdx
a720: 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  Cur is the curso
a730: 72 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 69 72  r.** for the fir
a740: 73 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  st index in the 
a750: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73  pTab->pIndex lis
a760: 74 2e 20 20 43 75 72 73 6f 72 73 20 66 6f 72 20  t.  Cursors for 
a770: 6f 74 68 65 72 20 69 6e 64 69 63 65 73 0a 2a 2a  other indices.**
a780: 20 61 72 65 20 61 74 20 69 49 64 78 43 75 72 2b   are at iIdxCur+
a790: 4e 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  N for the N-th e
a7a0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 54  lement of the pT
a7b0: 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e  ab->pIndex list.
a7c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a7d0: 69 6e 65 20 61 6c 73 6f 20 67 65 6e 65 72 61 74  ine also generat
a7e0: 65 73 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  es code to check
a7f0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 4e   constraints.  N
a800: 4f 54 20 4e 55 4c 4c 2c 0a 2a 2a 20 43 48 45 43  OT NULL,.** CHEC
a810: 4b 2c 20 61 6e 64 20 55 4e 49 51 55 45 20 63 6f  K, and UNIQUE co
a820: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c  nstraints are al
a830: 6c 20 63 68 65 63 6b 65 64 2e 20 20 49 66 20 61  l checked.  If a
a840: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
a850: 73 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 61  s,.** then the a
a860: 70 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f  ppropriate actio
a870: 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  n is performed. 
a880: 20 54 68 65 72 65 20 61 72 65 20 66 69 76 65 20   There are five 
a890: 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 61 63 74 69  possible.** acti
a8a0: 6f 6e 73 3a 20 52 4f 4c 4c 42 41 43 4b 2c 20 41  ons: ROLLBACK, A
a8b0: 42 4f 52 54 2c 20 46 41 49 4c 2c 20 52 45 50 4c  BORT, FAIL, REPL
a8c0: 41 43 45 2c 20 61 6e 64 20 49 47 4e 4f 52 45 2e  ACE, and IGNORE.
a8d0: 0a 2a 2a 0a 2a 2a 20 20 43 6f 6e 73 74 72 61 69  .**.**  Constrai
a8e0: 6e 74 20 74 79 70 65 20 20 41 63 74 69 6f 6e 20  nt type  Action 
a8f0: 20 20 20 20 20 20 57 68 61 74 20 48 61 70 70 65        What Happe
a900: 6e 73 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.**  ---------
a910: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
a920: 2d 2d 20 20 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
a950: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
a960: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 20 20 20 20     ROLLBACK     
a970: 54 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  The current tran
a980: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
a990: 64 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 20 20  d back and.**   
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a9c0: 69 74 65 33 5f 73 74 65 70 28 29 20 72 65 74 75  ite3_step() retu
a9d0: 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  rns immediately 
a9e0: 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20  with a.**       
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
aa10: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43  code of SQLITE_C
aa20: 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a  ONSTRAINT..**.**
aa30: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
aa40: 20 20 20 41 42 4f 52 54 20 20 20 20 20 20 20 20     ABORT        
aa50: 42 61 63 6b 20 6f 75 74 20 63 68 61 6e 67 65 73  Back out changes
aa60: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
aa70: 74 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20 20  t command.**    
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 6c 79              only
aaa0: 20 28 64 6f 20 6e 6f 74 20 64 6f 20 61 20 63 6f   (do not do a co
aab0: 6d 70 6c 65 74 65 20 72 6f 6c 6c 62 61 63 6b 29  mplete rollback)
aac0: 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 20 20 20 63 61 75 73 65 20 73 71          cause sq
aaf0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20  lite3_step() to 
ab00: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
ab10: 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ly.**           
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45       with SQLITE
ab40: 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a  _CONSTRAINT..**.
ab50: 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20  **  any         
ab60: 20 20 20 20 20 46 41 49 4c 20 20 20 20 20 20 20       FAIL       
ab70: 20 20 53 71 6c 69 74 65 33 5f 73 74 65 70 28 29    Sqlite3_step()
ab80: 20 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69 61   returns immedia
ab90: 74 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20 20  tely with a.**  
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
abc0: 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c  turn code of SQL
abd0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 20  ITE_CONSTRAINT. 
abe0: 20 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   The.**         
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
ac10: 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65 64  on is not rolled
ac20: 20 62 61 63 6b 20 61 6e 64 20 61 6e 79 0a 2a 2a   back and any.**
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 63 68 61 6e 67 65 73 20 74 6f 20 70 72 69 6f 72  changes to prior
ac60: 20 72 6f 77 73 20 61 72 65 20 72 65 74 61 69 6e   rows are retain
ac70: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20  ed..**.**  any  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 49 47 4e 4f              IGNO
ac90: 52 45 20 20 20 20 20 20 20 54 68 65 20 61 74 74  RE       The att
aca0: 65 6d 70 74 20 69 6e 20 69 6e 73 65 72 74 20 6f  empt in insert o
acb0: 72 20 75 70 64 61 74 65 20 74 68 65 20 63 75 72  r update the cur
acc0: 72 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  rent.**         
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 20 72 6f 77 20 69 73 20 73 6b         row is sk
acf0: 69 70 70 65 64 2c 20 77 69 74 68 6f 75 74 20 74  ipped, without t
ad00: 68 72 6f 77 69 6e 67 20 61 6e 20 65 72 72 6f 72  hrowing an error
ad10: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 20 20 20 50 72 6f 63 65 73 73 69 6e 67 20 63      Processing c
ad40: 6f 6e 74 69 6e 75 65 73 20 77 69 74 68 20 74 68  ontinues with th
ad50: 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2a 20 20  e next row..**  
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
ad80: 68 65 72 65 20 69 73 20 61 6e 20 69 6d 6d 65 64  here is an immed
ad90: 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 69 67 6e  iate jump to ign
ada0: 6f 72 65 44 65 73 74 2e 29 0a 2a 2a 0a 2a 2a 20  oreDest.).**.** 
adb0: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20 20   NOT NULL       
adc0: 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 54    REPLACE      T
add0: 68 65 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  he NULL value is
ade0: 20 72 65 70 6c 61 63 65 20 62 79 20 74 68 65 20   replace by the 
adf0: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20            value 
ae20: 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e  for that column.
ae30: 20 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74    If the default
ae40: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20 20   value.**       
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 20 20 20 20 20 69 73 20 4e 55 4c 4c           is NULL
ae70: 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 20  , the action is 
ae80: 74 68 65 20 73 61 6d 65 20 61 73 20 41 42 4f 52  the same as ABOR
ae90: 54 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e 49 51 55 45  T..**.**  UNIQUE
aea0: 20 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41             REPLA
aeb0: 43 45 20 20 20 20 20 20 54 68 65 20 6f 74 68 65  CE      The othe
aec0: 72 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 66 6c  r row that confl
aed0: 69 63 74 73 20 77 69 74 68 20 74 68 65 20 72 6f  icts with the ro
aee0: 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 62 65 69 6e 67 20 69 6e 73 65 72 74      being insert
af10: 65 64 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  ed is removed..*
af20: 2a 0a 2a 2a 20 20 43 48 45 43 4b 20 20 20 20 20  *.**  CHECK     
af30: 20 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20         REPLACE  
af40: 20 20 20 20 49 6c 6c 65 67 61 6c 2e 20 20 54 68      Illegal.  Th
af50: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20  e results in an 
af60: 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  exception..**.**
af70: 20 57 68 69 63 68 20 61 63 74 69 6f 6e 20 74 6f   Which action to
af80: 20 74 61 6b 65 20 69 73 20 64 65 74 65 72 6d 69   take is determi
af90: 6e 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 72  ned by the overr
afa0: 69 64 65 45 72 72 6f 72 20 70 61 72 61 6d 65 74  ideError paramet
afb0: 65 72 2e 0a 2a 2a 20 4f 72 20 69 66 20 6f 76 65  er..** Or if ove
afc0: 72 72 69 64 65 45 72 72 6f 72 3d 3d 4f 45 5f 44  rrideError==OE_D
afd0: 65 66 61 75 6c 74 2c 20 74 68 65 6e 20 74 68 65  efault, then the
afe0: 20 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72   pParse->onError
aff0: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 69 73   parameter.** is
b000: 20 75 73 65 64 2e 20 20 4f 72 20 69 66 20 70 50   used.  Or if pP
b010: 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  arse->onError==O
b020: 45 5f 44 65 66 61 75 6c 74 20 74 68 65 6e 20 74  E_Default then t
b030: 68 65 20 6f 6e 45 72 72 6f 72 20 76 61 6c 75 65  he onError value
b040: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6e 73  .** for the cons
b050: 74 72 61 69 6e 74 20 69 73 20 75 73 65 64 2e 0a  traint is used..
b060: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 47  */.void sqlite3G
b070: 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
b080: 74 43 68 65 63 6b 73 28 0a 20 20 50 61 72 73 65  tChecks(.  Parse
b090: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b0a0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
b0b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
b0c0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
b0d0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
b0e0: 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 75  ng inserted or u
b0f0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  pdated */.  int 
b100: 2a 61 52 65 67 49 64 78 2c 20 20 20 20 20 20 20  *aRegIdx,       
b110: 20 2f 2a 20 55 73 65 20 72 65 67 69 73 74 65 72   /* Use register
b120: 20 61 52 65 67 49 64 78 5b 69 5d 20 66 6f 72 20   aRegIdx[i] for 
b130: 69 6e 64 65 78 20 69 2e 20 20 30 20 66 6f 72 20  index i.  0 for 
b140: 75 6e 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  unused */.  int 
b150: 69 44 61 74 61 43 75 72 2c 20 20 20 20 20 20 20  iDataCur,       
b160: 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 64 61   /* Canonical da
b170: 74 61 20 63 75 72 73 6f 72 20 28 6d 61 69 6e 20  ta cursor (main 
b180: 74 61 62 6c 65 20 6f 72 20 50 4b 20 69 6e 64 65  table or PK inde
b190: 78 29 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  x) */.  int iIdx
b1a0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Cur,         /* 
b1b0: 46 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73  First index curs
b1c0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  or */.  int regN
b1d0: 65 77 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20  ewData,      /* 
b1e0: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  First register i
b1f0: 6e 20 61 20 72 61 6e 67 65 20 68 6f 6c 64 69 6e  n a range holdin
b200: 67 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 73 65  g values to inse
b210: 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  rt */.  int regO
b220: 6c 64 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20  ldData,      /* 
b230: 50 72 65 76 69 6f 75 73 20 63 6f 6e 74 65 6e 74  Previous content
b240: 2e 20 20 30 20 66 6f 72 20 49 4e 53 45 52 54 73  .  0 for INSERTs
b250: 20 2a 2f 0a 20 20 75 38 20 70 6b 43 68 6e 67 2c   */.  u8 pkChng,
b260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
b270: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 72 6f  n-zero if the ro
b280: 77 69 64 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  wid or PRIMARY K
b290: 45 59 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  EY changed */.  
b2a0: 75 38 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72  u8 overrideError
b2b0: 2c 20 20 20 20 2f 2a 20 4f 76 65 72 72 69 64 65  ,    /* Override
b2c0: 20 6f 6e 45 72 72 6f 72 20 74 6f 20 74 68 69 73   onError to this
b2d0: 20 69 66 20 6e 6f 74 20 4f 45 5f 44 65 66 61 75   if not OE_Defau
b2e0: 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 67 6e 6f  lt */.  int igno
b2f0: 72 65 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  reDest,      /* 
b300: 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62  Jump to this lab
b310: 65 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49 67 6e 6f  el on an OE_Igno
b320: 72 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 2a 2f  re resolution */
b330: 0a 20 20 69 6e 74 20 2a 70 62 4d 61 79 52 65 70  .  int *pbMayRep
b340: 6c 61 63 65 2c 20 20 20 2f 2a 20 4f 55 54 3a 20  lace,   /* OUT: 
b350: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 63  Set to true if c
b360: 6f 6e 73 74 72 61 69 6e 74 20 6d 61 79 20 63 61  onstraint may ca
b370: 75 73 65 20 61 20 72 65 70 6c 61 63 65 20 2a 2f  use a replace */
b380: 0a 20 20 69 6e 74 20 2a 61 69 43 68 6e 67 20 20  .  int *aiChng  
b390: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d          /* colum
b3a0: 6e 20 69 20 69 73 20 75 6e 63 68 61 6e 67 65 64  n i is unchanged
b3b0: 20 69 66 20 61 69 43 68 6e 67 5b 69 5d 3c 30 20   if aiChng[i]<0 
b3c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b3e0: 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
b3f0: 72 75 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  rution */.  Inde
b400: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
b410: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
b420: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  ne of the indice
b430: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  s */.  Index *pP
b440: 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  k = 0;      /* T
b450: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
b460: 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
b470: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 2f  3 *db;         /
b480: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
b490: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
b4a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b4b0: 2f 2a 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* loop counter 
b4c0: 2a 2f 0a 20 20 69 6e 74 20 69 78 3b 20 20 20 20  */.  int ix;    
b4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
b4e0: 65 78 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ex loop counter 
b4f0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
b500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b510: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
b520: 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 3b  /.  int onError;
b530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
b540: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
b550: 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 69 6e  strategy */.  in
b560: 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
b570: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b580: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
b590: 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 52  n */.  int seenR
b5a0: 65 70 6c 61 63 65 20 3d 20 30 3b 20 2f 2a 20 54  eplace = 0; /* T
b5b0: 72 75 65 20 69 66 20 52 45 50 4c 41 43 45 20 69  rue if REPLACE i
b5c0: 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  s used to resolv
b5d0: 65 20 49 4e 54 20 50 4b 20 63 6f 6e 66 6c 69 63  e INT PK conflic
b5e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6b 46 69  t */.  int nPkFi
b5f0: 65 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  eld;        /* N
b600: 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
b610: 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20  in PRIMARY KEY. 
b620: 31 20 66 6f 72 20 52 4f 57 49 44 20 74 61 62 6c  1 for ROWID tabl
b630: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 54  es */.  int ipkT
b640: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
b650: 54 6f 70 20 6f 66 20 74 68 65 20 72 6f 77 69 64  Top of the rowid
b660: 20 63 68 61 6e 67 65 20 63 6f 6e 73 74 72 61 69   change constrai
b670: 6e 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  nt check */.  in
b680: 74 20 69 70 6b 42 6f 74 74 6f 6d 20 3d 20 30 3b  t ipkBottom = 0;
b690: 20 20 20 2f 2a 20 42 6f 74 74 6f 6d 20 6f 66 20     /* Bottom of 
b6a0: 74 68 65 20 72 6f 77 69 64 20 63 68 61 6e 67 65  the rowid change
b6b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
b6c0: 6b 20 2a 2f 0a 20 20 75 38 20 69 73 55 70 64 61  k */.  u8 isUpda
b6d0: 74 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  te;         /* T
b6e0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
b6f0: 6e 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  n UPDATE operati
b700: 6f 6e 20 2a 2f 0a 20 20 75 38 20 62 41 66 66 69  on */.  u8 bAffi
b710: 6e 69 74 79 44 6f 6e 65 20 3d 20 30 3b 20 20 2f  nityDone = 0;  /
b720: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4f 50  * True if the OP
b730: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
b740: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 72 75 6e  ion has been run
b750: 20 2a 2f 0a 0a 20 20 69 73 55 70 64 61 74 65 20   */..  isUpdate 
b760: 3d 20 72 65 67 4f 6c 64 44 61 74 61 21 3d 30 3b  = regOldData!=0;
b770: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
b780: 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  db;.  v = sqlite
b790: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
b7a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
b7b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
b7c0: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
b7d0: 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c 65  ;  /* This table
b7e0: 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20 2a   is not a VIEW *
b7f0: 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  /.  nCol = pTab-
b800: 3e 6e 43 6f 6c 3b 0a 20 20 0a 20 20 2f 2a 20 70  >nCol;.  .  /* p
b810: 50 6b 20 69 73 20 74 68 65 20 50 52 49 4d 41 52  Pk is the PRIMAR
b820: 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
b830: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
b840: 62 6c 65 73 20 61 6e 64 20 4e 55 4c 4c 20 66 6f  bles and NULL fo
b850: 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 72 6f  r.  ** normal ro
b860: 77 69 64 20 74 61 62 6c 65 73 2e 20 20 6e 50 6b  wid tables.  nPk
b870: 46 69 65 6c 64 20 69 73 20 74 68 65 20 6e 75 6d  Field is the num
b880: 62 65 72 20 6f 66 20 6b 65 79 20 66 69 65 6c 64  ber of key field
b890: 73 20 69 6e 20 74 68 65 20 0a 20 20 2a 2a 20 70  s in the .  ** p
b8a0: 50 6b 20 69 6e 64 65 78 20 6f 72 20 31 20 66 6f  Pk index or 1 fo
b8b0: 72 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e  r a rowid table.
b8c0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
b8d0: 2c 20 6e 50 6b 46 69 65 6c 64 20 69 73 20 74 68  , nPkField is th
b8e0: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
b8f0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 74   fields in the t
b900: 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  rue primary key 
b910: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 2a 2f  of the table. */
b920: 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
b930: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 6b  pTab) ){.    pPk
b940: 20 3d 20 30 3b 0a 20 20 20 20 6e 50 6b 46 69 65   = 0;.    nPkFie
b950: 6c 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ld = 1;.  }else{
b960: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
b970: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
b980: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 6e 50 6b  x(pTab);.    nPk
b990: 46 69 65 6c 64 20 3d 20 70 50 6b 2d 3e 6e 4b 65  Field = pPk->nKe
b9a0: 79 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  yCol;.  }..  /* 
b9b0: 52 65 63 6f 72 64 20 74 68 61 74 20 74 68 69 73  Record that this
b9c0: 20 6d 6f 64 75 6c 65 20 68 61 73 20 73 74 61 72   module has star
b9d0: 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64  ted */.  VdbeMod
b9e0: 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
b9f0: 42 45 47 49 4e 3a 20 47 65 6e 43 6e 73 74 43 6b  BEGIN: GenCnstCk
ba00: 73 28 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64  s(%d,%d,%d,%d,%d
ba10: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
ba20: 20 20 20 20 20 20 20 20 20 69 44 61 74 61 43 75           iDataCu
ba30: 72 2c 20 69 49 64 78 43 75 72 2c 20 72 65 67 4e  r, iIdxCur, regN
ba40: 65 77 44 61 74 61 2c 20 72 65 67 4f 6c 64 44 61  ewData, regOldDa
ba50: 74 61 2c 20 70 6b 43 68 6e 67 29 29 3b 0a 0a 20  ta, pkChng));.. 
ba60: 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 4e 4f 54   /* Test all NOT
ba70: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
ba80: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
ba90: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
baa0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62  .    if( i==pTab
bab0: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
bac0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20   continue;      
bad0: 20 20 2f 2a 20 52 4f 57 49 44 20 69 73 20 6e 65    /* ROWID is ne
bae0: 76 65 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  ver NULL */.    
baf0: 7d 0a 20 20 20 20 69 66 28 20 61 69 43 68 6e 67  }.    if( aiChng
bb00: 20 26 26 20 61 69 43 68 6e 67 5b 69 5d 3c 30 20   && aiChng[i]<0 
bb10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 6e 27  ){.      /* Don'
bb20: 74 20 62 6f 74 68 65 72 20 63 68 65 63 6b 69 6e  t bother checkin
bb30: 67 20 66 6f 72 20 4e 4f 54 20 4e 55 4c 4c 20 6f  g for NOT NULL o
bb40: 6e 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 64  n columns that d
bb50: 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 2a 2f 0a  o not change */.
bb60: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
bb70: 20 20 20 20 7d 0a 20 20 20 20 6f 6e 45 72 72 6f      }.    onErro
bb80: 72 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  r = pTab->aCol[i
bb90: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 69  ].notNull;.    i
bba0: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  f( onError==OE_N
bbb0: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  one ) continue; 
bbc0: 20 2f 2a 20 54 68 69 73 20 63 6f 6c 75 6d 6e 20   /* This column 
bbd0: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
bbe0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28   NULL */.    if(
bbf0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d   overrideError!=
bc00: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
bc10: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
bc20: 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20  errideError;.   
bc30: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72   }else if( onErr
bc40: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
bc50: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
bc60: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
bc70: 7d 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  }.    if( onErro
bc80: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 26 26  r==OE_Replace &&
bc90: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70   pTab->aCol[i].p
bca0: 44 66 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Dflt==0 ){.     
bcb0: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
bcc0: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ort;.    }.    a
bcd0: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
bce0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f  OE_Rollback || o
bcf0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
bd00: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
bd10: 46 61 69 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20  Fail.        || 
bd20: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f  onError==OE_Igno
bd30: 72 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f  re || onError==O
bd40: 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20  E_Replace );.   
bd50: 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72   switch( onError
bd60: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
bd70: 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 20  E_Abort:.       
bd80: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
bd90: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
bda0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
bdb0: 68 20 2a 2f 0a 20 20 20 20 20 20 63 61 73 65 20  h */.      case 
bdc0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20  OE_Rollback:.   
bdd0: 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
bde0: 20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20   {.        char 
bdf0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
be00: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
be10: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
be20: 0a 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 20 20 20 20 20 20                  
be40: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
be50: 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
be60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be70: 64 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 49  dOp3(v, OP_HaltI
be80: 66 4e 75 6c 6c 2c 20 53 51 4c 49 54 45 5f 43 4f  fNull, SQLITE_CO
be90: 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
bea0: 2c 20 6f 6e 45 72 72 6f 72 2c 0a 20 20 20 20 20  , onError,.     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 72 65 67 4e 65 77 44 61 74 61 2b       regNewData+
bed0: 31 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 73 71  1+i);.        sq
bee0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
bef0: 34 28 76 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  4(v, zMsg, P4_DY
bf00: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20  NAMIC);.        
bf10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
bf20: 65 50 35 28 76 2c 20 50 35 5f 43 6f 6e 73 74 72  eP5(v, P5_Constr
bf30: 61 69 6e 74 4e 6f 74 4e 75 6c 6c 29 3b 0a 20 20  aintNotNull);.  
bf40: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
bf50: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 62  ge(v);.        b
bf60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
bf70: 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
bf80: 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  re: {.        sq
bf90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bfa0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
bfb0: 67 4e 65 77 44 61 74 61 2b 31 2b 69 2c 20 69 67  gNewData+1+i, ig
bfc0: 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20 20  noreDest);.     
bfd0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
bfe0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
bff0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
c000: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c010: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72      assert( onEr
c020: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
c030: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 31  );.        addr1
c040: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c050: 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
c060: 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31  ll, regNewData+1
c070: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
c080: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
c090: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c0a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c0b0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70   pTab->aCol[i].p
c0c0: 44 66 6c 74 2c 20 72 65 67 4e 65 77 44 61 74 61  Dflt, regNewData
c0d0: 2b 31 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 73  +1+i);.        s
c0e0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c0f0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
c100: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c120: 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 43 48    /* Test all CH
c130: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ECK constraints.
c140: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
c150: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
c160: 20 69 66 28 20 70 54 61 62 2d 3e 70 43 68 65 63   if( pTab->pChec
c170: 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  k && (db->flags 
c180: 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43  & SQLITE_IgnoreC
c190: 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a 20 20 20  hecks)==0 ){.   
c1a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 43 68 65 63   ExprList *pChec
c1b0: 6b 20 3d 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  k = pTab->pCheck
c1c0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
c1d0: 65 6c 66 54 61 62 20 3d 20 2d 28 72 65 67 4e 65  elfTab = -(regNe
c1e0: 77 44 61 74 61 2b 31 29 3b 0a 20 20 20 20 6f 6e  wData+1);.    on
c1f0: 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65  Error = override
c200: 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c  Error!=OE_Defaul
c210: 74 20 3f 20 6f 76 65 72 72 69 64 65 45 72 72 6f  t ? overrideErro
c220: 72 20 3a 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r : OE_Abort;.  
c230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
c240: 65 63 6b 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  eck->nExpr; i++)
c250: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 6c 6c 4f  {.      int allO
c260: 6b 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  k;.      Expr *p
c270: 45 78 70 72 20 3d 20 70 43 68 65 63 6b 2d 3e 61  Expr = pCheck->a
c280: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
c290: 20 69 66 28 20 61 69 43 68 6e 67 20 26 26 20 63   if( aiChng && c
c2a0: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 55 6e  heckConstraintUn
c2b0: 63 68 61 6e 67 65 64 28 70 45 78 70 72 2c 20 61  changed(pExpr, a
c2c0: 69 43 68 6e 67 2c 20 70 6b 43 68 6e 67 29 20 29  iChng, pkChng) )
c2d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c2e0: 20 61 6c 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33   allOk = sqlite3
c2f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
c300: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c310: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
c320: 2c 20 70 45 78 70 72 2c 20 61 6c 6c 4f 6b 2c 20  , pExpr, allOk, 
c330: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
c340: 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  L);.      if( on
c350: 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65  Error==OE_Ignore
c360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c370: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
c380: 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20  gnoreDest);.    
c390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c3a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
c3b0: 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  Check->a[i].zNam
c3c0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
c3d0: 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20  Name==0 ) zName 
c3e0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
c3f0: 20 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72         if( onErr
c400: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
c410: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
c420: 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  ort; /* IMP: R-1
c430: 35 35 36 39 2d 36 33 36 32 35 20 2a 2f 0a 20 20  5569-63625 */.  
c440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
c450: 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
c460: 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
c470: 52 41 49 4e 54 5f 43 48 45 43 4b 2c 0a 20 20 20  RAINT_CHECK,.   
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72             onErr
c4a0: 6f 72 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 54 52  or, zName, P4_TR
c4b0: 41 4e 53 49 45 4e 54 2c 0a 20 20 20 20 20 20 20  ANSIENT,.       
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
c4e0: 61 69 6e 74 43 68 65 63 6b 29 3b 0a 20 20 20 20  aintCheck);.    
c4f0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c500: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
c510: 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b 0a 20 20 20  l(v, allOk);.   
c520: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69   }.    pParse->i
c530: 53 65 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 7d  SelfTab = 0;.  }
c540: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
c550: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c560: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
c570: 49 66 20 72 6f 77 69 64 20 69 73 20 63 68 61 6e  If rowid is chan
c580: 67 69 6e 67 2c 20 6d 61 6b 65 20 73 75 72 65 20  ging, make sure 
c590: 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 64 6f  the new rowid do
c5a0: 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  es not previousl
c5b0: 79 0a 20 20 2a 2a 20 65 78 69 73 74 20 69 6e 20  y.  ** exist in 
c5c0: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  the table..  */.
c5d0: 20 20 69 66 28 20 70 6b 43 68 6e 67 20 26 26 20    if( pkChng && 
c5e0: 70 50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  pPk==0 ){.    in
c5f0: 74 20 61 64 64 72 52 6f 77 69 64 4f 6b 20 3d 20  t addrRowidOk = 
c600: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c610: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
c620: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
c630: 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   action to take 
c640: 69 6e 20 63 61 73 65 20 6f 66 20 61 20 72 6f 77  in case of a row
c650: 69 64 20 63 6f 6c 6c 69 73 69 6f 6e 20 2a 2f 0a  id collision */.
c660: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 54      onError = pT
c670: 61 62 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20 20 20  ab->keyConf;.   
c680: 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72   if( overrideErr
c690: 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or!=OE_Default )
c6a0: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
c6b0: 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b  = overrideError;
c6c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
c6d0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
c6e0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72  lt ){.      onEr
c6f0: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
c700: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
c710: 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  sUpdate ){.     
c720: 20 2f 2a 20 70 6b 43 68 6e 67 21 3d 30 20 64 6f   /* pkChng!=0 do
c730: 65 73 20 6e 6f 74 20 6d 65 61 6e 20 74 68 61 74  es not mean that
c740: 20 74 68 65 20 72 6f 77 69 64 20 68 61 73 20 63   the rowid has c
c750: 68 61 6e 67 65 64 2c 20 6f 6e 6c 79 20 74 68 61  hanged, only tha
c760: 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  t.      ** it mi
c770: 67 68 74 20 68 61 76 65 20 63 68 61 6e 67 65 64  ght have changed
c780: 2e 20 20 53 6b 69 70 20 74 68 65 20 63 6f 6e 66  .  Skip the conf
c790: 6c 69 63 74 20 6c 6f 67 69 63 20 62 65 6c 6f 77  lict logic below
c7a0: 20 69 66 20 74 68 65 20 72 6f 77 69 64 0a 20 20   if the rowid.  
c7b0: 20 20 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e      ** is unchan
c7c0: 67 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ged. */.      sq
c7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c7e0: 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 4e 65 77  v, OP_Eq, regNew
c7f0: 44 61 74 61 2c 20 61 64 64 72 52 6f 77 69 64 4f  Data, addrRowidO
c800: 6b 2c 20 72 65 67 4f 6c 64 44 61 74 61 29 3b 0a  k, regOldData);.
c810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c820: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
c830: 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20  ITE_NOTNULL);.  
c840: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
c850: 28 76 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  (v);.    }..    
c860: 2f 2a 20 49 66 20 74 68 65 20 72 65 73 70 6f 6e  /* If the respon
c870: 73 65 20 74 6f 20 61 20 72 6f 77 69 64 20 63 6f  se to a rowid co
c880: 6e 66 6c 69 63 74 20 69 73 20 52 45 50 4c 41 43  nflict is REPLAC
c890: 45 20 62 75 74 20 74 68 65 20 72 65 73 70 6f 6e  E but the respon
c8a0: 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 73 6f 6d  se.    ** to som
c8b0: 65 20 6f 74 68 65 72 20 55 4e 49 51 55 45 20 63  e other UNIQUE c
c8c0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 46 41 49  onstraint is FAI
c8d0: 4c 20 6f 72 20 49 47 4e 4f 52 45 2c 20 74 68 65  L or IGNORE, the
c8e0: 6e 20 77 65 20 6e 65 65 64 0a 20 20 20 20 2a 2a  n we need.    **
c8f0: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 72 75   to defer the ru
c900: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72 6f 77  nning of the row
c910: 69 64 20 63 6f 6e 66 6c 69 63 74 20 63 68 65 63  id conflict chec
c920: 6b 69 6e 67 20 75 6e 74 69 6c 20 61 66 74 65 72  king until after
c930: 0a 20 20 20 20 2a 2a 20 74 68 65 20 55 4e 49 51  .    ** the UNIQ
c940: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68  UE constraints h
c950: 61 76 65 20 72 75 6e 2e 0a 20 20 20 20 2a 2f 0a  ave run..    */.
c960: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
c970: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 26 26 20 6f  =OE_Replace && o
c980: 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45  verrideError!=OE
c990: 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
c9a0: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
c9b0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
c9c0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
c9d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
c9e0: 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
c9f0: 49 67 6e 6f 72 65 20 7c 7c 20 70 49 64 78 2d 3e  Ignore || pIdx->
ca00: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c  onError==OE_Fail
ca10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 70   ){.          ip
ca20: 6b 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  kTop = sqlite3Vd
ca30: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
ca40: 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oto);.          
ca50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ca60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ca70: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
ca80: 73 65 65 20 69 66 20 74 68 65 20 6e 65 77 20 72  see if the new r
ca90: 6f 77 69 64 20 61 6c 72 65 61 64 79 20 65 78 69  owid already exi
caa0: 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  sts in the table
cab0: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 74  .  Skip.    ** t
cac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
cad0: 66 6c 69 63 74 20 6c 6f 67 69 63 20 69 66 20 69  flict logic if i
cae0: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20  t does not. */. 
caf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb00: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
cb10: 69 73 74 73 2c 20 69 44 61 74 61 43 75 72 2c 20  ists, iDataCur, 
cb20: 61 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72 65 67  addrRowidOk, reg
cb30: 4e 65 77 44 61 74 61 29 3b 0a 20 20 20 20 56 64  NewData);.    Vd
cb40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
cb50: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
cb60: 63 6f 64 65 20 74 68 61 74 20 64 65 61 6c 73 20  code that deals 
cb70: 77 69 74 68 20 61 20 72 6f 77 69 64 20 63 6f 6c  with a rowid col
cb80: 6c 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 77  lision */.    sw
cb90: 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b  itch( onError ){
cba0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
cbb0: 7b 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  {.        onErro
cbc0: 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r = OE_Abort;.  
cbd0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
cbe0: 72 75 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  ru into the next
cbf0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
cc00: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52  .      case OE_R
cc10: 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63  ollback:.      c
cc20: 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20  ase OE_Abort:.  
cc30: 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c      case OE_Fail
cc40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
cc50: 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
cc60: 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72  nt(pParse, onErr
cc70: 6f 72 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  or, pTab);.     
cc80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cc90: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  }.      case OE_
cca0: 52 65 70 6c 61 63 65 3a 20 7b 0a 20 20 20 20 20  Replace: {.     
ccb0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
ccc0: 72 65 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  re DELETE trigge
ccd0: 72 73 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  rs on this table
cce0: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 20   and the.       
ccf0: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 72   ** recursive-tr
cd00: 69 67 67 65 72 73 20 66 6c 61 67 20 69 73 20 73  iggers flag is s
cd10: 65 74 2c 20 63 61 6c 6c 20 47 65 6e 65 72 61 74  et, call Generat
cd20: 65 52 6f 77 44 65 6c 65 74 65 28 29 20 74 6f 0a  eRowDelete() to.
cd30: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76          ** remov
cd40: 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 69 6e  e the conflictin
cd50: 67 20 72 6f 77 20 66 72 6f 6d 20 74 68 65 20 74  g row from the t
cd60: 61 62 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  able. This will 
cd70: 66 69 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  fire.        ** 
cd80: 74 68 65 20 74 72 69 67 67 65 72 73 20 61 6e 64  the triggers and
cd90: 20 72 65 6d 6f 76 65 20 62 6f 74 68 20 74 68 65   remove both the
cda0: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
cdb0: 20 62 2d 74 72 65 65 20 65 6e 74 72 69 65 73 2e   b-tree entries.
cdc0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
cdd0: 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
cde0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  , if there are n
cdf0: 6f 20 74 72 69 67 67 65 72 73 20 6f 72 20 74 68  o triggers or th
ce00: 65 20 72 65 63 75 72 73 69 76 65 2d 74 72 69 67  e recursive-trig
ce10: 67 65 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  gers.        ** 
ce20: 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
ce30: 20 62 75 74 20 74 68 65 20 74 61 62 6c 65 20 68   but the table h
ce40: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  as one or more i
ce50: 6e 64 65 78 65 73 2c 20 63 61 6c 6c 20 0a 20 20  ndexes, call .  
ce60: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
ce70: 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28  eRowIndexDelete(
ce80: 29 2e 20 54 68 69 73 20 72 65 6d 6f 76 65 73 20  ). This removes 
ce90: 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
cea0: 20 65 6e 74 72 69 65 73 20 0a 20 20 20 20 20 20   entries .      
ceb0: 20 20 2a 2a 20 6f 6e 6c 79 2e 20 54 68 65 20 74    ** only. The t
cec0: 61 62 6c 65 20 62 2d 74 72 65 65 20 65 6e 74 72  able b-tree entr
ced0: 79 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  y will be replac
cee0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 65 6e  ed by the new en
cef0: 74 72 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  try .        ** 
cf00: 77 68 65 6e 20 69 74 20 69 73 20 69 6e 73 65 72  when it is inser
cf10: 74 65 64 2e 20 20 0a 20 20 20 20 20 20 20 20 2a  ted.  .        *
cf20: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
cf30: 65 69 74 68 65 72 20 47 65 6e 65 72 61 74 65 52  either GenerateR
cf40: 6f 77 44 65 6c 65 74 65 28 29 20 6f 72 20 47 65  owDelete() or Ge
cf50: 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78 44 65  nerateRowIndexDe
cf60: 6c 65 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lete() is called
cf70: 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 73  ,.        ** als
cf80: 6f 20 69 6e 76 6f 6b 65 20 4d 75 6c 74 69 57 72  o invoke MultiWr
cf90: 69 74 65 28 29 20 74 6f 20 69 6e 64 69 63 61 74  ite() to indicat
cfa0: 65 20 74 68 61 74 20 74 68 69 73 20 56 44 42 45  e that this VDBE
cfb0: 20 6d 61 79 20 72 65 71 75 69 72 65 0a 20 20 20   may require.   
cfc0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
cfd0: 74 20 72 6f 6c 6c 62 61 63 6b 20 28 69 66 20 74  t rollback (if t
cfe0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
cff0: 61 62 6f 72 74 65 64 20 61 66 74 65 72 20 74 68  aborted after th
d000: 65 20 64 65 6c 65 74 65 0a 20 20 20 20 20 20 20  e delete.       
d010: 20 2a 2a 20 74 61 6b 65 73 20 70 6c 61 63 65 29   ** takes place)
d020: 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  . Earlier versio
d030: 6e 73 20 63 61 6c 6c 65 64 20 73 71 6c 69 74 65  ns called sqlite
d040: 33 4d 75 6c 74 69 57 72 69 74 65 28 29 20 72 65  3MultiWrite() re
d050: 67 61 72 64 6c 65 73 73 2c 0a 20 20 20 20 20 20  gardless,.      
d060: 20 20 2a 2a 20 62 75 74 20 62 65 69 6e 67 20 6d    ** but being m
d070: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 20 68 65  ore selective he
d080: 72 65 20 61 6c 6c 6f 77 73 20 73 74 61 74 65 6d  re allows statem
d090: 65 6e 74 73 20 6c 69 6b 65 3a 0a 20 20 20 20 20  ents like:.     
d0a0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
d0b0: 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20     REPLACE INTO 
d0c0: 74 28 72 6f 77 69 64 29 20 56 41 4c 55 45 53 28  t(rowid) VALUES(
d0d0: 24 6e 65 77 72 6f 77 69 64 29 0a 20 20 20 20 20  $newrowid).     
d0e0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
d0f0: 20 74 6f 20 72 75 6e 20 77 69 74 68 6f 75 74 20   to run without 
d100: 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  a statement jour
d110: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 61 72 65  nal if there are
d120: 20 6e 6f 20 69 6e 64 65 78 65 73 20 6f 6e 20 74   no indexes on t
d130: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  he.        ** ta
d140: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ble..        */.
d150: 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20          Trigger 
d160: 2a 70 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20  *pTrigger = 0;. 
d170: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 66         if( db->f
d180: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 63 54  lags&SQLITE_RecT
d190: 72 69 67 67 65 72 73 20 29 7b 0a 20 20 20 20 20  riggers ){.     
d1a0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
d1b0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 73 45  sqlite3TriggersE
d1c0: 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  xist(pParse, pTa
d1d0: 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c 20 30 2c  b, TK_DELETE, 0,
d1e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
d1f0: 20 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67         if( pTrig
d200: 67 65 72 20 7c 7c 20 73 71 6c 69 74 65 33 46 6b  ger || sqlite3Fk
d210: 52 65 71 75 69 72 65 64 28 70 50 61 72 73 65 2c  Required(pParse,
d220: 20 70 54 61 62 2c 20 30 2c 20 30 29 20 29 7b 0a   pTab, 0, 0) ){.
d230: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d240: 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72  3MultiWrite(pPar
d250: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
d260: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
d270: 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  wDelete(pParse, 
d280: 70 54 61 62 2c 20 70 54 72 69 67 67 65 72 2c 20  pTab, pTrigger, 
d290: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
d2a0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 72 65 67 4e 65 77 44 61 74 61        regNewData
d2d0: 2c 20 31 2c 20 30 2c 20 4f 45 5f 52 65 70 6c 61  , 1, 0, OE_Repla
d2e0: 63 65 2c 20 31 2c 20 2d 31 29 3b 0a 20 20 20 20  ce, 1, -1);.    
d2f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
d300: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d310: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
d320: 20 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73           if( Has
d330: 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
d340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d350: 69 73 20 4f 50 5f 44 65 6c 65 74 65 20 6f 70 63  is OP_Delete opc
d360: 6f 64 65 20 66 69 72 65 73 20 74 68 65 20 70 72  ode fires the pr
d370: 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20 6f 6e  e-update-hook on
d380: 6c 79 2e 20 49 74 20 64 6f 65 73 0a 20 20 20 20  ly. It does.    
d390: 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d          ** not m
d3a0: 6f 64 69 66 79 20 74 68 65 20 62 2d 74 72 65 65  odify the b-tree
d3b0: 2e 20 49 74 20 69 73 20 6d 6f 72 65 20 65 66 66  . It is more eff
d3c0: 69 63 69 65 6e 74 20 74 6f 20 6c 65 74 20 74 68  icient to let th
d3d0: 65 20 63 6f 6d 69 6e 67 0a 20 20 20 20 20 20 20  e coming.       
d3e0: 20 20 20 20 20 2a 2a 20 4f 50 5f 49 6e 73 65 72       ** OP_Inser
d3f0: 74 20 72 65 70 6c 61 63 65 20 74 68 65 20 65 78  t replace the ex
d400: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
d410: 6e 20 69 74 20 69 73 20 74 6f 20 64 65 6c 65 74  n it is to delet
d420: 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
d430: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 65 6e    ** existing en
d440: 74 72 79 20 61 6e 64 20 74 68 65 6e 20 69 6e 73  try and then ins
d450: 65 72 74 20 61 20 6e 65 77 20 6f 6e 65 2e 20 2a  ert a new one. *
d460: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
d470: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d480: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 44  v, OP_Delete, iD
d490: 61 74 61 43 75 72 2c 20 4f 50 46 4c 41 47 5f 49  ataCur, OPFLAG_I
d4a0: 53 4e 4f 4f 50 29 3b 0a 20 20 20 20 20 20 20 20  SNOOP);.        
d4b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d4c0: 70 70 65 6e 64 50 34 28 76 2c 20 70 54 61 62 2c  ppendP4(v, pTab,
d4d0: 20 50 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20   P4_TABLE);.    
d4e0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f        }.#endif /
d4f0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
d500: 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
d510: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
d520: 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 29 7b 0a  pTab->pIndex ){.
d530: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d540: 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
d550: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
d560: 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
d570: 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65  teRowIndexDelete
d580: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
d590: 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72  DataCur, iIdxCur
d5a0: 2c 30 2c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ,0,-1);.        
d5b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
d5c0: 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61 63        seenReplac
d5d0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
d5e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d5f0: 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f      case OE_Igno
d600: 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  re: {.        /*
d610: 61 73 73 65 72 74 28 20 73 65 65 6e 52 65 70 6c  assert( seenRepl
d620: 61 63 65 3d 3d 30 20 29 3b 2a 2f 0a 20 20 20 20  ace==0 );*/.    
d630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
d640: 6f 74 6f 28 76 2c 20 69 67 6e 6f 72 65 44 65 73  oto(v, ignoreDes
d650: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
d660: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
d670: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d680: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d690: 61 64 64 72 52 6f 77 69 64 4f 6b 29 3b 0a 20 20  addrRowidOk);.  
d6a0: 20 20 69 66 28 20 69 70 6b 54 6f 70 20 29 7b 0a    if( ipkTop ){.
d6b0: 20 20 20 20 20 20 69 70 6b 42 6f 74 74 6f 6d 20        ipkBottom 
d6c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d6d0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
d6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d6f0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 70  beJumpHere(v, ip
d700: 6b 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  kTop);.    }.  }
d710: 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20  ..  /* Test all 
d720: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
d730: 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 65  ts by creating e
d740: 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
d750: 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e 64 65  UNIQUE.  ** inde
d760: 78 20 61 6e 64 20 6d 61 6b 69 6e 67 20 73 75 72  x and making sur
d770: 65 20 74 68 61 74 20 64 75 70 6c 69 63 61 74 65  e that duplicate
d780: 20 65 6e 74 72 69 65 73 20 64 6f 20 6e 6f 74 20   entries do not 
d790: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 20  already exist.. 
d7a0: 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   ** Compute the 
d7b0: 72 65 76 69 73 65 64 20 72 65 63 6f 72 64 20 65  revised record e
d7c0: 6e 74 72 69 65 73 20 66 6f 72 20 69 6e 64 69 63  ntries for indic
d7d0: 65 73 20 61 73 20 77 65 20 67 6f 2e 0a 20 20 2a  es as we go..  *
d7e0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
d7f0: 20 61 6c 73 6f 20 68 61 6e 64 6c 65 73 20 74 68   also handles th
d800: 65 20 63 61 73 65 20 6f 66 20 74 68 65 20 50 52  e case of the PR
d810: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
d820: 66 6f 72 20 61 0a 20 20 2a 2a 20 57 49 54 48 4f  for a.  ** WITHO
d830: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
d840: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 78 3d 30 2c    */.  for(ix=0,
d850: 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64   pIdx=pTab->pInd
d860: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
d870: 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 78 2b 2b  Idx->pNext, ix++
d880: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 49 64  ){.    int regId
d890: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  x;          /* R
d8a0: 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
d8b0: 73 20 68 6f 6c 64 20 63 6f 6e 65 6e 74 20 66 6f  s hold conent fo
d8c0: 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e  r pIdx */.    in
d8d0: 74 20 72 65 67 52 3b 20 20 20 20 20 20 20 20 20  t regR;         
d8e0: 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 72     /* Range of r
d8f0: 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
d900: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 50 4b 20   conflicting PK 
d910: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 68 69 73  */.    int iThis
d920: 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur;        /* C
d930: 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 55  ursor for this U
d940: 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20  NIQUE index */. 
d950: 20 20 20 69 6e 74 20 61 64 64 72 55 6e 69 71 75     int addrUniqu
d960: 65 4f 6b 3b 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eOk;    /* Jump 
d970: 68 65 72 65 20 69 66 20 74 68 65 20 55 4e 49 51  here if the UNIQ
d980: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  UE constraint is
d990: 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 0a 20   satisfied */.. 
d9a0: 20 20 20 69 66 28 20 61 52 65 67 49 64 78 5b 69     if( aRegIdx[i
d9b0: 78 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  x]==0 ) continue
d9c0: 3b 20 20 2f 2a 20 53 6b 69 70 20 69 6e 64 69 63  ;  /* Skip indic
d9d0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
d9e0: 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 69 66 28  hange */.    if(
d9f0: 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 3d 3d   bAffinityDone==
da00: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
da10: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
da20: 76 2c 20 70 54 61 62 2c 20 72 65 67 4e 65 77 44  v, pTab, regNewD
da30: 61 74 61 2b 31 29 3b 0a 20 20 20 20 20 20 62 41  ata+1);.      bA
da40: 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20 31 3b  ffinityDone = 1;
da50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 68 69 73  .    }.    iThis
da60: 43 75 72 20 3d 20 69 49 64 78 43 75 72 2b 69 78  Cur = iIdxCur+ix
da70: 3b 0a 20 20 20 20 61 64 64 72 55 6e 69 71 75 65  ;.    addrUnique
da80: 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ok = sqlite3Vdbe
da90: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
daa0: 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 72 74 69     /* Skip parti
dab0: 61 6c 20 69 6e 64 69 63 65 73 20 66 6f 72 20 77  al indices for w
dac0: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
dad0: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 74 72 75  lause is not tru
dae0: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64  e */.    if( pId
daf0: 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
db00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
db10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
db20: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 61 52 65 67 49  P_Null, 0, aRegI
db30: 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20 20 20 70  dx[ix]);.      p
db40: 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20  Parse->iSelfTab 
db50: 3d 20 2d 28 72 65 67 4e 65 77 44 61 74 61 2b 31  = -(regNewData+1
db60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db70: 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 70  ExprIfFalseDup(p
db80: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 70 50 61  Parse, pIdx->pPa
db90: 72 74 49 64 78 57 68 65 72 65 2c 20 61 64 64 72  rtIdxWhere, addr
dba0: 55 6e 69 71 75 65 4f 6b 2c 0a 20 20 20 20 20 20  UniqueOk,.      
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4a 55 4d        SQLITE_JUM
dbd0: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
dbe0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62  pParse->iSelfTab
dbf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
dc00: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72 65 63   /* Create a rec
dc10: 6f 72 64 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ord for this ind
dc20: 65 78 20 65 6e 74 72 79 20 61 73 20 69 74 20 73  ex entry as it s
dc30: 68 6f 75 6c 64 20 61 70 70 65 61 72 20 61 66 74  hould appear aft
dc40: 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  er.    ** the in
dc50: 73 65 72 74 20 6f 72 20 75 70 64 61 74 65 2e 20  sert or update. 
dc60: 20 53 74 6f 72 65 20 74 68 61 74 20 72 65 63 6f   Store that reco
dc70: 72 64 20 69 6e 20 74 68 65 20 61 52 65 67 49 64  rd in the aRegId
dc80: 78 5b 69 78 5d 20 72 65 67 69 73 74 65 72 0a 20  x[ix] register. 
dc90: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 49 64 78     */.    regIdx
dca0: 20 3d 20 61 52 65 67 49 64 78 5b 69 78 5d 2b 31   = aRegIdx[ix]+1
dcb0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
dcc0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
dcd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
dce0: 69 46 69 65 6c 64 20 3d 20 70 49 64 78 2d 3e 61  iField = pIdx->a
dcf0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
dd00: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
dd10: 66 28 20 69 46 69 65 6c 64 3d 3d 58 4e 5f 45 58  f( iField==XN_EX
dd20: 50 52 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  PR ){.        pP
dd30: 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
dd40: 20 2d 28 72 65 67 4e 65 77 44 61 74 61 2b 31 29   -(regNewData+1)
dd50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dd60: 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50  3ExprCodeCopy(pP
dd70: 61 72 73 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c  arse, pIdx->aCol
dd80: 45 78 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Expr->a[i].pExpr
dd90: 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20 20  , regIdx+i);.   
dda0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65       pParse->iSe
ddb0: 6c 66 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  lfTab = 0;.     
ddc0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
ddd0: 76 2c 20 22 25 73 20 63 6f 6c 75 6d 6e 20 25 64  v, "%s column %d
dde0: 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  ", pIdx->zName, 
ddf0: 69 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i));.      }else
de00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46  {.        if( iF
de10: 69 65 6c 64 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c  ield==XN_ROWID |
de20: 7c 20 69 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  | iField==pTab->
de30: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
de40: 20 20 20 78 20 3d 20 72 65 67 4e 65 77 44 61 74     x = regNewDat
de50: 61 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  a;.        }else
de60: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  {.          x = 
de70: 69 46 69 65 6c 64 20 2b 20 72 65 67 4e 65 77 44  iField + regNewD
de80: 61 74 61 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  ata + 1;.       
de90: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
dea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
deb0: 69 46 69 65 6c 64 3c 30 20 3f 20 4f 50 5f 49 6e  iField<0 ? OP_In
dec0: 74 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  tCopy : OP_SCopy
ded0: 2c 20 78 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a  , x, regIdx+i);.
dee0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
def0: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 69 46  ent((v, "%s", iF
df00: 69 65 6c 64 3c 30 20 3f 20 22 72 6f 77 69 64 22  ield<0 ? "rowid"
df10: 20 3a 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 46   : pTab->aCol[iF
df20: 69 65 6c 64 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20  ield].zName));. 
df30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
df40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
df50: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
df60: 6f 72 64 2c 20 72 65 67 49 64 78 2c 20 70 49 64  ord, regIdx, pId
df70: 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 61 52 65 67  x->nColumn, aReg
df80: 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20 56 64  Idx[ix]);.    Vd
df90: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
dfa0: 6f 72 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  or %s", pIdx->zN
dfb0: 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20 53 51  ame));.#ifdef SQ
dfc0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 55 4c 4c  LITE_ENABLE_NULL
dfd0: 5f 54 52 49 4d 0a 20 20 20 20 69 66 28 20 70 49  _TRIM.    if( pI
dfe0: 64 78 2d 3e 69 64 78 54 79 70 65 3d 3d 32 20 29  dx->idxType==2 )
dff0: 20 73 71 6c 69 74 65 33 53 65 74 4d 61 6b 65 52   sqlite3SetMakeR
e000: 65 63 6f 72 64 50 35 28 76 2c 20 70 49 64 78 2d  ecordP5(v, pIdx-
e010: 3e 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66  >pTable);.#endif
e020: 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 61 6e 20 55  ..    /* In an U
e030: 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c  PDATE operation,
e040: 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   if this index i
e050: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
e060: 59 20 69 6e 64 65 78 20 0a 20 20 20 20 2a 2a 20  Y index .    ** 
e070: 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
e080: 49 44 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ID table and the
e090: 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 63  re has been no c
e0a0: 68 61 6e 67 65 20 74 68 65 0a 20 20 20 20 2a 2a  hange the.    **
e0b0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68   primary key, th
e0c0: 65 6e 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 20  en no collision 
e0d0: 69 73 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  is possible.  Th
e0e0: 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65 74 65  e collision dete
e0f0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 6f 67  ction.    ** log
e100: 69 63 20 62 65 6c 6f 77 20 63 61 6e 20 61 6c 6c  ic below can all
e110: 20 62 65 20 73 6b 69 70 70 65 64 2e 20 2a 2f 0a   be skipped. */.
e120: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
e130: 20 26 26 20 70 50 6b 3d 3d 70 49 64 78 20 26 26   && pPk==pIdx &&
e140: 20 70 6b 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20   pkChng==0 ){.  
e150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
e160: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
e170: 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20  ddrUniqueOk);.  
e180: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
e190: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
e1a0: 20 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e   out what action
e1b0: 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65   to take in case
e1c0: 20 74 68 65 72 65 20 69 73 20 61 20 75 6e 69 71   there is a uniq
e1d0: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
e1e0: 2a 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  */.    onError =
e1f0: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a   pIdx->onError;.
e200: 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
e210: 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 20 0a 20 20 20  =OE_None ){ .   
e220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e230: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
e240: 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20  drUniqueOk);.   
e250: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
e260: 20 70 49 64 78 20 69 73 20 6e 6f 74 20 61 20 55   pIdx is not a U
e270: 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20  NIQUE index */. 
e280: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 76 65     }.    if( ove
e290: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
e2a0: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
e2b0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69  onError = overri
e2c0: 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  deError;.    }el
e2d0: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
e2e0: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
e2f0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
e300: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20  _Abort;.    }.. 
e310: 20 20 20 2f 2a 20 43 6f 6c 6c 69 73 69 6f 6e 20     /* Collision 
e320: 64 65 74 65 63 74 69 6f 6e 20 6d 61 79 20 62 65  detection may be
e330: 20 6f 6d 69 74 74 65 64 20 69 66 20 61 6c 6c 20   omitted if all 
e340: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e350: 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a   are true:.    *
e360: 2a 20 20 20 28 31 29 20 54 68 65 20 63 6f 6e 66  *   (1) The conf
e370: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
e380: 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 52 45 50  algorithm is REP
e390: 4c 41 43 45 0a 20 20 20 20 2a 2a 20 20 20 28 32  LACE.    **   (2
e3a0: 29 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 61  ) The table is a
e3b0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
e3c0: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 28 33  able.    **   (3
e3d0: 29 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 73  ) There are no s
e3e0: 65 63 6f 6e 64 61 72 79 20 69 6e 64 65 78 65 73  econdary indexes
e3f0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20   on the table.  
e400: 20 20 2a 2a 20 20 20 28 34 29 20 4e 6f 20 64 65    **   (4) No de
e410: 6c 65 74 65 20 74 72 69 67 67 65 72 73 20 6e 65  lete triggers ne
e420: 65 64 20 74 6f 20 62 65 20 66 69 72 65 64 20 69  ed to be fired i
e430: 66 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  f there is a con
e440: 66 6c 69 63 74 0a 20 20 20 20 2a 2a 20 20 20 28  flict.    **   (
e450: 35 29 20 4e 6f 20 46 4b 20 63 6f 6e 73 74 72 61  5) No FK constra
e460: 69 6e 74 20 63 6f 75 6e 74 65 72 73 20 6e 65 65  int counters nee
e470: 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  d to be updated 
e480: 69 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 6f 63  if a conflict oc
e490: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  curs..    */ .  
e4a0: 20 20 69 66 28 20 28 69 78 3d 3d 30 20 26 26 20    if( (ix==0 && 
e4b0: 70 49 64 78 2d 3e 70 4e 65 78 74 3d 3d 30 29 20  pIdx->pNext==0) 
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 33    /* Condition 3
e4e0: 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 50 6b 3d   */.     && pPk=
e4f0: 3d 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  =pIdx           
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69          /* Condi
e520: 74 69 6f 6e 20 32 20 2a 2f 0a 20 20 20 20 20 26  tion 2 */.     &
e530: 26 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  & onError==OE_Re
e540: 70 6c 61 63 65 20 20 20 20 20 20 20 20 20 20 20  place           
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e560: 20 43 6f 6e 64 69 74 69 6f 6e 20 31 20 2a 2f 0a   Condition 1 */.
e570: 20 20 20 20 20 26 26 20 28 20 30 3d 3d 28 64 62       && ( 0==(db
e580: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
e590: 65 63 54 72 69 67 67 65 72 73 29 20 7c 7c 20 20  ecTriggers) ||  
e5a0: 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
e5b0: 20 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   4 */.          
e5c0: 30 3d 3d 73 71 6c 69 74 65 33 54 72 69 67 67 65  0==sqlite3Trigge
e5d0: 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20  rsExist(pParse, 
e5e0: 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c  pTab, TK_DELETE,
e5f0: 20 30 2c 20 30 29 29 0a 20 20 20 20 20 26 26 20   0, 0)).     && 
e600: 28 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73 26  ( 0==(db->flags&
e610: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
e620: 79 73 29 20 7c 7c 20 20 20 20 20 20 2f 2a 20 43  ys) ||      /* C
e630: 6f 6e 64 69 74 69 6f 6e 20 35 20 2a 2f 0a 20 20  ondition 5 */.  
e640: 20 20 20 20 20 20 20 28 30 3d 3d 70 54 61 62 2d         (0==pTab-
e650: 3e 70 46 4b 65 79 20 26 26 20 30 3d 3d 73 71 6c  >pFKey && 0==sql
e660: 69 74 65 33 46 6b 52 65 66 65 72 65 6e 63 65 73  ite3FkReferences
e670: 28 70 54 61 62 29 29 29 0a 20 20 20 20 29 7b 0a  (pTab))).    ){.
e680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e690: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e6a0: 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a   addrUniqueOk);.
e6b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
e6c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
e6d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
e6e0: 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72  e new index entr
e6f0: 79 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  y will be unique
e700: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
e710: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
e720: 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 69  OP_NoConflict, i
e730: 54 68 69 73 43 75 72 2c 20 61 64 64 72 55 6e 69  ThisCur, addrUni
e740: 71 75 65 4f 6b 2c 0a 20 20 20 20 20 20 20 20 20  queOk,.         
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b  regIdx, pIdx->nK
e770: 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
e780: 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  rage(v);..    /*
e790: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
e7a0: 6f 20 68 61 6e 64 6c 65 20 63 6f 6c 6c 69 73 69  o handle collisi
e7b0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 72 65 67 52 20  ons */.    regR 
e7c0: 3d 20 28 70 49 64 78 3d 3d 70 50 6b 29 20 3f 20  = (pIdx==pPk) ? 
e7d0: 72 65 67 49 64 78 20 3a 20 73 71 6c 69 74 65 33  regIdx : sqlite3
e7e0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
e7f0: 72 73 65 2c 20 6e 50 6b 46 69 65 6c 64 29 3b 0a  rse, nPkField);.
e800: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
e810: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
e820: 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
e830: 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
e840: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ab) ){.        s
e850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e860: 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
e870: 20 69 54 68 69 73 43 75 72 2c 20 72 65 67 52 29   iThisCur, regR)
e880: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ;.        /* Con
e890: 66 6c 69 63 74 20 6f 6e 6c 79 20 69 66 20 74 68  flict only if th
e8a0: 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
e8b0: 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 65 6e  xisting index en
e8c0: 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  try.        ** i
e8d0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
e8e0: 20 6f 6c 64 2d 72 6f 77 69 64 20 2a 2f 0a 20 20   old-rowid */.  
e8f0: 20 20 20 20 20 20 69 66 28 20 69 73 55 70 64 61        if( isUpda
e900: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
e910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e920: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52  3(v, OP_Eq, regR
e930: 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 20  , addrUniqueOk, 
e940: 72 65 67 4f 6c 64 44 61 74 61 29 3b 0a 20 20 20  regOldData);.   
e950: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e960: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
e970: 4c 49 54 45 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  LITE_NOTNULL);. 
e980: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
e990: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
e9a0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
e9b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  .        int x;.
e9c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
e9d0: 63 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ct the PRIMARY K
e9e0: 45 59 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  EY from the end 
e9f0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
ea00: 72 79 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  ry and.        *
ea10: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 72 65  * store it in re
ea20: 67 69 73 74 65 72 73 20 72 65 67 52 2e 2e 72 65  gisters regR..re
ea30: 67 52 2b 6e 50 6b 2d 31 20 2a 2f 0a 20 20 20 20  gR+nPk-1 */.    
ea40: 20 20 20 20 69 66 28 20 70 49 64 78 21 3d 70 50      if( pIdx!=pP
ea50: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  k ){.          f
ea60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e 6e  or(i=0; i<pPk->n
ea70: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
ea80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
ea90: 28 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  ( pPk->aiColumn[
eaa0: 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  i]>=0 );.       
eab0: 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
eac0: 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
ead0: 64 78 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  dx, pPk->aiColum
eae0: 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  n[i]);.         
eaf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eb00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
eb10: 6e 2c 20 69 54 68 69 73 43 75 72 2c 20 78 2c 20  n, iThisCur, x, 
eb20: 72 65 67 52 2b 69 29 3b 0a 20 20 20 20 20 20 20  regR+i);.       
eb30: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
eb40: 28 28 76 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  ((v, "%s.%s", pT
eb50: 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
eb80: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Pk->aiColumn[i]]
eb90: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  .zName));.      
eba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ebb0: 20 20 20 20 20 20 20 20 69 66 28 20 69 73 55 70          if( isUp
ebc0: 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  date ){.        
ebd0: 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c    /* If currentl
ebe0: 79 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  y processing the
ebf0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20   PRIMARY KEY of 
ec00: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
ec10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61  .          ** ta
ec20: 62 6c 65 2c 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69  ble, only confli
ec30: 63 74 20 69 66 20 74 68 65 20 6e 65 77 20 50 52  ct if the new PR
ec40: 49 4d 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73  IMARY KEY values
ec50: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20   are actually.  
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65          ** diffe
ec70: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c  rent from the ol
ec80: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  d..          **.
ec90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72            ** For
eca0: 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c   a UNIQUE index,
ecb0: 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69   only conflict i
ecc0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
ecd0: 59 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 20  Y values.       
ece0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74     ** of the mat
ecf0: 63 68 65 64 20 69 6e 64 65 78 20 72 6f 77 20 61  ched index row a
ed00: 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  re different fro
ed10: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 50  m the original P
ed20: 52 49 4d 41 52 59 0a 20 20 20 20 20 20 20 20 20  RIMARY.         
ed30: 20 2a 2a 20 4b 45 59 20 76 61 6c 75 65 73 20 6f   ** KEY values o
ed40: 66 20 74 68 69 73 20 72 6f 77 20 62 65 66 6f 72  f this row befor
ed50: 65 20 74 68 65 20 75 70 64 61 74 65 2e 20 20 2a  e the update.  *
ed60: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
ed70: 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74  addrJump = sqlit
ed80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ed90: 72 28 76 29 2b 70 50 6b 2d 3e 6e 4b 65 79 43 6f  r(v)+pPk->nKeyCo
eda0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  l;.          int
edb0: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 0a 20 20 20   op = OP_Ne;.   
edc0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 43 6d         int regCm
edd0: 70 20 3d 20 28 49 73 50 72 69 6d 61 72 79 4b 65  p = (IsPrimaryKe
ede0: 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 72  yIndex(pIdx) ? r
edf0: 65 67 49 64 78 20 3a 20 72 65 67 52 29 3b 0a 20  egIdx : regR);. 
ee00: 20 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28   .          for(
ee10: 69 3d 30 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79  i=0; i<pPk->nKey
ee20: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
ee30: 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 34 20         char *p4 
ee40: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
ee50: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
ee60: 61 72 73 65 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c  arse, pPk->azCol
ee70: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  l[i]);.         
ee80: 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f     x = pPk->aiCo
ee90: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
eea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
eeb0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
eec0: 20 69 66 28 20 69 3d 3d 28 70 50 6b 2d 3e 6e 4b   if( i==(pPk->nK
eed0: 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20  eyCol-1) ){.    
eee0: 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4a 75            addrJu
eef0: 6d 70 20 3d 20 61 64 64 72 55 6e 69 71 75 65 4f  mp = addrUniqueO
ef00: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
ef10: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 0a 20 20 20   op = OP_Eq;.   
ef20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ef30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef40: 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
ef50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef60: 20 72 65 67 4f 6c 64 44 61 74 61 2b 31 2b 78 2c   regOldData+1+x,
ef70: 20 61 64 64 72 4a 75 6d 70 2c 20 72 65 67 43 6d   addrJump, regCm
ef80: 70 2b 69 2c 20 70 34 2c 20 50 34 5f 43 4f 4c 4c  p+i, p4, P4_COLL
ef90: 53 45 51 0a 20 20 20 20 20 20 20 20 20 20 20 20  SEQ.            
efa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
efb0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
efc0: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
efd0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
efe0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
eff0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 29 3b  f(v, op==OP_Eq);
f000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
f010: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
f020: 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
f030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
f040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f050: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
f060: 63 6f 64 65 20 74 68 61 74 20 65 78 65 63 75 74  code that execut
f070: 65 73 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e  es if the new in
f080: 64 65 78 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  dex entry is not
f090: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 61   unique */.    a
f0a0: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
f0b0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f  OE_Rollback || o
f0c0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
f0d0: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
f0e0: 46 61 69 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20  Fail.        || 
f0f0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f  onError==OE_Igno
f100: 72 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f  re || onError==O
f110: 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20  E_Replace );.   
f120: 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72   switch( onError
f130: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
f140: 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  E_Rollback:.    
f150: 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a    case OE_Abort:
f160: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46  .      case OE_F
f170: 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ail: {.        s
f180: 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
f190: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f  traint(pParse, o
f1a0: 6e 45 72 72 6f 72 2c 20 70 49 64 78 29 3b 0a 20  nError, pIdx);. 
f1b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
f1d0: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20   OE_Ignore: {.  
f1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f1f0: 65 47 6f 74 6f 28 76 2c 20 69 67 6e 6f 72 65 44  eGoto(v, ignoreD
f200: 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  est);.        br
f210: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
f220: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
f230: 20 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70        Trigger *p
f240: 54 72 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20  Trigger = 0;.   
f250: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45       assert( onE
f260: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
f270: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
f280: 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50  te3MultiWrite(pP
f290: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
f2a0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  f( db->flags&SQL
f2b0: 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 20  ITE_RecTriggers 
f2c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 72  ){.          pTr
f2d0: 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
f2e0: 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50 61  riggersExist(pPa
f2f0: 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45  rse, pTab, TK_DE
f300: 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LETE, 0, 0);.   
f310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
f320: 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f  qlite3GenerateRo
f330: 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20  wDelete(pParse, 
f340: 70 54 61 62 2c 20 70 54 72 69 67 67 65 72 2c 20  pTab, pTrigger, 
f350: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
f360: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  r,.            r
f370: 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 2c 20 30  egR, nPkField, 0
f380: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 0a 20 20  , OE_Replace,.  
f390: 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 3d            (pIdx=
f3a0: 3d 70 50 6b 20 3f 20 4f 4e 45 50 41 53 53 5f 53  =pPk ? ONEPASS_S
f3b0: 49 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f  INGLE : ONEPASS_
f3c0: 4f 46 46 29 2c 20 69 54 68 69 73 43 75 72 29 3b  OFF), iThisCur);
f3d0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 52 65 70  .        seenRep
f3e0: 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  lace = 1;.      
f3f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f400: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f410: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f420: 65 6c 28 76 2c 20 61 64 64 72 55 6e 69 71 75 65  el(v, addrUnique
f430: 4f 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 65 67  Ok);.    if( reg
f440: 52 21 3d 72 65 67 49 64 78 20 29 20 73 71 6c 69  R!=regIdx ) sqli
f450: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
f460: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
f470: 2c 20 6e 50 6b 46 69 65 6c 64 29 3b 0a 20 20 7d  , nPkField);.  }
f480: 0a 20 20 69 66 28 20 69 70 6b 54 6f 70 20 29 7b  .  if( ipkTop ){
f490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f4a0: 47 6f 74 6f 28 76 2c 20 69 70 6b 54 6f 70 2b 31  Goto(v, ipkTop+1
f4b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f4c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 70  beJumpHere(v, ip
f4d0: 6b 42 6f 74 74 6f 6d 29 3b 0a 20 20 7d 0a 20 20  kBottom);.  }.  
f4e0: 0a 20 20 2a 70 62 4d 61 79 52 65 70 6c 61 63 65  .  *pbMayReplace
f4f0: 20 3d 20 73 65 65 6e 52 65 70 6c 61 63 65 3b 0a   = seenReplace;.
f500: 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
f510: 65 6e 74 28 28 76 2c 20 22 45 4e 44 3a 20 47 65  ent((v, "END: Ge
f520: 6e 43 6e 73 74 43 6b 73 28 25 64 29 22 2c 20 73  nCnstCks(%d)", s
f530: 65 65 6e 52 65 70 6c 61 63 65 29 29 3b 0a 7d 0a  eenReplace));.}.
f540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f550: 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d 0a  NABLE_NULL_TRIM.
f560: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
f570: 20 50 35 20 6f 70 65 72 61 6e 64 20 6f 6e 20 74   P5 operand on t
f580: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 28  he last opcode (
f590: 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
f5a0: 61 6e 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  an OP_MakeRecord
f5b0: 29 0a 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 6e  ).** to be the n
f5c0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f5d0: 20 69 6e 20 74 61 62 6c 65 20 70 54 61 62 20 74   in table pTab t
f5e0: 68 61 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  hat must not be 
f5f0: 4e 55 4c 4c 2d 74 72 69 6d 6d 65 64 2e 0a 2a 2a  NULL-trimmed..**
f600: 0a 2a 2a 20 4f 72 20 69 66 20 6e 6f 20 63 6f 6c  .** Or if no col
f610: 75 6d 6e 73 20 6f 66 20 70 54 61 62 20 6d 61 79  umns of pTab may
f620: 20 62 65 20 4e 55 4c 4c 2d 74 72 69 6d 6d 65 64   be NULL-trimmed
f630: 2c 20 6c 65 61 76 65 20 50 35 20 61 74 20 7a 65  , leave P5 at ze
f640: 72 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ro..*/.void sqli
f650: 74 65 33 53 65 74 4d 61 6b 65 52 65 63 6f 72 64  te3SetMakeRecord
f660: 50 35 28 56 64 62 65 20 2a 76 2c 20 54 61 62 6c  P5(Vdbe *v, Tabl
f670: 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 31 36 20  e *pTab){.  u16 
f680: 69 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 73  i;..  /* Records
f690: 20 77 69 74 68 20 6f 6d 69 74 74 65 64 20 63 6f   with omitted co
f6a0: 6c 75 6d 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61  lumns are only a
f6b0: 6c 6c 6f 77 65 64 20 66 6f 72 20 73 63 68 65 6d  llowed for schem
f6c0: 61 20 66 6f 72 6d 61 74 0a 20 20 2a 2a 20 76 65  a format.  ** ve
f6d0: 72 73 69 6f 6e 20 32 20 61 6e 64 20 6c 61 74 65  rsion 2 and late
f6e0: 72 20 28 53 51 4c 69 74 65 20 76 65 72 73 69 6f  r (SQLite versio
f6f0: 6e 20 33 2e 31 2e 34 2c 20 32 30 30 35 2d 30 32  n 3.1.4, 2005-02
f700: 2d 32 30 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  -20). */.  if( p
f710: 54 61 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  Tab->pSchema->fi
f720: 6c 65 5f 66 6f 72 6d 61 74 3c 32 20 29 20 72 65  le_format<2 ) re
f730: 74 75 72 6e 3b 0a 0a 20 20 66 6f 72 28 69 3d 70  turn;..  for(i=p
f740: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 3b 20 69 3e 30  Tab->nCol-1; i>0
f750: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
f760: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44  pTab->aCol[i].pD
f770: 66 6c 74 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  flt!=0 ) break;.
f780: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43      if( pTab->aC
f790: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
f7a0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
f7b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
f7c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f7d0: 65 50 35 28 76 2c 20 69 2b 31 29 3b 0a 7d 0a 23  eP5(v, i+1);.}.#
f7e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
f7f0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
f800: 74 65 73 20 63 6f 64 65 20 74 6f 20 66 69 6e 69  tes code to fini
f810: 73 68 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72  sh the INSERT or
f820: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
f830: 6e 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 73 74  n.** that was st
f840: 61 72 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  arted by a prior
f850: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
f860: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
f870: 6e 74 43 68 65 63 6b 73 2e 0a 2a 2a 20 41 20 63  ntChecks..** A c
f880: 6f 6e 73 65 63 75 74 69 76 65 20 72 61 6e 67 65  onsecutive range
f890: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
f8a0: 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77  arting at regNew
f8b0: 44 61 74 61 20 63 6f 6e 74 61 69 6e 73 20 74 68  Data contains th
f8c0: 65 0a 2a 2a 20 72 6f 77 69 64 20 61 6e 64 20 74  e.** rowid and t
f8d0: 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65  he content to be
f8e0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
f8f0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
f900: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
f910: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  hould be the sam
f920: 65 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  e as the first s
f930: 69 78 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ix.** arguments 
f940: 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  to sqlite3Genera
f950: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
f960: 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ks..*/.void sqli
f970: 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  te3CompleteInser
f980: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
f990: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
f9a0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
f9b0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
f9c0: 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ab,        /* th
f9d0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
f9e0: 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  ch we are insert
f9f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ing */.  int iDa
fa00: 74 61 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20  taCur,       /* 
fa10: 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 63 61  Cursor of the ca
fa20: 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 73 6f 75  nonical data sou
fa30: 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  rce */.  int iId
fa40: 78 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  xCur,        /* 
fa50: 46 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73  First index curs
fa60: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  or */.  int regN
fa70: 65 77 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 52  ewData,     /* R
fa80: 61 6e 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ange of content 
fa90: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64  */.  int *aRegId
faa0: 78 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  x,       /* Regi
fab0: 73 74 65 72 20 75 73 65 64 20 62 79 20 65 61 63  ster used by eac
fac0: 68 20 69 6e 64 65 78 2e 20 20 30 20 66 6f 72 20  h index.  0 for 
fad0: 75 6e 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a  unused indices *
fae0: 2f 0a 20 20 69 6e 74 20 75 70 64 61 74 65 5f 66  /.  int update_f
faf0: 6c 61 67 73 2c 20 20 20 2f 2a 20 54 72 75 65 20  lags,   /* True 
fb00: 66 6f 72 20 55 50 44 41 54 45 2c 20 46 61 6c 73  for UPDATE, Fals
fb10: 65 20 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a  e for INSERT */.
fb20: 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
fb30: 2c 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ,     /* True if
fb40: 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
fb50: 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 20  to be an append 
fb60: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 53 65 65 6b  */.  int useSeek
fb70: 52 65 73 75 6c 74 20 20 20 2f 2a 20 54 72 75 65  Result   /* True
fb80: 20 74 6f 20 73 65 74 20 74 68 65 20 55 53 45 53   to set the USES
fb90: 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
fba0: 6e 20 4f 50 5f 5b 49 64 78 5d 49 6e 73 65 72 74  n OP_[Idx]Insert
fbb0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
fbc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
fbd0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
fbe0: 6e 74 73 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  nts under constr
fbf0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
fc00: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
fc10: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 62 65 69 6e  /* An index bein
fc20: 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70  g inserted or up
fc30: 64 61 74 65 64 20 2a 2f 0a 20 20 75 38 20 70 69  dated */.  u8 pi
fc40: 6b 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  k_flags;       /
fc50: 2a 20 66 6c 61 67 20 76 61 6c 75 65 73 20 70 61  * flag values pa
fc60: 73 73 65 64 20 74 6f 20 74 68 65 20 62 74 72 65  ssed to the btre
fc70: 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e  e insert */.  in
fc80: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
fc90: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 72 65 67    /* Content reg
fca0: 69 73 74 65 72 73 20 28 61 66 74 65 72 20 74 68  isters (after th
fcb0: 65 20 72 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e  e rowid) */.  in
fcc0: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
fcd0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
fce0: 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
fcf0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74  record for the t
fd00: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd20: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
fd30: 0a 20 20 75 38 20 62 41 66 66 69 6e 69 74 79 44  .  u8 bAffinityD
fd40: 6f 6e 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  one = 0; /* True
fd50: 20 69 66 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   if OP_Affinity 
fd60: 68 61 73 20 62 65 65 6e 20 72 75 6e 20 61 6c 72  has been run alr
fd70: 65 61 64 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eady */..  asser
fd80: 74 28 20 75 70 64 61 74 65 5f 66 6c 61 67 73 3d  t( update_flags=
fd90: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 75 70 64  =0.       || upd
fda0: 61 74 65 5f 66 6c 61 67 73 3d 3d 4f 50 46 4c 41  ate_flags==OPFLA
fdb0: 47 5f 49 53 55 50 44 41 54 45 0a 20 20 20 20 20  G_ISUPDATE.     
fdc0: 20 20 7c 7c 20 75 70 64 61 74 65 5f 66 6c 61 67    || update_flag
fdd0: 73 3d 3d 28 4f 50 46 4c 41 47 5f 49 53 55 50 44  s==(OPFLAG_ISUPD
fde0: 41 54 45 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50  ATE|OPFLAG_SAVEP
fdf0: 4f 53 49 54 49 4f 4e 29 0a 20 20 29 3b 0a 0a 20  OSITION).  );.. 
fe00: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
fe10: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
fe20: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
fe30: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
fe40: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a  Select==0 );  /*
fe50: 20 54 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e   This table is n
fe60: 6f 74 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 66  ot a VIEW */.  f
fe70: 6f 72 28 69 3d 30 2c 20 70 49 64 78 3d 70 54 61  or(i=0, pIdx=pTa
fe80: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
fe90: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
fea0: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t, i++){.    if(
feb0: 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 20 29   aRegIdx[i]==0 )
fec0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
fed0: 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20 31  AffinityDone = 1
fee0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
fef0: 70 50 61 72 74 49 64 78 57 68 65 72 65 20 29 7b  pPartIdxWhere ){
ff00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ff10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ff20: 73 4e 75 6c 6c 2c 20 61 52 65 67 49 64 78 5b 69  sNull, aRegIdx[i
ff30: 5d 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  ], sqlite3VdbeCu
ff40: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
ff50: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
ff60: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
ff70: 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 28 75    pik_flags = (u
ff80: 73 65 53 65 65 6b 52 65 73 75 6c 74 20 3f 20 4f  seSeekResult ? O
ff90: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
ffa0: 55 4c 54 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  ULT : 0);.    if
ffb0: 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  ( IsPrimaryKeyIn
ffc0: 64 65 78 28 70 49 64 78 29 20 26 26 20 21 48 61  dex(pIdx) && !Ha
ffd0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
ffe0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
fff0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
10000 29 3b 0a 20 20 20 20 20 20 70 69 6b 5f 66 6c 61  );.      pik_fla
10010 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 4e 43 48  gs |= OPFLAG_NCH
10020 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 69 6b 5f  ANGE;.      pik_
10030 66 6c 61 67 73 20 7c 3d 20 28 75 70 64 61 74 65  flags |= (update
10040 5f 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  _flags & OPFLAG_
10050 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 3b 0a 23  SAVEPOSITION);.#
10060 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10070 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
10080 4f 4b 0a 20 20 20 20 20 20 69 66 28 20 75 70 64  OK.      if( upd
10090 61 74 65 5f 66 6c 61 67 73 3d 3d 30 20 29 7b 0a  ate_flags==0 ){.
100a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
100b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
100c0 49 6e 73 65 72 74 49 6e 74 2c 20 0a 20 20 20 20  InsertInt, .    
100d0 20 20 20 20 20 20 20 20 69 49 64 78 43 75 72 2b          iIdxCur+
100e0 69 2c 20 61 52 65 67 49 64 78 5b 69 5d 2c 20 30  i, aRegIdx[i], 0
100f0 2c 20 28 63 68 61 72 2a 29 70 54 61 62 2c 20 50  , (char*)pTab, P
10100 34 5f 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  4_TABLE.        
10110 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10120 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10130 2c 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29  , OPFLAG_ISNOOP)
10140 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
10150 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10160 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
10170 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
10180 20 69 49 64 78 43 75 72 2b 69 2c 20 61 52 65 67   iIdxCur+i, aReg
10190 49 64 78 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Idx[i],.        
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 61 52 65 67 49 64 78 5b 69 5d 2b 31 2c 0a 20   aRegIdx[i]+1,. 
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 75 6e          pIdx->un
101e0 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 70 49 64 78  iqNotNull ? pIdx
101f0 2d 3e 6e 4b 65 79 43 6f 6c 3a 20 70 49 64 78 2d  ->nKeyCol: pIdx-
10200 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73  >nColumn);.    s
10210 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10220 50 35 28 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29  P5(v, pik_flags)
10230 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 48 61 73  ;.  }.  if( !Has
10240 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 72 65  Rowid(pTab) ) re
10250 74 75 72 6e 3b 0a 20 20 72 65 67 44 61 74 61 20  turn;.  regData 
10260 3d 20 72 65 67 4e 65 77 44 61 74 61 20 2b 20 31  = regNewData + 1
10270 3b 0a 20 20 72 65 67 52 65 63 20 3d 20 73 71 6c  ;.  regRec = sql
10280 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10290 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
102a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
102b0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
102c0 67 44 61 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f  gData, pTab->nCo
102d0 6c 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 73 71  l, regRec);.  sq
102e0 6c 69 74 65 33 53 65 74 4d 61 6b 65 52 65 63 6f  lite3SetMakeReco
102f0 72 64 50 35 28 76 2c 20 70 54 61 62 29 3b 0a 20  rdP5(v, pTab);. 
10300 20 69 66 28 20 21 62 41 66 66 69 6e 69 74 79 44   if( !bAffinityD
10310 6f 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  one ){.    sqlit
10320 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
10330 76 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  v, pTab, 0);.   
10340 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10350 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
10360 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
10370 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
10380 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
10390 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 70 69  nested ){.    pi
103a0 6b 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  k_flags = 0;.  }
103b0 65 6c 73 65 7b 0a 20 20 20 20 70 69 6b 5f 66 6c  else{.    pik_fl
103c0 61 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43 48  ags = OPFLAG_NCH
103d0 41 4e 47 45 3b 0a 20 20 20 20 70 69 6b 5f 66 6c  ANGE;.    pik_fl
103e0 61 67 73 20 7c 3d 20 28 75 70 64 61 74 65 5f 66  ags |= (update_f
103f0 6c 61 67 73 3f 75 70 64 61 74 65 5f 66 6c 61 67  lags?update_flag
10400 73 3a 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57  s:OPFLAG_LASTROW
10410 49 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ID);.  }.  if( a
10420 70 70 65 6e 64 42 69 61 73 20 29 7b 0a 20 20 20  ppendBias ){.   
10430 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50   pik_flags |= OP
10440 46 4c 41 47 5f 41 50 50 45 4e 44 3b 0a 20 20 7d  FLAG_APPEND;.  }
10450 0a 20 20 69 66 28 20 75 73 65 53 65 65 6b 52 65  .  if( useSeekRe
10460 73 75 6c 74 20 29 7b 0a 20 20 20 20 70 69 6b 5f  sult ){.    pik_
10470 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f  flags |= OPFLAG_
10480 55 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20  USESEEKRESULT;. 
10490 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
104a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
104b0 65 72 74 2c 20 69 44 61 74 61 43 75 72 2c 20 72  ert, iDataCur, r
104c0 65 67 52 65 63 2c 20 72 65 67 4e 65 77 44 61 74  egRec, regNewDat
104d0 61 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73  a);.  if( !pPars
104e0 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20  e->nested ){.   
104f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
10500 6e 64 50 34 28 76 2c 20 70 54 61 62 2c 20 50 34  ndP4(v, pTab, P4
10510 5f 54 41 42 4c 45 29 3b 0a 20 20 7d 0a 20 20 73  _TABLE);.  }.  s
10520 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10530 50 35 28 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29  P5(v, pik_flags)
10540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
10550 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
10560 74 68 65 20 70 54 61 62 20 74 61 62 6c 65 20 61  the pTab table a
10570 6e 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  nd all its indic
10580 65 73 20 61 6e 64 20 67 65 6e 65 72 61 74 65 0a  es and generate.
10590 2a 2a 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  ** code to open 
105a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
105b0 74 68 6f 73 65 20 63 75 72 73 6f 72 73 2e 0a 2a  those cursors..*
105c0 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
105d0 66 6f 72 20 74 68 65 20 6f 62 6a 65 63 74 20 74  for the object t
105e0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
105f0 20 63 6f 6d 70 6c 65 74 65 20 64 61 74 61 20 28   complete data (
10600 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 68 65 20  normally.** the 
10610 74 61 62 6c 65 20 69 74 73 65 6c 66 2c 20 62 75  table itself, bu
10620 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  t the PRIMARY KE
10630 59 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 63  Y index in the c
10640 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54  ase of a WITHOUT
10650 0a 2a 2a 20 52 4f 57 49 44 20 74 61 62 6c 65 29  .** ROWID table)
10660 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20   is returned in 
10670 2a 70 69 44 61 74 61 43 75 72 2e 20 20 54 68 65  *piDataCur.  The
10680 20 66 69 72 73 74 20 69 6e 64 65 78 20 63 75 72   first index cur
10690 73 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  sor is.** return
106a0 65 64 20 69 6e 20 2a 70 69 49 64 78 43 75 72 2e  ed in *piIdxCur.
106b0 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
106c0 69 6e 64 69 63 65 73 20 69 73 20 72 65 74 75 72  indices is retur
106d0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 69  ned..**.** Use i
106e0 42 61 73 65 20 61 73 20 74 68 65 20 66 69 72 73  Base as the firs
106f0 74 20 63 75 72 73 6f 72 20 28 65 69 74 68 65 72  t cursor (either
10700 20 74 68 65 20 2a 70 69 44 61 74 61 43 75 72 20   the *piDataCur 
10710 66 6f 72 20 72 6f 77 69 64 20 74 61 62 6c 65 73  for rowid tables
10720 0a 2a 2a 20 6f 72 20 74 68 65 20 66 69 72 73 74  .** or the first
10730 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
10740 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 29  UT ROWID tables)
10750 20 69 66 20 69 74 20 69 73 20 6e 6f 6e 2d 6e 65   if it is non-ne
10760 67 61 74 69 76 65 2e 0a 2a 2a 20 49 66 20 69 42  gative..** If iB
10770 61 73 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  ase is negative,
10780 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74   then allocate t
10790 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c  he next availabl
107a0 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
107b0 46 6f 72 20 61 20 72 6f 77 69 64 20 74 61 62 6c  For a rowid tabl
107c0 65 2c 20 2a 70 69 44 61 74 61 43 75 72 20 77 69  e, *piDataCur wi
107d0 6c 6c 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  ll be exactly on
107e0 65 20 6c 65 73 73 20 74 68 61 6e 20 2a 70 69 49  e less than *piI
107f0 64 78 43 75 72 2e 0a 2a 2a 20 46 6f 72 20 61 20  dxCur..** For a 
10800 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
10810 62 6c 65 2c 20 2a 70 69 44 61 74 61 43 75 72 20  ble, *piDataCur 
10820 77 69 6c 6c 20 62 65 20 73 6f 6d 65 77 68 65 72  will be somewher
10830 65 20 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a  e in the range.*
10840 2a 20 6f 66 20 2a 70 69 49 64 78 43 75 72 73 2c  * of *piIdxCurs,
10850 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
10860 65 72 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ere the PRIMARY 
10870 4b 45 59 20 69 6e 64 65 78 20 61 70 70 65 61 72  KEY index appear
10880 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 54 61 62  s on the.** pTab
10890 2d 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e 0a 2a  ->pIndex list..*
108a0 2a 0a 2a 2a 20 49 66 20 70 54 61 62 20 69 73 20  *.** If pTab is 
108b0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
108c0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
108d0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
108e0 64 20 74 68 65 0a 2a 2a 20 2a 70 69 44 61 74 61  d the.** *piData
108f0 43 75 72 20 61 6e 64 20 2a 70 69 49 64 78 43 75  Cur and *piIdxCu
10900 72 20 76 61 6c 75 65 73 20 61 72 65 20 6c 65 66  r values are lef
10910 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  t uninitialized.
10920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
10930 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63  penTableAndIndic
10940 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
10950 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
10960 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
10970 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
10980 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 6f  /* Table to be o
10990 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  pened */.  int o
109a0 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  p,          /* O
109b0 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50  P_OpenRead or OP
109c0 5f 4f 70 65 6e 57 72 69 74 65 20 2a 2f 0a 20 20  _OpenWrite */.  
109d0 75 38 20 70 35 2c 20 20 20 20 20 20 20 20 20 20  u8 p5,          
109e0 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
109f0 20 4f 50 5f 4f 70 65 6e 2a 20 6f 70 63 6f 64 65   OP_Open* opcode
10a00 73 20 28 65 78 63 65 70 74 20 6f 6e 20 57 49 54  s (except on WIT
10a10 48 4f 55 54 20 52 4f 57 49 44 29 20 2a 2f 0a 20  HOUT ROWID) */. 
10a20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20   int iBase,     
10a30 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 66 6f    /* Use this fo
10a40 72 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  r the table curs
10a50 6f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  or, if there is 
10a60 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 2a 61 54 6f  one */.  u8 *aTo
10a70 4f 70 65 6e 2c 20 20 20 20 20 2f 2a 20 49 66 20  Open,     /* If 
10a80 6e 6f 74 20 4e 55 4c 4c 3a 20 62 6f 6f 6c 65 61  not NULL: boolea
10a90 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  n for each table
10aa0 20 61 6e 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20   and index */.  
10ab0 69 6e 74 20 2a 70 69 44 61 74 61 43 75 72 2c 20  int *piDataCur, 
10ac0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 61   /* Write the da
10ad0 74 61 62 61 73 65 20 73 6f 75 72 63 65 20 63 75  tabase source cu
10ae0 72 73 6f 72 20 6e 75 6d 62 65 72 20 68 65 72 65  rsor number here
10af0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49 64 78   */.  int *piIdx
10b00 43 75 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Cur    /* Write 
10b10 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 20  the first index 
10b20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 68 65  cursor number he
10b30 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
10b40 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69  ;.  int iDb;.  i
10b50 6e 74 20 69 44 61 74 61 43 75 72 3b 0a 20 20 49  nt iDataCur;.  I
10b60 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 56 64  ndex *pIdx;.  Vd
10b70 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
10b80 28 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61  ( op==OP_OpenRea
10b90 64 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e  d || op==OP_Open
10ba0 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72  Write );.  asser
10bb0 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72  t( op==OP_OpenWr
10bc0 69 74 65 20 7c 7c 20 70 35 3d 3d 30 20 29 3b 0a  ite || p5==0 );.
10bd0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
10be0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 2f 2a 20  pTab) ){.    /* 
10bf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10c00 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 76 69 72 74  a no-op for virt
10c10 75 61 6c 20 74 61 62 6c 65 73 2e 20 4c 65 61 76  ual tables. Leav
10c20 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
10c30 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 2a 70   ** variables *p
10c40 69 44 61 74 61 43 75 72 20 61 6e 64 20 2a 70 69  iDataCur and *pi
10c50 49 64 78 43 75 72 20 75 6e 69 6e 69 74 69 61 6c  IdxCur uninitial
10c60 69 7a 65 64 20 73 6f 20 74 68 61 74 20 76 61 6c  ized so that val
10c70 67 72 69 6e 64 0a 20 20 20 20 2a 2a 20 63 61 6e  grind.    ** can
10c80 20 64 65 74 65 63 74 20 69 66 20 74 68 65 79 20   detect if they 
10c90 61 72 65 20 75 73 65 64 20 62 79 20 6d 69 73 74  are used by mist
10ca0 61 6b 65 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  ake in the calle
10cb0 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  r. */.    return
10cc0 20 30 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20   0;.  }.  iDb = 
10cd0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
10ce0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
10cf0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
10d00 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
10d10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10d20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10d30 0a 20 20 69 66 28 20 69 42 61 73 65 3c 30 20 29  .  if( iBase<0 )
10d40 20 69 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d   iBase = pParse-
10d50 3e 6e 54 61 62 3b 0a 20 20 69 44 61 74 61 43 75  >nTab;.  iDataCu
10d60 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a 20 20 69  r = iBase++;.  i
10d70 66 28 20 70 69 44 61 74 61 43 75 72 20 29 20 2a  f( piDataCur ) *
10d80 70 69 44 61 74 61 43 75 72 20 3d 20 69 44 61 74  piDataCur = iDat
10d90 61 43 75 72 3b 0a 20 20 69 66 28 20 48 61 73 52  aCur;.  if( HasR
10da0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 28 61  owid(pTab) && (a
10db0 54 6f 4f 70 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f  ToOpen==0 || aTo
10dc0 4f 70 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Open[0]) ){.    
10dd0 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
10de0 28 70 50 61 72 73 65 2c 20 69 44 61 74 61 43 75  (pParse, iDataCu
10df0 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70  r, iDb, pTab, op
10e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10e10 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
10e20 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
10e30 61 62 2d 3e 74 6e 75 6d 2c 20 6f 70 3d 3d 4f 50  ab->tnum, op==OP
10e40 5f 4f 70 65 6e 57 72 69 74 65 2c 20 70 54 61 62  _OpenWrite, pTab
10e50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
10e60 69 66 28 20 70 69 49 64 78 43 75 72 20 29 20 2a  if( piIdxCur ) *
10e70 70 69 49 64 78 43 75 72 20 3d 20 69 42 61 73 65  piIdxCur = iBase
10e80 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 64  ;.  for(i=0, pId
10e90 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
10ea0 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
10eb0 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  >pNext, i++){.  
10ec0 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20    int iIdxCur = 
10ed0 69 42 61 73 65 2b 2b 3b 0a 20 20 20 20 61 73 73  iBase++;.    ass
10ee0 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
10ef0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
10f00 61 20 29 3b 0a 20 20 20 20 69 66 28 20 49 73 50  a );.    if( IsP
10f10 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
10f20 49 64 78 29 20 26 26 20 21 48 61 73 52 6f 77 69  Idx) && !HasRowi
10f30 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
10f40 20 69 66 28 20 70 69 44 61 74 61 43 75 72 20 29   if( piDataCur )
10f50 20 2a 70 69 44 61 74 61 43 75 72 20 3d 20 69 49   *piDataCur = iI
10f60 64 78 43 75 72 3b 0a 20 20 20 20 20 20 70 35 20  dxCur;.      p5 
10f70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
10f80 66 28 20 61 54 6f 4f 70 65 6e 3d 3d 30 20 7c 7c  f( aToOpen==0 ||
10f90 20 61 54 6f 4f 70 65 6e 5b 69 2b 31 5d 20 29 7b   aToOpen[i+1] ){
10fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10fb0 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
10fc0 69 49 64 78 43 75 72 2c 20 70 49 64 78 2d 3e 74  iIdxCur, pIdx->t
10fd0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  num, iDb);.     
10fe0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
10ff0 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
11000 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 73 71   pIdx);.      sq
11010 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11020 35 28 76 2c 20 70 35 29 3b 0a 20 20 20 20 20 20  5(v, p5);.      
11030 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11040 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
11050 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
11060 20 69 66 28 20 69 42 61 73 65 3e 70 50 61 72 73   if( iBase>pPars
11070 65 2d 3e 6e 54 61 62 20 29 20 70 50 61 72 73 65  e->nTab ) pParse
11080 2d 3e 6e 54 61 62 20 3d 20 69 42 61 73 65 3b 0a  ->nTab = iBase;.
11090 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 0a    return i;.}...
110a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
110b0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ST./*.** The fol
110c0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
110d0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
110e0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
110f0 68 65 0a 2a 2a 20 74 72 61 6e 73 66 65 72 20 6f  he.** transfer o
11100 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
11110 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 75 73  sed.  This is us
11120 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
11130 2a 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 20  * purposes only 
11140 2d 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  - to make sure t
11150 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
11160 6d 69 7a 61 74 69 6f 6e 20 72 65 61 6c 6c 79 0a  mization really.
11170 2a 2a 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ** is happening 
11180 77 68 65 6e 20 69 74 20 69 73 20 73 75 70 70 6f  when it is suppo
11190 73 65 64 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73  sed to..*/.int s
111a0 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
111b0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  ount;.#endif /* 
111c0 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
111d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
111e0 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 0a 2f 2a  OMIT_XFER_OPT./*
111f0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
11200 20 69 66 20 69 6e 64 65 78 20 70 53 72 63 20 69   if index pSrc i
11210 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 61 73 20  s compatible as 
11220 61 20 73 6f 75 72 63 65 20 6f 66 20 64 61 74 61  a source of data
11230 0a 2a 2a 20 66 6f 72 20 69 6e 64 65 78 20 70 44  .** for index pD
11240 65 73 74 20 69 6e 20 61 6e 20 69 6e 73 65 72 74  est in an insert
11250 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
11260 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 72 75 6c  zation.  The rul
11270 65 73 0a 2a 2a 20 66 6f 72 20 61 20 63 6f 6d 70  es.** for a comp
11280 61 74 69 62 6c 65 20 69 6e 64 65 78 3a 0a 2a 2a  atible index:.**
11290 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 69  .**    *   The i
112a0 6e 64 65 78 20 69 73 20 6f 76 65 72 20 74 68 65  ndex is over the
112b0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 63 6f 6c   same set of col
112c0 75 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20 20 20 54  umns.**    *   T
112d0 68 65 20 73 61 6d 65 20 44 45 53 43 20 61 6e 64  he same DESC and
112e0 20 41 53 43 20 6d 61 72 6b 69 6e 67 73 20 6f 63   ASC markings oc
112f0 63 75 72 73 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75  curs on all colu
11300 6d 6e 73 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68  mns.**    *   Th
11310 65 20 73 61 6d 65 20 6f 6e 45 72 72 6f 72 20 70  e same onError p
11320 72 6f 63 65 73 73 69 6e 67 20 28 4f 45 5f 41 62  rocessing (OE_Ab
11330 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
11340 65 74 63 29 0a 2a 2a 20 20 20 20 2a 20 20 20 54  etc).**    *   T
11350 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e  he same collatin
11360 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 65 61  g sequence on ea
11370 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20  ch column.**    
11380 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20 68 61  *   The index ha
11390 73 20 74 68 65 20 65 78 61 63 74 20 73 61 6d 65  s the exact same
113a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f   WHERE clause.*/
113b0 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66 65 72  .static int xfer
113c0 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28  CompatibleIndex(
113d0 49 6e 64 65 78 20 2a 70 44 65 73 74 2c 20 49 6e  Index *pDest, In
113e0 64 65 78 20 2a 70 53 72 63 29 7b 0a 20 20 69 6e  dex *pSrc){.  in
113f0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
11400 44 65 73 74 20 26 26 20 70 53 72 63 20 29 3b 0a  Dest && pSrc );.
11410 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11420 3e 70 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 70  >pTable!=pSrc->p
11430 54 61 62 6c 65 20 29 3b 0a 20 20 69 66 28 20 70  Table );.  if( p
11440 44 65 73 74 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70  Dest->nKeyCol!=p
11450 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Src->nKeyCol ){.
11460 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11470 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 6e 75 6d  /* Different num
11480 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
11490 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73  /.  }.  if( pDes
114a0 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 53 72 63  t->onError!=pSrc
114b0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
114c0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
114d0 44 69 66 66 65 72 65 6e 74 20 63 6f 6e 66 6c 69  Different confli
114e0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 73 74  ct resolution st
114f0 72 61 74 65 67 69 65 73 20 2a 2f 0a 20 20 7d 0a  rategies */.  }.
11500 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
11510 63 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29  c->nKeyCol; i++)
11520 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
11530 61 69 43 6f 6c 75 6d 6e 5b 69 5d 21 3d 70 44 65  aiColumn[i]!=pDe
11540 73 74 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  st->aiColumn[i] 
11550 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11560 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e  0;   /* Differen
11570 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 64 65 78 65  t columns indexe
11580 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  d */.    }.    i
11590 66 28 20 70 53 72 63 2d 3e 61 69 43 6f 6c 75 6d  f( pSrc->aiColum
115a0 6e 5b 69 5d 3d 3d 58 4e 5f 45 58 50 52 20 29 7b  n[i]==XN_EXPR ){
115b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
115c0 53 72 63 2d 3e 61 43 6f 6c 45 78 70 72 21 3d 30  Src->aColExpr!=0
115d0 20 26 26 20 70 44 65 73 74 2d 3e 61 43 6f 6c 45   && pDest->aColE
115e0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
115f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11600 6f 6d 70 61 72 65 28 30 2c 20 70 53 72 63 2d 3e  ompare(0, pSrc->
11610 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 5d 2e 70  aColExpr->a[i].p
11620 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 70 44 65 73 74 2d 3e 61 43 6f 6c 45 78     pDest->aColEx
11650 70 72 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  pr->a[i].pExpr, 
11660 2d 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)!=0 ){.      
11670 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
11680 20 44 69 66 66 65 72 65 6e 74 20 65 78 70 72 65   Different expre
11690 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 69 6e  ssions in the in
116a0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  dex */.      }. 
116b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 72     }.    if( pSr
116c0 63 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  c->aSortOrder[i]
116d0 21 3d 70 44 65 73 74 2d 3e 61 53 6f 72 74 4f 72  !=pDest->aSortOr
116e0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
116f0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44  return 0;   /* D
11700 69 66 66 65 72 65 6e 74 20 73 6f 72 74 20 6f 72  ifferent sort or
11710 64 65 72 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ders */.    }.  
11720 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
11730 72 69 63 6d 70 28 70 53 72 63 2d 3e 61 7a 43 6f  ricmp(pSrc->azCo
11740 6c 6c 5b 69 5d 2c 70 44 65 73 74 2d 3e 61 7a 43  ll[i],pDest->azC
11750 6f 6c 6c 5b 69 5d 29 21 3d 30 20 29 7b 0a 20 20  oll[i])!=0 ){.  
11760 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11770 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c  /* Different col
11780 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
11790 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
117a0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
117b0 6f 6d 70 61 72 65 28 30 2c 20 70 53 72 63 2d 3e  ompare(0, pSrc->
117c0 70 50 61 72 74 49 64 78 57 68 65 72 65 2c 20 70  pPartIdxWhere, p
117d0 44 65 73 74 2d 3e 70 50 61 72 74 49 64 78 57 68  Dest->pPartIdxWh
117e0 65 72 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  ere, -1) ){.    
117f0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
11800 20 44 69 66 66 65 72 65 6e 74 20 57 48 45 52 45   Different WHERE
11810 20 63 6c 61 75 73 65 73 20 2a 2f 0a 20 20 7d 0a   clauses */.  }.
11820 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 74 65 73 74  .  /* If no test
11830 20 61 62 6f 76 65 20 66 61 69 6c 73 20 74 68 65   above fails the
11840 6e 20 74 68 65 20 69 6e 64 69 63 65 73 20 6d 75  n the indices mu
11850 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
11860 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
11870 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
11880 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70   the transfer op
11890 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 49 4e  timization on IN
118a0 53 45 52 54 73 20 6f 66 20 74 68 65 20 66 6f 72  SERTs of the for
118b0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45  m.**.**     INSE
118c0 52 54 20 49 4e 54 4f 20 74 61 62 31 20 53 45 4c  RT INTO tab1 SEL
118d0 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 32 3b  ECT * FROM tab2;
118e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20  .**.** The xfer 
118f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 61  optimization tra
11900 6e 73 66 65 72 73 20 72 61 77 20 72 65 63 6f 72  nsfers raw recor
11910 64 73 20 66 72 6f 6d 20 74 61 62 32 20 6f 76 65  ds from tab2 ove
11920 72 20 74 6f 20 74 61 62 31 2e 20 20 0a 2a 2a 20  r to tab1.  .** 
11930 43 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  Columns are not 
11940 64 65 63 6f 64 65 64 20 61 6e 64 20 72 65 61 73  decoded and reas
11950 73 65 6d 62 6c 65 64 2c 20 77 68 69 63 68 20 67  sembled, which g
11960 72 65 61 74 6c 79 20 69 6d 70 72 6f 76 65 73 0a  reatly improves.
11970 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  ** performance. 
11980 20 52 61 77 20 69 6e 64 65 78 20 72 65 63 6f 72   Raw index recor
11990 64 73 20 61 72 65 20 74 72 61 6e 73 66 65 72 72  ds are transferr
119a0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
119b0 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 66  ay..**.** The xf
119c0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
119d0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
119e0 64 20 69 66 20 74 61 62 31 20 61 6e 64 20 74 61  d if tab1 and ta
119f0 62 32 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c  b2 are compatibl
11a00 65 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  e..** There are 
11a10 6c 6f 74 73 20 6f 66 20 72 75 6c 65 73 20 66 6f  lots of rules fo
11a20 72 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 63 6f  r determining co
11a30 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 73 65  mpatibility - se
11a40 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 65 6d  e comments.** em
11a50 62 65 64 64 65 64 20 69 6e 20 74 68 65 20 63 6f  bedded in the co
11a60 64 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  de for details..
11a70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11a80 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
11a90 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
11aa0 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
11ab0 64 20 74 6f 20 62 65 20 75 73 65 64 2e 0a 2a 2a  d to be used..**
11ac0 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 78   Sometimes the x
11ad0 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
11ae0 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20   will only work 
11af0 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  if the destinati
11b00 6f 6e 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 65  on table.** is e
11b10 6d 70 74 79 20 2d 20 61 20 66 61 63 74 6f 72 20  mpty - a factor 
11b20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65  that can only be
11b30 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
11b40 75 6e 2d 74 69 6d 65 2e 20 20 49 6e 20 74 68 61  un-time.  In tha
11b50 74 0a 2a 2a 20 63 61 73 65 2c 20 74 68 69 73 20  t.** case, this 
11b60 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
11b70 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 78  s code for the x
11b80 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
11b90 20 62 75 74 20 61 6c 73 6f 0a 2a 2a 20 64 6f 65   but also.** doe
11ba0 73 20 61 20 74 65 73 74 20 74 6f 20 73 65 65 20  s a test to see 
11bb0 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  if the destinati
11bc0 6f 6e 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  on table is empt
11bd0 79 20 61 6e 64 20 6a 75 6d 70 73 20 6f 76 65 72  y and jumps over
11be0 20 74 68 65 0a 2a 2a 20 78 66 65 72 20 6f 70 74   the.** xfer opt
11bf0 69 6d 69 7a 61 74 69 6f 6e 20 63 6f 64 65 20 69  imization code i
11c00 66 20 74 68 65 20 74 65 73 74 20 66 61 69 6c 73  f the test fails
11c10 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
11c20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
11c30 20 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 73   returns FALSE s
11c40 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
11c50 72 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 67  r will know to g
11c60 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 6e 65  o ahead and gene
11c70 72 61 74 65 0a 2a 2a 20 61 6e 20 75 6e 6f 70 74  rate.** an unopt
11c80 69 6d 69 7a 65 64 20 74 72 61 6e 73 66 65 72 2e  imized transfer.
11c90 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
11ca0 6c 73 6f 20 72 65 74 75 72 6e 73 20 46 41 4c 53  lso returns FALS
11cb0 45 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 69 73  E if there.** is
11cc0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
11cd0 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
11ce0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 61 70 70  ation can be app
11cf0 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lied..**.** This
11d00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
11d10 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 75 73   particularly us
11d20 65 66 75 6c 20 61 74 20 6d 61 6b 69 6e 67 20 56  eful at making V
11d30 41 43 55 55 4d 20 72 75 6e 20 66 61 73 74 65 72  ACUUM run faster
11d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d50 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  xferOptimization
11d60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11d70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
11d80 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
11d90 20 54 61 62 6c 65 20 2a 70 44 65 73 74 2c 20 20   Table *pDest,  
11da0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
11db0 62 6c 65 20 77 65 20 61 72 65 20 69 6e 73 65 72  ble we are inser
11dc0 74 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a 20 20 53  ting into */.  S
11dd0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
11de0 20 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54       /* A SELECT
11df0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 73   statement to us
11e00 65 20 61 73 20 74 68 65 20 64 61 74 61 20 73 6f  e as the data so
11e10 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  urce */.  int on
11e20 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
11e30 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
11e40 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
11e50 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 44  rs */.  int iDbD
11e60 65 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  est           /*
11e70 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 66   The database of
11e80 20 70 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 73   pDest */.){.  s
11e90 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11ea0 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c  rse->db;.  ExprL
11eb0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11ed0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
11ee0 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20   the SELECT */. 
11ef0 20 54 61 62 6c 65 20 2a 70 53 72 63 3b 20 20 20   Table *pSrc;   
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
11f20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
11f30 65 20 6f 66 20 53 45 4c 45 43 54 20 2a 2f 0a 20  e of SELECT */. 
11f40 20 49 6e 64 65 78 20 2a 70 53 72 63 49 64 78 2c   Index *pSrcIdx,
11f50 20 2a 70 44 65 73 74 49 64 78 3b 20 20 20 20 20   *pDestIdx;     
11f60 20 20 2f 2a 20 53 6f 75 72 63 65 20 61 6e 64 20    /* Source and 
11f70 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6e 64 69  destination indi
11f80 63 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ces */.  struct 
11f90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
11fa0 74 65 6d 3b 20 20 20 20 20 20 2f 2a 20 41 6e 20  tem;      /* An 
11fb0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 53 65 6c 65  element of pSele
11fc0 63 74 2d 3e 70 53 72 63 20 2a 2f 0a 20 20 69 6e  ct->pSrc */.  in
11fd0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ff0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
12000 2f 0a 20 20 69 6e 74 20 69 44 62 53 72 63 3b 20  /.  int iDbSrc; 
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
12030 62 61 73 65 20 6f 66 20 70 53 72 63 20 2a 2f 0a  base of pSrc */.
12040 20 20 69 6e 74 20 69 53 72 63 2c 20 69 44 65 73    int iSrc, iDes
12050 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12060 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 66 72     /* Cursors fr
12070 6f 6d 20 73 6f 75 72 63 65 20 61 6e 64 20 64 65  om source and de
12080 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  stination */.  i
12090 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 2f 2a 20 4c 6f 6f 70 20 61 64 64 72 65 73 73 65  /* Loop addresse
120c0 73 20 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79  s */.  int empty
120d0 44 65 73 74 54 65 73 74 20 3d 20 30 3b 20 20 20  DestTest = 0;   
120e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
120f0 73 73 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65  ss of test for e
12100 6d 70 74 79 20 70 44 65 73 74 20 2a 2f 0a 20 20  mpty pDest */.  
12110 69 6e 74 20 65 6d 70 74 79 53 72 63 54 65 73 74  int emptySrcTest
12120 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12130 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
12140 65 73 74 20 66 6f 72 20 65 6d 70 74 79 20 70 53  est for empty pS
12150 72 63 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  rc */.  Vdbe *v;
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12180 56 44 42 45 20 77 65 20 61 72 65 20 62 75 69 6c  VDBE we are buil
12190 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ding */.  int re
121a0 67 41 75 74 6f 69 6e 63 3b 20 20 20 20 20 20 20  gAutoinc;       
121b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
121c0 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 75 73  mory register us
121d0 65 64 20 62 79 20 41 55 54 4f 49 4e 43 20 2a 2f  ed by AUTOINC */
121e0 0a 20 20 69 6e 74 20 64 65 73 74 48 61 73 55 6e  .  int destHasUn
121f0 69 71 75 65 49 64 78 20 3d 20 30 3b 20 20 20 20  iqueIdx = 0;    
12200 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
12210 44 65 73 74 20 68 61 73 20 61 20 55 4e 49 51 55  Dest has a UNIQU
12220 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  E index */.  int
12230 20 72 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77   regData, regRow
12240 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id;           /*
12250 20 52 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   Registers holdi
12260 6e 67 20 64 61 74 61 20 61 6e 64 20 72 6f 77 69  ng data and rowi
12270 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 65 6c  d */..  if( pSel
12280 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
12290 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4d 75 73  turn 0;   /* Mus
122a0 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  t be of the form
122b0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e    INSERT INTO ..
122c0 2e 20 53 45 4c 45 43 54 20 2e 2e 2e 20 2a 2f 0a  . SELECT ... */.
122d0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
122e0 2d 3e 70 57 69 74 68 20 7c 7c 20 70 53 65 6c 65  ->pWith || pSele
122f0 63 74 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20  ct->pWith ){.   
12300 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
12310 70 74 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  pt to process th
12320 69 73 20 71 75 65 72 79 20 69 66 20 74 68 65 72  is query if ther
12330 65 20 61 72 65 20 61 6e 20 57 49 54 48 20 63 6c  e are an WITH cl
12340 61 75 73 65 73 0a 20 20 20 20 2a 2a 20 61 74 74  auses.    ** att
12350 61 63 68 65 64 20 74 6f 20 69 74 2e 20 50 72 6f  ached to it. Pro
12360 63 65 65 64 69 6e 67 20 6d 61 79 20 67 65 6e 65  ceeding may gene
12370 72 61 74 65 20 61 20 66 61 6c 73 65 20 22 6e 6f  rate a false "no
12380 20 73 75 63 68 20 74 61 62 6c 65 3a 20 78 78 78   such table: xxx
12390 22 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 69  ".    ** error i
123a0 66 20 70 53 65 6c 65 63 74 20 72 65 61 64 73 20  f pSelect reads 
123b0 66 72 6f 6d 20 61 20 43 54 45 20 6e 61 6d 65 64  from a CTE named
123c0 20 22 78 78 78 22 2e 20 20 2a 2f 0a 20 20 20 20   "xxx".  */.    
123d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
123e0 69 66 28 20 73 71 6c 69 74 65 33 54 72 69 67 67  if( sqlite3Trigg
123f0 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
12400 44 65 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74  Dest) ){.    ret
12410 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 31  urn 0;   /* tab1
12420 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 74   must not have t
12430 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 23  riggers */.  }.#
12440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12450 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12460 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
12470 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 72 65  pDest) ){.    re
12480 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62  turn 0;   /* tab
12490 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  1 must not be a 
124a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
124b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
124c0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ( onError==OE_De
124d0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 69 66 28  fault ){.    if(
124e0 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 3e 3d 30   pDest->iPKey>=0
124f0 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 70 44 65   ) onError = pDe
12500 73 74 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20 20 20  st->keyConf;.   
12510 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
12520 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72 72  _Default ) onErr
12530 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
12540 20 7d 0a 20 20 61 73 73 65 72 74 28 70 53 65 6c   }.  assert(pSel
12550 65 63 74 2d 3e 70 53 72 63 29 3b 20 20 20 2f 2a  ect->pSrc);   /*
12560 20 61 6c 6c 6f 63 61 74 65 64 20 65 76 65 6e 20   allocated even 
12570 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 46  if there is no F
12580 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
12590 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  if( pSelect->pSr
125a0 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
125b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
125c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6d 75 73   FROM clause mus
125d0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
125e0 6e 65 20 74 65 72 6d 20 2a 2f 0a 20 20 7d 0a 20  ne term */.  }. 
125f0 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53   if( pSelect->pS
12600 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
12610 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12620 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  ;   /* FROM clau
12630 73 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69  se cannot contai
12640 6e 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  n a subquery */.
12650 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
12660 74 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  t->pWhere ){.   
12670 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
12680 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68  SELECT may not h
12690 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
126a0 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  se */.  }.  if( 
126b0 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
126c0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
126d0 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d  0;   /* SELECT m
126e0 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f  ay not have an O
126f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
12700 2f 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f  /.  }.  /* Do no
12710 74 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66  t need to test f
12720 6f 72 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  or a HAVING clau
12730 73 65 2e 20 20 49 66 20 48 41 56 49 4e 47 20 69  se.  If HAVING i
12740 73 20 70 72 65 73 65 6e 74 20 62 75 74 0a 20 20  s present but.  
12750 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  ** there is no O
12760 52 44 45 52 20 42 59 2c 20 77 65 20 77 69 6c 6c  RDER BY, we will
12770 20 67 65 74 20 61 6e 20 65 72 72 6f 72 2e 20 2a   get an error. *
12780 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  /.  if( pSelect-
12790 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
127a0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
127b0 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68  SELECT may not h
127c0 61 76 65 20 61 20 47 52 4f 55 50 20 42 59 20 63  ave a GROUP BY c
127d0 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69  lause */.  }.  i
127e0 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4c 69 6d  f( pSelect->pLim
127f0 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
12800 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20   0;   /* SELECT 
12810 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  may not have a L
12820 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
12830 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74   }.  if( pSelect
12840 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
12850 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53  return 0;   /* S
12860 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62 65  ELECT may not be
12870 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
12880 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  y */.  }.  if( p
12890 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
128a0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
128b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
128c0 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
128d0 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 20  not be DISTINCT 
128e0 2a 2f 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20  */.  }.  pEList 
128f0 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
12900 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
12910 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ist!=0 );.  if( 
12920 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
12930 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12940 3b 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c  ;   /* The resul
12950 74 20 73 65 74 20 6d 75 73 74 20 68 61 76 65 20  t set must have 
12960 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6c 75  exactly one colu
12970 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  mn */.  }.  asse
12980 72 74 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  rt( pEList->a[0]
12990 2e 70 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20  .pExpr );.  if( 
129a0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
129b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  pr->op!=TK_ASTER
129c0 49 53 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ISK ){.    retur
129d0 6e 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 72 65  n 0;   /* The re
129e0 73 75 6c 74 20 73 65 74 20 6d 75 73 74 20 62 65  sult set must be
129f0 20 74 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65   the special ope
12a00 72 61 74 6f 72 20 22 2a 22 20 2a 2f 0a 20 20 7d  rator "*" */.  }
12a10 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
12a20 6f 69 6e 74 20 77 65 20 68 61 76 65 20 65 73 74  oint we have est
12a30 61 62 6c 69 73 68 65 64 20 74 68 61 74 20 74 68  ablished that th
12a40 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
12a50 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 72 72 65  f the.  ** corre
12a60 63 74 20 73 79 6e 74 61 63 74 69 63 20 66 6f 72  ct syntactic for
12a70 6d 20 74 6f 20 70 61 72 74 69 63 69 70 61 74 65  m to participate
12a80 20 69 6e 20 74 68 69 73 20 6f 70 74 69 6d 69 7a   in this optimiz
12a90 61 74 69 6f 6e 2e 20 20 4e 6f 77 0a 20 20 2a 2a  ation.  Now.  **
12aa0 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63   we have to chec
12ab0 6b 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 2e  k the semantics.
12ac0 0a 20 20 2a 2f 0a 20 20 70 49 74 65 6d 20 3d 20  .  */.  pItem = 
12ad0 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61  pSelect->pSrc->a
12ae0 3b 0a 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74  ;.  pSrc = sqlit
12af0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
12b00 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74  m(pParse, 0, pIt
12b10 65 6d 29 3b 0a 20 20 69 66 28 20 70 53 72 63 3d  em);.  if( pSrc=
12b20 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
12b30 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c   0;   /* FROM cl
12b40 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ause does not co
12b50 6e 74 61 69 6e 20 61 20 72 65 61 6c 20 74 61 62  ntain a real tab
12b60 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  le */.  }.  if( 
12b70 70 53 72 63 3d 3d 70 44 65 73 74 20 29 7b 0a 20  pSrc==pDest ){. 
12b80 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
12b90 2a 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20  * tab1 and tab2 
12ba0 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 73  may not be the s
12bb0 61 6d 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d  ame table */.  }
12bc0 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28  .  if( HasRowid(
12bd0 70 44 65 73 74 29 21 3d 48 61 73 52 6f 77 69 64  pDest)!=HasRowid
12be0 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 72 65  (pSrc) ){.    re
12bf0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 73 6f 75  turn 0;   /* sou
12c00 72 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74  rce and destinat
12c10 69 6f 6e 20 6d 75 73 74 20 62 6f 74 68 20 62 65  ion must both be
12c20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 6f   WITHOUT ROWID o
12c30 72 20 6e 6f 74 20 2a 2f 0a 20 20 7d 0a 23 69 66  r not */.  }.#if
12c40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12c50 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
12c60 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 53  if( IsVirtual(pS
12c70 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
12c80 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d  n 0;   /* tab2 m
12c90 75 73 74 20 6e 6f 74 20 62 65 20 61 20 76 69 72  ust not be a vir
12ca0 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
12cb0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
12cc0 53 72 63 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Src->pSelect ){.
12cd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
12ce0 2f 2a 20 74 61 62 32 20 6d 61 79 20 6e 6f 74 20  /* tab2 may not 
12cf0 62 65 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 7d  be a view */.  }
12d00 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 43  .  if( pDest->nC
12d10 6f 6c 21 3d 70 53 72 63 2d 3e 6e 43 6f 6c 20 29  ol!=pSrc->nCol )
12d20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
12d30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
12d40 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 74  olumns must be t
12d50 68 65 20 73 61 6d 65 20 69 6e 20 74 61 62 31 20  he same in tab1 
12d60 61 6e 64 20 74 61 62 32 20 2a 2f 0a 20 20 7d 0a  and tab2 */.  }.
12d70 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b    if( pDest->iPK
12d80 65 79 21 3d 70 53 72 63 2d 3e 69 50 4b 65 79 20  ey!=pSrc->iPKey 
12d90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12da0 20 20 20 2f 2a 20 42 6f 74 68 20 74 61 62 6c 65     /* Both table
12db0 73 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  s must have the 
12dc0 73 61 6d 65 20 49 4e 54 45 47 45 52 20 50 52 49  same INTEGER PRI
12dd0 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 7d 0a  MARY KEY */.  }.
12de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 65    for(i=0; i<pDe
12df0 73 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  st->nCol; i++){.
12e00 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 44 65 73      Column *pDes
12e10 74 43 6f 6c 20 3d 20 26 70 44 65 73 74 2d 3e 61  tCol = &pDest->a
12e20 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 43 6f 6c 75  Col[i];.    Colu
12e30 6d 6e 20 2a 70 53 72 63 43 6f 6c 20 3d 20 26 70  mn *pSrcCol = &p
12e40 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 23 69  Src->aCol[i];.#i
12e50 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12e60 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e  LE_HIDDEN_COLUMN
12e70 53 0a 20 20 20 20 69 66 28 20 28 64 62 2d 3e 6d  S.    if( (db->m
12e80 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
12e90 5f 56 61 63 75 75 6d 29 3d 3d 30 20 0a 20 20 20  _Vacuum)==0 .   
12ea0 20 20 26 26 20 28 70 44 65 73 74 43 6f 6c 2d 3e    && (pDestCol->
12eb0 63 6f 6c 46 6c 61 67 73 20 7c 20 70 53 72 63 43  colFlags | pSrcC
12ec0 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 29 20 26 20  ol->colFlags) & 
12ed0 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 20 0a  COLFLAG_HIDDEN .
12ee0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
12ef0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 4e 65 69  urn 0;    /* Nei
12f00 74 68 65 72 20 74 61 62 6c 65 20 6d 61 79 20 68  ther table may h
12f10 61 76 65 20 5f 5f 68 69 64 64 65 6e 5f 5f 20 63  ave __hidden__ c
12f20 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
12f30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
12f40 44 65 73 74 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  DestCol->affinit
12f50 79 21 3d 70 53 72 63 43 6f 6c 2d 3e 61 66 66 69  y!=pSrcCol->affi
12f60 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 72 65  nity ){.      re
12f70 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 41 66  turn 0;    /* Af
12f80 66 69 6e 69 74 79 20 6d 75 73 74 20 62 65 20 74  finity must be t
12f90 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63  he same on all c
12fa0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
12fb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
12fc0 73 74 72 69 63 6d 70 28 70 44 65 73 74 43 6f 6c  stricmp(pDestCol
12fd0 2d 3e 7a 43 6f 6c 6c 2c 20 70 53 72 63 43 6f 6c  ->zColl, pSrcCol
12fe0 2d 3e 7a 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20  ->zColl)!=0 ){. 
12ff0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
13000 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
13010 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
13020 74 68 65 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20  the same on all 
13030 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
13040 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 43 6f  .    if( pDestCo
13050 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 26 26 20 21 70  l->notNull && !p
13060 53 72 63 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20  SrcCol->notNull 
13070 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13080 30 3b 20 20 20 20 2f 2a 20 74 61 62 32 20 6d 75  0;    /* tab2 mu
13090 73 74 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 20 69  st be NOT NULL i
130a0 66 20 74 61 62 31 20 69 73 20 2a 2f 0a 20 20 20  f tab1 is */.   
130b0 20 7d 0a 20 20 20 20 2f 2a 20 44 65 66 61 75 6c   }.    /* Defaul
130c0 74 20 76 61 6c 75 65 73 20 66 6f 72 20 73 65 63  t values for sec
130d0 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
130e0 6e 74 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 20  nt columns need 
130f0 74 6f 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20  to match. */.   
13100 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
13110 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 43    assert( pDestC
13120 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20 7c 7c 20  ol->pDflt==0 || 
13130 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 2d  pDestCol->pDflt-
13140 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b 0a  >op==TK_SPAN );.
13150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
13160 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 20  rcCol->pDflt==0 
13170 7c 7c 20 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c  || pSrcCol->pDfl
13180 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29  t->op==TK_SPAN )
13190 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 44 65  ;.      if( (pDe
131a0 73 74 43 6f 6c 2d 3e 70 44 66 6c 74 3d 3d 30 29  stCol->pDflt==0)
131b0 21 3d 28 70 53 72 63 43 6f 6c 2d 3e 70 44 66 6c  !=(pSrcCol->pDfl
131c0 74 3d 3d 30 29 20 0a 20 20 20 20 20 20 20 7c 7c  t==0) .       ||
131d0 20 28 70 44 65 73 74 43 6f 6c 2d 3e 70 44 66 6c   (pDestCol->pDfl
131e0 74 20 26 26 20 73 74 72 63 6d 70 28 70 44 65 73  t && strcmp(pDes
131f0 74 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e 7a  tCol->pDflt->u.z
13200 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20 20  Token,.         
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
13230 72 63 43 6f 6c 2d 3e 70 44 66 6c 74 2d 3e 75 2e  rcCol->pDflt->u.
13240 7a 54 6f 6b 65 6e 29 21 3d 30 29 0a 20 20 20 20  zToken)!=0).    
13250 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
13260 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 44 65 66  urn 0;    /* Def
13270 61 75 6c 74 20 76 61 6c 75 65 73 20 6d 75 73 74  ault values must
13280 20 62 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72   be the same for
13290 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   all columns */.
132a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
132b0 7d 0a 20 20 66 6f 72 28 70 44 65 73 74 49 64 78  }.  for(pDestIdx
132c0 3d 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20  =pDest->pIndex; 
132d0 70 44 65 73 74 49 64 78 3b 20 70 44 65 73 74 49  pDestIdx; pDestI
132e0 64 78 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e 65  dx=pDestIdx->pNe
132f0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 49 73 55  xt){.    if( IsU
13300 6e 69 71 75 65 49 6e 64 65 78 28 70 44 65 73 74  niqueIndex(pDest
13310 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 64 65  Idx) ){.      de
13320 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 3d  stHasUniqueIdx =
13330 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   1;.    }.    fo
13340 72 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e  r(pSrcIdx=pSrc->
13350 70 49 6e 64 65 78 3b 20 70 53 72 63 49 64 78 3b  pIndex; pSrcIdx;
13360 20 70 53 72 63 49 64 78 3d 70 53 72 63 49 64 78   pSrcIdx=pSrcIdx
13370 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13380 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74 69 62  if( xferCompatib
13390 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49 64 78  leIndex(pDestIdx
133a0 2c 20 70 53 72 63 49 64 78 29 20 29 20 62 72 65  , pSrcIdx) ) bre
133b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
133c0 28 20 70 53 72 63 49 64 78 3d 3d 30 20 29 7b 0a  ( pSrcIdx==0 ){.
133d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
133e0 20 20 20 2f 2a 20 70 44 65 73 74 49 64 78 20 68     /* pDestIdx h
133f0 61 73 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64  as no correspond
13400 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 70 53 72  ing index in pSr
13410 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  c */.    }.  }.#
13420 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13430 49 54 5f 43 48 45 43 4b 0a 20 20 69 66 28 20 70  IT_CHECK.  if( p
13440 44 65 73 74 2d 3e 70 43 68 65 63 6b 20 26 26 20  Dest->pCheck && 
13450 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
13460 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e 70 43 68  ompare(pSrc->pCh
13470 65 63 6b 2c 70 44 65 73 74 2d 3e 70 43 68 65 63  eck,pDest->pChec
13480 6b 2c 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  k,-1) ){.    ret
13490 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c  urn 0;   /* Tabl
134a0 65 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  es have differen
134b0 74 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  t CHECK constrai
134c0 6e 74 73 2e 20 20 54 69 63 6b 65 74 20 23 32 32  nts.  Ticket #22
134d0 35 32 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66  52 */.  }.#endif
134e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
134f0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
13500 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74  .  /* Disallow t
13510 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
13520 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20  mization if the 
13530 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
13540 65 20 63 6f 6e 73 74 61 69 6e 73 0a 20 20 2a 2a  e constains.  **
13550 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79   any foreign key
13560 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 54   constraints.  T
13570 68 69 73 20 69 73 20 6d 6f 72 65 20 72 65 73 74  his is more rest
13580 72 69 63 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rictive than nec
13590 65 73 73 61 72 79 2e 0a 20 20 2a 2a 20 42 75 74  essary..  ** But
135a0 20 74 68 65 20 6d 61 69 6e 20 62 65 6e 65 66 69   the main benefi
135b0 63 69 61 72 79 20 6f 66 20 74 68 65 20 74 72 61  ciary of the tra
135c0 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
135d0 6f 6e 20 69 73 20 74 68 65 20 56 41 43 55 55 4d  on is the VACUUM
135e0 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20   .  ** command, 
135f0 61 6e 64 20 74 68 65 20 56 41 43 55 55 4d 20 63  and the VACUUM c
13600 6f 6d 6d 61 6e 64 20 64 69 73 61 62 6c 65 73 20  ommand disables 
13610 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
13620 74 72 61 69 6e 74 73 2e 20 20 53 6f 0a 20 20 2a  traints.  So.  *
13630 2a 20 74 68 65 20 65 78 74 72 61 20 63 6f 6d 70  * the extra comp
13640 6c 69 63 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65  lication to make
13650 20 74 68 69 73 20 72 75 6c 65 20 6c 65 73 73 20   this rule less 
13660 72 65 73 74 72 69 63 74 69 76 65 20 69 73 20 70  restrictive is p
13670 72 6f 62 61 62 6c 79 0a 20 20 2a 2a 20 6e 6f 74  robably.  ** not
13680 20 77 6f 72 74 68 20 74 68 65 20 65 66 66 6f 72   worth the effor
13690 74 2e 20 20 54 69 63 6b 65 74 20 5b 36 32 38 34  t.  Ticket [6284
136a0 64 66 38 39 64 65 62 64 66 61 36 31 64 62 38 30  df89debdfa61db80
136b0 37 33 65 30 36 32 39 30 38 61 66 30 63 39 62 36  73e062908af0c9b6
136c0 31 31 38 65 5d 0a 20 20 2a 2f 0a 20 20 69 66 28  118e].  */.  if(
136d0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
136e0 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
136f0 29 21 3d 30 20 26 26 20 70 44 65 73 74 2d 3e 70  )!=0 && pDest->p
13700 46 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 72  FKey!=0 ){.    r
13710 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
13720 64 69 66 0a 20 20 69 66 28 20 28 64 62 2d 3e 66  dif.  if( (db->f
13730 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
13740 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20  untRows)!=0 ){. 
13750 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
13760 20 78 66 65 72 20 6f 70 74 20 64 6f 65 73 20 6e   xfer opt does n
13770 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74  ot play well wit
13780 68 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63  h PRAGMA count_c
13790 68 61 6e 67 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20  hanges */.  }.. 
137a0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
137b0 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
137c0 20 74 68 61 74 20 74 68 65 20 78 66 65 72 20 6f   that the xfer o
137d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
137e0 74 0a 20 20 2a 2a 20 6c 65 61 73 74 20 61 20 70  t.  ** least a p
137f0 6f 73 73 69 62 69 6c 69 74 79 2c 20 74 68 6f 75  ossibility, thou
13800 67 68 20 69 74 20 6d 69 67 68 74 20 6f 6e 6c 79  gh it might only
13810 20 77 6f 72 6b 20 69 66 20 74 68 65 20 64 65 73   work if the des
13820 74 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a 20 74 61  tination.  ** ta
13830 62 6c 65 20 28 74 61 62 31 29 20 69 73 20 69 6e  ble (tab1) is in
13840 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 20  itially empty.. 
13850 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
13860 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
13870 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2b 2b  _xferopt_count++
13880 3b 0a 23 65 6e 64 69 66 0a 20 20 69 44 62 53 72  ;.#endif.  iDbSr
13890 63 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  c = sqlite3Schem
138a0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 53 72  aToIndex(db, pSr
138b0 63 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76  c->pSchema);.  v
138c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
138d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
138e0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
138f0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
13900 53 72 63 29 3b 0a 20 20 69 53 72 63 20 3d 20 70  Src);.  iSrc = p
13910 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
13920 20 69 44 65 73 74 20 3d 20 70 50 61 72 73 65 2d   iDest = pParse-
13930 3e 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67 41 75  >nTab++;.  regAu
13940 74 6f 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42  toinc = autoIncB
13950 65 67 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62  egin(pParse, iDb
13960 44 65 73 74 2c 20 70 44 65 73 74 29 3b 0a 20 20  Dest, pDest);.  
13970 72 65 67 44 61 74 61 20 3d 20 73 71 6c 69 74 65  regData = sqlite
13980 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13990 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  se);.  regRowid 
139a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
139b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
139c0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
139d0 70 50 61 72 73 65 2c 20 69 44 65 73 74 2c 20 69  pParse, iDest, i
139e0 44 62 44 65 73 74 2c 20 70 44 65 73 74 2c 20 4f  DbDest, pDest, O
139f0 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20  P_OpenWrite);.  
13a00 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64  assert( HasRowid
13a10 28 70 44 65 73 74 29 20 7c 7c 20 64 65 73 74 48  (pDest) || destH
13a20 61 73 55 6e 69 71 75 65 49 64 78 20 29 3b 0a 20  asUniqueIdx );. 
13a30 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61   if( (db->mDbFla
13a40 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75  gs & DBFLAG_Vacu
13a50 75 6d 29 3d 3d 30 20 26 26 20 28 0a 20 20 20 20  um)==0 && (.    
13a60 20 20 28 70 44 65 73 74 2d 3e 69 50 4b 65 79 3c    (pDest->iPKey<
13a70 30 20 26 26 20 70 44 65 73 74 2d 3e 70 49 6e 64  0 && pDest->pInd
13a80 65 78 21 3d 30 29 20 20 20 20 20 20 20 20 20 20  ex!=0)          
13a90 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 7c 7c 20  /* (1) */.   || 
13aa0 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64 78  destHasUniqueIdx
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ad0 20 28 32 29 20 2a 2f 0a 20 20 20 7c 7c 20 28 6f   (2) */.   || (o
13ae0 6e 45 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72 74  nError!=OE_Abort
13af0 20 26 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f   && onError!=OE_
13b00 52 6f 6c 6c 62 61 63 6b 29 20 20 20 2f 2a 20 28  Rollback)   /* (
13b10 33 29 20 2a 2f 0a 20 20 29 29 7b 0a 20 20 20 20  3) */.  )){.    
13b20 2f 2a 20 49 6e 20 73 6f 6d 65 20 63 69 72 63 75  /* In some circu
13b30 6d 73 74 61 6e 63 65 73 2c 20 77 65 20 61 72 65  mstances, we are
13b40 20 61 62 6c 65 20 74 6f 20 72 75 6e 20 74 68 65   able to run the
13b50 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
13b60 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 69  on.    ** only i
13b70 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
13b80 6e 20 74 61 62 6c 65 20 69 73 20 69 6e 69 74 69  n table is initi
13b90 61 6c 6c 79 20 65 6d 70 74 79 2e 20 55 6e 6c 65  ally empty. Unle
13ba0 73 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 44 42  ss the.    ** DB
13bb0 46 4c 41 47 5f 56 61 63 75 75 6d 20 66 6c 61 67  FLAG_Vacuum flag
13bc0 20 69 73 20 73 65 74 2c 20 74 68 69 73 20 62 6c   is set, this bl
13bd0 6f 63 6b 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ock generates co
13be0 64 65 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  de to make.    *
13bf0 2a 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 61  * that determina
13c00 74 69 6f 6e 2e 20 49 66 20 44 42 46 4c 41 47 5f  tion. If DBFLAG_
13c10 56 61 63 75 75 6d 20 69 73 20 73 65 74 2c 20 74  Vacuum is set, t
13c20 68 65 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74  hen the destinat
13c30 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ion.    ** table
13c40 20 69 73 20 61 6c 77 61 79 73 20 65 6d 70 74 79   is always empty
13c50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13c60 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64 65 72  Conditions under
13c70 20 77 68 69 63 68 20 74 68 65 20 64 65 73 74 69   which the desti
13c80 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  nation must be e
13c90 6d 70 74 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mpty:.    **.   
13ca0 20 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73   ** (1) There is
13cb0 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
13cc0 41 52 59 20 4b 45 59 20 62 75 74 20 74 68 65 72  ARY KEY but ther
13cd0 65 20 61 72 65 20 69 6e 64 69 63 65 73 2e 0a 20  e are indices.. 
13ce0 20 20 20 2a 2a 20 20 20 20 20 28 49 66 20 74 68     **     (If th
13cf0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
13d00 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 65   not initially e
13d10 6d 70 74 79 2c 20 74 68 65 20 72 6f 77 69 64 20  mpty, the rowid 
13d20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 20 20  fields.    **   
13d30 20 20 6f 66 20 69 6e 64 65 78 20 65 6e 74 72 69    of index entri
13d40 65 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  es might need to
13d50 20 63 68 61 6e 67 65 2e 29 0a 20 20 20 20 2a 2a   change.).    **
13d60 0a 20 20 20 20 2a 2a 20 28 32 29 20 54 68 65 20  .    ** (2) The 
13d70 64 65 73 74 69 6e 61 74 69 6f 6e 20 68 61 73 20  destination has 
13d80 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
13d90 20 28 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d   (The xfer optim
13da0 69 7a 61 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ization .    ** 
13db0 20 20 20 20 69 73 20 75 6e 61 62 6c 65 20 74 6f      is unable to
13dc0 20 74 65 73 74 20 75 6e 69 71 75 65 6e 65 73 73   test uniqueness
13dd0 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
13de0 20 28 33 29 20 6f 6e 45 72 72 6f 72 20 69 73 20   (3) onError is 
13df0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
13e00 74 68 61 6e 20 4f 45 5f 41 62 6f 72 74 20 61 6e  than OE_Abort an
13e10 64 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 0a 20  d OE_Rollback.. 
13e20 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 31 20     */.    addr1 
13e30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13e40 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
13e50 2c 20 69 44 65 73 74 2c 20 30 29 3b 20 56 64 62  , iDest, 0); Vdb
13e60 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13e70 20 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20    emptyDestTest 
13e80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13e90 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
13ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13eb0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
13ec0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48 61  1);.  }.  if( Ha
13ed0 73 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a  sRowid(pSrc) ){.
13ee0 20 20 20 20 75 38 20 69 6e 73 46 6c 61 67 73 3b      u8 insFlags;
13ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
13f00 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53  Table(pParse, iS
13f10 72 63 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63  rc, iDbSrc, pSrc
13f20 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
13f30 20 20 20 20 65 6d 70 74 79 53 72 63 54 65 73 74      emptySrcTest
13f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13f50 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
13f60 64 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62  d, iSrc, 0); Vdb
13f70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13f80 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b    if( pDest->iPK
13f90 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ey>=0 ){.      a
13fa0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
13fb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13fc0 6f 77 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52  owid, iSrc, regR
13fd0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 64 64  owid);.      add
13fe0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
13ff0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
14000 45 78 69 73 74 73 2c 20 69 44 65 73 74 2c 20 30  Exists, iDest, 0
14010 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
14020 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
14030 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
14040 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
14050 28 70 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72  (pParse, onError
14060 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  , pDest);.      
14070 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14080 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
14090 20 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70       autoIncStep
140a0 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f  (pParse, regAuto
140b0 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  inc, regRowid);.
140c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44      }else if( pD
140d0 65 73 74 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29  est->pIndex==0 )
140e0 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  {.      addr1 = 
140f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14100 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
14110 2c 20 69 44 65 73 74 2c 20 72 65 67 52 6f 77 69  , iDest, regRowi
14120 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
14130 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
14140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14150 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63  , OP_Rowid, iSrc
14160 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
14170 20 20 20 61 73 73 65 72 74 28 20 28 70 44 65 73     assert( (pDes
14180 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  t->tabFlags & TF
14190 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3d  _Autoincrement)=
141a0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
141b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
141c0 33 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  3(v, OP_RowData,
141d0 20 69 53 72 63 2c 20 72 65 67 44 61 74 61 2c 20   iSrc, regData, 
141e0 31 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  1);.    if( db->
141f0 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
14200 47 5f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  G_Vacuum ){.    
14210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14220 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e  Op1(v, OP_SeekEn
14230 64 2c 20 69 44 65 73 74 29 3b 0a 20 20 20 20 20  d, iDest);.     
14240 20 69 6e 73 46 6c 61 67 73 20 3d 20 4f 50 46 4c   insFlags = OPFL
14250 41 47 5f 4e 43 48 41 4e 47 45 7c 4f 50 46 4c 41  AG_NCHANGE|OPFLA
14260 47 5f 4c 41 53 54 52 4f 57 49 44 7c 0a 20 20 20  G_LASTROWID|.   
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 20 20 20 20 20 20 20 20 4f 50 46 4c 41 47 5f 41          OPFLAG_A
14290 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f 55 53 45  PPEND|OPFLAG_USE
142a0 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20 20 20 20  SEEKRESULT;.    
142b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 73  }else{.      ins
142c0 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e  Flags = OPFLAG_N
142d0 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47 5f 4c 41  CHANGE|OPFLAG_LA
142e0 53 54 52 4f 57 49 44 7c 4f 50 46 4c 41 47 5f 41  STROWID|OPFLAG_A
142f0 50 50 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20  PPEND;.    }.   
14300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14310 70 34 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p4(v, OP_Insert,
14320 20 69 44 65 73 74 2c 20 72 65 67 44 61 74 61 2c   iDest, regData,
14330 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20   regRowid,.     
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14350 20 28 63 68 61 72 2a 29 70 44 65 73 74 2c 20 50   (char*)pDest, P
14360 34 5f 54 41 42 4c 45 29 3b 0a 20 20 20 20 73 71  4_TABLE);.    sq
14370 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14380 35 28 76 2c 20 69 6e 73 46 6c 61 67 73 29 3b 0a  5(v, insFlags);.
14390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
143a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
143b0 2c 20 69 53 72 63 2c 20 61 64 64 72 31 29 3b 20  , iSrc, addr1); 
143c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
143d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
143e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
143f0 73 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20  se, iSrc, 0);.  
14400 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14410 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14420 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 7d 65   iDest, 0);.  }e
14430 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
14440 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14450 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73 74  , iDbDest, pDest
14460 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 44 65 73 74  ->tnum, 1, pDest
14470 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
14480 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
14490 50 61 72 73 65 2c 20 69 44 62 53 72 63 2c 20 70  Parse, iDbSrc, p
144a0 53 72 63 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 53  Src->tnum, 0, pS
144b0 72 63 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  rc->zName);.  }.
144c0 20 20 66 6f 72 28 70 44 65 73 74 49 64 78 3d 70    for(pDestIdx=p
144d0 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44  Dest->pIndex; pD
144e0 65 73 74 49 64 78 3b 20 70 44 65 73 74 49 64 78  estIdx; pDestIdx
144f0 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e 65 78 74  =pDestIdx->pNext
14500 29 7b 0a 20 20 20 20 75 38 20 69 64 78 49 6e 73  ){.    u8 idxIns
14510 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66  Flags = 0;.    f
14520 6f 72 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d  or(pSrcIdx=pSrc-
14530 3e 70 49 6e 64 65 78 3b 20 41 4c 57 41 59 53 28  >pIndex; ALWAYS(
14540 70 53 72 63 49 64 78 29 3b 20 70 53 72 63 49 64  pSrcIdx); pSrcId
14550 78 3d 70 53 72 63 49 64 78 2d 3e 70 4e 65 78 74  x=pSrcIdx->pNext
14560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 66 65  ){.      if( xfe
14570 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64 65 78  rCompatibleIndex
14580 28 70 44 65 73 74 49 64 78 2c 20 70 53 72 63 49  (pDestIdx, pSrcI
14590 64 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  dx) ) break;.   
145a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
145b0 53 72 63 49 64 78 20 29 3b 0a 20 20 20 20 73 71  SrcIdx );.    sq
145c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
145d0 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
145e0 69 53 72 63 2c 20 70 53 72 63 49 64 78 2d 3e 74  iSrc, pSrcIdx->t
145f0 6e 75 6d 2c 20 69 44 62 53 72 63 29 3b 0a 20 20  num, iDbSrc);.  
14600 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
14610 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
14620 2c 20 70 53 72 63 49 64 78 29 3b 0a 20 20 20 20  , pSrcIdx);.    
14630 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
14640 22 25 73 22 2c 20 70 53 72 63 49 64 78 2d 3e 7a  "%s", pSrcIdx->z
14650 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71 6c 69  Name));.    sqli
14660 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14670 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
14680 44 65 73 74 2c 20 70 44 65 73 74 49 64 78 2d 3e  Dest, pDestIdx->
14690 74 6e 75 6d 2c 20 69 44 62 44 65 73 74 29 3b 0a  tnum, iDbDest);.
146a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
146b0 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
146c0 73 65 2c 20 70 44 65 73 74 49 64 78 29 3b 0a 20  se, pDestIdx);. 
146d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
146e0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
146f0 5f 42 55 4c 4b 43 53 52 29 3b 0a 20 20 20 20 56  _BULKCSR);.    V
14700 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
14710 25 73 22 2c 20 70 44 65 73 74 49 64 78 2d 3e 7a  %s", pDestIdx->z
14720 4e 61 6d 65 29 29 3b 0a 20 20 20 20 61 64 64 72  Name));.    addr
14730 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
14740 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
14750 6e 64 2c 20 69 53 72 63 2c 20 30 29 3b 20 56 64  nd, iSrc, 0); Vd
14760 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
14770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14780 64 4f 70 33 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp3(v, OP_RowDa
14790 74 61 2c 20 69 53 72 63 2c 20 72 65 67 44 61 74  ta, iSrc, regDat
147a0 61 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 64  a, 1);.    if( d
147b0 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42  b->mDbFlags & DB
147c0 46 4c 41 47 5f 56 61 63 75 75 6d 20 29 7b 0a 20  FLAG_Vacuum ){. 
147d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 49 4e 53       /* This INS
147e0 45 52 54 20 63 6f 6d 6d 61 6e 64 20 69 73 20 70  ERT command is p
147f0 61 72 74 20 6f 66 20 61 20 56 41 43 55 55 4d 20  art of a VACUUM 
14800 6f 70 65 72 61 74 69 6f 6e 2c 20 77 68 69 63 68  operation, which
14810 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 20 20   guarantees.    
14820 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64 65    ** that the de
14830 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
14840 69 73 20 65 6d 70 74 79 2e 20 49 66 20 61 6c 6c  is empty. If all
14850 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73   indexed columns
14860 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f   use.      ** co
14870 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14880 20 42 49 4e 41 52 59 2c 20 74 68 65 6e 20 69 74   BINARY, then it
14890 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 73 73   can also be ass
148a0 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 20 20  umed that the.  
148b0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 6c      ** index wil
148c0 6c 20 62 65 20 70 6f 70 75 6c 61 74 65 64 20 62  l be populated b
148d0 79 20 69 6e 73 65 72 74 69 6e 67 20 6b 65 79 73  y inserting keys
148e0 20 69 6e 20 73 74 72 69 63 74 6c 79 20 73 6f 72   in strictly sor
148f0 74 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ted .      ** or
14900 64 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  der. In this cas
14910 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 65  e, instead of se
14920 65 6b 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  eking within the
14930 20 62 2d 74 72 65 65 20 61 73 20 70 61 72 74 0a   b-tree as part.
14940 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 76 65 72        ** of ever
14950 79 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 20 6f  y OP_IdxInsert o
14960 70 63 6f 64 65 2c 20 61 6e 20 4f 50 5f 53 65 65  pcode, an OP_See
14970 6b 45 6e 64 20 69 73 20 61 64 64 65 64 20 62 65  kEnd is added be
14980 66 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a  fore the.      *
14990 2a 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 20 74  * OP_IdxInsert t
149a0 6f 20 73 65 65 6b 20 74 6f 20 74 68 65 20 70 6f  o seek to the po
149b0 69 6e 74 20 77 69 74 68 69 6e 20 74 68 65 20 62  int within the b
149c0 2d 74 72 65 65 20 77 68 65 72 65 20 65 61 63 68  -tree where each
149d0 20 6b 65 79 20 0a 20 20 20 20 20 20 2a 2a 20 73   key .      ** s
149e0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
149f0 64 2e 20 54 68 69 73 20 69 73 20 66 61 73 74 65  d. This is faste
14a00 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
14a10 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
14a20 68 65 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d  he indexed colum
14a30 6e 73 20 75 73 65 20 61 20 63 6f 6c 6c 61 74 69  ns use a collati
14a40 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 74 68 65  on sequence othe
14a50 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  r than.      ** 
14a60 42 49 4e 41 52 59 2c 20 74 68 69 73 20 6f 70 74  BINARY, this opt
14a70 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 64 69 73  imization is dis
14a80 61 62 6c 65 64 2e 20 54 68 69 73 20 69 73 20 62  abled. This is b
14a90 65 63 61 75 73 65 20 74 68 65 20 75 73 65 72 20  ecause the user 
14aa0 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
14ab0 63 68 61 6e 67 65 20 74 68 65 20 64 65 66 69 6e  change the defin
14ac0 69 74 69 6f 6e 20 6f 66 20 61 20 63 6f 6c 6c 61  ition of a colla
14ad0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 6e  tion sequence an
14ae0 64 20 74 68 65 6e 20 72 75 6e 0a 20 20 20 20 20  d then run.     
14af0 20 2a 2a 20 61 20 56 41 43 55 55 4d 20 63 6f 6d   ** a VACUUM com
14b00 6d 61 6e 64 2e 20 49 6e 20 74 68 61 74 20 63 61  mand. In that ca
14b10 73 65 20 6b 65 79 73 20 6d 61 79 20 6e 6f 74 20  se keys may not 
14b20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 20 73 74  be written in st
14b30 72 69 63 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  rictly.      ** 
14b40 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 2a  sorted order.  *
14b50 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
14b60 20 69 3c 70 53 72 63 49 64 78 2d 3e 6e 43 6f 6c   i<pSrcIdx->nCol
14b70 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
14b80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14b90 43 6f 6c 6c 20 3d 20 70 53 72 63 49 64 78 2d 3e  Coll = pSrcIdx->
14ba0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
14bb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
14bc0 74 72 69 63 6d 70 28 73 71 6c 69 74 65 33 53 74  tricmp(sqlite3St
14bd0 72 42 49 4e 41 52 59 2c 20 7a 43 6f 6c 6c 29 20  rBINARY, zColl) 
14be0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
14bf0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 53  .      if( i==pS
14c00 72 63 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  rcIdx->nColumn )
14c10 7b 0a 20 20 20 20 20 20 20 20 69 64 78 49 6e 73  {.        idxIns
14c20 46 6c 61 67 73 20 3d 20 4f 50 46 4c 41 47 5f 55  Flags = OPFLAG_U
14c30 53 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20 20  SESEEKRESULT;.  
14c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14c50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
14c60 65 6b 45 6e 64 2c 20 69 44 65 73 74 29 3b 0a 20  ekEnd, iDest);. 
14c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14c80 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
14c90 53 72 63 29 20 26 26 20 70 44 65 73 74 49 64 78  Src) && pDestIdx
14ca0 2d 3e 69 64 78 54 79 70 65 3d 3d 32 20 29 7b 0a  ->idxType==2 ){.
14cb0 20 20 20 20 20 20 69 64 78 49 6e 73 46 6c 61 67        idxInsFlag
14cc0 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41  s |= OPFLAG_NCHA
14cd0 4e 47 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  NGE;.    }.    s
14ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14cf0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
14d00 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61 74 61  , iDest, regData
14d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14d20 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 69 64  beChangeP5(v, id
14d30 78 49 6e 73 46 6c 61 67 73 7c 4f 50 46 4c 41 47  xInsFlags|OPFLAG
14d40 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
14d50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14d60 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63  v, OP_Next, iSrc
14d70 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65  , addr1+1); Vdbe
14d80 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14d90 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14da0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
14db0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14dc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
14dd0 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20 20 20  e, iSrc, 0);.   
14de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14df0 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
14e00 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  iDest, 0);.  }. 
14e10 20 69 66 28 20 65 6d 70 74 79 53 72 63 54 65 73   if( emptySrcTes
14e20 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
14e30 75 6d 70 48 65 72 65 28 76 2c 20 65 6d 70 74 79  umpHere(v, empty
14e40 53 72 63 54 65 73 74 29 3b 0a 20 20 73 71 6c 69  SrcTest);.  sqli
14e50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
14e60 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
14e70 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  id);.  sqlite3Re
14e80 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14e90 72 73 65 2c 20 72 65 67 44 61 74 61 29 3b 0a 20  rse, regData);. 
14ea0 20 69 66 28 20 65 6d 70 74 79 44 65 73 74 54 65   if( emptyDestTe
14eb0 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
14ec0 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e  3AutoincrementEn
14ed0 64 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73  d(pParse);.    s
14ee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14ef0 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
14f00 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20  ITE_OK, 0);.    
14f10 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14f20 65 72 65 28 76 2c 20 65 6d 70 74 79 44 65 73 74  ere(v, emptyDest
14f30 54 65 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Test);.    sqlit
14f40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14f50 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74 2c  OP_Close, iDest,
14f60 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
14f70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14f80 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
14f90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14fa0 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 20 2a  _OMIT_XFER_OPT *
14fb0 2f 0a                                            /.