/ Hex Artifact Content
Login

Artifact d8bb30535c8c0785876025a4a07f9074640a15d1:


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 70 54 61 62 2d 3e 74 6e 75 6d 20 29  num=pTab->tnum )
05f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
0600: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 63 6f 64  eAddOp3(v, opcod
0610: 65 2c 20 69 43 75 72 2c 20 70 50 6b 2d 3e 74 6e  e, iCur, pPk->tn
0620: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
0630: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
0640: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50  yInfo(pParse, pP
0650: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  k);.    VdbeComm
0660: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
0670: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d  ab->zName));.  }
0680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0690: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
06a0: 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
06b0: 79 20 73 74 72 69 6e 67 20 61 73 73 6f 63 69 61  y string associa
06c0: 74 65 64 20 77 69 74 68 20 69 6e 64 65 78 0a 2a  ted with index.*
06d0: 2a 20 70 49 64 78 2e 20 41 20 63 6f 6c 75 6d 6e  * pIdx. A column
06e0: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
06f0: 20 68 61 73 20 6f 6e 65 20 63 68 61 72 61 63 74   has one charact
0700: 65 72 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  er for each colu
0710: 6d 6e 20 69 6e 20 0a 2a 2a 20 74 68 65 20 74 61  mn in .** the ta
0720: 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ble, according t
0730: 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  o the affinity o
0740: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 3a 0a 2a 2a  f the column:.**
0750: 0a 2a 2a 20 20 43 68 61 72 61 63 74 65 72 20 20  .**  Character  
0760: 20 20 20 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e      Column affin
0770: 69 74 79 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ity.**  --------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 27 61 27 20 20  ------.**  'a'  
07a0: 20 20 20 20 20 20 20 20 20 20 54 45 58 54 0a 2a            TEXT.*
07b0: 2a 20 20 27 62 27 20 20 20 20 20 20 20 20 20 20  *  'b'          
07c0: 20 20 4e 4f 4e 45 0a 2a 2a 20 20 27 63 27 20 20    NONE.**  'c'  
07d0: 20 20 20 20 20 20 20 20 20 20 4e 55 4d 45 52 49            NUMERI
07e0: 43 0a 2a 2a 20 20 27 64 27 20 20 20 20 20 20 20  C.**  'd'       
07f0: 20 20 20 20 20 49 4e 54 45 47 45 52 0a 2a 2a 20       INTEGER.** 
0800: 20 27 65 27 20 20 20 20 20 20 20 20 20 20 20 20   'e'            
0810: 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  REAL.**.** An ex
0820: 74 72 61 20 27 64 27 20 69 73 20 61 70 70 65 6e  tra 'd' is appen
0830: 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ded to the end o
0840: 66 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  f the string to 
0850: 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20 72 6f 77  cover the.** row
0860: 69 64 20 74 68 61 74 20 61 70 70 65 61 72 73 20  id that appears 
0870: 61 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  as the last colu
0880: 6d 6e 20 69 6e 20 65 76 65 72 79 20 69 6e 64 65  mn in every inde
0890: 78 2e 0a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  x..**.** Memory 
08a0: 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20 63  for the buffer c
08b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
08c0: 6c 75 6d 6e 20 69 6e 64 65 78 20 61 66 66 69 6e  lumn index affin
08d0: 69 74 79 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ity string.** is
08e0: 20 6d 61 6e 61 67 65 64 20 61 6c 6f 6e 67 20 77   managed along w
08f0: 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ith the rest of 
0900: 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
0910: 75 72 65 2e 20 49 74 20 77 69 6c 6c 20 62 65 0a  ure. It will be.
0920: 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68 65 6e  ** released when
0930: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
0940: 64 65 78 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  dex() is called.
0950: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
0960: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
0970: 6e 69 74 79 53 74 72 28 56 64 62 65 20 2a 76 2c  nityStr(Vdbe *v,
0980: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
0990: 20 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c   if( !pIdx->zCol
09a0: 41 66 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Aff ){.    /* Th
09b0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 63  e first time a c
09c0: 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
09d0: 74 72 69 6e 67 20 66 6f 72 20 61 20 70 61 72 74  tring for a part
09e0: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 69 73 0a  icular index is.
09f0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c      ** required,
0a00: 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
0a10: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 68   and populated h
0a20: 65 72 65 2e 20 49 74 20 69 73 20 74 68 65 6e 20  ere. It is then 
0a30: 73 74 6f 72 65 64 20 61 73 0a 20 20 20 20 2a 2a  stored as.    **
0a40: 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65   a member of the
0a50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
0a60: 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20   for subsequent 
0a70: 75 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  use..    **.    
0a80: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ** The column af
0a90: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 77 69  finity string wi
0aa0: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ll eventually be
0ab0: 20 64 65 6c 65 74 65 64 20 62 79 0a 20 20 20 20   deleted by.    
0ac0: 2a 2a 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49  ** sqliteDeleteI
0ad0: 6e 64 65 78 28 29 20 77 68 65 6e 20 74 68 65 20  ndex() when the 
0ae0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
0af0: 69 74 73 65 6c 66 20 69 73 20 63 6c 65 61 6e 65  itself is cleane
0b00: 64 0a 20 20 20 20 2a 2a 20 75 70 2e 0a 20 20 20  d.    ** up..   
0b10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   */.    int n;. 
0b20: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
0b30: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20   pIdx->pTable;. 
0b40: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
0b50: 20 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76   sqlite3VdbeDb(v
0b60: 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f  );.    pIdx->zCo
0b70: 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a 29 73  lAff = (char *)s
0b80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
0b90: 77 28 30 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  w(0, pIdx->nColu
0ba0: 6d 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 21  mn+1);.    if( !
0bb0: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
0bc0: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
0bd0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
0be0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0bf0: 20 7d 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20   }.    for(n=0; 
0c00: 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  n<pIdx->nColumn;
0c10: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 31 36   n++){.      i16
0c20: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
0c30: 75 6d 6e 5b 6e 5d 3b 0a 20 20 20 20 20 20 70 49  umn[n];.      pI
0c40: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d  dx->zColAff[n] =
0c50: 20 78 3c 30 20 3f 20 53 51 4c 49 54 45 5f 41 46   x<0 ? SQLITE_AF
0c60: 46 5f 49 4e 54 45 47 45 52 20 3a 20 70 54 61 62  F_INTEGER : pTab
0c70: 2d 3e 61 43 6f 6c 5b 78 5d 2e 61 66 66 69 6e 69  ->aCol[x].affini
0c80: 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ty;.    }.    pI
0c90: 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e 5d 20 3d  dx->zColAff[n] =
0ca0: 20 30 3b 0a 20 20 7d 0a 20 0a 20 20 72 65 74 75   0;.  }. .  retu
0cb0: 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  rn pIdx->zColAff
0cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
0cd0: 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
0ce0: 73 74 72 69 6e 67 20 66 6f 72 20 74 61 62 6c 65  string for table
0cf0: 20 70 54 61 62 2c 20 69 66 20 69 74 20 68 61 73   pTab, if it has
0d00: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
0d10: 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 20 20  n.** computed.  
0d20: 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
0d30: 6f 6e 2c 20 6f 6d 69 74 20 74 72 61 69 6c 69 6e  on, omit trailin
0d40: 67 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  g SQLITE_AFF_NON
0d50: 45 20 61 66 66 69 6e 69 74 69 65 73 2e 0a 2a 2a  E affinities..**
0d60: 0a 2a 2a 20 49 66 20 74 68 65 20 61 66 66 69 6e  .** If the affin
0d70: 69 74 79 20 65 78 69 73 74 73 20 28 69 66 20 69  ity exists (if i
0d80: 74 20 69 73 20 6e 6f 20 65 6e 74 69 72 65 6c 79  t is no entirely
0d90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
0da0: 20 76 61 6c 75 65 73 29 20 61 6e 64 0a 2a 2a 20   values) and.** 
0db0: 69 66 20 69 52 65 67 3e 30 20 74 68 65 6e 20 63  if iReg>0 then c
0dc0: 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
0dd0: 74 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77  ty opcode that w
0de0: 69 6c 6c 20 73 65 74 20 74 68 65 20 61 66 66 69  ill set the affi
0df0: 6e 69 74 69 65 73 0a 2a 2a 20 66 6f 72 20 72 65  nities.** for re
0e00: 67 69 73 74 65 72 20 69 52 65 67 20 61 6e 64 20  gister iReg and 
0e10: 66 6f 6c 6c 6f 77 69 6e 67 2e 20 20 4f 72 20 69  following.  Or i
0e20: 66 20 61 66 66 69 6e 69 74 69 65 73 20 65 78 69  f affinities exi
0e30: 73 74 73 20 61 6e 64 20 69 52 65 67 3d 3d 30 2c  sts and iReg==0,
0e40: 0a 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 73 65  .** then just se
0e50: 74 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  t the P4 operand
0e60: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
0e70: 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68 20 73   opcode (which s
0e80: 68 6f 75 6c 64 20 20 62 65 0a 2a 2a 20 61 6e 20  hould  be.** an 
0e90: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 29 20 74  OP_MakeRecord) t
0ea0: 6f 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  o the affinity s
0eb0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 20 63  tring..**.** A c
0ec0: 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
0ed0: 74 72 69 6e 67 20 68 61 73 20 6f 6e 65 20 63 68  tring has one ch
0ee0: 61 72 61 63 74 65 72 20 70 65 72 20 63 6f 6c 75  aracter per colu
0ef0: 6d 6e 3a 0a 2a 2a 0a 2a 2a 20 20 43 68 61 72 61  mn:.**.**  Chara
0f00: 63 74 65 72 20 20 20 20 20 20 43 6f 6c 75 6d 6e  cter      Column
0f10: 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 20 2d 2d   affinity.**  --
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
0f40: 20 27 61 27 20 20 20 20 20 20 20 20 20 20 20 20   'a'            
0f50: 54 45 58 54 0a 2a 2a 20 20 27 62 27 20 20 20 20  TEXT.**  'b'    
0f60: 20 20 20 20 20 20 20 20 4e 4f 4e 45 0a 2a 2a 20          NONE.** 
0f70: 20 27 63 27 20 20 20 20 20 20 20 20 20 20 20 20   'c'            
0f80: 4e 55 4d 45 52 49 43 0a 2a 2a 20 20 27 64 27 20  NUMERIC.**  'd' 
0f90: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 47             INTEG
0fa0: 45 52 0a 2a 2a 20 20 27 65 27 20 20 20 20 20 20  ER.**  'e'      
0fb0: 20 20 20 20 20 20 52 45 41 4c 0a 2a 2f 0a 76 6f        REAL.*/.vo
0fc0: 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c 65 41  id sqlite3TableA
0fd0: 66 66 69 6e 69 74 79 28 56 64 62 65 20 2a 76 2c  ffinity(Vdbe *v,
0fe0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
0ff0: 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
1000: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 41 66  ;.  char *zColAf
1010: 66 20 3d 20 70 54 61 62 2d 3e 7a 43 6f 6c 41 66  f = pTab->zColAf
1020: 66 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 41 66 66  f;.  if( zColAff
1030: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1040: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
1050: 56 64 62 65 44 62 28 76 29 3b 0a 20 20 20 20 7a  VdbeDb(v);.    z
1060: 43 6f 6c 41 66 66 20 3d 20 28 63 68 61 72 20 2a  ColAff = (char *
1070: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
1080: 52 61 77 28 30 2c 20 70 54 61 62 2d 3e 6e 43 6f  Raw(0, pTab->nCo
1090: 6c 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  l+1);.    if( !z
10a0: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 20 20  ColAff ){.      
10b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
10d0: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  rn;.    }..    f
10e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
10f0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1100: 20 20 7a 43 6f 6c 41 66 66 5b 69 5d 20 3d 20 70    zColAff[i] = p
1110: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66  Tab->aCol[i].aff
1120: 69 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  inity;.    }.   
1130: 20 64 6f 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 41   do{.      zColA
1140: 66 66 5b 69 2d 2d 5d 20 3d 20 30 3b 0a 20 20 20  ff[i--] = 0;.   
1150: 20 7d 77 68 69 6c 65 28 20 69 3e 3d 30 20 26 26   }while( i>=0 &&
1160: 20 7a 43 6f 6c 41 66 66 5b 69 5d 3d 3d 53 51 4c   zColAff[i]==SQL
1170: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a  ITE_AFF_NONE );.
1180: 20 20 20 20 70 54 61 62 2d 3e 7a 43 6f 6c 41 66      pTab->zColAf
1190: 66 20 3d 20 7a 43 6f 6c 41 66 66 3b 0a 20 20 7d  f = zColAff;.  }
11a0: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74  .  i = sqlite3St
11b0: 72 6c 65 6e 33 30 28 7a 43 6f 6c 41 66 66 29 3b  rlen30(zColAff);
11c0: 0a 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20  .  if( i ){.    
11d0: 69 66 28 20 69 52 65 67 20 29 7b 0a 20 20 20 20  if( iReg ){.    
11e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f0: 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69  Op4(v, OP_Affini
1200: 74 79 2c 20 69 52 65 67 2c 20 69 2c 20 30 2c 20  ty, iReg, i, 0, 
1210: 7a 43 6f 6c 41 66 66 2c 20 69 29 3b 0a 20 20 20  zColAff, i);.   
1220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1230: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1240: 34 28 76 2c 20 2d 31 2c 20 7a 43 6f 6c 41 66 66  4(v, -1, zColAff
1250: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
1260: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1270: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
1280: 74 61 62 6c 65 20 70 54 61 62 20 69 6e 20 64 61  table pTab in da
1290: 74 61 62 61 73 65 20 69 44 62 20 6f 72 20 61 6e  tabase iDb or an
12a0: 79 20 6f 66 20 69 74 73 20 69 6e 64 69 63 65 73  y of its indices
12b0: 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 70  .** have been op
12c0: 65 6e 65 64 20 61 74 20 61 6e 79 20 70 6f 69 6e  ened at any poin
12d0: 74 20 69 6e 20 74 68 65 20 56 44 42 45 20 70 72  t in the VDBE pr
12e0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 69 73 20 75  ogram. This is u
12f0: 73 65 64 20 74 6f 20 73 65 65 20 69 66 20 0a 2a  sed to see if .*
1300: 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 66  * a statement of
1310: 20 74 68 65 20 66 6f 72 6d 20 20 22 49 4e 53 45   the form  "INSE
1320: 52 54 20 49 4e 54 4f 20 3c 69 44 62 2c 20 70 54  RT INTO <iDb, pT
1330: 61 62 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20  ab> SELECT ..." 
1340: 63 61 6e 20 0a 2a 2a 20 72 75 6e 20 77 69 74 68  can .** run with
1350: 6f 75 74 20 75 73 69 6e 67 20 61 20 74 65 6d 70  out using a temp
1360: 6f 72 61 72 79 20 74 61 62 6c 65 20 66 6f 72 20  orary table for 
1370: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
1380: 68 65 20 53 45 4c 45 43 54 2e 20 0a 2a 2f 0a 73  he SELECT. .*/.s
1390: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 73 54  tatic int readsT
13a0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
13b0: 6e 74 20 69 44 62 2c 20 54 61 62 6c 65 20 2a 70  nt iDb, Table *p
13c0: 54 61 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Tab){.  Vdbe *v 
13d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13e0: 28 70 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  (p);.  int i;.  
13f0: 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  int iEnd = sqlit
1400: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1410: 72 28 76 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(v);.#ifndef SQ
1420: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1430: 4c 54 41 42 4c 45 0a 20 20 56 54 61 62 6c 65 20  LTABLE.  VTable 
1440: 2a 70 56 54 61 62 20 3d 20 49 73 56 69 72 74 75  *pVTab = IsVirtu
1450: 61 6c 28 70 54 61 62 29 20 3f 20 73 71 6c 69 74  al(pTab) ? sqlit
1460: 65 33 47 65 74 56 54 61 62 6c 65 28 70 2d 3e 64  e3GetVTable(p->d
1470: 62 2c 20 70 54 61 62 29 20 3a 20 30 3b 0a 23 65  b, pTab) : 0;.#e
1480: 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  ndif..  for(i=1;
1490: 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20   i<iEnd; i++){. 
14a0: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
14b0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
14c0: 70 28 76 2c 20 69 29 3b 0a 20 20 20 20 61 73 73  p(v, i);.    ass
14d0: 65 72 74 28 20 70 4f 70 21 3d 30 20 29 3b 0a 20  ert( pOp!=0 );. 
14e0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
14f0: 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61 64 20  de==OP_OpenRead 
1500: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 69 44 62 20  && pOp->p3==iDb 
1510: 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
1520: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 6e  pIndex;.      in
1530: 74 20 74 6e 75 6d 20 3d 20 70 4f 70 2d 3e 70 32  t tnum = pOp->p2
1540: 3b 0a 20 20 20 20 20 20 69 66 28 20 74 6e 75 6d  ;.      if( tnum
1550: 3d 3d 70 54 61 62 2d 3e 74 6e 75 6d 20 29 7b 0a  ==pTab->tnum ){.
1560: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1580: 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1590: 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
15a0: 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
15b0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
15c0: 69 66 28 20 74 6e 75 6d 3d 3d 70 49 6e 64 65 78  if( tnum==pIndex
15d0: 2d 3e 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20 20  ->tnum ){.      
15e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1600: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1610: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1620: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70  LTABLE.    if( p
1630: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  Op->opcode==OP_V
1640: 4f 70 65 6e 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Open && pOp->p4.
1650: 70 56 74 61 62 3d 3d 70 56 54 61 62 20 29 7b 0a  pVtab==pVTab ){.
1660: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
1670: 70 2d 3e 70 34 2e 70 56 74 61 62 21 3d 30 20 29  p->p4.pVtab!=0 )
1680: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1690: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
16a0: 56 54 41 42 20 29 3b 0a 20 20 20 20 20 20 72 65  VTAB );.      re
16b0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 23 65  turn 1;.    }.#e
16c0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
16d0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
16e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16f0: 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  INCREMENT./*.** 
1700: 4c 6f 63 61 74 65 20 6f 72 20 63 72 65 61 74 65  Locate or create
1710: 20 61 6e 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20   an AutoincInfo 
1720: 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69  structure associ
1730: 61 74 65 64 20 77 69 74 68 20 74 61 62 6c 65 20  ated with table 
1740: 70 54 61 62 0a 2a 2a 20 77 68 69 63 68 20 69 73  pTab.** which is
1750: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
1760: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1770: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 66 6f  gister number fo
1780: 72 20 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a  r the register.*
1790: 2a 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  * that holds the
17a0: 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 2e 0a   maximum rowid..
17b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
17c0: 74 20 6d 6f 73 74 20 6f 6e 65 20 41 75 74 6f 69  t most one Autoi
17d0: 6e 63 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ncInfo structure
17e0: 20 70 65 72 20 74 61 62 6c 65 20 65 76 65 6e 20   per table even 
17f0: 69 66 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 74  if the.** same t
1800: 61 62 6c 65 20 69 73 20 61 75 74 6f 69 6e 63 72  able is autoincr
1810: 65 6d 65 6e 74 65 64 20 6d 75 6c 74 69 70 6c 65  emented multiple
1820: 20 74 69 6d 65 73 20 64 75 65 20 74 6f 20 69 6e   times due to in
1830: 73 65 72 74 73 20 77 69 74 68 69 6e 0a 2a 2a 20  serts within.** 
1840: 74 72 69 67 67 65 72 73 2e 20 20 41 20 6e 65 77  triggers.  A new
1850: 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 73 74 72   AutoincInfo str
1860: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
1870: 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1880: 0a 2a 2a 20 66 69 72 73 74 20 75 73 65 20 6f 66  .** first use of
1890: 20 74 61 62 6c 65 20 70 54 61 62 2e 20 20 4f 6e   table pTab.  On
18a0: 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
18b0: 65 6e 74 20 75 73 65 73 2c 20 74 68 65 20 6f 72  ent uses, the or
18c0: 69 67 69 6e 61 6c 0a 2a 2a 20 41 75 74 6f 69 6e  iginal.** Autoin
18d0: 63 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  cInfo structure 
18e0: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
18f0: 68 72 65 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  hree memory loca
1900: 74 69 6f 6e 73 20 61 72 65 20 61 6c 6c 6f 63 61  tions are alloca
1910: 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ted:.**.**   (1)
1920: 20 20 52 65 67 69 73 74 65 72 20 74 6f 20 68 6f    Register to ho
1930: 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
1940: 68 65 20 70 54 61 62 20 74 61 62 6c 65 2e 0a 2a  he pTab table..*
1950: 2a 20 20 20 28 32 29 20 20 52 65 67 69 73 74 65  *   (2)  Registe
1960: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
1970: 78 69 6d 75 6d 20 52 4f 57 49 44 20 6f 66 20 70  ximum ROWID of p
1980: 54 61 62 2e 0a 2a 2a 20 20 20 28 33 29 20 20 52  Tab..**   (3)  R
1990: 65 67 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20  egister to hold 
19a0: 74 68 65 20 72 6f 77 69 64 20 69 6e 20 73 71 6c  the rowid in sql
19b0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 6f 66 20  ite_sequence of 
19c0: 70 54 61 62 0a 2a 2a 0a 2a 2a 20 54 68 65 20 32  pTab.**.** The 2
19d0: 6e 64 20 72 65 67 69 73 74 65 72 20 69 73 20 74  nd register is t
19e0: 68 65 20 6f 6e 65 20 74 68 61 74 20 69 73 20 72  he one that is r
19f0: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 69  eturned.  That i
1a00: 73 20 61 6c 6c 20 74 68 65 0a 2a 2a 20 69 6e 73  s all the.** ins
1a10: 65 72 74 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  ert routine need
1a20: 73 20 74 6f 20 6b 6e 6f 77 20 61 62 6f 75 74 2e  s to know about.
1a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a40: 75 74 6f 49 6e 63 42 65 67 69 6e 28 0a 20 20 50  utoIncBegin(.  P
1a50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a60: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1a70: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
1a80: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db,            /
1a90: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
1aa0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1ab0: 70 54 61 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20  pTab */.  Table 
1ac0: 2a 70 54 61 62 20 20 20 20 20 20 20 20 20 2f 2a  *pTab         /*
1ad0: 20 54 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   The table we ar
1ae0: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 2a 2f 0a  e writing to */.
1af0: 29 7b 0a 20 20 69 6e 74 20 6d 65 6d 49 64 20 3d  ){.  int memId =
1b00: 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69   0;      /* Regi
1b10: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6d 61 78  ster holding max
1b20: 69 6d 75 6d 20 72 6f 77 69 64 20 2a 2f 0a 20 20  imum rowid */.  
1b30: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
1b40: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
1b50: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 50 61 72  ement ){.    Par
1b60: 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1b70: 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1b80: 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1b90: 20 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70    AutoincInfo *p
1ba0: 49 6e 66 6f 3b 0a 0a 20 20 20 20 70 49 6e 66 6f  Info;..    pInfo
1bb0: 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 41   = pToplevel->pA
1bc0: 69 6e 63 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  inc;.    while( 
1bd0: 70 49 6e 66 6f 20 26 26 20 70 49 6e 66 6f 2d 3e  pInfo && pInfo->
1be0: 70 54 61 62 21 3d 70 54 61 62 20 29 7b 20 70 49  pTab!=pTab ){ pI
1bf0: 6e 66 6f 20 3d 20 70 49 6e 66 6f 2d 3e 70 4e 65  nfo = pInfo->pNe
1c00: 78 74 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 49  xt; }.    if( pI
1c10: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
1c20: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  pInfo = sqlite3D
1c30: 62 4d 61 6c 6c 6f 63 52 61 77 28 70 50 61 72 73  bMallocRaw(pPars
1c40: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
1c50: 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  Info));.      if
1c60: 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  ( pInfo==0 ) ret
1c70: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 70 49 6e  urn 0;.      pIn
1c80: 66 6f 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6f 70  fo->pNext = pTop
1c90: 6c 65 76 65 6c 2d 3e 70 41 69 6e 63 3b 0a 20 20  level->pAinc;.  
1ca0: 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1cb0: 41 69 6e 63 20 3d 20 70 49 6e 66 6f 3b 0a 20 20  Ainc = pInfo;.  
1cc0: 20 20 20 20 70 49 6e 66 6f 2d 3e 70 54 61 62 20      pInfo->pTab 
1cd0: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 70 49  = pTab;.      pI
1ce0: 6e 66 6f 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a  nfo->iDb = iDb;.
1cf0: 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1d00: 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20 20 20  >nMem++;        
1d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1d20: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 6e 61  ister to hold na
1d30: 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20  me of table */. 
1d40: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 72 65 67 43       pInfo->regC
1d50: 74 72 20 3d 20 2b 2b 70 54 6f 70 6c 65 76 65 6c  tr = ++pToplevel
1d60: 2d 3e 6e 4d 65 6d 3b 20 20 2f 2a 20 4d 61 78 20  ->nMem;  /* Max 
1d70: 72 6f 77 69 64 20 72 65 67 69 73 74 65 72 20 2a  rowid register *
1d80: 2f 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  /.      pTopleve
1d90: 6c 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 20 20 20  l->nMem++;      
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1db0: 6f 77 69 64 20 69 6e 20 73 71 6c 69 74 65 5f 73  owid in sqlite_s
1dc0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 7d  equence */.    }
1dd0: 0a 20 20 20 20 6d 65 6d 49 64 20 3d 20 70 49 6e  .    memId = pIn
1de0: 66 6f 2d 3e 72 65 67 43 74 72 3b 0a 20 20 7d 0a  fo->regCtr;.  }.
1df0: 20 20 72 65 74 75 72 6e 20 6d 65 6d 49 64 3b 0a    return memId;.
1e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e10: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
1e20: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
1e30: 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 6f 66  nitialize all of
1e40: 20 74 68 65 0a 2a 2a 20 72 65 67 69 73 74 65 72   the.** register
1e50: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 75 74   used by the aut
1e60: 6f 69 6e 63 72 65 6d 65 6e 74 20 74 72 61 63 6b  oincrement track
1e70: 65 72 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  er.  .*/.void sq
1e80: 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65  lite3Autoincreme
1e90: 6e 74 42 65 67 69 6e 28 50 61 72 73 65 20 2a 70  ntBegin(Parse *p
1ea0: 50 61 72 73 65 29 7b 0a 20 20 41 75 74 6f 69 6e  Parse){.  Autoin
1eb0: 63 49 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20  cInfo *p;       
1ec0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1ed0: 69 6f 6e 20 61 62 6f 75 74 20 61 6e 20 41 55 54  ion about an AUT
1ee0: 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20  OINCREMENT */.  
1ef0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1f00: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
1f10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1f20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 62 20 2a 70  ction */.  Db *p
1f30: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1f40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f50: 65 20 6f 6e 6c 79 20 61 75 74 6f 69 6e 63 20 74  e only autoinc t
1f60: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  able */.  int me
1f70: 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
1f80: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1f90: 20 68 6f 6c 64 69 6e 67 20 6d 61 78 20 72 6f 77   holding max row
1fa0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  id */.  int addr
1fb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc0: 20 20 20 2f 2a 20 41 20 56 44 42 45 20 61 64 64     /* A VDBE add
1fd0: 72 65 73 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ress */.  Vdbe *
1fe0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1ff0: 65 3b 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64  e;   /* VDBE und
2000: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
2010: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
2020: 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2030: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 72 69  alled during tri
2040: 67 67 65 72 2d 67 65 6e 65 72 61 74 69 6f 6e 2e  gger-generation.
2050: 20 20 49 74 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c    It is.  ** onl
2060: 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 68  y called from th
2070: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 2a 2f 0a 20  e top-level */. 
2080: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
2090: 3e 70 54 72 69 67 67 65 72 54 61 62 3d 3d 30 20  >pTriggerTab==0 
20a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20b0: 72 73 65 3d 3d 73 71 6c 69 74 65 33 50 61 72 73  rse==sqlite3Pars
20c0: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
20d0: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
20e0: 76 20 29 3b 20 20 20 2f 2a 20 57 65 20 66 61 69  v );   /* We fai
20f0: 6c 65 64 20 6c 6f 6e 67 20 61 67 6f 20 69 66 20  led long ago if 
2100: 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 2a  this is not so *
2110: 2f 0a 20 20 66 6f 72 28 70 20 3d 20 70 50 61 72  /.  for(p = pPar
2120: 73 65 2d 3e 70 41 69 6e 63 3b 20 70 3b 20 70 20  se->pAinc; p; p 
2130: 3d 20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  = p->pNext){.   
2140: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
2150: 70 2d 3e 69 44 62 5d 3b 0a 20 20 20 20 6d 65 6d  p->iDb];.    mem
2160: 49 64 20 3d 20 70 2d 3e 72 65 67 43 74 72 3b 0a  Id = p->regCtr;.
2170: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2180: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2190: 6c 64 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70  ld(db, 0, pDb->p
21a0: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73  Schema) );.    s
21b0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
21c0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44  pParse, 0, p->iD
21d0: 62 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  b, pDb->pSchema-
21e0: 3e 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65  >pSeqTab, OP_Ope
21f0: 6e 52 65 61 64 29 3b 0a 20 20 20 20 73 71 6c 69  nRead);.    sqli
2200: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2210: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 6d 65 6d   OP_Null, 0, mem
2220: 49 64 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a 20 20  Id, memId+1);.  
2230: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
2240: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2250: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
2260: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2270: 53 74 72 69 6e 67 38 2c 20 30 2c 20 6d 65 6d 49  String8, 0, memI
2280: 64 2d 31 2c 20 30 2c 20 70 2d 3e 70 54 61 62 2d  d-1, 0, p->pTab-
2290: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
22a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22b0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
22c0: 30 2c 20 61 64 64 72 2b 39 29 3b 20 56 64 62 65  0, addr+9); Vdbe
22d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
22e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2300: 20 30 2c 20 30 2c 20 6d 65 6d 49 64 29 3b 0a 20   0, 0, memId);. 
2310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2320: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 6d  dOp3(v, OP_Ne, m
2330: 65 6d 49 64 2d 31 2c 20 61 64 64 72 2b 37 2c 20  emId-1, addr+7, 
2340: 6d 65 6d 49 64 29 3b 20 56 64 62 65 43 6f 76 65  memId); VdbeCove
2350: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
2360: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2370: 28 76 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  (v, SQLITE_JUMPI
2380: 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 73 71 6c 69  FNULL);.    sqli
2390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23a0: 20 4f 50 5f 52 6f 77 69 64 2c 20 30 2c 20 6d 65   OP_Rowid, 0, me
23b0: 6d 49 64 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  mId+1);.    sqli
23c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
23d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 30 2c 20 31   OP_Column, 0, 1
23e0: 2c 20 6d 65 6d 49 64 29 3b 0a 20 20 20 20 73 71  , memId);.    sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2400: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
2410: 64 64 72 2b 39 29 3b 0a 20 20 20 20 73 71 6c 69  ddr+9);.    sqli
2420: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2430: 20 4f 50 5f 4e 65 78 74 2c 20 30 2c 20 61 64 64   OP_Next, 0, add
2440: 72 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  r+2); VdbeCovera
2450: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
2460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2470: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 6d  OP_Integer, 0, m
2480: 65 6d 49 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  emId);.    sqlit
2490: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
24a0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 7d  OP_Close);.  }.}
24b0: 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
24c0: 68 65 20 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64  he maximum rowid
24d0: 20 66 6f 72 20 61 6e 20 61 75 74 6f 69 6e 63 72   for an autoincr
24e0: 65 6d 65 6e 74 20 63 61 6c 63 75 6c 61 74 69 6f  ement calculatio
24f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
2500: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
2510: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
2520: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
2530: 20 68 6f 6c 64 73 20 61 0a 2a 2a 20 6e 65 77 20   holds a.** new 
2540: 72 6f 77 69 64 20 74 68 61 74 20 69 73 20 61 62  rowid that is ab
2550: 6f 75 74 20 74 6f 20 62 65 20 69 6e 73 65 72 74  out to be insert
2560: 65 64 2e 20 20 49 66 20 74 68 61 74 20 6e 65 77  ed.  If that new
2570: 20 72 6f 77 69 64 20 69 73 0a 2a 2a 20 6c 61 72   rowid is.** lar
2580: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61 78  ger than the max
2590: 69 6d 75 6d 20 72 6f 77 69 64 20 69 6e 20 74 68  imum rowid in th
25a0: 65 20 6d 65 6d 49 64 20 6d 65 6d 6f 72 79 20 63  e memId memory c
25b0: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ell, then the.**
25c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20   memory cell is 
25d0: 75 70 64 61 74 65 64 2e 20 20 54 68 65 20 73 74  updated.  The st
25e0: 61 63 6b 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ack is unchanged
25f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2600: 20 61 75 74 6f 49 6e 63 53 74 65 70 28 50 61 72   autoIncStep(Par
2610: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
2620: 6d 65 6d 49 64 2c 20 69 6e 74 20 72 65 67 52 6f  memId, int regRo
2630: 77 69 64 29 7b 0a 20 20 69 66 28 20 6d 65 6d 49  wid){.  if( memI
2640: 64 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  d>0 ){.    sqlit
2650: 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
2660: 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d  rse->pVdbe, OP_M
2670: 65 6d 4d 61 78 2c 20 6d 65 6d 49 64 2c 20 72 65  emMax, memId, re
2680: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  gRowid);.  }.}..
2690: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
26a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
26b0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
26c0: 77 72 69 74 65 20 61 75 74 6f 69 6e 63 72 65 6d  write autoincrem
26d0: 65 6e 74 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 72  ent.** maximum r
26e0: 6f 77 69 64 20 76 61 6c 75 65 73 20 62 61 63 6b  owid values back
26f0: 20 69 6e 74 6f 20 74 68 65 20 73 71 6c 69 74 65   into the sqlite
2700: 5f 73 65 71 75 65 6e 63 65 20 72 65 67 69 73 74  _sequence regist
2710: 65 72 2e 0a 2a 2a 20 45 76 65 72 79 20 73 74 61  er..** Every sta
2720: 74 65 6d 65 6e 74 20 74 68 61 74 20 6d 69 67 68  tement that migh
2730: 74 20 64 6f 20 61 6e 20 49 4e 53 45 52 54 20 69  t do an INSERT i
2740: 6e 74 6f 20 61 6e 20 61 75 74 6f 69 6e 63 72 65  nto an autoincre
2750: 6d 65 6e 74 0a 2a 2a 20 74 61 62 6c 65 20 28 65  ment.** table (e
2760: 69 74 68 65 72 20 64 69 72 65 63 74 6c 79 20 6f  ither directly o
2770: 72 20 74 68 72 6f 75 67 68 20 74 72 69 67 67 65  r through trigge
2780: 72 73 29 20 6e 65 65 64 73 20 74 6f 20 63 61 6c  rs) needs to cal
2790: 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
27a0: 65 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  e just before th
27b0: 65 20 22 65 78 69 74 22 20 63 6f 64 65 2e 0a 2a  e "exit" code..*
27c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 75  /.void sqlite3Au
27d0: 74 6f 69 6e 63 72 65 6d 65 6e 74 45 6e 64 28 50  toincrementEnd(P
27e0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
27f0: 20 41 75 74 6f 69 6e 63 49 6e 66 6f 20 2a 70 3b   AutoincInfo *p;
2800: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2810: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71  rse->pVdbe;.  sq
2820: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2830: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
2840: 74 28 20 76 20 29 3b 0a 20 20 66 6f 72 28 70 20  t( v );.  for(p 
2850: 3d 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 3b  = pParse->pAinc;
2860: 20 70 3b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   p; p = p->pNext
2870: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
2880: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
2890: 5d 3b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ];.    int j1;. 
28a0: 20 20 20 69 6e 74 20 69 52 65 63 3b 0a 20 20 20     int iRec;.   
28b0: 20 69 6e 74 20 6d 65 6d 49 64 20 3d 20 70 2d 3e   int memId = p->
28c0: 72 65 67 43 74 72 3b 0a 0a 20 20 20 20 69 52 65  regCtr;..    iRe
28d0: 63 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  c = sqlite3GetTe
28e0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
28f0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2900: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
2910: 64 28 64 62 2c 20 30 2c 20 70 44 62 2d 3e 70 53  d(db, 0, pDb->pS
2920: 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 73 71  chema) );.    sq
2930: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
2940: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 69 44 62  Parse, 0, p->iDb
2950: 2c 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  , pDb->pSchema->
2960: 70 53 65 71 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  pSeqTab, OP_Open
2970: 57 72 69 74 65 29 3b 0a 20 20 20 20 6a 31 20 3d  Write);.    j1 =
2980: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2990: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
29a0: 2c 20 6d 65 6d 49 64 2b 31 29 3b 20 56 64 62 65  , memId+1); Vdbe
29b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29d0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
29e0: 64 2c 20 30 2c 20 6d 65 6d 49 64 2b 31 29 3b 0a  d, 0, memId+1);.
29f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2a00: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
2a10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
2a30: 52 65 63 6f 72 64 2c 20 6d 65 6d 49 64 2d 31 2c  Record, memId-1,
2a40: 20 32 2c 20 69 52 65 63 29 3b 0a 20 20 20 20 73   2, iRec);.    s
2a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2a60: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
2a70: 2c 20 69 52 65 63 2c 20 6d 65 6d 49 64 2b 31 29  , iRec, memId+1)
2a80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2a90: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2aa0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
2ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ac0: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
2ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2ae0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
2af0: 65 2c 20 69 52 65 63 29 3b 0a 20 20 7d 0a 7d 0a  e, iRec);.  }.}.
2b00: 23 65 6c 73 65 0a 2f 2a 0a 2a 2a 20 49 66 20 53  #else./*.** If S
2b10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
2b20: 4e 43 52 45 4d 45 4e 54 20 69 73 20 64 65 66 69  NCREMENT is defi
2b30: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 68  ned, then the th
2b40: 72 65 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ree routines.** 
2b50: 61 62 6f 76 65 20 61 72 65 20 61 6c 6c 20 6e 6f  above are all no
2b60: 2d 6f 70 73 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  -ops.*/.# define
2b70: 20 61 75 74 6f 49 6e 63 42 65 67 69 6e 28 41 2c   autoIncBegin(A,
2b80: 42 2c 43 29 20 28 30 29 0a 23 20 64 65 66 69 6e  B,C) (0).# defin
2b90: 65 20 61 75 74 6f 49 6e 63 53 74 65 70 28 41 2c  e autoIncStep(A,
2ba0: 42 2c 43 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  B,C).#endif /* S
2bb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
2bc0: 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 0a 2f 2a  NCREMENT */.../*
2bd0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
2be0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
2bf0: 6e 74 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74  nt xferOptimizat
2c00: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
2c10: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
2c20: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
2c30: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44 65 73 74  /.  Table *pDest
2c40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2c50: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 69 6e   table we are in
2c60: 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a  serting into */.
2c70: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
2c80: 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53 45 4c  t,      /* A SEL
2c90: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
2ca0: 20 75 73 65 20 61 73 20 74 68 65 20 64 61 74 61   use as the data
2cb0: 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74   source */.  int
2cc0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
2cd0: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e     /* How to han
2ce0: 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  dle constraint e
2cf0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  rrors */.  int i
2d00: 44 62 44 65 73 74 20 20 20 20 20 20 20 20 20 20  DbDest          
2d10: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
2d20: 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a 29 3b 0a   of pDest */.);.
2d30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2d40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2d50: 20 68 61 6e 64 6c 65 20 53 51 4c 20 6f 66 20 74   handle SQL of t
2d60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
2d70: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 6e 73  ms:.**.**    ins
2d80: 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45 20 28  ert into TABLE (
2d90: 49 44 4c 49 53 54 29 20 76 61 6c 75 65 73 28 45  IDLIST) values(E
2da0: 58 50 52 4c 49 53 54 29 0a 2a 2a 20 20 20 20 69  XPRLIST).**    i
2db0: 6e 73 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45  nsert into TABLE
2dc0: 20 28 49 44 4c 49 53 54 29 20 73 65 6c 65 63 74   (IDLIST) select
2dd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 49 44 4c 49 53  .**.** The IDLIS
2de0: 54 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  T following the 
2df0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 61 6c  table name is al
2e00: 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  ways optional.  
2e10: 49 66 20 6f 6d 69 74 74 65 64 2c 0a 2a 2a 20 74  If omitted,.** t
2e20: 68 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c  hen a list of al
2e30: 6c 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  l columns for th
2e40: 65 20 74 61 62 6c 65 20 69 73 20 73 75 62 73 74  e table is subst
2e50: 69 74 75 74 65 64 2e 20 20 54 68 65 20 49 44 4c  ituted.  The IDL
2e60: 49 53 54 0a 2a 2a 20 61 70 70 65 61 72 73 20 69  IST.** appears i
2e70: 6e 20 74 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61  n the pColumn pa
2e80: 72 61 6d 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d  rameter.  pColum
2e90: 6e 20 69 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c  n is NULL if IDL
2ea0: 49 53 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a  IST is omitted..
2eb0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20  **.** The pList 
2ec0: 70 61 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20  parameter holds 
2ed0: 45 58 50 52 4c 49 53 54 20 69 6e 20 74 68 65 20  EXPRLIST in the 
2ee0: 66 69 72 73 74 20 66 6f 72 6d 20 6f 66 20 74 68  first form of th
2ef0: 65 20 49 4e 53 45 52 54 0a 2a 2a 20 73 74 61 74  e INSERT.** stat
2f00: 65 6d 65 6e 74 20 61 62 6f 76 65 2c 20 61 6e 64  ement above, and
2f10: 20 70 53 65 6c 65 63 74 20 69 73 20 4e 55 4c 4c   pSelect is NULL
2f20: 2e 20 20 46 6f 72 20 74 68 65 20 73 65 63 6f 6e  .  For the secon
2f30: 64 20 66 6f 72 6d 2c 20 70 4c 69 73 74 20 69 73  d form, pList is
2f40: 0a 2a 2a 20 4e 55 4c 4c 20 61 6e 64 20 70 53 65  .** NULL and pSe
2f50: 6c 65 63 74 20 69 73 20 61 20 70 6f 69 6e 74 65  lect is a pointe
2f60: 72 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 20  r to the select 
2f70: 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
2f80: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 64 61  o generate.** da
2f90: 74 61 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72  ta for the inser
2fa0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  t..**.** The cod
2fb0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 6c 6c  e generated foll
2fc0: 6f 77 73 20 6f 6e 65 20 6f 66 20 66 6f 75 72 20  ows one of four 
2fd0: 74 65 6d 70 6c 61 74 65 73 2e 20 20 46 6f 72 20  templates.  For 
2fe0: 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 69 6e 73 65  a simple.** inse
2ff0: 72 74 20 77 69 74 68 20 64 61 74 61 20 63 6f 6d  rt with data com
3000: 69 6e 67 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  ing from a VALUE
3010: 53 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f  S clause, the co
3020: 64 65 20 65 78 65 63 75 74 65 73 0a 2a 2a 20 6f  de executes.** o
3030: 6e 63 65 20 73 74 72 61 69 67 68 74 20 64 6f 77  nce straight dow
3040: 6e 20 74 68 72 6f 75 67 68 2e 20 20 50 73 65 75  n through.  Pseu
3050: 64 6f 2d 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20  do-code follows 
3060: 28 77 65 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a  (we call this.**
3070: 20 74 68 65 20 22 31 73 74 20 74 65 6d 70 6c 61   the "1st templa
3080: 74 65 22 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te"):.**.**     
3090: 20 20 20 20 6f 70 65 6e 20 77 72 69 74 65 20 63      open write c
30a0: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
30b0: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
30c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 75 74 20  .**         put 
30d0: 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20 65 78  VALUES clause ex
30e0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 74 6f 20 72  pressions into r
30f0: 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
3100: 20 20 20 20 77 72 69 74 65 20 74 68 65 20 72 65      write the re
3110: 73 75 6c 74 69 6e 67 20 72 65 63 6f 72 64 20 69  sulting record i
3120: 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20  nto <table>.**  
3130: 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 0a 2a         cleanup.*
3140: 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 65 20 72  *.** The three r
3150: 65 6d 61 69 6e 69 6e 67 20 74 65 6d 70 6c 61 74  emaining templat
3160: 65 73 20 61 73 73 75 6d 65 20 74 68 65 20 73 74  es assume the st
3170: 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
3180: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 49  e form.**.**   I
3190: 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62 6c  NSERT INTO <tabl
31a0: 65 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 0a 2a 2a  e> SELECT ....**
31b0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
31c0: 54 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74  T clause is of t
31d0: 68 65 20 72 65 73 74 72 69 63 74 65 64 20 66 6f  he restricted fo
31e0: 72 6d 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  rm "SELECT * FRO
31f0: 4d 20 3c 74 61 62 6c 65 32 3e 22 20 2d 0a 2a 2a  M <table2>" -.**
3200: 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20   in other words 
3210: 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 75  if the SELECT pu
3220: 6c 6c 73 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  lls all columns 
3230: 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
3240: 62 6c 65 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65  ble.** and there
3250: 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20   is no WHERE or 
3260: 4c 49 4d 49 54 20 6f 72 20 47 52 4f 55 50 20 42  LIMIT or GROUP B
3270: 59 20 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c  Y or ORDER BY cl
3280: 61 75 73 65 73 2c 20 61 6e 64 0a 2a 2a 20 69 66  auses, and.** if
3290: 20 3c 74 61 62 6c 65 32 3e 20 61 6e 64 20 3c 74   <table2> and <t
32a0: 61 62 6c 65 31 3e 20 61 72 65 20 64 69 73 74 69  able1> are disti
32b0: 6e 63 74 20 74 61 62 6c 65 73 20 62 75 74 20 68  nct tables but h
32c0: 61 76 65 20 69 64 65 6e 74 69 63 61 6c 0a 2a 2a  ave identical.**
32d0: 20 73 63 68 65 6d 61 73 2c 20 69 6e 63 6c 75 64   schemas, includ
32e0: 69 6e 67 20 61 6c 6c 20 74 68 65 20 73 61 6d 65  ing all the same
32f0: 20 69 6e 64 69 63 65 73 2c 20 74 68 65 6e 20 61   indices, then a
3300: 20 73 70 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a   special optimiz
3310: 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 69 6e 76 6f  ation.** is invo
3320: 6b 65 64 20 74 68 61 74 20 63 6f 70 69 65 73 20  ked that copies 
3330: 72 61 77 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  raw records from
3340: 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72 20 74   <table2> over t
3350: 6f 20 3c 74 61 62 6c 65 31 3e 2e 0a 2a 2a 20 53  o <table1>..** S
3360: 65 65 20 74 68 65 20 78 66 65 72 4f 70 74 69 6d  ee the xferOptim
3370: 69 7a 61 74 69 6f 6e 28 29 20 66 75 6e 63 74 69  ization() functi
3380: 6f 6e 20 66 6f 72 20 74 68 65 20 69 6d 70 6c 65  on for the imple
3390: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 69  mentation of thi
33a0: 73 0a 2a 2a 20 74 65 6d 70 6c 61 74 65 2e 20 20  s.** template.  
33b0: 54 68 69 73 20 69 73 20 74 68 65 20 32 6e 64 20  This is the 2nd 
33c0: 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
33d0: 20 20 20 20 20 20 20 20 6f 70 65 6e 20 61 20 77          open a w
33e0: 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c  rite cursor to <
33f0: 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20  table>.**       
3400: 20 20 6f 70 65 6e 20 72 65 61 64 20 63 75 72 73    open read curs
3410: 6f 72 20 6f 6e 20 3c 74 61 62 6c 65 32 3e 0a 2a  or on <table2>.*
3420: 2a 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  *         transf
3430: 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 69  er all records i
3440: 6e 20 3c 74 61 62 6c 65 32 3e 20 6f 76 65 72 20  n <table2> over 
3450: 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20  to <table>.**   
3460: 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73        close curs
3470: 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ors.**         f
3480: 6f 72 65 61 63 68 20 69 6e 64 65 78 20 6f 6e 20  oreach index on 
3490: 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20  <table>.**      
34a0: 20 20 20 20 20 6f 70 65 6e 20 61 20 77 72 69 74       open a writ
34b0: 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20  e cursor on the 
34c0: 3c 74 61 62 6c 65 3e 20 69 6e 64 65 78 0a 2a 2a  <table> index.**
34d0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 20             open 
34e0: 61 20 72 65 61 64 20 63 75 72 73 6f 72 20 6f 6e  a read cursor on
34f0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
3500: 6e 67 20 3c 74 61 62 6c 65 32 3e 20 69 6e 64 65  ng <table2> inde
3510: 78 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  x.**           t
3520: 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 65 63 6f  ransfer all reco
3530: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 72 65 61  rds from the rea
3540: 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 20 63  d to the write c
3550: 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20  ursors.**       
3560: 20 20 20 20 63 6c 6f 73 65 20 63 75 72 73 6f 72      close cursor
3570: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64  s.**         end
3580: 20 66 6f 72 65 61 63 68 0a 2a 2a 0a 2a 2a 20 54   foreach.**.** T
3590: 68 65 20 33 72 64 20 74 65 6d 70 6c 61 74 65 20  he 3rd template 
35a0: 69 73 20 66 6f 72 20 77 68 65 6e 20 74 68 65 20  is for when the 
35b0: 73 65 63 6f 6e 64 20 74 65 6d 70 6c 61 74 65 20  second template 
35c0: 64 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 0a 2a  does not apply.*
35d0: 2a 20 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54  * and the SELECT
35e0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
35f0: 20 72 65 61 64 20 66 72 6f 6d 20 3c 74 61 62 6c   read from <tabl
3600: 65 3e 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 0a  e> at any time..
3610: 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  ** The generated
3620: 20 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20 74 68   code follows th
3630: 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a 2a 0a  is template:.**.
3640: 2a 2a 20 20 20 20 20 20 20 20 20 58 20 3c 2d 20  **         X <- 
3650: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74  A.**         got
3660: 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73  o B.**      A: s
3670: 65 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c  etup for the SEL
3680: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c  ECT.**         l
3690: 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 72 6f 77  oop over the row
36a0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
36b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 61  **           loa
36c0: 64 20 76 61 6c 75 65 73 20 69 6e 74 6f 20 72 65  d values into re
36d0: 67 69 73 74 65 72 73 20 52 2e 2e 52 2b 6e 0a 2a  gisters R..R+n.*
36e0: 2a 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  *           yiel
36f0: 64 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  d X.**         e
3700: 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20  nd loop.**      
3710: 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74 65 72     cleanup after
3720: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20   the SELECT.**  
3730: 20 20 20 20 20 20 20 65 6e 64 2d 63 6f 72 6f 75         end-corou
3740: 74 69 6e 65 20 58 0a 2a 2a 20 20 20 20 20 20 42  tine X.**      B
3750: 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63 75 72  : open write cur
3760: 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61  sor to <table> a
3770: 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a  nd its indices.*
3780: 2a 20 20 20 20 20 20 43 3a 20 79 69 65 6c 64 20  *      C: yield 
3790: 58 2c 20 61 74 20 45 4f 46 20 67 6f 74 6f 20 44  X, at EOF goto D
37a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65  .**         inse
37b0: 72 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65  rt the select re
37c0: 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65  sult into <table
37d0: 3e 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 2a 2a  > from R..R+n.**
37e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43 0a           goto C.
37f0: 2a 2a 20 20 20 20 20 20 44 3a 20 63 6c 65 61 6e  **      D: clean
3800: 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 34 74 68  up.**.** The 4th
3810: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 75 73 65   template is use
3820: 64 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20  d if the insert 
3830: 73 74 61 74 65 6d 65 6e 74 20 74 61 6b 65 73 20  statement takes 
3840: 69 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72  its.** values fr
3850: 6f 6d 20 61 20 53 45 4c 45 43 54 20 62 75 74 20  om a SELECT but 
3860: 74 68 65 20 64 61 74 61 20 69 73 20 62 65 69 6e  the data is bein
3870: 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  g inserted into 
3880: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20  a table.** that 
3890: 69 73 20 61 6c 73 6f 20 72 65 61 64 20 61 73 20  is also read as 
38a0: 70 61 72 74 20 6f 66 20 74 68 65 20 53 45 4c 45  part of the SELE
38b0: 43 54 2e 20 20 49 6e 20 74 68 65 20 74 68 69 72  CT.  In the thir
38c0: 64 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61  d form,.** we ha
38d0: 76 65 20 74 6f 20 75 73 65 20 61 20 69 6e 74 65  ve to use a inte
38e0: 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20 74  rmediate table t
38f0: 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
3900: 6c 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65  lts of.** the se
3910: 6c 65 63 74 2e 20 20 54 68 65 20 74 65 6d 70 6c  lect.  The templ
3920: 61 74 65 20 69 73 20 6c 69 6b 65 20 74 68 69 73  ate is like this
3930: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
3940: 58 20 3c 2d 20 41 0a 2a 2a 20 20 20 20 20 20 20  X <- A.**       
3950: 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20 20 20 20    goto B.**     
3960: 20 41 3a 20 73 65 74 75 70 20 66 6f 72 20 74 68   A: setup for th
3970: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  e SELECT.**     
3980: 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68      loop over th
3990: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
39a0: 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
39b0: 20 20 20 20 6c 6f 61 64 20 76 61 6c 75 65 20 69      load value i
39c0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 52 2e 2e  nto register R..
39d0: 52 2b 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  R+n.**          
39e0: 20 79 69 65 6c 64 20 58 0a 2a 2a 20 20 20 20 20   yield X.**     
39f0: 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20      end loop.** 
3a00: 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 20          cleanup 
3a10: 61 66 74 65 72 20 74 68 65 20 53 45 4c 45 43 54  after the SELECT
3a20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20  .**         end 
3a30: 63 6f 2d 72 6f 75 74 69 6e 65 20 52 0a 2a 2a 20  co-routine R.** 
3a40: 20 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65 6d       B: open tem
3a50: 70 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  p table.**      
3a60: 4c 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20 45  L: yield X, at E
3a70: 4f 46 20 67 6f 74 6f 20 4d 0a 2a 2a 20 20 20 20  OF goto M.**    
3a80: 20 20 20 20 20 69 6e 73 65 72 74 20 72 6f 77 20       insert row 
3a90: 66 72 6f 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f  from R..R+n into
3aa0: 20 74 65 6d 70 20 74 61 62 6c 65 0a 2a 2a 20 20   temp table.**  
3ab0: 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a 2a 2a         goto L.**
3ac0: 20 20 20 20 20 20 4d 3a 20 6f 70 65 6e 20 77 72        M: open wr
3ad0: 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20 3c 74  ite cursor to <t
3ae0: 61 62 6c 65 3e 20 61 6e 64 20 69 74 73 20 69 6e  able> and its in
3af0: 64 69 63 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  dices.**        
3b00: 20 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62   rewind temp tab
3b10: 6c 65 0a 2a 2a 20 20 20 20 20 20 43 3a 20 6c 6f  le.**      C: lo
3b20: 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66 20  op over rows of 
3b30: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62  intermediate tab
3b40: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
3b50: 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73 20  transfer values 
3b60: 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61 74  form intermediat
3b70: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74 61  e table into <ta
3b80: 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble>.**         
3b90: 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20  end loop.**     
3ba0: 20 44 3a 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a 76   D: cleanup.*/.v
3bb0: 6f 69 64 20 73 71 6c 69 74 65 33 49 6e 73 65 72  oid sqlite3Inser
3bc0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3bd0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
3be0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
3bf0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
3c00: 69 73 74 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ist,    /* Name 
3c10: 6f 66 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  of table into wh
3c20: 69 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72  ich we are inser
3c30: 74 69 6e 67 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ting */.  Select
3c40: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
3c50: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
3c60: 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20  ement to use as 
3c70: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
3c80: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
3c90: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 43 6f  lumn,      /* Co
3ca0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 6f 72 72 65  lumn names corre
3cb0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 49 44 4c 49  sponding to IDLI
3cc0: 53 54 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ST. */.  int onE
3cd0: 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rror           /
3ce0: 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20  * How to handle 
3cf0: 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72  constraint error
3d00: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
3d10: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
3d20: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 61 74 61  /* The main data
3d30: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
3d40: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
3d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d60: 20 74 61 62 6c 65 20 74 6f 20 69 6e 73 65 72 74   table to insert
3d70: 20 69 6e 74 6f 2e 20 20 61 6b 61 20 54 41 42 4c   into.  aka TABL
3d80: 45 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  E */.  char *zTa
3d90: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
3da0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
3db0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
3dc0: 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f  are inserting */
3dd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3de0: 44 62 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  Db;      /* Name
3df0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3e00: 20 68 6f 6c 64 69 6e 67 20 74 68 69 73 20 74 61   holding this ta
3e10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ble */.  int i, 
3e20: 6a 2c 20 69 64 78 3b 20 20 20 20 20 20 20 20 2f  j, idx;        /
3e30: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
3e40: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
3e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
3e60: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3e70: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
3e80: 63 68 69 6e 65 20 2a 2f 0a 20 20 49 6e 64 65 78  chine */.  Index
3e90: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
3ea0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
3eb0: 6f 76 65 72 20 69 6e 64 69 63 65 73 20 6f 66 20  over indices of 
3ec0: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
3ed0: 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt nColumn;     
3ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3ef0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3f00: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
3f10: 48 69 64 64 65 6e 20 3d 20 30 3b 20 20 20 20 20  Hidden = 0;     
3f20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69   /* Number of hi
3f30: 64 64 65 6e 20 63 6f 6c 75 6d 6e 73 20 69 66 20  dden columns if 
3f40: 54 41 42 4c 45 20 69 73 20 76 69 72 74 75 61 6c  TABLE is virtual
3f50: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43   */.  int iDataC
3f60: 75 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56  ur = 0;     /* V
3f70: 44 42 45 20 63 75 72 73 6f 72 20 74 68 61 74 20  DBE cursor that 
3f80: 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  is the main data
3f90: 20 72 65 70 6f 73 69 74 6f 72 79 20 2a 2f 0a 20   repository */. 
3fa0: 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 30   int iIdxCur = 0
3fb0: 3b 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ;      /* First 
3fc0: 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a  index cursor */.
3fd0: 20 20 69 6e 74 20 69 70 6b 43 6f 6c 75 6d 6e 20    int ipkColumn 
3fe0: 3d 20 2d 31 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d  = -1;   /* Colum
3ff0: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 49 4e  n that is the IN
4000: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4010: 59 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 4f 66  Y */.  int endOf
4020: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
4030: 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
4040: 64 20 6f 66 20 74 68 65 20 69 6e 73 65 72 74 69  d of the inserti
4050: 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  on loop */.  int
4060: 20 73 72 63 54 61 62 20 3d 20 30 3b 20 20 20 20   srcTab = 0;    
4070: 20 20 20 2f 2a 20 44 61 74 61 20 63 6f 6d 65 73     /* Data comes
4080: 20 66 72 6f 6d 20 74 68 69 73 20 74 65 6d 70 6f   from this tempo
4090: 72 61 72 79 20 63 75 72 73 6f 72 20 69 66 20 3e  rary cursor if >
40a0: 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  =0 */.  int addr
40b0: 49 6e 73 54 6f 70 20 3d 20 30 3b 20 20 20 2f 2a  InsTop = 0;   /*
40c0: 20 4a 75 6d 70 20 74 6f 20 6c 61 62 65 6c 20 22   Jump to label "
40d0: 44 22 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  D" */.  int addr
40e0: 43 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Cont = 0;     /*
40f0: 20 54 6f 70 20 6f 66 20 69 6e 73 65 72 74 20 6c   Top of insert l
4100: 6f 6f 70 2e 20 4c 61 62 65 6c 20 22 43 22 20 69  oop. Label "C" i
4110: 6e 20 74 65 6d 70 6c 61 74 65 73 20 33 20 61 6e  n templates 3 an
4120: 64 20 34 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  d 4 */.  SelectD
4130: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
4140: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
4150: 72 20 53 45 4c 45 43 54 20 6f 6e 20 72 68 73 20  r SELECT on rhs 
4160: 6f 66 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69  of INSERT */.  i
4170: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
4180: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
4190: 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   database holdin
41a0: 67 20 54 41 42 4c 45 20 2a 2f 0a 20 20 44 62 20  g TABLE */.  Db 
41b0: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
41c0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
41d0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
41e0: 62 6c 65 20 62 65 69 6e 67 20 69 6e 73 65 72 74  ble being insert
41f0: 65 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 75 38 20  ed into */.  u8 
4200: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 30  useTempTable = 0
4210: 3b 20 20 2f 2a 20 53 74 6f 72 65 20 53 45 4c 45  ;  /* Store SELE
4220: 43 54 20 72 65 73 75 6c 74 73 20 69 6e 20 69 6e  CT results in in
4230: 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65  termediate table
4240: 20 2a 2f 0a 20 20 75 38 20 61 70 70 65 6e 64 46   */.  u8 appendF
4250: 6c 61 67 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54  lag = 0;    /* T
4260: 72 75 65 20 69 66 20 74 68 65 20 69 6e 73 65 72  rue if the inser
4270: 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62  t is likely to b
4280: 65 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e an append */. 
4290: 20 75 38 20 77 69 74 68 6f 75 74 52 6f 77 69 64   u8 withoutRowid
42a0: 3b 20 20 20 20 20 20 2f 2a 20 30 20 66 6f 72 20  ;      /* 0 for 
42b0: 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 2e 20 20 31  normal table.  1
42c0: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
42d0: 49 44 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 38  ID table */.  u8
42e0: 20 62 49 64 4c 69 73 74 49 6e 4f 72 64 65 72 20   bIdListInOrder 
42f0: 3d 20 31 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 1; /* True if 
4300: 49 44 4c 49 53 54 20 69 73 20 69 6e 20 74 61 62  IDLIST is in tab
4310: 6c 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 45 78  le order */.  Ex
4320: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
4330: 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 56  0;  /* List of V
4340: 41 4c 55 45 53 28 29 20 74 6f 20 62 65 20 69 6e  ALUES() to be in
4350: 73 65 72 74 65 64 20 20 2a 2f 0a 0a 20 20 2f 2a  serted  */..  /*
4360: 20 52 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   Register alloca
4370: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tions */.  int r
4380: 65 67 46 72 6f 6d 53 65 6c 65 63 74 20 3d 20 30  egFromSelect = 0
4390: 3b 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65  ;/* Base registe
43a0: 72 20 66 6f 72 20 64 61 74 61 20 63 6f 6d 69 6e  r for data comin
43b0: 67 20 66 72 6f 6d 20 53 45 4c 45 43 54 20 2a 2f  g from SELECT */
43c0: 0a 20 20 69 6e 74 20 72 65 67 41 75 74 6f 69 6e  .  int regAutoin
43d0: 63 20 3d 20 30 3b 20 20 20 2f 2a 20 52 65 67 69  c = 0;   /* Regi
43e0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
43f0: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 63   AUTOINCREMENT c
4400: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
4410: 72 65 67 52 6f 77 43 6f 75 6e 74 20 3d 20 30 3b  regRowCount = 0;
4420: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
4430: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f   used for the ro
4440: 77 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  w counter */.  i
4450: 6e 74 20 72 65 67 49 6e 73 3b 20 20 20 20 20 20  nt regIns;      
4460: 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 6f 66       /* Block of
4470: 20 72 65 67 73 20 68 6f 6c 64 69 6e 67 20 72 6f   regs holding ro
4480: 77 69 64 2b 64 61 74 61 20 62 65 69 6e 67 20 69  wid+data being i
4490: 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
44a0: 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20   regRowid;      
44b0: 20 20 20 2f 2a 20 72 65 67 69 73 74 65 72 73 20     /* registers 
44c0: 68 6f 6c 64 69 6e 67 20 69 6e 73 65 72 74 20 72  holding insert r
44d0: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  owid */.  int re
44e0: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
44f0: 2f 2a 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  /* register hold
4500: 69 6e 67 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  ing first column
4510: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
4520: 69 6e 74 20 2a 61 52 65 67 49 64 78 20 3d 20 30  int *aRegIdx = 0
4530: 3b 20 20 20 20 20 2f 2a 20 4f 6e 65 20 72 65 67  ;     /* One reg
4540: 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
4550: 74 6f 20 65 61 63 68 20 69 6e 64 65 78 20 2a 2f  to each index */
4560: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4570: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
4580: 69 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20 20  int isView;     
4590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
45a0: 72 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e  rue if attemptin
45b0: 67 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  g to insert into
45c0: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 54 72 69   a view */.  Tri
45d0: 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 20  gger *pTrigger; 
45e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
45f0: 20 6f 66 20 74 72 69 67 67 65 72 73 20 6f 6e 20   of triggers on 
4600: 70 54 61 62 2c 20 69 66 20 72 65 71 75 69 72 65  pTab, if require
4610: 64 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 61 73 6b  d */.  int tmask
4620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4630: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 72     /* Mask of tr
4640: 69 67 67 65 72 20 74 69 6d 65 73 20 2a 2f 0a 23  igger times */.#
4650: 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50  endif..  db = pP
4660: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73  arse->db;.  mems
4670: 65 74 28 26 64 65 73 74 2c 20 30 2c 20 73 69 7a  et(&dest, 0, siz
4680: 65 6f 66 28 64 65 73 74 29 29 3b 0a 20 20 69 66  eof(dest));.  if
4690: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
46a0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
46b0: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  ed ){.    goto i
46c0: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
46d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
46e0: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 69 73  Select object is
46f0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 73   really just a s
4700: 69 6d 70 6c 65 20 56 41 4c 55 45 53 28 29 20 6c  imple VALUES() l
4710: 69 73 74 20 77 69 74 68 20 61 0a 20 20 2a 2a 20  ist with a.  ** 
4720: 73 69 6e 67 6c 65 20 72 6f 77 20 76 61 6c 75 65  single row value
4730: 73 20 28 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  s (the common ca
4740: 73 65 29 20 74 68 65 6e 20 6b 65 65 70 20 74 68  se) then keep th
4750: 61 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 76 61  at one row of va
4760: 6c 75 65 73 0a 20 20 2a 2a 20 61 6e 64 20 67 6f  lues.  ** and go
4770: 20 61 68 65 61 64 20 61 6e 64 20 64 69 73 63 61   ahead and disca
4780: 72 64 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62  rd the Select ob
4790: 6a 65 63 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ject.  */.  if( 
47a0: 70 53 65 6c 65 63 74 20 26 26 20 28 70 53 65 6c  pSelect && (pSel
47b0: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
47c0: 53 46 5f 56 61 6c 75 65 73 29 21 3d 30 20 26 26  SF_Values)!=0 &&
47d0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
47e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
47f0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
4800: 73 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d  st;.    pSelect-
4810: 3e 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  >pEList = 0;.   
4820: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
4830: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
4840: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d  );.    pSelect =
4850: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f   0;.  }..  /* Lo
4860: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
4870: 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77 69 6c  nto which we wil
4880: 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
4890: 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  ew information..
48a0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
48b0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
48c0: 20 29 3b 0a 20 20 7a 54 61 62 20 3d 20 70 54 61   );.  zTab = pTa
48d0: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  bList->a[0].zNam
48e0: 65 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 7a  e;.  if( NEVER(z
48f0: 54 61 62 3d 3d 30 29 20 29 20 67 6f 74 6f 20 69  Tab==0) ) goto i
4900: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
4910: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
4920: 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
4930: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
4940: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
4950: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
4960: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
4970: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
4980: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
4990: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
49a0: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
49b0: 3e 6e 44 62 20 29 3b 0a 20 20 70 44 62 20 3d 20  >nDb );.  pDb = 
49c0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
49d0: 20 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d   zDb = pDb->zNam
49e0: 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
49f0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
4a00: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
4a10: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
4a20: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 67 6f 74   zDb) ){.    got
4a30: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
4a40: 3b 0a 20 20 7d 0a 20 20 77 69 74 68 6f 75 74 52  ;.  }.  withoutR
4a50: 6f 77 69 64 20 3d 20 21 48 61 73 52 6f 77 69 64  owid = !HasRowid
4a60: 28 70 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 46 69  (pTab);..  /* Fi
4a70: 67 75 72 65 20 6f 75 74 20 69 66 20 77 65 20 68  gure out if we h
4a80: 61 76 65 20 61 6e 79 20 74 72 69 67 67 65 72 73  ave any triggers
4a90: 20 61 6e 64 20 69 66 20 74 68 65 20 74 61 62 6c   and if the tabl
4aa0: 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 69 6e 73  e being.  ** ins
4ab0: 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61 20  erted into is a 
4ac0: 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  view.  */.#ifnde
4ad0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
4ae0: 49 47 47 45 52 0a 20 20 70 54 72 69 67 67 65 72  IGGER.  pTrigger
4af0: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
4b00: 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20  rsExist(pParse, 
4b10: 70 54 61 62 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  pTab, TK_INSERT,
4b20: 20 30 2c 20 26 74 6d 61 73 6b 29 3b 0a 20 20 69   0, &tmask);.  i
4b30: 73 56 69 65 77 20 3d 20 70 54 61 62 2d 3e 70 53  sView = pTab->pS
4b40: 65 6c 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65 0a  elect!=0;.#else.
4b50: 23 20 64 65 66 69 6e 65 20 70 54 72 69 67 67 65  # define pTrigge
4b60: 72 20 30 0a 23 20 64 65 66 69 6e 65 20 74 6d 61  r 0.# define tma
4b70: 73 6b 20 30 0a 23 20 64 65 66 69 6e 65 20 69 73  sk 0.# define is
4b80: 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 23 69  View 0.#endif.#i
4b90: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4ba0: 5f 56 49 45 57 0a 23 20 75 6e 64 65 66 20 69 73  _VIEW.# undef is
4bb0: 56 69 65 77 0a 23 20 64 65 66 69 6e 65 20 69 73  View.# define is
4bc0: 56 69 65 77 20 30 0a 23 65 6e 64 69 66 0a 20 20  View 0.#endif.  
4bd0: 61 73 73 65 72 74 28 20 28 70 54 72 69 67 67 65  assert( (pTrigge
4be0: 72 20 26 26 20 74 6d 61 73 6b 29 20 7c 7c 20 28  r && tmask) || (
4bf0: 70 54 72 69 67 67 65 72 3d 3d 30 20 26 26 20 74  pTrigger==0 && t
4c00: 6d 61 73 6b 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  mask==0) );..  /
4c10: 2a 20 49 66 20 70 54 61 62 20 69 73 20 72 65 61  * If pTab is rea
4c20: 6c 6c 79 20 61 20 76 69 65 77 2c 20 6d 61 6b 65  lly a view, make
4c30: 20 73 75 72 65 20 69 74 20 68 61 73 20 62 65 65   sure it has bee
4c40: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  n initialized.. 
4c50: 20 2a 2a 20 56 69 65 77 47 65 74 43 6f 6c 75 6d   ** ViewGetColum
4c60: 6e 4e 61 6d 65 73 28 29 20 69 73 20 61 20 6e 6f  nNames() is a no
4c70: 2d 6f 70 20 69 66 20 70 54 61 62 20 69 73 20 6e  -op if pTab is n
4c80: 6f 74 20 61 20 76 69 65 77 2e 0a 20 20 2a 2f 0a  ot a view..  */.
4c90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
4ca0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
4cb0: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
4cc0: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
4cd0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
4ce0: 20 2f 2a 20 43 61 6e 6e 6f 74 20 69 6e 73 65 72   /* Cannot inser
4cf0: 74 20 69 6e 74 6f 20 61 20 72 65 61 64 2d 6f 6e  t into a read-on
4d00: 6c 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ly table..  */. 
4d10: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 65   if( sqlite3IsRe
4d20: 61 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70  adOnly(pParse, p
4d30: 54 61 62 2c 20 74 6d 61 73 6b 29 20 29 7b 0a 20  Tab, tmask) ){. 
4d40: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
4d50: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
4d60: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 56 44 42  * Allocate a VDB
4d70: 45 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  E.  */.  v = sql
4d80: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
4d90: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
4da0: 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c  ) goto insert_cl
4db0: 65 61 6e 75 70 3b 0a 20 20 69 66 28 20 70 50 61  eanup;.  if( pPa
4dc0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
4dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
4de0: 74 43 68 61 6e 67 65 73 28 76 29 3b 0a 20 20 73  tChanges(v);.  s
4df0: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
4e00: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
4e10: 2c 20 70 53 65 6c 65 63 74 20 7c 7c 20 70 54 72  , pSelect || pTr
4e20: 69 67 67 65 72 2c 20 69 44 62 29 3b 0a 0a 23 69  igger, iDb);..#i
4e30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4e40: 54 5f 58 46 45 52 5f 4f 50 54 0a 20 20 2f 2a 20  T_XFER_OPT.  /* 
4e50: 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
4e60: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
4e70: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
4e80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62  INSERT INTO <tab
4e90: 6c 65 31 3e 20 53 45 4c 45 43 54 20 2a 20 46 52  le1> SELECT * FR
4ea0: 4f 4d 20 3c 74 61 62 6c 65 32 3e 3b 0a 20 20 2a  OM <table2>;.  *
4eb0: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 73 70 65 63  *.  ** Then spec
4ec0: 69 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ial optimization
4ed0: 73 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64  s can be applied
4ee0: 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 20 74   that make the t
4ef0: 72 61 6e 73 66 65 72 0a 20 20 2a 2a 20 76 65 72  ransfer.  ** ver
4f00: 79 20 66 61 73 74 20 61 6e 64 20 77 68 69 63 68  y fast and which
4f10: 20 72 65 64 75 63 65 20 66 72 61 67 6d 65 6e 74   reduce fragment
4f20: 61 74 69 6f 6e 20 6f 66 20 69 6e 64 69 63 65 73  ation of indices
4f30: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
4f40: 20 69 73 20 74 68 65 20 32 6e 64 20 74 65 6d 70   is the 2nd temp
4f50: 6c 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  late..  */.  if(
4f60: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 78   pColumn==0 && x
4f70: 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  ferOptimization(
4f80: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
4f90: 65 6c 65 63 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  elect, onError, 
4fa0: 69 44 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65  iDb) ){.    asse
4fb0: 72 74 28 20 21 70 54 72 69 67 67 65 72 20 29 3b  rt( !pTrigger );
4fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
4fd0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 67 6f 74  st==0 );.    got
4fe0: 6f 20 69 6e 73 65 72 74 5f 65 6e 64 3b 0a 20 20  o insert_end;.  
4ff0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5000: 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54  TE_OMIT_XFER_OPT
5010: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
5020: 73 20 69 73 20 61 6e 20 41 55 54 4f 49 4e 43 52  s is an AUTOINCR
5030: 45 4d 45 4e 54 20 74 61 62 6c 65 2c 20 6c 6f 6f  EMENT table, loo
5040: 6b 20 75 70 20 74 68 65 20 73 65 71 75 65 6e 63  k up the sequenc
5050: 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a  e number in the.
5060: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 73 65 71 75    ** sqlite_sequ
5070: 65 6e 63 65 20 74 61 62 6c 65 20 61 6e 64 20 73  ence table and s
5080: 74 6f 72 65 20 69 74 20 69 6e 20 6d 65 6d 6f 72  tore it in memor
5090: 79 20 63 65 6c 6c 20 72 65 67 41 75 74 6f 69 6e  y cell regAutoin
50a0: 63 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 41 75 74  c..  */.  regAut
50b0: 6f 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42 65  oinc = autoIncBe
50c0: 67 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62 2c  gin(pParse, iDb,
50d0: 20 70 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c   pTab);..  /* Al
50e0: 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73  locate registers
50f0: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65   for holding the
5100: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   rowid of the ne
5110: 77 20 72 6f 77 2c 0a 20 20 2a 2a 20 74 68 65 20  w row,.  ** the 
5120: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  content of the n
5130: 65 77 20 72 6f 77 2c 20 61 6e 64 20 74 68 65 20  ew row, and the 
5140: 61 73 73 65 6d 62 6c 69 65 64 20 72 6f 77 20 72  assemblied row r
5150: 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 72 65  ecord..  */.  re
5160: 67 52 6f 77 69 64 20 3d 20 72 65 67 49 6e 73 20  gRowid = regIns 
5170: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
5180: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
5190: 20 2b 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2b   += pTab->nCol +
51a0: 20 31 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74   1;.  if( IsVirt
51b0: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
51c0: 20 72 65 67 52 6f 77 69 64 2b 2b 3b 0a 20 20 20   regRowid++;.   
51d0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
51e0: 0a 20 20 7d 0a 20 20 72 65 67 44 61 74 61 20 3d  .  }.  regData =
51f0: 20 72 65 67 52 6f 77 69 64 2b 31 3b 0a 0a 20 20   regRowid+1;..  
5200: 2f 2a 20 49 66 20 74 68 65 20 49 4e 53 45 52 54  /* If the INSERT
5210: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 63 6c 75   statement inclu
5220: 64 65 64 20 61 6e 20 49 44 4c 49 53 54 20 74 65  ded an IDLIST te
5230: 72 6d 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  rm, then make su
5240: 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d  re.  ** all elem
5250: 65 6e 74 73 20 6f 66 20 74 68 65 20 49 44 4c 49  ents of the IDLI
5260: 53 54 20 72 65 61 6c 6c 79 20 61 72 65 20 63 6f  ST really are co
5270: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
5280: 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 6d  le and .  ** rem
5290: 65 6d 62 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e  ember the column
52a0: 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20   indices..  **. 
52b0: 20 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   ** If the table
52c0: 20 68 61 73 20 61 6e 20 49 4e 54 45 47 45 52 20   has an INTEGER 
52d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
52e0: 6d 6e 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75  mn and that colu
52f0: 6d 6e 0a 20 20 2a 2a 20 69 73 20 6e 61 6d 65 64  mn.  ** is named
5300: 20 69 6e 20 74 68 65 20 49 44 4c 49 53 54 2c 20   in the IDLIST, 
5310: 74 68 65 6e 20 72 65 63 6f 72 64 20 69 6e 20 74  then record in t
5320: 68 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61 72  he ipkColumn var
5330: 69 61 62 6c 65 0a 20 20 2a 2a 20 74 68 65 20 69  iable.  ** the i
5340: 6e 64 65 78 20 69 6e 74 6f 20 49 44 4c 49 53 54  ndex into IDLIST
5350: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
5360: 6b 65 79 20 63 6f 6c 75 6d 6e 2e 20 20 69 70 6b  key column.  ipk
5370: 43 6f 6c 75 6d 6e 20 69 73 0a 20 20 2a 2a 20 74  Column is.  ** t
5380: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5390: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 73 20 69  primary key as i
53a0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 49 44 4c  t appears in IDL
53b0: 49 53 54 2c 20 6e 6f 74 20 61 73 0a 20 20 2a 2a  IST, not as.  **
53c0: 20 69 73 20 61 70 70 65 61 72 73 20 69 6e 20 74   is appears in t
53d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  he original tabl
53e0: 65 2e 20 20 28 54 68 65 20 69 6e 64 65 78 20 6f  e.  (The index o
53f0: 66 20 74 68 65 20 49 4e 54 45 47 45 52 0a 20 20  f the INTEGER.  
5400: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ** PRIMARY KEY i
5410: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  n the original t
5420: 61 62 6c 65 20 69 73 20 70 54 61 62 2d 3e 69 50  able is pTab->iP
5430: 4b 65 79 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  Key.).  */.  if(
5440: 20 70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20   pColumn ){.    
5450: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
5460: 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  mn->nId; i++){. 
5470: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b       pColumn->a[
5480: 69 5d 2e 69 64 78 20 3d 20 2d 31 3b 0a 20 20 20  i].idx = -1;.   
5490: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
54a0: 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20  i<pColumn->nId; 
54b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
54c0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
54d0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
54e0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
54f0: 43 6d 70 28 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69  Cmp(pColumn->a[i
5500: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
5510: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
5520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
5530: 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78 20  olumn->a[i].idx 
5540: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = j;.          i
5550: 66 28 20 69 21 3d 6a 20 29 20 62 49 64 4c 69 73  f( i!=j ) bIdLis
5560: 74 49 6e 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  tInOrder = 0;.  
5570: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70          if( j==p
5580: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
5590: 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f 6c            ipkCol
55a0: 75 6d 6e 20 3d 20 69 3b 20 20 61 73 73 65 72 74  umn = i;  assert
55b0: 28 20 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20  ( !withoutRowid 
55c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
55d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
55e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
55f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
5600: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
5610: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5620: 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d 6e 2d  IsRowid(pColumn-
5630: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20  >a[i].zName) && 
5640: 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  !withoutRowid ){
5650: 0a 20 20 20 20 20 20 20 20 20 20 69 70 6b 43 6f  .          ipkCo
5660: 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20  lumn = i;.      
5670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5680: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5690: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
56a0: 65 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %S has no colu
56b0: 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
56d0: 4c 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e  List, 0, pColumn
56e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
56f0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
5700: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
5710: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
5720: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
5730: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5740: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
5750: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
5760: 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  w many columns o
5770: 66 20 64 61 74 61 20 61 72 65 20 73 75 70 70 6c  f data are suppl
5780: 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
5790: 61 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67  a.  ** is coming
57a0: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
57b0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 67  tatement, then g
57c0: 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
57d0: 74 69 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 70  tine that.  ** p
57e0: 72 6f 64 75 63 65 73 20 61 20 73 69 6e 67 6c 65  roduces a single
57f0: 20 72 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45   row of the SELE
5800: 43 54 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  CT on each invoc
5810: 61 74 69 6f 6e 2e 20 20 54 68 65 0a 20 20 2a 2a  ation.  The.  **
5820: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 74   co-routine is t
5830: 68 65 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65 72  he common header
5840: 20 74 6f 20 74 68 65 20 33 72 64 20 61 6e 64 20   to the 3rd and 
5850: 34 74 68 20 74 65 6d 70 6c 61 74 65 73 2e 0a 20  4th templates.. 
5860: 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63   */.  if( pSelec
5870: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 44 61 74 61  t ){.    /* Data
5880: 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20   is coming from 
5890: 61 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  a SELECT.  Gener
58a0: 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ate a co-routine
58b0: 20 74 6f 20 72 75 6e 20 74 68 65 20 53 45 4c 45   to run the SELE
58c0: 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  CT */.    int re
58d0: 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  gYield;       /*
58e0: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
58f0: 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74  g co-routine ent
5900: 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ry-point */.    
5910: 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
5920: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
5930: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  e co-routine */.
5940: 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
5950: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
5960: 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 72  t code */..    r
5970: 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72  egYield = ++pPar
5980: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64  se->nMem;.    ad
5990: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
59a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
59b0: 29 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  ) + 1;.    sqlit
59c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
59d0: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
59e0: 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61  , regYield, 0, a
59f0: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c  ddrTop);.    sql
5a00: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
5a10: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
5a20: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
5a30: 64 29 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64  d);.    dest.iSd
5a40: 73 74 20 3d 20 62 49 64 4c 69 73 74 49 6e 4f 72  st = bIdListInOr
5a50: 64 65 72 20 3f 20 72 65 67 44 61 74 61 20 3a 20  der ? regData : 
5a60: 30 3b 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73  0;.    dest.nSds
5a70: 74 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  t = pTab->nCol;.
5a80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5a90: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
5aa0: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
5ab0: 20 20 20 20 72 65 67 46 72 6f 6d 53 65 6c 65 63      regFromSelec
5ac0: 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
5ad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
5ae0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 7c 7c 20 72  se->nErr==0 || r
5af0: 63 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  c );.    if( rc 
5b00: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
5b10: 6c 65 64 20 29 20 67 6f 74 6f 20 69 6e 73 65 72  led ) goto inser
5b20: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73  t_cleanup;.    s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5b40: 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
5b50: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
5b60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5b70: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
5b80: 6f 70 20 2d 20 31 29 3b 20 20 20 20 20 20 20 20  op - 1);        
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ba0: 2a 20 6c 61 62 65 6c 20 42 3a 20 2a 2f 0a 20 20  * label B: */.  
5bb0: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
5bc0: 74 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  t->pEList );.   
5bd0: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 53 65 6c 65   nColumn = pSele
5be0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
5bf0: 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  r;..    /* Set u
5c00: 73 65 54 65 6d 70 54 61 62 6c 65 20 74 6f 20 54  seTempTable to T
5c10: 52 55 45 20 69 66 20 74 68 65 20 72 65 73 75 6c  RUE if the resul
5c20: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
5c30: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
5c40: 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
5c50: 65 6e 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72  en into a tempor
5c60: 61 72 79 20 74 61 62 6c 65 20 28 74 65 6d 70 6c  ary table (templ
5c70: 61 74 65 20 34 29 2e 20 20 53 65 74 20 74 6f 0a  ate 4).  Set to.
5c80: 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
5c90: 65 61 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20  each output row 
5ca0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 61  of the SELECT ca
5cb0: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 64 69 72  n be written dir
5cc0: 65 63 74 6c 79 20 69 6e 74 6f 0a 20 20 20 20 2a  ectly into.    *
5cd0: 2a 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  * the destinatio
5ce0: 6e 20 74 61 62 6c 65 20 28 74 65 6d 70 6c 61 74  n table (templat
5cf0: 65 20 33 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  e 3)..    **.   
5d00: 20 2a 2a 20 41 20 74 65 6d 70 20 74 61 62 6c 65   ** A temp table
5d10: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 66   must be used if
5d20: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
5d30: 20 75 70 64 61 74 65 64 20 69 73 20 61 6c 73 6f   updated is also
5d40: 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74   one.    ** of t
5d50: 68 65 20 74 61 62 6c 65 73 20 62 65 69 6e 67 20  he tables being 
5d60: 72 65 61 64 20 62 79 20 74 68 65 20 53 45 4c 45  read by the SELE
5d70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  CT statement.  A
5d80: 6c 73 6f 20 75 73 65 20 61 20 0a 20 20 20 20 2a  lso use a .    *
5d90: 2a 20 74 65 6d 70 20 74 61 62 6c 65 20 69 6e 20  * temp table in 
5da0: 74 68 65 20 63 61 73 65 20 6f 66 20 72 6f 77 20  the case of row 
5db0: 74 72 69 67 67 65 72 73 2e 0a 20 20 20 20 2a 2f  triggers..    */
5dc0: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
5dd0: 72 20 7c 7c 20 72 65 61 64 73 54 61 62 6c 65 28  r || readsTable(
5de0: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
5df0: 62 29 20 29 7b 0a 20 20 20 20 20 20 75 73 65 54  b) ){.      useT
5e00: 65 6d 70 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  empTable = 1;.  
5e10: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 73 65    }..    if( use
5e20: 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  TempTable ){.   
5e30: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65     /* Invoke the
5e40: 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 78   coroutine to ex
5e50: 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
5e60: 6e 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43  n from the SELEC
5e70: 54 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61  T.      ** and a
5e80: 64 64 20 69 74 20 74 6f 20 61 20 74 72 61 6e 73  dd it to a trans
5e90: 69 65 6e 74 20 74 61 62 6c 65 20 73 72 63 54 61  ient table srcTa
5ea0: 62 2e 20 20 54 68 65 20 63 6f 64 65 20 67 65 6e  b.  The code gen
5eb0: 65 72 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  erated.      ** 
5ec0: 68 65 72 65 20 69 73 20 66 72 6f 6d 20 74 68 65  here is from the
5ed0: 20 34 74 68 20 74 65 6d 70 6c 61 74 65 3a 0a 20   4th template:. 
5ee0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
5ef0: 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65        B: open te
5f00: 6d 70 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  mp table.      *
5f10: 2a 20 20 20 20 20 20 4c 3a 20 79 69 65 6c 64 20  *      L: yield 
5f20: 58 2c 20 67 6f 74 6f 20 4d 20 61 74 20 45 4f 46  X, goto M at EOF
5f30: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
5f40: 20 20 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f    insert row fro
5f50: 6d 20 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65  m R..R+n into te
5f60: 6d 70 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  mp table.      *
5f70: 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c  *         goto L
5f80: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 4d  .      **      M
5f90: 3a 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  : ....      */. 
5fa0: 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
5fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
5fc0: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 70 61  ister to hold pa
5fd0: 63 6b 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20  cked record */. 
5fe0: 20 20 20 20 20 69 6e 74 20 72 65 67 54 65 6d 70       int regTemp
5ff0: 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 52 65 67  Rowid;    /* Reg
6000: 69 73 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 65  ister to hold te
6010: 6d 70 20 74 61 62 6c 65 20 52 4f 57 49 44 20 2a  mp table ROWID *
6020: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
6030: 4c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  L;           /* 
6040: 4c 61 62 65 6c 20 22 4c 22 20 2a 2f 0a 0a 20 20  Label "L" */..  
6050: 20 20 20 20 73 72 63 54 61 62 20 3d 20 70 50 61      srcTab = pPa
6060: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
6070: 20 20 20 72 65 67 52 65 63 20 3d 20 73 71 6c 69     regRec = sqli
6080: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6090: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 67  arse);.      reg
60a0: 54 65 6d 70 52 6f 77 69 64 20 3d 20 73 71 6c 69  TempRowid = sqli
60b0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
60c0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
60d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
60e0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
60f0: 61 6c 2c 20 73 72 63 54 61 62 2c 20 6e 43 6f 6c  al, srcTab, nCol
6100: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
6110: 4c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  L = sqlite3VdbeA
6120: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
6130: 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  d, dest.iSDParm)
6140: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6170: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6180: 46 72 6f 6d 53 65 6c 65 63 74 2c 20 6e 43 6f 6c  FromSelect, nCol
6190: 75 6d 6e 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  umn, regRec);.  
61a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
61b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
61c0: 6f 77 69 64 2c 20 73 72 63 54 61 62 2c 20 72 65  owid, srcTab, re
61d0: 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20  gTempRowid);.   
61e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
61f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
6200: 74 2c 20 73 72 63 54 61 62 2c 20 72 65 67 52 65  t, srcTab, regRe
6210: 63 2c 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29  c, regTempRowid)
6220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6230: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6240: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4c 29 3b  Goto, 0, addrL);
6250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6260: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
6270: 64 72 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  drL);.      sqli
6280: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6290: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
62a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
62b0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
62c0: 50 61 72 73 65 2c 20 72 65 67 54 65 6d 70 52 6f  Parse, regTempRo
62d0: 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  wid);.    }.  }e
62e0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
62f0: 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 20   is the case if 
6300: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
6310: 20 49 4e 53 45 52 54 20 69 73 20 63 6f 6d 69 6e   INSERT is comin
6320: 67 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 0a  g from a VALUES.
6330: 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 0a 20 20      ** clause.  
6340: 20 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e    */.    NameCon
6350: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65  text sNC;.    me
6360: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
6370: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
6380: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
6390: 72 73 65 3b 0a 20 20 20 20 73 72 63 54 61 62 20  rse;.    srcTab 
63a0: 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
63b0: 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 3d 3d  ( useTempTable==
63c0: 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  0 );.    nColumn
63d0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
63e0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
63f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
6400: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
6410: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
6420: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
6430: 43 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  C, pList->a[i].p
6440: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
6450: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
6460: 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
6470: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6480: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49 44 4c   there is no IDL
6490: 49 53 54 20 74 65 72 6d 20 62 75 74 20 74 68 65  IST term but the
64a0: 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6e   table has an in
64b0: 74 65 67 65 72 20 70 72 69 6d 61 72 79 0a 20 20  teger primary.  
64c0: 2a 2a 20 6b 65 79 2c 20 74 68 65 20 73 65 74 20  ** key, the set 
64d0: 74 68 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61  the ipkColumn va
64e0: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e  riable to the in
64f0: 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
6500: 79 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69  y .  ** column i
6510: 6e 64 65 78 20 69 6e 20 74 68 65 20 6f 72 69 67  ndex in the orig
6520: 69 6e 61 6c 20 74 61 62 6c 65 20 64 65 66 69 6e  inal table defin
6530: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ition..  */.  if
6540: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20  ( pColumn==0 && 
6550: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
6560: 20 69 70 6b 43 6f 6c 75 6d 6e 20 3d 20 70 54 61   ipkColumn = pTa
6570: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 7d 0a 0a 20  b->iPKey;.  }.. 
6580: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
6590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
65a0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
65b0: 65 20 64 61 74 61 20 6d 61 74 63 68 65 73 20 74  e data matches t
65c0: 68 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  he number.  ** o
65d0: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
65e0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
65f0: 65 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  e table..  */.  
6600: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
6610: 61 62 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ab) ){.    for(i
6620: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
6630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 48  ; i++){.      nH
6640: 69 64 64 65 6e 20 2b 3d 20 28 49 73 48 69 64 64  idden += (IsHidd
6650: 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
6660: 61 43 6f 6c 5b 69 5d 29 20 3f 20 31 20 3a 20 30  aCol[i]) ? 1 : 0
6670: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
6680: 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26  f( pColumn==0 &&
6690: 20 6e 43 6f 6c 75 6d 6e 20 26 26 20 6e 43 6f 6c   nColumn && nCol
66a0: 75 6d 6e 21 3d 28 70 54 61 62 2d 3e 6e 43 6f 6c  umn!=(pTab->nCol
66b0: 2d 6e 48 69 64 64 65 6e 29 20 29 7b 0a 20 20 20  -nHidden) ){.   
66c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
66d0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
66e0: 20 22 74 61 62 6c 65 20 25 53 20 68 61 73 20 25   "table %S has %
66f0: 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 25 64  d columns but %d
6700: 20 76 61 6c 75 65 73 20 77 65 72 65 20 73 75 70   values were sup
6710: 70 6c 69 65 64 22 2c 0a 20 20 20 20 20 20 20 70  plied",.       p
6720: 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 54 61 62  TabList, 0, pTab
6730: 2d 3e 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e 2c 20  ->nCol-nHidden, 
6740: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 67 6f  nColumn);.    go
6750: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
6760: 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f  p;.  }.  if( pCo
6770: 6c 75 6d 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75  lumn!=0 && nColu
6780: 6d 6e 21 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64  mn!=pColumn->nId
6790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
67a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
67b0: 22 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25  "%d values for %
67c0: 64 20 63 6f 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c  d columns", nCol
67d0: 75 6d 6e 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49  umn, pColumn->nI
67e0: 64 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73  d);.    goto ins
67f0: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  ert_cleanup;.  }
6800: 0a 20 20 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69  .    .  /* Initi
6810: 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 20  alize the count 
6820: 6f 66 20 72 6f 77 73 20 74 6f 20 62 65 20 69 6e  of rows to be in
6830: 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66  serted.  */.  if
6840: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
6850: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
6860: 7b 0a 20 20 20 20 72 65 67 52 6f 77 43 6f 75 6e  {.    regRowCoun
6870: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
6880: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
6890: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
68a0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
68b0: 6f 77 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20  owCount);.  }.. 
68c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
68d0: 6f 74 20 61 20 76 69 65 77 2c 20 6f 70 65 6e 20  ot a view, open 
68e0: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  the table and an
68f0: 64 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 2a 2f  d all indices */
6900: 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29  .  if( !isView )
6910: 7b 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a  {.    int nIdx;.
6920: 20 20 20 20 6e 49 64 78 20 3d 20 73 71 6c 69 74      nIdx = sqlit
6930: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
6940: 64 69 63 65 73 28 70 50 61 72 73 65 2c 20 70 54  dices(pParse, pT
6950: 61 62 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  ab, OP_OpenWrite
6960: 2c 20 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20  , -1, 0,.       
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
6990: 69 44 61 74 61 43 75 72 2c 20 26 69 49 64 78 43  iDataCur, &iIdxC
69a0: 75 72 29 3b 0a 20 20 20 20 61 52 65 67 49 64 78  ur);.    aRegIdx
69b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
69c0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
69d0: 28 69 6e 74 29 2a 28 6e 49 64 78 2b 31 29 29 3b  (int)*(nIdx+1));
69e0: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
69f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
6a00: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
6a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
6a20: 69 3d 30 3b 20 69 3c 6e 49 64 78 3b 20 69 2b 2b  i=0; i<nIdx; i++
6a30: 29 7b 0a 20 20 20 20 20 20 61 52 65 67 49 64 78  ){.      aRegIdx
6a40: 5b 69 5d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  [i] = ++pParse->
6a50: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nMem;.    }.  }.
6a60: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68  .  /* This is th
6a70: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6d 61 69  e top of the mai
6a80: 6e 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70  n insertion loop
6a90: 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54 65 6d   */.  if( useTem
6aa0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  pTable ){.    /*
6ab0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64 65   This block code
6ac0: 73 20 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f 6f  s the top of loo
6ad0: 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 6d  p only.  The com
6ae0: 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73 20 74 68  plete loop is th
6af0: 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
6b00: 6e 67 20 70 73 65 75 64 6f 63 6f 64 65 20 28 74  ng pseudocode (t
6b10: 65 6d 70 6c 61 74 65 20 34 29 3a 0a 20 20 20 20  emplate 4):.    
6b20: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
6b30: 20 20 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61    rewind temp ta
6b40: 62 6c 65 2c 20 69 66 20 65 6d 70 74 79 20 67 6f  ble, if empty go
6b50: 74 6f 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20  to D.    **     
6b60: 20 43 3a 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f   C: loop over ro
6b70: 77 73 20 6f 66 20 69 6e 74 65 72 6d 65 64 69 61  ws of intermedia
6b80: 74 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  te table.    ** 
6b90: 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66            transf
6ba0: 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20 69  er values form i
6bb0: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
6bc0: 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 20  e into <table>. 
6bd0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 65 6e     **         en
6be0: 64 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20  d loop.    **   
6bf0: 20 20 20 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f     D: ....    */
6c00: 0a 20 20 20 20 61 64 64 72 49 6e 73 54 6f 70 20  .    addrInsTop 
6c10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6c20: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
6c30: 2c 20 73 72 63 54 61 62 29 3b 20 56 64 62 65 43  , srcTab); VdbeC
6c40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6c50: 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
6c60: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6c70: 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  r(v);.  }else if
6c80: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
6c90: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63   /* This block c
6ca0: 6f 64 65 73 20 74 68 65 20 74 6f 70 20 6f 66 20  odes the top of 
6cb0: 6c 6f 6f 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20  loop only.  The 
6cc0: 63 6f 6d 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73  complete loop is
6cd0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c   the.    ** foll
6ce0: 6f 77 69 6e 67 20 70 73 65 75 64 6f 63 6f 64 65  owing pseudocode
6cf0: 20 28 74 65 6d 70 6c 61 74 65 20 33 29 3a 0a 20   (template 3):. 
6d00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
6d10: 20 20 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74    C: yield X, at
6d20: 20 45 4f 46 20 67 6f 74 6f 20 44 0a 20 20 20 20   EOF goto D.    
6d30: 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 73 65 72  **         inser
6d40: 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65 73  t the select res
6d50: 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e  ult into <table>
6d60: 20 66 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 20 20 20   from R..R+n.   
6d70: 20 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f   **         goto
6d80: 20 43 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 44   C.    **      D
6d90: 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  : ....    */.   
6da0: 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20 61 64   addrInsTop = ad
6db0: 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
6dc0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6dd0: 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
6de0: 50 61 72 6d 29 3b 0a 20 20 20 20 56 64 62 65 43  Parm);.    VdbeC
6df0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
6e00: 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 42 45  .  /* Run the BE
6e10: 46 4f 52 45 20 61 6e 64 20 49 4e 53 54 45 41 44  FORE and INSTEAD
6e20: 20 4f 46 20 74 72 69 67 67 65 72 73 2c 20 69 66   OF triggers, if
6e30: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 0a 20   there are any. 
6e40: 20 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20   */.  endOfLoop 
6e50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
6e60: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
6e70: 20 74 6d 61 73 6b 20 26 20 54 52 49 47 47 45 52   tmask & TRIGGER
6e80: 5f 42 45 46 4f 52 45 20 29 7b 0a 20 20 20 20 69  _BEFORE ){.    i
6e90: 6e 74 20 72 65 67 43 6f 6c 73 20 3d 20 73 71 6c  nt regCols = sql
6ea0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
6eb0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
6ec0: 43 6f 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  Col+1);..    /* 
6ed0: 62 75 69 6c 64 20 74 68 65 20 4e 45 57 2e 2a 20  build the NEW.* 
6ee0: 72 65 66 65 72 65 6e 63 65 20 72 6f 77 2e 20 20  reference row.  
6ef0: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65  Note that if the
6f00: 72 65 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  re is an INTEGER
6f10: 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  .    ** PRIMARY 
6f20: 4b 45 59 20 69 6e 74 6f 20 77 68 69 63 68 20 61  KEY into which a
6f30: 20 4e 55 4c 4c 20 69 73 20 62 65 69 6e 67 20 69   NULL is being i
6f40: 6e 73 65 72 74 65 64 2c 20 74 68 61 74 20 4e 55  nserted, that NU
6f50: 4c 4c 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  LL will be.    *
6f60: 2a 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  * translated int
6f70: 6f 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  o a unique ID fo
6f80: 72 20 74 68 65 20 72 6f 77 2e 20 20 42 75 74 20  r the row.  But 
6f90: 6f 6e 20 61 20 42 45 46 4f 52 45 20 74 72 69 67  on a BEFORE trig
6fa0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 77 65 20 64  ger,.    ** we d
6fb0: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 61 74 20  o not know what 
6fc0: 74 68 65 20 75 6e 69 71 75 65 20 49 44 20 77 69  the unique ID wi
6fd0: 6c 6c 20 62 65 20 28 62 65 63 61 75 73 65 20 74  ll be (because t
6fe0: 68 65 20 69 6e 73 65 72 74 20 68 61 73 0a 20 20  he insert has.  
6ff0: 20 20 2a 2a 20 6e 6f 74 20 68 61 70 70 65 6e 65    ** not happene
7000: 64 20 79 65 74 29 20 73 6f 20 77 65 20 73 75 62  d yet) so we sub
7010: 73 74 69 74 75 74 65 20 61 20 72 6f 77 69 64 20  stitute a rowid 
7020: 6f 66 20 2d 31 0a 20 20 20 20 2a 2f 0a 20 20 20  of -1.    */.   
7030: 20 69 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3c 30   if( ipkColumn<0
7040: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7050: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7060: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72  P_Integer, -1, r
7070: 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 65 6c  egCols);.    }el
7080: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31  se{.      int j1
7090: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
70a0: 21 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 3b  !withoutRowid );
70b0: 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 54 65  .      if( useTe
70c0: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
70d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
70e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
70f0: 6e 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43 6f  n, srcTab, ipkCo
7100: 6c 75 6d 6e 2c 20 72 65 67 43 6f 6c 73 29 3b 0a  lumn, regCols);.
7110: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
7130: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f  lect==0 );  /* O
7140: 74 68 65 72 77 69 73 65 20 75 73 65 54 65 6d 70  therwise useTemp
7150: 54 61 62 6c 65 20 69 73 20 74 72 75 65 20 2a 2f  Table is true */
7160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7170: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7180: 20 70 4c 69 73 74 2d 3e 61 5b 69 70 6b 43 6f 6c   pList->a[ipkCol
7190: 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 72 65 67 43  umn].pExpr, regC
71a0: 6f 6c 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ols);.      }.  
71b0: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
71c0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
71d0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c  _NotNull, regCol
71e0: 73 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  s); VdbeCoverage
71f0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
7200: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7210: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
7220: 72 65 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  regCols);.      
7230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7240: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
7250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7260: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
7270: 49 6e 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20 56  Int, regCols); V
7280: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7290: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
72a0: 6e 6e 6f 74 20 68 61 76 65 20 74 72 69 67 67 65  nnot have trigge
72b0: 72 73 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20  rs on a virtual 
72c0: 74 61 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72  table. If it wer
72d0: 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20  e possible,.    
72e0: 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f  ** this block wo
72f0: 75 6c 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f  uld have to acco
7300: 75 6e 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63  unt for hidden c
7310: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
7320: 20 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72    assert( !IsVir
7330: 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20  tual(pTab) );.. 
7340: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
7350: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61   new column data
7360: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7370: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
7380: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
7390: 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  f( pColumn==0 ){
73a0: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a  .        j = i;.
73b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
73c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
73d0: 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b  pColumn->nId; j+
73e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
73f0: 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e  ( pColumn->a[j].
7400: 69 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  idx==i ) break;.
7410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7420: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 21 75 73  }.      if( (!us
7430: 65 54 65 6d 70 54 61 62 6c 65 20 26 26 20 21 70  eTempTable && !p
7440: 4c 69 73 74 29 20 7c 7c 20 28 70 43 6f 6c 75 6d  List) || (pColum
7450: 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d  n && j>=pColumn-
7460: 3e 6e 49 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >nId) ){.       
7470: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7480: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61  (pParse, pTab->a
7490: 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65  Col[i].pDflt, re
74a0: 67 43 6f 6c 73 2b 69 2b 31 29 3b 0a 20 20 20 20  gCols+i+1);.    
74b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54    }else if( useT
74c0: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
74d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
74e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
74f0: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 72  mn, srcTab, j, r
7500: 65 67 43 6f 6c 73 2b 69 2b 31 29 3b 20 0a 20 20  egCols+i+1); .  
7510: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7520: 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65     assert( pSele
7530: 63 74 3d 3d 30 20 29 3b 20 2f 2a 20 4f 74 68 65  ct==0 ); /* Othe
7540: 72 77 69 73 65 20 75 73 65 54 65 6d 70 54 61 62  rwise useTempTab
7550: 6c 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  le is true */.  
7560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7570: 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 70 50  rCodeAndCache(pP
7580: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a  arse, pList->a[j
7590: 5d 2e 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73  ].pExpr, regCols
75a0: 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  +i+1);.      }. 
75b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
75c0: 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52  this is an INSER
75d0: 54 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68  T on a view with
75e0: 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49   an INSTEAD OF I
75f0: 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20  NSERT trigger,. 
7600: 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74     ** do not att
7610: 65 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73  empt any convers
7620: 69 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65  ions before asse
7630: 6d 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72  mbling the recor
7640: 64 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  d..    ** If thi
7650: 73 20 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c  s is a real tabl
7660: 65 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65  e, attempt conve
7670: 72 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72  rsions as requir
7680: 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
7690: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66   table column af
76a0: 66 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f  finities..    */
76b0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
76c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
76d0: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
76e0: 2c 20 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2b  , pTab, regCols+
76f0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
7700: 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72  * Fire BEFORE or
7710: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
7720: 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  gers */.    sqli
7730: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
7740: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
7750: 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  er, TK_INSERT, 0
7760: 2c 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45  , TRIGGER_BEFORE
7770: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c  , .        pTab,
7780: 20 72 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e 6e   regCols-pTab->n
7790: 43 6f 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c 20  Col-1, onError, 
77a0: 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20  endOfLoop);..   
77b0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
77c0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
77d0: 20 72 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d 3e   regCols, pTab->
77e0: 6e 43 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  nCol+1);.  }..  
77f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
7800: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
7810: 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
7820: 20 69 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f 66   into a range of
7830: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20  .  ** registers 
7840: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67  beginning at reg
7850: 49 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  Ins..  */.  if( 
7860: 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69  !isView ){.    i
7870: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
7880: 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
7890: 68 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20  he row that the 
78a0: 56 55 70 64 61 74 65 20 6f 70 63 6f 64 65 20 77  VUpdate opcode w
78b0: 69 6c 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e 65  ill delete: none
78c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
78d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
78e0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 6e  P_Null, 0, regIn
78f0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
7900: 28 20 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20 29  ( ipkColumn>=0 )
7910: 7b 0a 20 20 20 20 20 20 69 66 28 20 75 73 65 54  {.      if( useT
7920: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
7930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7940: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
7950: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43  mn, srcTab, ipkC
7960: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29  olumn, regRowid)
7970: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7980: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
7990: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
79b0: 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  y, regFromSelect
79c0: 2b 69 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52  +ipkColumn, regR
79d0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
79e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
79f0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20  Op *pOp;.       
7a00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
7a10: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
7a20: 61 5b 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78  a[ipkColumn].pEx
7a30: 70 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  pr, regRowid);. 
7a40: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
7a50: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
7a60: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66   -1);.        if
7a70: 28 20 41 4c 57 41 59 53 28 70 4f 70 29 20 26 26  ( ALWAYS(pOp) &&
7a80: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
7a90: 5f 4e 75 6c 6c 20 26 26 20 21 49 73 56 69 72 74  _Null && !IsVirt
7aa0: 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
7ab0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61         appendFla
7ac0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  g = 1;.         
7ad0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
7ae0: 50 5f 4e 65 77 52 6f 77 69 64 3b 0a 20 20 20 20  P_NewRowid;.    
7af0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
7b00: 69 44 61 74 61 43 75 72 3b 0a 20 20 20 20 20 20  iDataCur;.      
7b10: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65      pOp->p2 = re
7b20: 67 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  gRowid;.        
7b30: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 72 65 67 41    pOp->p3 = regA
7b40: 75 74 6f 69 6e 63 3b 0a 20 20 20 20 20 20 20 20  utoinc;.        
7b50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7b60: 2f 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  /* If the PRIMAR
7b70: 59 20 4b 45 59 20 65 78 70 72 65 73 73 69 6f 6e  Y KEY expression
7b80: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 75   is NULL, then u
7b90: 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 0a 20  se OP_NewRowid. 
7ba0: 20 20 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65 72       ** to gener
7bb0: 61 74 65 20 61 20 75 6e 69 71 75 65 20 70 72 69  ate a unique pri
7bc0: 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 2e 0a  mary key value..
7bd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
7be0: 66 28 20 21 61 70 70 65 6e 64 46 6c 61 67 20 29  f( !appendFlag )
7bf0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31  {.        int j1
7c00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 49  ;.        if( !I
7c10: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
7c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d  {.          j1 =
7c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c40: 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p1(v, OP_NotNull
7c50: 2c 20 72 65 67 52 6f 77 69 64 29 3b 20 56 64 62  , regRowid); Vdb
7c60: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7c70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7c80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7c90: 4e 65 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43  NewRowid, iDataC
7ca0: 75 72 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  ur, regRowid, re
7cb0: 67 41 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20  gAutoinc);.     
7cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7cd0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
7ce0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7cf0: 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73            j1 = s
7d00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
7d10: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
7d20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
7d40: 6c 6c 2c 20 72 65 67 52 6f 77 69 64 2c 20 6a 31  ll, regRowid, j1
7d50: 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
7d60: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
7d70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7d80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7d90: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f  MustBeInt, regRo
7da0: 77 69 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  wid); VdbeCovera
7db0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ge(v);.      }. 
7dc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
7dd0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
7de0: 77 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  withoutRowid ){.
7df0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7e00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
7e10: 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  ll, 0, regRowid)
7e20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7e40: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp3(v, OP_NewRo
7e50: 77 69 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72  wid, iDataCur, r
7e60: 65 67 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f  egRowid, regAuto
7e70: 69 6e 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65  inc);.      appe
7e80: 6e 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  ndFlag = 1;.    
7e90: 7d 0a 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65  }.    autoIncSte
7ea0: 70 28 70 50 61 72 73 65 2c 20 72 65 67 41 75 74  p(pParse, regAut
7eb0: 6f 69 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b  oinc, regRowid);
7ec0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
7ed0: 20 64 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f   data for all co
7ee0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77  lumns of the new
7ef0: 20 65 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e   entry, beginnin
7f00: 67 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  g.    ** with th
7f10: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a  e first column..
7f20: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64 64      */.    nHidd
7f30: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  en = 0;.    for(
7f40: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
7f50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
7f60: 6e 74 20 69 52 65 67 53 74 6f 72 65 20 3d 20 72  nt iRegStore = r
7f70: 65 67 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20 20  egRowid+1+i;.   
7f80: 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e     if( i==pTab->
7f90: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
7fa0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66   /* The value of
7fb0: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
7fc0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
7fd0: 69 73 20 61 6c 77 61 79 73 20 61 20 4e 55 4c 4c  is always a NULL
7fe0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65  ..        ** Whe
7ff0: 6e 65 76 65 72 20 74 68 69 73 20 63 6f 6c 75 6d  never this colum
8000: 6e 20 69 73 20 72 65 61 64 2c 20 74 68 65 20 72  n is read, the r
8010: 6f 77 69 64 20 77 69 6c 6c 20 62 65 20 73 75 62  owid will be sub
8020: 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20  stituted.       
8030: 20 2a 2a 20 69 6e 20 69 74 73 20 70 6c 61 63 65   ** in its place
8040: 2e 20 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20 74  .  Hence, fill t
8050: 68 69 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  his column with 
8060: 61 20 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a  a NULL to avoid.
8070: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e          ** takin
8080: 67 20 75 70 20 64 61 74 61 20 73 70 61 63 65 20  g up data space 
8090: 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  with information
80a0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
80b0: 20 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20   be used..      
80c0: 20 20 2a 2a 20 41 73 20 74 68 65 72 65 20 6d 61    ** As there ma
80d0: 79 20 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f 70  y be shallow cop
80e0: 69 65 73 20 6f 66 20 74 68 69 73 20 76 61 6c 75  ies of this valu
80f0: 65 2c 20 6d 61 6b 65 20 69 74 20 61 20 73 6f 66  e, make it a sof
8100: 74 2d 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  t-NULL */.      
8110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8120: 4f 70 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e 75  Op1(v, OP_SoftNu
8130: 6c 6c 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a  ll, iRegStore);.
8140: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
8150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8160: 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29  if( pColumn==0 )
8170: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
8180: 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
8190: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a  ab->aCol[i]) ){.
81a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
81b0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
81c0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  ) );.          j
81d0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
81e0: 20 6e 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20   nHidden++;.    
81f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8200: 20 20 20 20 20 6a 20 3d 20 69 20 2d 20 6e 48 69       j = i - nHi
8210: 64 64 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  dden;.        }.
8220: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8230: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8240: 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b  pColumn->nId; j+
8250: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
8260: 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e  ( pColumn->a[j].
8270: 69 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  idx==i ) break;.
8280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8290: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20  }.      if( j<0 
82a0: 7c 7c 20 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c  || nColumn==0 ||
82b0: 20 28 70 43 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d   (pColumn && j>=
82c0: 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 20 29 7b  pColumn->nId) ){
82d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
82e0: 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
82f0: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  le(pParse, pTab-
8300: 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20  >aCol[i].pDflt, 
8310: 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20 20 20  iRegStore);.    
8320: 20 20 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54    }else if( useT
8330: 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  empTable ){.    
8340: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8350: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
8360: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 69  mn, srcTab, j, i
8370: 52 65 67 53 74 6f 72 65 29 3b 20 0a 20 20 20 20  RegStore); .    
8380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c    }else if( pSel
8390: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
83a0: 66 28 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74  f( regFromSelect
83b0: 21 3d 72 65 67 44 61 74 61 20 29 7b 0a 20 20 20  !=regData ){.   
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
83e0: 43 6f 70 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c  Copy, regFromSel
83f0: 65 63 74 2b 6a 2c 20 69 52 65 67 53 74 6f 72 65  ect+j, iRegStore
8400: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8420: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
8430: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
8440: 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 52 65  >a[j].pExpr, iRe
8450: 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d  gStore);.      }
8460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
8470: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
8480: 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
8490: 73 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 69  s and generate i
84a0: 6e 64 65 78 20 6b 65 79 73 20 61 6e 64 0a 20 20  ndex keys and.  
84b0: 20 20 2a 2a 20 64 6f 20 74 68 65 20 69 6e 73 65    ** do the inse
84c0: 72 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  rtion..    */.#i
84d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
84e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
84f0: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
8500: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
8510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61  const char *pVTa
8520: 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  b = (const char 
8530: 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
8540: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
8550: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d      sqlite3VtabM
8560: 61 6b 65 57 72 69 74 61 62 6c 65 28 70 50 61 72  akeWritable(pPar
8570: 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  se, pTab);.     
8580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8590: 70 34 28 76 2c 20 4f 50 5f 56 55 70 64 61 74 65  p4(v, OP_VUpdate
85a0: 2c 20 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b  , 1, pTab->nCol+
85b0: 32 2c 20 72 65 67 49 6e 73 2c 20 70 56 54 61 62  2, regIns, pVTab
85c0: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
85d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
85e0: 6e 67 65 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72  ngeP5(v, onError
85f0: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f  ==OE_Default ? O
8600: 45 5f 41 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f  E_Abort : onErro
8610: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
8620: 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
8630: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
8640: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
8650: 69 6e 74 20 69 73 52 65 70 6c 61 63 65 3b 20 20  int isReplace;  
8660: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
8670: 20 69 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   if constraints 
8680: 6d 61 79 20 63 61 75 73 65 20 61 20 72 65 70 6c  may cause a repl
8690: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
86a0: 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
86b0: 74 72 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61  traintChecks(pPa
86c0: 72 73 65 2c 20 70 54 61 62 2c 20 61 52 65 67 49  rse, pTab, aRegI
86d0: 64 78 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  dx, iDataCur, iI
86e0: 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
86f0: 20 72 65 67 49 6e 73 2c 20 30 2c 20 69 70 6b 43   regIns, 0, ipkC
8700: 6f 6c 75 6d 6e 3e 3d 30 2c 20 6f 6e 45 72 72 6f  olumn>=0, onErro
8710: 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 2c 20 26 69  r, endOfLoop, &i
8720: 73 52 65 70 6c 61 63 65 0a 20 20 20 20 20 20 29  sReplace.      )
8730: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
8740: 6b 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  kCheck(pParse, p
8750: 54 61 62 2c 20 30 2c 20 72 65 67 49 6e 73 2c 20  Tab, 0, regIns, 
8760: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
8770: 69 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65  ite3CompleteInse
8780: 72 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  rtion(pParse, pT
8790: 61 62 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49  ab, iDataCur, iI
87a0: 64 78 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20  dxCur,.         
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 20 20 20 20 20 72 65 67 49 6e 73 2c 20 61 52        regIns, aR
87d0: 65 67 49 64 78 2c 20 30 2c 20 61 70 70 65 6e 64  egIdx, 0, append
87e0: 46 6c 61 67 2c 20 69 73 52 65 70 6c 61 63 65 3d  Flag, isReplace=
87f0: 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  =0);.    }.  }..
8800: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
8810: 63 6f 75 6e 74 20 6f 66 20 72 6f 77 73 20 74 68  count of rows th
8820: 61 74 20 61 72 65 20 69 6e 73 65 72 74 65 64 0a  at are inserted.
8830: 20 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e    */.  if( (db->
8840: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
8850: 6f 75 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a  ountRows)!=0 ){.
8860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8870: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
8880: 6d 6d 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c  mm, regRowCount,
8890: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   1);.  }..  if( 
88a0: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
88b0: 2f 2a 20 43 6f 64 65 20 41 46 54 45 52 20 74 72  /* Code AFTER tr
88c0: 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71  iggers */.    sq
88d0: 6c 69 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67  lite3CodeRowTrig
88e0: 67 65 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  ger(pParse, pTri
88f0: 67 67 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  gger, TK_INSERT,
8900: 20 30 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45   0, TRIGGER_AFTE
8910: 52 2c 20 0a 20 20 20 20 20 20 20 20 70 54 61 62  R, .        pTab
8920: 2c 20 72 65 67 44 61 74 61 2d 32 2d 70 54 61 62  , regData-2-pTab
8930: 2d 3e 6e 43 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c  ->nCol, onError,
8940: 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d   endOfLoop);.  }
8950: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  ..  /* The botto
8960: 6d 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 69 6e  m of the main in
8970: 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66  sertion loop, if
8980: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
8990: 0a 20 20 2a 2a 20 69 73 20 61 20 53 45 4c 45 43  .  ** is a SELEC
89a0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
89b0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
89c0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
89d0: 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28  ndOfLoop);.  if(
89e0: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b   useTempTable ){
89f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8a00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
8a10: 74 2c 20 73 72 63 54 61 62 2c 20 61 64 64 72 43  t, srcTab, addrC
8a20: 6f 6e 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ont); VdbeCovera
8a30: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
8a40: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8a50: 2c 20 61 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20  , addrInsTop);. 
8a60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8a70: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
8a80: 2c 20 73 72 63 54 61 62 29 3b 0a 20 20 7d 65 6c  , srcTab);.  }el
8a90: 73 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29  se if( pSelect )
8aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
8ab0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
8ac0: 74 6f 2c 20 30 2c 20 61 64 64 72 43 6f 6e 74 29  to, 0, addrCont)
8ad0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8ae0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
8af0: 72 49 6e 73 54 6f 70 29 3b 0a 20 20 7d 0a 0a 20  rInsTop);.  }.. 
8b00: 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
8b10: 70 54 61 62 29 20 26 26 20 21 69 73 56 69 65 77  pTab) && !isView
8b20: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   ){.    /* Close
8b30: 20 61 6c 6c 20 74 61 62 6c 65 73 20 6f 70 65 6e   all tables open
8b40: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44  ed */.    if( iD
8b50: 61 74 61 43 75 72 3c 69 49 64 78 43 75 72 20 29  ataCur<iIdxCur )
8b60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b70: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
8b80: 69 44 61 74 61 43 75 72 29 3b 0a 20 20 20 20 66  iDataCur);.    f
8b90: 6f 72 28 69 64 78 3d 30 2c 20 70 49 64 78 3d 70  or(idx=0, pIdx=p
8ba0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
8bb0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
8bc0: 65 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20  ext, idx++){.   
8bd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8be0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
8bf0: 2c 20 69 64 78 2b 69 49 64 78 43 75 72 29 3b 0a  , idx+iIdxCur);.
8c00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 69 6e 73 65 72      }.  }..inser
8c10: 74 5f 65 6e 64 3a 0a 20 20 2f 2a 20 55 70 64 61  t_end:.  /* Upda
8c20: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  te the sqlite_se
8c30: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20  quence table by 
8c40: 73 74 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74  storing the cont
8c50: 65 6e 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ent of the.  ** 
8c60: 6d 61 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f  maximum rowid co
8c70: 75 6e 74 65 72 20 76 61 6c 75 65 73 20 72 65 63  unter values rec
8c80: 6f 72 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65  orded while inse
8c90: 72 74 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20  rting into.  ** 
8ca0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61  autoincrement ta
8cb0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
8cc0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
8cd0: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54  =0 && pParse->pT
8ce0: 72 69 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a  riggerTab==0 ){.
8cf0: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69      sqlite3Autoi
8d00: 6e 63 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72  ncrementEnd(pPar
8d10: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  se);.  }..  /*. 
8d20: 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   ** Return the n
8d30: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
8d40: 73 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  serted. If this 
8d50: 72 6f 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a  routine is .  **
8d60: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
8d70: 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 63 61   because of a ca
8d80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73  ll to sqlite3Nes
8d90: 74 65 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e  tedParse(), do n
8da0: 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74  ot.  ** invoke t
8db0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
8dc0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
8dd0: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
8de0: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26  TE_CountRows) &&
8df0: 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64   !pParse->nested
8e00: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72   && !pParse->pTr
8e10: 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
8e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8e30: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
8e40: 77 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20  w, regRowCount, 
8e50: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8e60: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
8e70: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
8e80: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8e90: 2c 20 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , 0, COLNAME_NAM
8ea0: 45 2c 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65  E, "rows inserte
8eb0: 64 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  d", SQLITE_STATI
8ec0: 43 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f  C);.  }..insert_
8ed0: 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
8ee0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
8ef0: 64 62 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20  db, pTabList);. 
8f00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8f10: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
8f20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
8f30: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
8f40: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
8f50: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
8f60: 20 70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c   pColumn);.  sql
8f70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
8f80: 52 65 67 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d  RegIdx);.}../* M
8f90: 61 6b 65 20 73 75 72 65 20 22 69 73 56 69 65 77  ake sure "isView
8fa0: 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72  " and other macr
8fb0: 6f 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  os defined above
8fc0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
8fd0: 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65  Otherwise.** the
8fe0: 6c 79 20 6d 61 79 20 69 6e 74 65 72 66 65 72 65  ly may interfere
8ff0: 20 77 69 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f   with compilatio
9000: 6e 20 6f 66 20 6f 74 68 65 72 20 66 75 6e 63 74  n of other funct
9010: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ions in this fil
9020: 65 0a 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74  e.** (or in anot
9030: 68 65 72 20 66 69 6c 65 2c 20 69 66 20 74 68 69  her file, if thi
9040: 73 20 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 70  s file becomes p
9050: 61 72 74 20 6f 66 20 74 68 65 20 61 6d 61 6c 67  art of the amalg
9060: 61 6d 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69  amation).  */.#i
9070: 66 64 65 66 20 69 73 56 69 65 77 0a 20 23 75 6e  fdef isView. #un
9080: 64 65 66 20 69 73 56 69 65 77 0a 23 65 6e 64 69  def isView.#endi
9090: 66 0a 23 69 66 64 65 66 20 70 54 72 69 67 67 65  f.#ifdef pTrigge
90a0: 72 0a 20 23 75 6e 64 65 66 20 70 54 72 69 67 67  r. #undef pTrigg
90b0: 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  er.#endif.#ifdef
90c0: 20 74 6d 61 73 6b 0a 20 23 75 6e 64 65 66 20 74   tmask. #undef t
90d0: 6d 61 73 6b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  mask.#endif../*.
90e0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
90f0: 20 74 6f 20 64 6f 20 63 6f 6e 73 74 72 61 69 6e   to do constrain
9100: 74 20 63 68 65 63 6b 73 20 70 72 69 6f 72 20 74  t checks prior t
9110: 6f 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 61  o an INSERT or a
9120: 6e 20 55 50 44 41 54 45 0a 2a 2a 20 6f 6e 20 74  n UPDATE.** on t
9130: 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a  able pTab..**.**
9140: 20 54 68 65 20 72 65 67 4e 65 77 44 61 74 61 20   The regNewData 
9150: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
9160: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
9170: 69 6e 20 61 20 72 61 6e 67 65 20 74 68 61 74 20  in a range that 
9180: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20  contains.** the 
9190: 64 61 74 61 20 74 6f 20 62 65 20 69 6e 73 65 72  data to be inser
91a0: 74 65 64 20 6f 72 20 74 68 65 20 64 61 74 61 20  ted or the data 
91b0: 61 66 74 65 72 20 74 68 65 20 75 70 64 61 74 65  after the update
91c0: 2e 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65  .  There will be
91d0: 0a 2a 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  .** pTab->nCol+1
91e0: 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 74 68   registers in th
91f0: 69 73 20 72 61 6e 67 65 2e 20 20 54 68 65 20 66  is range.  The f
9200: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 28 74  irst register (t
9210: 68 65 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 72  he one.** that r
9220: 65 67 4e 65 77 44 61 74 61 20 70 6f 69 6e 74 73  egNewData points
9230: 20 74 6f 29 20 77 69 6c 6c 20 63 6f 6e 74 61 69   to) will contai
9240: 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 2c  n the new rowid,
9250: 20 6f 72 20 4e 55 4c 4c 20 69 6e 20 74 68 65 0a   or NULL in the.
9260: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 57 49 54  ** case of a WIT
9270: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
9280: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 72 65  .  The second re
9290: 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 61  gister in the ra
92a0: 6e 67 65 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74  nge will.** cont
92b0: 61 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ain the content 
92c0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 61 62  of the first tab
92d0: 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  le column.  The 
92e0: 74 68 69 72 64 20 72 65 67 69 73 74 65 72 20 77  third register w
92f0: 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  ill.** contain t
9300: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
9310: 65 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 63  e second table c
9320: 6f 6c 75 6d 6e 2e 20 20 41 6e 64 20 73 6f 20 66  olumn.  And so f
9330: 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  orth..**.** The 
9340: 72 65 67 4f 6c 64 44 61 74 61 20 70 61 72 61 6d  regOldData param
9350: 65 74 65 72 20 69 73 20 73 69 6d 69 6c 61 72 20  eter is similar 
9360: 74 6f 20 72 65 67 4e 65 77 44 61 74 61 20 65 78  to regNewData ex
9370: 63 65 70 74 20 74 68 61 74 20 69 74 20 63 6f 6e  cept that it con
9380: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74  tains.** the dat
9390: 61 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 55 50  a prior to an UP
93a0: 44 41 54 45 20 72 61 74 68 65 72 20 74 68 61 6e  DATE rather than
93b0: 20 61 66 74 65 72 77 61 72 64 73 2e 20 20 72 65   afterwards.  re
93c0: 67 4f 6c 64 44 61 74 61 20 69 73 20 7a 65 72 6f  gOldData is zero
93d0: 0a 2a 2a 20 66 6f 72 20 61 6e 20 49 4e 53 45 52  .** for an INSER
93e0: 54 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  T.  This routine
93f0: 20 63 61 6e 20 64 69 73 74 69 6e 67 75 69 73 68   can distinguish
9400: 20 62 65 74 77 65 65 6e 20 55 50 44 41 54 45 20   between UPDATE 
9410: 61 6e 64 20 49 4e 53 45 52 54 20 62 79 0a 2a 2a  and INSERT by.**
9420: 20 63 68 65 63 6b 69 6e 67 20 72 65 67 4f 6c 64   checking regOld
9430: 44 61 74 61 20 66 6f 72 20 7a 65 72 6f 2e 0a 2a  Data for zero..*
9440: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 55 50 44 41  *.** For an UPDA
9450: 54 45 2c 20 74 68 65 20 70 6b 43 68 6e 67 20 62  TE, the pkChng b
9460: 6f 6f 6c 65 61 6e 20 69 73 20 74 72 75 65 20 69  oolean is true i
9470: 66 20 74 68 65 20 74 72 75 65 20 70 72 69 6d 61  f the true prima
9480: 72 79 20 6b 65 79 20 28 74 68 65 0a 2a 2a 20 72  ry key (the.** r
9490: 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 72 6d 61  owid for a norma
94a0: 6c 20 74 61 62 6c 65 20 6f 72 20 74 68 65 20 50  l table or the P
94b0: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 61  RIMARY KEY for a
94c0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
94d0: 61 62 6c 65 29 0a 2a 2a 20 6d 69 67 68 74 20 62  able).** might b
94e0: 65 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  e modified by th
94f0: 65 20 55 50 44 41 54 45 2e 20 20 49 66 20 70 6b  e UPDATE.  If pk
9500: 43 68 6e 67 20 69 73 20 66 61 6c 73 65 2c 20 74  Chng is false, t
9510: 68 65 6e 20 74 68 65 20 6b 65 79 20 6f 66 0a 2a  hen the key of.*
9520: 2a 20 74 68 65 20 69 44 61 74 61 43 75 72 20 63  * the iDataCur c
9530: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 69 73 20  ontent table is 
9540: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
9550: 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20 74 68   unchanged by th
9560: 65 20 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20  e UPDATE..**.** 
9570: 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 2c 20 74  For an INSERT, t
9580: 68 65 20 70 6b 43 68 6e 67 20 62 6f 6f 6c 65 61  he pkChng boolea
9590: 6e 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  n indicates whet
95a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72  her or not the r
95b0: 6f 77 69 64 0a 2a 2a 20 77 61 73 20 65 78 70 6c  owid.** was expl
95c0: 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
95d0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
95e0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
95f0: 2e 20 20 49 66 20 70 6b 43 68 6e 67 0a 2a 2a 20  .  If pkChng.** 
9600: 69 73 20 7a 65 72 6f 2c 20 69 74 20 6d 65 61 6e  is zero, it mean
9610: 73 20 74 68 61 74 20 74 68 65 20 65 69 74 68 65  s that the eithe
9620: 72 20 72 6f 77 69 64 20 69 73 20 63 6f 6d 70 75  r rowid is compu
9630: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
9640: 79 20 6f 72 0a 2a 2a 20 74 68 61 74 20 74 68 65  y or.** that the
9650: 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
9660: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
9670: 61 6e 64 20 68 61 73 20 6e 6f 20 72 6f 77 69 64  and has no rowid
9680: 2e 20 20 4f 6e 20 61 6e 20 49 4e 53 45 52 54 2c  .  On an INSERT,
9690: 0a 2a 2a 20 70 6b 43 68 6e 67 20 77 69 6c 6c 20  .** pkChng will 
96a0: 6f 6e 6c 79 20 62 65 20 74 72 75 65 20 69 66 20  only be true if 
96b0: 74 68 65 20 49 4e 53 45 52 54 20 73 74 61 74 65  the INSERT state
96c0: 6d 65 6e 74 20 70 72 6f 76 69 64 65 73 20 61 6e  ment provides an
96d0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75   integer.** valu
96e0: 65 20 66 6f 72 20 65 69 74 68 65 72 20 74 68 65  e for either the
96f0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 72   rowid column or
9700: 20 69 74 73 20 49 4e 54 45 47 45 52 20 50 52 49   its INTEGER PRI
9710: 4d 41 52 59 20 4b 45 59 20 61 6c 69 61 73 2e 0a  MARY KEY alias..
9720: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
9730: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69 73  enerated by this
9740: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 73 74   routine will st
9750: 6f 72 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e  ore new index en
9760: 74 72 69 65 73 20 69 6e 74 6f 0a 2a 2a 20 72 65  tries into.** re
9770: 67 69 73 74 65 72 73 20 69 64 65 6e 74 69 66 69  gisters identifi
9780: 65 64 20 62 79 20 61 52 65 67 49 64 78 5b 5d 2e  ed by aRegIdx[].
9790: 20 20 4e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79    No index entry
97a0: 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 0a   is created for.
97b0: 2a 2a 20 69 6e 64 69 63 65 73 20 77 68 65 72 65  ** indices where
97c0: 20 61 52 65 67 49 64 78 5b 69 5d 3d 3d 30 2e 20   aRegIdx[i]==0. 
97d0: 20 54 68 65 20 6f 72 64 65 72 20 6f 66 20 69 6e   The order of in
97e0: 64 69 63 65 73 20 69 6e 20 61 52 65 67 49 64 78  dices in aRegIdx
97f0: 5b 5d 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  [] is.** the sam
9800: 65 20 61 73 20 74 68 65 20 6f 72 64 65 72 20 6f  e as the order o
9810: 66 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65  f indices on the
9820: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
9830: 69 6e 64 69 63 65 73 0a 2a 2a 20 61 74 20 70 54  indices.** at pT
9840: 61 62 2d 3e 70 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  ab->pIndex..**.*
9850: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
9860: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f  t have already o
9870: 70 65 6e 65 64 20 77 72 69 74 65 61 62 6c 65 20  pened writeable 
9880: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 6d  cursors on the m
9890: 61 69 6e 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  ain.** table and
98a0: 20 61 6c 6c 20 61 70 70 6c 69 63 61 62 6c 65 20   all applicable 
98b0: 69 6e 64 69 63 65 73 20 28 74 68 61 74 20 69 73  indices (that is
98c0: 20 74 6f 20 73 61 79 2c 20 61 6c 6c 20 69 6e 64   to say, all ind
98d0: 69 63 65 73 20 66 6f 72 20 77 68 69 63 68 0a 2a  ices for which.*
98e0: 2a 20 61 52 65 67 49 64 78 5b 5d 20 69 73 20 6e  * aRegIdx[] is n
98f0: 6f 74 20 7a 65 72 6f 29 2e 20 20 69 44 61 74 61  ot zero).  iData
9900: 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  Cur is the curso
9910: 72 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74  r for the main t
9920: 61 62 6c 65 20 77 68 65 6e 0a 2a 2a 20 69 6e 73  able when.** ins
9930: 65 72 74 69 6e 67 20 6f 72 20 75 70 64 61 74 69  erting or updati
9940: 6e 67 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  ng a rowid table
9950: 2c 20 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20  , or the cursor 
9960: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
9970: 4b 45 59 0a 2a 2a 20 69 6e 64 65 78 20 77 68 65  KEY.** index whe
9980: 6e 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 61  n operating on a
9990: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
99a0: 61 62 6c 65 2e 20 20 69 49 64 78 43 75 72 20 69  able.  iIdxCur i
99b0: 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  s the cursor.** 
99c0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 69 6e  for the first in
99d0: 64 65 78 20 69 6e 20 74 68 65 20 70 54 61 62 2d  dex in the pTab-
99e0: 3e 70 49 6e 64 65 78 20 6c 69 73 74 2e 20 20 43  >pIndex list.  C
99f0: 75 72 73 6f 72 73 20 66 6f 72 20 6f 74 68 65 72  ursors for other
9a00: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 61 72 65 20   indices.** are 
9a10: 61 74 20 69 49 64 78 43 75 72 2b 4e 20 66 6f 72  at iIdxCur+N for
9a20: 20 74 68 65 20 4e 2d 74 68 20 65 6c 65 6d 65 6e   the N-th elemen
9a30: 74 20 6f 66 20 74 68 65 20 70 54 61 62 2d 3e 70  t of the pTab->p
9a40: 49 6e 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  Index list..**.*
9a50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
9a60: 6c 73 6f 20 67 65 6e 65 72 61 74 65 73 20 63 6f  lso generates co
9a70: 64 65 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73  de to check cons
9a80: 74 72 61 69 6e 74 73 2e 20 20 4e 4f 54 20 4e 55  traints.  NOT NU
9a90: 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b 2c 20 61 6e  LL,.** CHECK, an
9aa0: 64 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  d UNIQUE constra
9ab0: 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 63 68 65  ints are all che
9ac0: 63 6b 65 64 2e 20 20 49 66 20 61 20 63 6f 6e 73  cked.  If a cons
9ad0: 74 72 61 69 6e 74 20 66 61 69 6c 73 2c 0a 2a 2a  traint fails,.**
9ae0: 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70   then the approp
9af0: 72 69 61 74 65 20 61 63 74 69 6f 6e 20 69 73 20  riate action is 
9b00: 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 72  performed.  Ther
9b10: 65 20 61 72 65 20 66 69 76 65 20 70 6f 73 73 69  e are five possi
9b20: 62 6c 65 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a 20  ble.** actions: 
9b30: 52 4f 4c 4c 42 41 43 4b 2c 20 41 42 4f 52 54 2c  ROLLBACK, ABORT,
9b40: 20 46 41 49 4c 2c 20 52 45 50 4c 41 43 45 2c 20   FAIL, REPLACE, 
9b50: 61 6e 64 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a 2a  and IGNORE..**.*
9b60: 2a 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  *  Constraint ty
9b70: 70 65 20 20 41 63 74 69 6f 6e 20 20 20 20 20 20  pe  Action      
9b80: 20 57 68 61 74 20 48 61 70 70 65 6e 73 0a 2a 2a   What Happens.**
9b90: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
9ba0: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -  ----------   
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e 79  --------.**  any
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 4f                RO
9bf0: 4c 4c 42 41 43 4b 20 20 20 20 20 54 68 65 20 63  LLBACK     The c
9c00: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
9c10: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
9c20: 6b 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  k and.**        
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9c50: 73 74 65 70 28 29 20 72 65 74 75 72 6e 73 20 69  step() returns i
9c60: 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74 68 20  mmediately with 
9c70: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64 65 20      return code 
9ca0: 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  of SQLITE_CONSTR
9cb0: 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79  AINT..**.**  any
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 42                AB
9cd0: 4f 52 54 20 20 20 20 20 20 20 20 42 61 63 6b 20  ORT        Back 
9ce0: 6f 75 74 20 63 68 61 6e 67 65 73 20 66 72 6f 6d  out changes from
9cf0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6d   the current com
9d00: 6d 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  mand.**         
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 20 20 20 6f 6e 6c 79 20 28 64 6f 20         only (do 
9d30: 6e 6f 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  not do a complet
9d40: 65 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 6e  e rollback) then
9d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 63 61 75 73 65 20 73 71 6c 69 74 65 33     cause sqlite3
9d80: 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74 75 72  _step() to retur
9d90: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f 4e 53  with SQLITE_CONS
9dd0: 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61  TRAINT..**.**  a
9de0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
9df0: 46 41 49 4c 20 20 20 20 20 20 20 20 20 53 71 6c  FAIL         Sql
9e00: 69 74 65 33 5f 73 74 65 70 28 29 20 72 65 74 75  ite3_step() retu
9e10: 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  rns immediately 
9e20: 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20  with a.**       
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9e50: 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43  code of SQLITE_C
9e60: 4f 4e 53 54 52 41 49 4e 54 2e 20 20 54 68 65 0a  ONSTRAINT.  The.
9e70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73    transaction is
9ea0: 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b   not rolled back
9eb0: 20 61 6e 64 20 61 6e 79 0a 2a 2a 20 20 20 20 20   and any.**     
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67             chang
9ee0: 65 73 20 74 6f 20 70 72 69 6f 72 20 72 6f 77 73  es to prior rows
9ef0: 20 61 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a   are retained..*
9f00: 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20  *.**  any       
9f10: 20 20 20 20 20 20 20 49 47 4e 4f 52 45 20 20 20         IGNORE   
9f20: 20 20 20 20 54 68 65 20 61 74 74 65 6d 70 74 20      The attempt 
9f30: 69 6e 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64  in insert or upd
9f40: 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ate the current.
9f50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 72 6f 77 20 69 73 20 73 6b 69 70 70 65 64    row is skipped
9f80: 2c 20 77 69 74 68 6f 75 74 20 74 68 72 6f 77 69  , without throwi
9f90: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  ng an error..** 
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
9fc0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 69 6e  rocessing contin
9fd0: 75 65 73 20 77 69 74 68 20 74 68 65 20 6e 65 78  ues with the nex
9fe0: 74 20 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20  t row..**       
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 28 54 68 65 72 65 20           (There 
a010: 69 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  is an immediate 
a020: 6a 75 6d 70 20 74 6f 20 69 67 6e 6f 72 65 44 65  jump to ignoreDe
a030: 73 74 2e 29 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20  st.).**.**  NOT 
a040: 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 52 45 50  NULL         REP
a050: 4c 41 43 45 20 20 20 20 20 20 54 68 65 20 4e 55  LACE      The NU
a060: 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 70 6c  LL value is repl
a070: 61 63 65 20 62 79 20 74 68 65 20 64 65 66 61 75  ace by the defau
a080: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 76 61 6c 75 65 20 66 6f 72 20 74       value for t
a0b0: 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20  hat column.  If 
a0c0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
a0d0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65      is NULL, the
a100: 20 61 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73   action is the s
a110: 61 6d 65 20 61 73 20 41 42 4f 52 54 2e 0a 2a 2a  ame as ABORT..**
a120: 0a 2a 2a 20 20 55 4e 49 51 55 45 20 20 20 20 20  .**  UNIQUE     
a130: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
a140: 20 20 20 54 68 65 20 6f 74 68 65 72 20 72 6f 77     The other row
a150: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
a160: 77 69 74 68 20 74 68 65 20 72 6f 77 0a 2a 2a 20  with the row.** 
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
a190: 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 69 73  eing inserted is
a1a0: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
a1b0: 20 43 48 45 43 4b 20 20 20 20 20 20 20 20 20 20   CHECK          
a1c0: 20 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 49    REPLACE      I
a1d0: 6c 6c 65 67 61 6c 2e 20 20 54 68 65 20 72 65 73  llegal.  The res
a1e0: 75 6c 74 73 20 69 6e 20 61 6e 20 65 78 63 65 70  ults in an excep
a1f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63  tion..**.** Whic
a200: 68 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65  h action to take
a210: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
a220: 79 20 74 68 65 20 6f 76 65 72 72 69 64 65 45 72  y the overrideEr
a230: 72 6f 72 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ror parameter..*
a240: 2a 20 4f 72 20 69 66 20 6f 76 65 72 72 69 64 65  * Or if override
a250: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
a260: 74 2c 20 74 68 65 6e 20 74 68 65 20 70 50 61 72  t, then the pPar
a270: 73 65 2d 3e 6f 6e 45 72 72 6f 72 20 70 61 72 61  se->onError para
a280: 6d 65 74 65 72 0a 2a 2a 20 69 73 20 75 73 65 64  meter.** is used
a290: 2e 20 20 4f 72 20 69 66 20 70 50 61 72 73 65 2d  .  Or if pParse-
a2a0: 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
a2b0: 61 75 6c 74 20 74 68 65 6e 20 74 68 65 20 6f 6e  ault then the on
a2c0: 45 72 72 6f 72 20 76 61 6c 75 65 0a 2a 2a 20 66  Error value.** f
a2d0: 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
a2e0: 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f  t is used..*/.vo
a2f0: 69 64 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  id sqlite3Genera
a300: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
a310: 6b 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ks(.  Parse *pPa
a320: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
a330: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
a340: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
a350: 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b,         /* Th
a360: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
a370: 73 65 72 74 65 64 20 6f 72 20 75 70 64 61 74 65  serted or update
a380: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67  d */.  int *aReg
a390: 49 64 78 2c 20 20 20 20 20 20 20 20 2f 2a 20 55  Idx,        /* U
a3a0: 73 65 20 72 65 67 69 73 74 65 72 20 61 52 65 67  se register aReg
a3b0: 49 64 78 5b 69 5d 20 66 6f 72 20 69 6e 64 65 78  Idx[i] for index
a3c0: 20 69 2e 20 20 30 20 66 6f 72 20 75 6e 75 73 65   i.  0 for unuse
a3d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61  d */.  int iData
a3e0: 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  Cur,        /* C
a3f0: 61 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 63 75  anonical data cu
a400: 72 73 6f 72 20 28 6d 61 69 6e 20 74 61 62 6c 65  rsor (main table
a410: 20 6f 72 20 50 4b 20 69 6e 64 65 78 29 20 2a 2f   or PK index) */
a420: 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20  .  int iIdxCur, 
a430: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
a440: 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
a450: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44 61 74  .  int regNewDat
a460: 61 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  a,      /* First
a470: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 72   register in a r
a480: 61 6e 67 65 20 68 6f 6c 64 69 6e 67 20 76 61 6c  ange holding val
a490: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f  ues to insert */
a4a0: 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 44 61 74  .  int regOldDat
a4b0: 61 2c 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  a,      /* Previ
a4c0: 6f 75 73 20 63 6f 6e 74 65 6e 74 2e 20 20 30 20  ous content.  0 
a4d0: 66 6f 72 20 49 4e 53 45 52 54 73 20 2a 2f 0a 20  for INSERTs */. 
a4e0: 20 75 38 20 70 6b 43 68 6e 67 2c 20 20 20 20 20   u8 pkChng,     
a4f0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
a500: 6f 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f  o if the rowid o
a510: 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 68  r PRIMARY KEY ch
a520: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76  anged */.  u8 ov
a530: 65 72 72 69 64 65 45 72 72 6f 72 2c 20 20 20 20  errideError,    
a540: 2f 2a 20 4f 76 65 72 72 69 64 65 20 6f 6e 45 72  /* Override onEr
a550: 72 6f 72 20 74 6f 20 74 68 69 73 20 69 66 20 6e  ror to this if n
a560: 6f 74 20 4f 45 5f 44 65 66 61 75 6c 74 20 2a 2f  ot OE_Default */
a570: 0a 20 20 69 6e 74 20 69 67 6e 6f 72 65 44 65 73  .  int ignoreDes
a580: 74 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  t,      /* Jump 
a590: 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 6f 6e  to this label on
a5a0: 20 61 6e 20 4f 45 5f 49 67 6e 6f 72 65 20 72 65   an OE_Ignore re
a5b0: 73 6f 6c 75 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  solution */.  in
a5c0: 74 20 2a 70 62 4d 61 79 52 65 70 6c 61 63 65 20  t *pbMayReplace 
a5d0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
a5e0: 6f 20 74 72 75 65 20 69 66 20 63 6f 6e 73 74 72  o true if constr
a5f0: 61 69 6e 74 20 6d 61 79 20 63 61 75 73 65 20 61  aint may cause a
a600: 20 72 65 70 6c 61 63 65 20 2a 2f 0a 29 7b 0a 20   replace */.){. 
a610: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
a620: 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 75 6e        /* VDBE un
a630: 64 65 72 20 63 6f 6e 73 74 72 75 74 69 6f 6e 20  der constrution 
a640: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
a650: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
a660: 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74  nter to one of t
a670: 68 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  he indices */.  
a680: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20  Index *pPk = 0; 
a690: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 52 49 4d       /* The PRIM
a6a0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 2a 2f  ARY KEY index */
a6b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
a6c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a6d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a6e0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
a6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70           /* loop
a700: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
a710: 74 20 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  t ix;           
a720: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70     /* Index loop
a730: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
a740: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
a750: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a760: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
a770: 20 6f 6e 45 72 72 6f 72 3b 20 20 20 20 20 20 20   onError;       
a780: 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
a790: 73 6f 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67  solution strateg
a7a0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20  y */.  int j1;  
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a7c0: 64 64 72 65 73 73 73 20 6f 66 20 6a 75 6d 70 20  ddresss of jump 
a7d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
a7e0: 20 69 6e 74 20 73 65 65 6e 52 65 70 6c 61 63 65   int seenReplace
a7f0: 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
a800: 20 52 45 50 4c 41 43 45 20 69 73 20 75 73 65 64   REPLACE is used
a810: 20 74 6f 20 72 65 73 6f 6c 76 65 20 49 4e 54 20   to resolve INT 
a820: 50 4b 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  PK conflict */. 
a830: 20 69 6e 74 20 6e 50 6b 46 69 65 6c 64 3b 20 20   int nPkField;  
a840: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a850: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 50 52 49  of fields in PRI
a860: 4d 41 52 59 20 4b 45 59 2e 20 31 20 66 6f 72 20  MARY KEY. 1 for 
a870: 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
a880: 20 20 69 6e 74 20 69 70 6b 54 6f 70 20 3d 20 30    int ipkTop = 0
a890: 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;      /* Top of
a8a0: 20 74 68 65 20 72 6f 77 69 64 20 63 68 61 6e 67   the rowid chang
a8b0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  e constraint che
a8c0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 42  ck */.  int ipkB
a8d0: 6f 74 74 6f 6d 20 3d 20 30 3b 20 20 20 2f 2a 20  ottom = 0;   /* 
a8e0: 42 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 72 6f  Bottom of the ro
a8f0: 77 69 64 20 63 68 61 6e 67 65 20 63 6f 6e 73 74  wid change const
a900: 72 61 69 6e 74 20 63 68 65 63 6b 20 2a 2f 0a 20  raint check */. 
a910: 20 75 38 20 69 73 55 70 64 61 74 65 3b 20 20 20   u8 isUpdate;   
a920: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
a930: 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
a940: 54 45 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  TE operation */.
a950: 20 20 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f    u8 bAffinityDo
a960: 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65  ne = 0;  /* True
a970: 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e   if the OP_Affin
a980: 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ity operation ha
a990: 73 20 62 65 65 6e 20 72 75 6e 20 2a 2f 0a 20 20  s been run */.  
a9a0: 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 2d  int regRowid = -
a9b0: 31 3b 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72  1;   /* Register
a9c0: 20 68 6f 6c 64 69 6e 67 20 52 4f 57 49 44 20 76   holding ROWID v
a9d0: 61 6c 75 65 20 2a 2f 0a 0a 20 20 69 73 55 70 64  alue */..  isUpd
a9e0: 61 74 65 20 3d 20 72 65 67 4f 6c 64 44 61 74 61  ate = regOldData
a9f0: 21 3d 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  !=0;.  db = pPar
aa00: 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71  se->db;.  v = sq
aa10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
aa20: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
aa30: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
aa40: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ( pTab->pSelect=
aa50: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74  =0 );  /* This t
aa60: 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49  able is not a VI
aa70: 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70  EW */.  nCol = p
aa80: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 0a 20 20  Tab->nCol;.  .  
aa90: 2f 2a 20 70 50 6b 20 69 73 20 74 68 65 20 50 52  /* pPk is the PR
aaa0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
aab0: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
aac0: 44 20 74 61 62 6c 65 73 20 61 6e 64 20 4e 55 4c  D tables and NUL
aad0: 4c 20 66 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61  L for.  ** norma
aae0: 6c 20 72 6f 77 69 64 20 74 61 62 6c 65 73 2e 20  l rowid tables. 
aaf0: 20 6e 50 6b 46 69 65 6c 64 20 69 73 20 74 68 65   nPkField is the
ab00: 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 66   number of key f
ab10: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 0a 20 20  ields in the .  
ab20: 2a 2a 20 70 50 6b 20 69 6e 64 65 78 20 6f 72 20  ** pPk index or 
ab30: 31 20 66 6f 72 20 61 20 72 6f 77 69 64 20 74 61  1 for a rowid ta
ab40: 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
ab50: 6f 72 64 73 2c 20 6e 50 6b 46 69 65 6c 64 20 69  ords, nPkField i
ab60: 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
ab70: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
ab80: 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79 20  he true primary 
ab90: 6b 65 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  key of the table
aba0: 2e 20 2a 2f 0a 20 20 69 66 28 20 48 61 73 52 6f  . */.  if( HasRo
abb0: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
abc0: 20 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 6e 50   pPk = 0;.    nP
abd0: 6b 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 7d 65  kField = 1;.  }e
abe0: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73  lse{.    pPk = s
abf0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
ac00: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20  Index(pTab);.   
ac10: 20 6e 50 6b 46 69 65 6c 64 20 3d 20 70 50 6b 2d   nPkField = pPk-
ac20: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a 0a 20  >nKeyCol;.  }.. 
ac30: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 61 74 20   /* Record that 
ac40: 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
ac50: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 56 64 62  started */.  Vdb
ac60: 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
ac70: 76 2c 20 22 42 45 47 49 4e 3a 20 47 65 6e 43 6e  v, "BEGIN: GenCn
ac80: 73 74 43 6b 73 28 25 64 2c 25 64 2c 25 64 2c 25  stCks(%d,%d,%d,%
ac90: 64 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  d,%d)",.        
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 44 61               iDa
acb0: 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20  taCur, iIdxCur, 
acc0: 72 65 67 4e 65 77 44 61 74 61 2c 20 72 65 67 4f  regNewData, regO
acd0: 6c 64 44 61 74 61 2c 20 70 6b 43 68 6e 67 29 29  ldData, pkChng))
ace0: 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c  ;..  /* Test all
acf0: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
ad00: 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  aints..  */.  fo
ad10: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
ad20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
ad30: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
ad40: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ad50: 20 20 20 7d 0a 20 20 20 20 6f 6e 45 72 72 6f 72     }.    onError
ad60: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d   = pTab->aCol[i]
ad70: 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  .notNull;.    if
ad80: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ( onError==OE_No
ad90: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
ada0: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
adb0: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
adc0: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
add0: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
ade0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
adf0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
ae00: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e  ault ){.      on
ae10: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
ae20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ae30: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
ae40: 61 63 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  ace && pTab->aCo
ae50: 6c 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b  l[i].pDflt==0 ){
ae60: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
ae70: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
ae80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45  .    assert( onE
ae90: 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  rror==OE_Rollbac
aea0: 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  k || onError==OE
aeb0: 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f  _Abort || onErro
aec0: 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  r==OE_Fail.     
aed0: 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f     || onError==O
aee0: 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72  E_Ignore || onEr
aef0: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
af00: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
af10: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
af20: 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20  case OE_Abort:. 
af30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61         sqlite3Ma
af40: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
af50: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20          /* Fall 
af60: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 20  through */.     
af70: 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
af80: 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45  k:.      case OE
af90: 5f 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20  _Fail: {.       
afa0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
afb0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
afc0: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
afd0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
b000: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
b010: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b020: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
b030: 5f 48 61 6c 74 49 66 4e 75 6c 6c 2c 20 53 51 4c  _HaltIfNull, SQL
b040: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
b050: 4f 54 4e 55 4c 4c 2c 20 6f 6e 45 72 72 6f 72 2c  OTNULL, onError,
b060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b070: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4e 65             regNe
b080: 77 44 61 74 61 2b 31 2b 69 2c 20 7a 4d 73 67 2c  wData+1+i, zMsg,
b090: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
b0a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b0b0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 50 35 5f  eChangeP5(v, P5_
b0c0: 43 6f 6e 73 74 72 61 69 6e 74 4e 6f 74 4e 75 6c  ConstraintNotNul
b0d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
b0e0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b100: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
b110: 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20  E_Ignore: {.    
b120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b130: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
b140: 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31  ll, regNewData+1
b150: 2b 69 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b  +i, ignoreDest);
b160: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
b170: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
b180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b190: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
b1a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b1b0: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ( onError==OE_Re
b1c0: 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20  place );.       
b1d0: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
b1e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
b1f0: 74 4e 75 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74  tNull, regNewDat
b200: 61 2b 31 2b 69 29 3b 20 56 64 62 65 43 6f 76 65  a+1+i); VdbeCove
b210: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b220: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b230: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61  (pParse, pTab->a
b240: 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65  Col[i].pDflt, re
b250: 67 4e 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20  gNewData+1+i);. 
b260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b270: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
b280: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
b290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b2a0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61    }..  /* Test a
b2b0: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
b2c0: 69 6e 74 73 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ints.  */.#ifnde
b2d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b2e0: 45 43 4b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ECK.  if( pTab->
b2f0: 70 43 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66  pCheck && (db->f
b300: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67  lags & SQLITE_Ig
b310: 6e 6f 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29  noreChecks)==0 )
b320: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
b330: 70 43 68 65 63 6b 20 3d 20 70 54 61 62 2d 3e 70  pCheck = pTab->p
b340: 43 68 65 63 6b 3b 0a 20 20 20 20 70 50 61 72 73  Check;.    pPars
b350: 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72 65 67 4e  e->ckBase = regN
b360: 65 77 44 61 74 61 2b 31 3b 0a 20 20 20 20 6f 6e  ewData+1;.    on
b370: 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65  Error = override
b380: 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c  Error!=OE_Defaul
b390: 74 20 3f 20 6f 76 65 72 72 69 64 65 45 72 72 6f  t ? overrideErro
b3a0: 72 20 3a 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r : OE_Abort;.  
b3b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
b3c0: 65 63 6b 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  eck->nExpr; i++)
b3d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 6c 6c 4f  {.      int allO
b3e0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
b3f0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b400: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b410: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 43 68  True(pParse, pCh
b420: 65 63 6b 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  eck->a[i].pExpr,
b430: 20 61 6c 6c 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a   allOk, SQLITE_J
b440: 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
b450: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
b460: 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
b470: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b480: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
b490: 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74 29  , 0, ignoreDest)
b4a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b4b0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
b4c0: 6d 65 20 3d 20 70 43 68 65 63 6b 2d 3e 61 5b 69  me = pCheck->a[i
b4d0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
b4e0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
b4f0: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  zName = pTab->zN
b500: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
b510: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
b520: 6c 61 63 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d  lace ) onError =
b530: 20 4f 45 5f 41 62 6f 72 74 3b 20 2f 2a 20 49 4d   OE_Abort; /* IM
b540: 50 3a 20 52 2d 31 35 35 36 39 2d 36 33 36 32 35  P: R-15569-63625
b550: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
b560: 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
b570: 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
b580: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
b590: 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 6f 6e 45 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c   onError, zName,
b5c0: 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20   P4_TRANSIENT,. 
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f               P5_
b5f0: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 29  ConstraintCheck)
b600: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b610: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b620: 76 65 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b  veLabel(v, allOk
b630: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
b640: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b650: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
b660: 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 72  K) */..  /* If r
b670: 6f 77 69 64 20 69 73 20 63 68 61 6e 67 69 6e 67  owid is changing
b680: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
b690: 6e 65 77 20 72 6f 77 69 64 20 64 6f 65 73 20 6e  new rowid does n
b6a0: 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20  ot previously.  
b6b0: 2a 2a 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ** exist in the 
b6c0: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
b6d0: 28 20 70 6b 43 68 6e 67 20 26 26 20 70 50 6b 3d  ( pkChng && pPk=
b6e0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
b6f0: 64 72 52 6f 77 69 64 4f 6b 20 3d 20 73 71 6c 69  drRowidOk = sqli
b700: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
b710: 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  (v);..    /* Fig
b720: 75 72 65 20 6f 75 74 20 77 68 61 74 20 61 63 74  ure out what act
b730: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20 63  ion to take in c
b740: 61 73 65 20 6f 66 20 61 20 72 6f 77 69 64 20 63  ase of a rowid c
b750: 6f 6c 6c 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  ollision */.    
b760: 6f 6e 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e  onError = pTab->
b770: 6b 65 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28  keyConf;.    if(
b780: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d   overrideError!=
b790: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
b7a0: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76      onError = ov
b7b0: 65 72 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20  errideError;.   
b7c0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72   }else if( onErr
b7d0: 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
b7e0: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
b7f0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
b800: 7d 0a 0a 20 20 20 20 69 66 28 20 69 73 55 70 64  }..    if( isUpd
b810: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ate ){.      /* 
b820: 70 6b 43 68 6e 67 21 3d 30 20 64 6f 65 73 20 6e  pkChng!=0 does n
b830: 6f 74 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65  ot mean that the
b840: 20 72 6f 77 69 64 20 68 61 73 20 63 68 61 6e 67   rowid has chang
b850: 65 2c 20 6f 6e 6c 79 20 74 68 61 74 0a 20 20 20  e, only that.   
b860: 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 68     ** it might h
b870: 61 76 65 20 63 68 61 6e 67 65 64 2e 20 20 53 6b  ave changed.  Sk
b880: 69 70 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ip the conflict 
b890: 6c 6f 67 69 63 20 62 65 6c 6f 77 20 69 66 20 74  logic below if t
b8a0: 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  he rowid.      *
b8b0: 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  * is unchanged. 
b8c0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b8d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b8e0: 5f 45 71 2c 20 72 65 67 4e 65 77 44 61 74 61 2c  _Eq, regNewData,
b8f0: 20 61 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72 65   addrRowidOk, re
b900: 67 4f 6c 64 44 61 74 61 29 3b 0a 20 20 20 20 20  gOldData);.     
b910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
b920: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
b930: 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56  OTNULL);.      V
b940: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b950: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
b960: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 74 6f   the response to
b970: 20 61 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63   a rowid conflic
b980: 74 20 69 73 20 52 45 50 4c 41 43 45 20 62 75 74  t is REPLACE but
b990: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 0a 20 20   the response.  
b9a0: 20 20 2a 2a 20 74 6f 20 73 6f 6d 65 20 6f 74 68    ** to some oth
b9b0: 65 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  er UNIQUE constr
b9c0: 61 69 6e 74 20 69 73 20 46 41 49 4c 20 6f 72 20  aint is FAIL or 
b9d0: 49 47 4e 4f 52 45 2c 20 74 68 65 6e 20 77 65 20  IGNORE, then we 
b9e0: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64  need.    ** to d
b9f0: 65 66 65 72 20 74 68 65 20 72 75 6e 6e 69 6e 67  efer the running
ba00: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f   of the rowid co
ba10: 6e 66 6c 69 63 74 20 63 68 65 63 6b 69 6e 67 20  nflict checking 
ba20: 75 6e 74 69 6c 20 61 66 74 65 72 0a 20 20 20 20  until after.    
ba30: 2a 2a 20 74 68 65 20 55 4e 49 51 55 45 20 63 6f  ** the UNIQUE co
ba40: 6e 73 74 72 61 69 6e 74 73 20 68 61 76 65 20 72  nstraints have r
ba50: 75 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  un..    */.    i
ba60: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  f( onError==OE_R
ba70: 65 70 6c 61 63 65 20 26 26 20 6f 76 65 72 72 69  eplace && overri
ba80: 64 65 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  deError!=OE_Repl
ba90: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ace ){.      for
baa0: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
bab0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
bac0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
bad0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
bae0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72  nError==OE_Ignor
baf0: 65 20 7c 7c 20 70 49 64 78 2d 3e 6f 6e 45 72 72  e || pIdx->onErr
bb00: 6f 72 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  or==OE_Fail ){. 
bb10: 20 20 20 20 20 20 20 20 20 69 70 6b 54 6f 70 20           ipkTop 
bb20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
bb30: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
bb40: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
bb50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bb60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
bb70: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
bb80: 66 20 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20  f the new rowid 
bb90: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
bba0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 53 6b  n the table.  Sk
bbb0: 69 70 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  ip.    ** the fo
bbc0: 6c 6c 6f 77 69 6e 67 20 63 6f 6e 66 6c 69 63 74  llowing conflict
bbd0: 20 6c 6f 67 69 63 20 69 66 20 69 74 20 64 6f 65   logic if it doe
bbe0: 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 73 71  s not. */.    sq
bbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
bc00: 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c  v, OP_NotExists,
bc10: 20 69 44 61 74 61 43 75 72 2c 20 61 64 64 72 52   iDataCur, addrR
bc20: 6f 77 69 64 4f 6b 2c 20 72 65 67 4e 65 77 44 61  owidOk, regNewDa
bc30: 74 61 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ta);.    VdbeCov
bc40: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f  erage(v);..    /
bc50: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bc60: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
bc70: 61 20 72 6f 77 69 64 20 63 6f 6c 6c 69 73 69 6f  a rowid collisio
bc80: 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28  n */.    switch(
bc90: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
bca0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
bcb0: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
bcc0: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  E_Abort;.       
bcd0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
bce0: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
bcf0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
bd00: 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61    case OE_Rollba
bd10: 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ck:.      case O
bd20: 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63  E_Abort:.      c
bd30: 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20  ase OE_Fail: {. 
bd40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
bd50: 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  widConstraint(pP
bd60: 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70  arse, onError, p
bd70: 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  Tab);.        br
bd80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bd90: 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61     case OE_Repla
bda0: 63 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ce: {.        /*
bdb0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 44 45   If there are DE
bdc0: 4c 45 54 45 20 74 72 69 67 67 65 72 73 20 6f 6e  LETE triggers on
bdd0: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6e 64 20   this table and 
bde0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
bdf0: 65 63 75 72 73 69 76 65 2d 74 72 69 67 67 65 72  ecursive-trigger
be00: 73 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 63  s flag is set, c
be10: 61 6c 6c 20 47 65 6e 65 72 61 74 65 52 6f 77 44  all GenerateRowD
be20: 65 6c 65 74 65 28 29 20 74 6f 0a 20 20 20 20 20  elete() to.     
be30: 20 20 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65     ** remove the
be40: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
be50: 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
be60: 20 54 68 69 73 20 77 69 6c 6c 20 66 69 72 65 0a   This will fire.
be70: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
be80: 72 69 67 67 65 72 73 20 61 6e 64 20 72 65 6d 6f  riggers and remo
be90: 76 65 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c  ve both the tabl
bea0: 65 20 61 6e 64 20 69 6e 64 65 78 20 62 2d 74 72  e and index b-tr
beb0: 65 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ee entries..    
bec0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
bed0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
bee0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 69  there are no tri
bef0: 67 67 65 72 73 20 6f 72 20 74 68 65 20 72 65 63  ggers or the rec
bf00: 75 72 73 69 76 65 2d 74 72 69 67 67 65 72 73 0a  ursive-triggers.
bf10: 20 20 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20          ** flag 
bf20: 69 73 20 6e 6f 74 20 73 65 74 2c 20 62 75 74 20  is not set, but 
bf30: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6f 6e  the table has on
bf40: 65 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  e or more indexe
bf50: 73 2c 20 63 61 6c 6c 20 0a 20 20 20 20 20 20 20  s, call .       
bf60: 20 2a 2a 20 47 65 6e 65 72 61 74 65 52 6f 77 49   ** GenerateRowI
bf70: 6e 64 65 78 44 65 6c 65 74 65 28 29 2e 20 54 68  ndexDelete(). Th
bf80: 69 73 20 72 65 6d 6f 76 65 73 20 74 68 65 20 69  is removes the i
bf90: 6e 64 65 78 20 62 2d 74 72 65 65 20 65 6e 74 72  ndex b-tree entr
bfa0: 69 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ies .        ** 
bfb0: 6f 6e 6c 79 2e 20 54 68 65 20 74 61 62 6c 65 20  only. The table 
bfc0: 62 2d 74 72 65 65 20 65 6e 74 72 79 20 77 69 6c  b-tree entry wil
bfd0: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  l be replaced by
bfe0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 0a   the new entry .
bff0: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
c000: 69 74 20 69 73 20 69 6e 73 65 72 74 65 64 2e 20  it is inserted. 
c010: 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
c020: 20 20 20 20 20 2a 2a 20 49 66 20 65 69 74 68 65       ** If eithe
c030: 72 20 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  r GenerateRowDel
c040: 65 74 65 28 29 20 6f 72 20 47 65 6e 65 72 61 74  ete() or Generat
c050: 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28  eRowIndexDelete(
c060: 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20  ) is called,.   
c070: 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 69 6e 76       ** also inv
c080: 6f 6b 65 20 4d 75 6c 74 69 57 72 69 74 65 28 29  oke MultiWrite()
c090: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
c0a0: 74 20 74 68 69 73 20 56 44 42 45 20 6d 61 79 20  t this VDBE may 
c0b0: 72 65 71 75 69 72 65 0a 20 20 20 20 20 20 20 20  require.        
c0c0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  ** statement rol
c0d0: 6c 62 61 63 6b 20 28 69 66 20 74 68 65 20 73 74  lback (if the st
c0e0: 61 74 65 6d 65 6e 74 20 69 73 20 61 62 6f 72 74  atement is abort
c0f0: 65 64 20 61 66 74 65 72 20 74 68 65 20 64 65 6c  ed after the del
c100: 65 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ete.        ** t
c110: 61 6b 65 73 20 70 6c 61 63 65 29 2e 20 45 61 72  akes place). Ear
c120: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 63 61  lier versions ca
c130: 6c 6c 65 64 20 73 71 6c 69 74 65 33 4d 75 6c 74  lled sqlite3Mult
c140: 69 57 72 69 74 65 28 29 20 72 65 67 61 72 64 6c  iWrite() regardl
c150: 65 73 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ess,.        ** 
c160: 62 75 74 20 62 65 69 6e 67 20 6d 6f 72 65 20 73  but being more s
c170: 65 6c 65 63 74 69 76 65 20 68 65 72 65 20 61 6c  elective here al
c180: 6c 6f 77 73 20 73 74 61 74 65 6d 65 6e 74 73 20  lows statements 
c190: 6c 69 6b 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  like:.        **
c1a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 52 45  .        **   RE
c1b0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 28 72 6f 77  PLACE INTO t(row
c1c0: 69 64 29 20 56 41 4c 55 45 53 28 24 6e 65 77 72  id) VALUES($newr
c1d0: 6f 77 69 64 29 0a 20 20 20 20 20 20 20 20 2a 2a  owid).        **
c1e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  .        ** to r
c1f0: 75 6e 20 77 69 74 68 6f 75 74 20 61 20 73 74 61  un without a sta
c200: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
c210: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69  f there are no i
c220: 6e 64 65 78 65 73 20 6f 6e 20 74 68 65 0a 20 20  ndexes on the.  
c230: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 0a        ** table..
c240: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c250: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
c260: 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  gger = 0;.      
c270: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26    if( db->flags&
c280: 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65  SQLITE_RecTrigge
c290: 72 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rs ){.          
c2a0: 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
c2b0: 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74 28  e3TriggersExist(
c2c0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b  pParse, pTab, TK
c2d0: 5f 44 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a  _DELETE, 0, 0);.
c2e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c2f0: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 20 7c    if( pTrigger |
c300: 7c 20 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69  | sqlite3FkRequi
c310: 72 65 64 28 70 50 61 72 73 65 2c 20 70 54 61 62  red(pParse, pTab
c320: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
c330: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 6c 74       sqlite3Mult
c340: 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a  iWrite(pParse);.
c350: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c360: 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65  3GenerateRowDele
c370: 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  te(pParse, pTab,
c380: 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74 61   pTrigger, iData
c390: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20  Cur, iIdxCur,.  
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 72 65 67 4e 65 77 44 61 74 61 2c 20 31 2c 20   regNewData, 1, 
c3d0: 30 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 31  0, OE_Replace, 1
c3e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
c3f0: 20 69 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65   if( pTab->pInde
c400: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  x ){.          s
c410: 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
c420: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
c430: 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72      sqlite3Gener
c440: 61 74 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74  ateRowIndexDelet
c450: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
c460: 69 44 61 74 61 43 75 72 2c 20 69 49 64 78 43 75  iDataCur, iIdxCu
c470: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 0);.        }
c480: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 52 65 70  .        seenRep
c490: 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  lace = 1;.      
c4a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c4b0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49  .      case OE_I
c4c0: 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20  gnore: {.       
c4d0: 20 2f 2a 61 73 73 65 72 74 28 20 73 65 65 6e 52   /*assert( seenR
c4e0: 65 70 6c 61 63 65 3d 3d 30 20 29 3b 2a 2f 0a 20  eplace==0 );*/. 
c4f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c500: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c510: 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65  oto, 0, ignoreDe
c520: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  st);.        bre
c530: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c540: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
c550: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c560: 20 61 64 64 72 52 6f 77 69 64 4f 6b 29 3b 0a 20   addrRowidOk);. 
c570: 20 20 20 69 66 28 20 69 70 6b 54 6f 70 20 29 7b     if( ipkTop ){
c580: 0a 20 20 20 20 20 20 69 70 6b 42 6f 74 74 6f 6d  .      ipkBottom
c590: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c5a0: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
c5b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c5c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69  dbeJumpHere(v, i
c5d0: 70 6b 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  pkTop);.    }.  
c5e0: 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c  }..  /* Test all
c5f0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
c600: 6e 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  nts by creating 
c610: 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
c620: 20 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e 64   UNIQUE.  ** ind
c630: 65 78 20 61 6e 64 20 6d 61 6b 69 6e 67 20 73 75  ex and making su
c640: 72 65 20 74 68 61 74 20 64 75 70 6c 69 63 61 74  re that duplicat
c650: 65 20 65 6e 74 72 69 65 73 20 64 6f 20 6e 6f 74  e entries do not
c660: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
c670: 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    ** Compute the
c680: 20 72 65 76 69 73 65 64 20 72 65 63 6f 72 64 20   revised record 
c690: 65 6e 74 72 69 65 73 20 66 6f 72 20 69 6e 64 69  entries for indi
c6a0: 63 65 73 20 61 73 20 77 65 20 67 6f 2e 0a 20 20  ces as we go..  
c6b0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
c6c0: 70 20 61 6c 73 6f 20 68 61 6e 64 6c 65 73 20 74  p also handles t
c6d0: 68 65 20 63 61 73 65 20 6f 66 20 74 68 65 20 50  he case of the P
c6e0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
c6f0: 20 66 6f 72 20 61 0a 20 20 2a 2a 20 57 49 54 48   for a.  ** WITH
c700: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
c710: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 78 3d 30  .  */.  for(ix=0
c720: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
c730: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
c740: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 78 2b  pIdx->pNext, ix+
c750: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 49  +){.    int regI
c760: 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
c770: 52 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  Range of registe
c780: 72 73 20 68 6f 6c 64 20 63 6f 6e 65 6e 74 20 66  rs hold conent f
c790: 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  or pIdx */.    i
c7a0: 6e 74 20 72 65 67 52 3b 20 20 20 20 20 20 20 20  nt regR;        
c7b0: 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20      /* Range of 
c7c0: 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e  registers holdin
c7d0: 67 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 50 4b  g conflicting PK
c7e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 68 69   */.    int iThi
c7f0: 73 43 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  sCur;        /* 
c800: 43 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20  Cursor for this 
c810: 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a  UNIQUE index */.
c820: 20 20 20 20 69 6e 74 20 61 64 64 72 55 6e 69 71      int addrUniq
c830: 75 65 4f 6b 3b 20 20 20 20 2f 2a 20 4a 75 6d 70  ueOk;    /* Jump
c840: 20 68 65 72 65 20 69 66 20 74 68 65 20 55 4e 49   here if the UNI
c850: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  QUE constraint i
c860: 73 20 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 0a  s satisfied */..
c870: 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78 5b      if( aRegIdx[
c880: 69 78 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ix]==0 ) continu
c890: 65 3b 20 20 2f 2a 20 53 6b 69 70 20 69 6e 64 69  e;  /* Skip indi
c8a0: 63 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ces that do not 
c8b0: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 20 20 69 66  change */.    if
c8c0: 28 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 3d  ( bAffinityDone=
c8d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c8e0: 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
c8f0: 28 76 2c 20 70 54 61 62 2c 20 72 65 67 4e 65 77  (v, pTab, regNew
c900: 44 61 74 61 2b 31 29 3b 0a 20 20 20 20 20 20 62  Data+1);.      b
c910: 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20 31  AffinityDone = 1
c920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 68 69  ;.    }.    iThi
c930: 73 43 75 72 20 3d 20 69 49 64 78 43 75 72 2b 69  sCur = iIdxCur+i
c940: 78 3b 0a 20 20 20 20 61 64 64 72 55 6e 69 71 75  x;.    addrUniqu
c950: 65 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eOk = sqlite3Vdb
c960: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
c970: 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 72 74      /* Skip part
c980: 69 61 6c 20 69 6e 64 69 63 65 73 20 66 6f 72 20  ial indices for 
c990: 77 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20  which the WHERE 
c9a0: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 74 72  clause is not tr
c9b0: 75 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  ue */.    if( pI
c9c0: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
c9d0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
c9e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c9f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 61 52 65 67  OP_Null, 0, aReg
ca00: 49 64 78 5b 69 78 5d 29 3b 0a 20 20 20 20 20 20  Idx[ix]);.      
ca10: 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d  pParse->ckBase =
ca20: 20 72 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a 20   regNewData+1;. 
ca30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ca40: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
ca50: 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
ca60: 65 72 65 2c 20 61 64 64 72 55 6e 69 71 75 65 4f  ere, addrUniqueO
ca70: 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
ca90: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
caa0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b        pParse->ck
cab0: 42 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Base = 0;.    }.
cac0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
cad0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 69 73   record for this
cae0: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 61 73 20   index entry as 
caf0: 69 74 20 73 68 6f 75 6c 64 20 61 70 70 65 61 72  it should appear
cb00: 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68   after.    ** th
cb10: 65 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61  e insert or upda
cb20: 74 65 2e 20 20 53 74 6f 72 65 20 74 68 61 74 20  te.  Store that 
cb30: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 61 52  record in the aR
cb40: 65 67 49 64 78 5b 69 78 5d 20 72 65 67 69 73 74  egIdx[ix] regist
cb50: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  er.    */.    re
cb60: 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 47 65  gIdx = sqlite3Ge
cb70: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
cb80: 65 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  e, pIdx->nColumn
cb90: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
cba0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
cbb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
cbc0: 20 69 46 69 65 6c 64 20 3d 20 70 49 64 78 2d 3e   iField = pIdx->
cbd0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
cbe0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
cbf0: 69 66 28 20 69 46 69 65 6c 64 3c 30 20 7c 7c 20  if( iField<0 || 
cc00: 69 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 69 50  iField==pTab->iP
cc10: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
cc20: 66 28 20 72 65 67 52 6f 77 69 64 3d 3d 72 65 67  f( regRowid==reg
cc30: 49 64 78 2b 69 20 29 20 63 6f 6e 74 69 6e 75 65  Idx+i ) continue
cc40: 3b 20 2f 2a 20 52 4f 57 49 44 20 61 6c 72 65 61  ; /* ROWID alrea
cc50: 64 79 20 69 6e 20 72 65 67 49 64 78 2b 69 20 2a  dy in regIdx+i *
cc60: 2f 0a 20 20 20 20 20 20 20 20 78 20 3d 20 72 65  /.        x = re
cc70: 67 4e 65 77 44 61 74 61 3b 0a 20 20 20 20 20 20  gNewData;.      
cc80: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 20 70 49    regRowid =  pI
cc90: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
cca0: 65 20 3f 20 2d 31 20 3a 20 72 65 67 49 64 78 2b  e ? -1 : regIdx+
ccb0: 69 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  i;.      }else{.
ccc0: 20 20 20 20 20 20 20 20 78 20 3d 20 69 46 69 65          x = iFie
ccd0: 6c 64 20 2b 20 72 65 67 4e 65 77 44 61 74 61 20  ld + regNewData 
cce0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  + 1;.      }.   
ccf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd00: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
cd10: 2c 20 78 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a  , x, regIdx+i);.
cd20: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
cd30: 74 28 28 76 2c 20 22 25 73 22 2c 20 69 46 69 65  t((v, "%s", iFie
cd40: 6c 64 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  ld<0 ? "rowid" :
cd50: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 46 69 65   pTab->aCol[iFie
cd60: 6c 64 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ld].zName));.   
cd70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
cd80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
cd90: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 49 64  akeRecord, regId
cda0: 78 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  x, pIdx->nColumn
cdb0: 2c 20 61 52 65 67 49 64 78 5b 69 78 5d 29 3b 0a  , aRegIdx[ix]);.
cdc0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
cdd0: 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 49  (v, "for %s", pI
cde0: 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  dx->zName));.   
cdf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ce00: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
ce10: 70 50 61 72 73 65 2c 20 72 65 67 49 64 78 2c 20  pParse, regIdx, 
ce20: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
ce30: 0a 20 20 20 20 2f 2a 20 49 6e 20 61 6e 20 55 50  .    /* In an UP
ce40: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20  DATE operation, 
ce50: 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  if this index is
ce60: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ce70: 20 69 6e 64 65 78 20 0a 20 20 20 20 2a 2a 20 6f   index .    ** o
ce80: 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
ce90: 44 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 72  D table and ther
cea0: 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 63 68  e has been no ch
ceb0: 61 6e 67 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ange the.    ** 
cec0: 70 72 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65  primary key, the
ced0: 6e 20 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 20 69  n no collision i
cee0: 73 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 65  s possible.  The
cef0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 64 65 74 65 63   collision detec
cf00: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 6f 67 69  tion.    ** logi
cf10: 63 20 62 65 6c 6f 77 20 63 61 6e 20 61 6c 6c 20  c below can all 
cf20: 62 65 20 73 6b 69 70 70 65 64 2e 20 2a 2f 0a 20  be skipped. */. 
cf30: 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65 20     if( isUpdate 
cf40: 26 26 20 70 50 6b 3d 3d 70 49 64 78 20 26 26 20  && pPk==pIdx && 
cf50: 70 6b 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  pkChng==0 ){.   
cf60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
cf70: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
cf80: 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20  drUniqueOk);.   
cf90: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
cfa0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20   }..    /* Find 
cfb0: 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e 20  out what action 
cfc0: 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65 20  to take in case 
cfd0: 74 68 65 72 65 20 69 73 20 61 20 75 6e 69 71 75  there is a uniqu
cfe0: 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a  eness conflict *
cff0: 2f 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20  /.    onError = 
d000: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  pIdx->onError;. 
d010: 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d     if( onError==
d020: 4f 45 5f 4e 6f 6e 65 20 29 7b 20 0a 20 20 20 20  OE_None ){ .    
d030: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d040: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
d050: 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e  , regIdx, pIdx->
d060: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
d070: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d080: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 55  veLabel(v, addrU
d090: 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 20 20  niqueOk);.      
d0a0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 70 49  continue;  /* pI
d0b0: 64 78 20 69 73 20 6e 6f 74 20 61 20 55 4e 49 51  dx is not a UNIQ
d0c0: 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  UE index */.    
d0d0: 7d 0a 20 20 20 20 69 66 28 20 6f 76 65 72 72 69  }.    if( overri
d0e0: 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61  deError!=OE_Defa
d0f0: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
d100: 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45  rror = overrideE
d110: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rror;.    }else 
d120: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
d130: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
d140: 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62   onError = OE_Ab
d150: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  ort;.    }.    .
d160: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
d170: 73 65 65 20 69 66 20 74 68 65 20 6e 65 77 20 69  see if the new i
d180: 6e 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20  ndex entry will 
d190: 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20  be unique */.   
d1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d1b0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 43 6f  p4Int(v, OP_NoCo
d1c0: 6e 66 6c 69 63 74 2c 20 69 54 68 69 73 43 75 72  nflict, iThisCur
d1d0: 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a  , addrUniqueOk,.
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 20 20 72 65 67 49 64 78 2c           regIdx,
d200: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
d210: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d220: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
d230: 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
d240: 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a  e collisions */.
d250: 20 20 20 20 72 65 67 52 20 3d 20 28 70 49 64 78      regR = (pIdx
d260: 3d 3d 70 50 6b 29 20 3f 20 72 65 67 49 64 78 20  ==pPk) ? regIdx 
d270: 3a 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  : sqlite3GetTemp
d280: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
d290: 6b 46 69 65 6c 64 29 3b 0a 20 20 20 20 69 66 28  kField);.    if(
d2a0: 20 69 73 55 70 64 61 74 65 20 7c 7c 20 6f 6e 45   isUpdate || onE
d2b0: 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
d2c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61   ){.      if( Ha
d2d0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
d2e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d2f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d300: 49 64 78 52 6f 77 69 64 2c 20 69 54 68 69 73 43  IdxRowid, iThisC
d310: 75 72 2c 20 72 65 67 52 29 3b 0a 20 20 20 20 20  ur, regR);.     
d320: 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 6f     /* Conflict o
d330: 6e 6c 79 20 69 66 20 74 68 65 20 72 6f 77 69 64  nly if the rowid
d340: 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67   of the existing
d350: 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20   index entry.   
d360: 20 20 20 20 20 2a 2a 20 69 73 20 64 69 66 66 65       ** is diffe
d370: 72 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 2d 72 6f  rent from old-ro
d380: 77 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  wid */.        i
d390: 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20  f( isUpdate ){. 
d3a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d3b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d3c0: 5f 45 71 2c 20 72 65 67 52 2c 20 61 64 64 72 55  _Eq, regR, addrU
d3d0: 6e 69 71 75 65 4f 6b 2c 20 72 65 67 4f 6c 64 44  niqueOk, regOldD
d3e0: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
d3f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d400: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f  eP5(v, SQLITE_NO
d410: 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20  TNULL);.        
d420: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d430: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d450: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 20    int x;.       
d460: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
d470: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 72 6f 6d  PRIMARY KEY from
d480: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d490: 69 6e 64 65 78 20 65 6e 74 72 79 20 61 6e 64 0a  index entry and.
d4a0: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
d4b0: 20 69 74 20 69 6e 20 72 65 67 69 73 74 65 72 73   it in registers
d4c0: 20 72 65 67 52 2e 2e 72 65 67 52 2b 6e 50 6b 2d   regR..regR+nPk-
d4d0: 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  1 */.        if(
d4e0: 20 70 49 64 78 21 3d 70 50 6b 20 29 7b 0a 20 20   pIdx!=pPk ){.  
d4f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d500: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
d510: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d520: 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
d530: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
d540: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
d550: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
d560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d570: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d580: 20 69 54 68 69 73 43 75 72 2c 20 78 2c 20 72 65   iThisCur, x, re
d590: 67 52 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  gR+i);.         
d5a0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d5b0: 76 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  v, "%s.%s", pTab
d5c0: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b    pTab->aCol[pPk
d5f0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a  ->aiColumn[i]].z
d600: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
d610: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
d620: 20 20 20 20 20 20 69 66 28 20 69 73 55 70 64 61        if( isUpda
d630: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
d640: 2f 2a 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20  /* If currently 
d650: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 50  processing the P
d660: 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 20  RIMARY KEY of a 
d670: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 0a 20  WITHOUT ROWID . 
d680: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
d690: 65 2c 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69 63 74  e, only conflict
d6a0: 20 69 66 20 74 68 65 20 6e 65 77 20 50 52 49 4d   if the new PRIM
d6b0: 41 52 59 20 4b 45 59 20 76 61 6c 75 65 73 20 61  ARY KEY values a
d6c0: 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  re actually.    
d6d0: 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65        ** differe
d6e0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e  nt from the old.
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
d700: 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61          ** For a
d710: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 6f   UNIQUE index, o
d720: 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69 66 20  nly conflict if 
d730: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d740: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 20 20 20  values.         
d750: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68   ** of the match
d760: 65 64 20 69 6e 64 65 78 20 72 6f 77 20 61 72 65  ed index row are
d770: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
d780: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 50 52 49  the original PRI
d790: 4d 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 2a  MARY.          *
d7a0: 2a 20 4b 45 59 20 76 61 6c 75 65 73 20 6f 66 20  * KEY values of 
d7b0: 74 68 69 73 20 72 6f 77 20 62 65 66 6f 72 65 20  this row before 
d7c0: 74 68 65 20 75 70 64 61 74 65 2e 20 20 2a 2f 0a  the update.  */.
d7d0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 64            int ad
d7e0: 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33  drJump = sqlite3
d7f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d800: 76 29 2b 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b  v)+pPk->nKeyCol;
d810: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
d820: 70 20 3d 20 4f 50 5f 4e 65 3b 0a 20 20 20 20 20  p = OP_Ne;.     
d830: 20 20 20 20 20 69 6e 74 20 72 65 67 43 6d 70 20       int regCmp 
d840: 3d 20 28 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  = (pIdx->autoInd
d850: 65 78 3d 3d 32 20 3f 20 72 65 67 49 64 78 20 3a  ex==2 ? regIdx :
d860: 20 72 65 67 52 29 3b 0a 20 20 0a 20 20 20 20 20   regR);.  .     
d870: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d880: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
d890: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
d8a0: 63 68 61 72 20 2a 70 34 20 3d 20 28 63 68 61 72  char *p4 = (char
d8b0: 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  *)sqlite3LocateC
d8c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d8d0: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 3b 0a  Pk->azColl[i]);.
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20              x = 
d8f0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
d900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d910: 28 20 69 3d 3d 28 70 50 6b 2d 3e 6e 4b 65 79 43  ( i==(pPk->nKeyC
d920: 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol-1) ){.       
d930: 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20         addrJump 
d940: 3d 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 3b 0a  = addrUniqueOk;.
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
d960: 20 3d 20 4f 50 5f 45 71 3b 0a 20 20 20 20 20 20   = OP_Eq;.      
d970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d990: 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20 0a 20 20  ddOp4(v, op, .  
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
d9b0: 67 4f 6c 64 44 61 74 61 2b 31 2b 78 2c 20 61 64  gOldData+1+x, ad
d9c0: 64 72 4a 75 6d 70 2c 20 72 65 67 43 6d 70 2b 69  drJump, regCmp+i
d9d0: 2c 20 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  , p4, P4_COLLSEQ
d9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
da00: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
da10: 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e 55 4c  v, SQLITE_NOTNUL
da20: 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  L);.            
da30: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
da40: 2c 20 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  , op==OP_Eq);.  
da50: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
da60: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
da70: 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20  OP_Ne);.        
da80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
da90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
daa0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
dab0: 65 20 74 68 61 74 20 65 78 65 63 75 74 65 73 20  e that executes 
dac0: 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  if the new index
dad0: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 75 6e   entry is not un
dae0: 69 71 75 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  ique */.    asse
daf0: 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  rt( onError==OE_
db00: 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72  Rollback || onEr
db10: 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c  ror==OE_Abort ||
db20: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69   onError==OE_Fai
db30: 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45  l.        || onE
db40: 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  rror==OE_Ignore 
db50: 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  || onError==OE_R
db60: 65 70 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77  eplace );.    sw
db70: 69 74 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b  itch( onError ){
db80: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52  .      case OE_R
db90: 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63  ollback:.      c
dba0: 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20  ase OE_Abort:.  
dbb0: 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c      case OE_Fail
dbc0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
dbd0: 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
dbe0: 69 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e 45 72  int(pParse, onEr
dbf0: 72 6f 72 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  ror, pIdx);.    
dc00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dc10: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
dc20: 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20  _Ignore: {.     
dc30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc40: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
dc50: 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b   0, ignoreDest);
dc60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
dc80: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
dc90: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
dca0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
dcb0: 61 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d  assert( onError=
dcc0: 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20  =OE_Replace );. 
dcd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75         sqlite3Mu
dce0: 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29  ltiWrite(pParse)
dcf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
dd00: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
dd10: 65 63 54 72 69 67 67 65 72 73 20 29 7b 0a 20 20  ecTriggers ){.  
dd20: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
dd30: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
dd40: 72 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20  rsExist(pParse, 
dd50: 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45 54 45 2c  pTab, TK_DELETE,
dd60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
dd70: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
dd80: 33 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65  3GenerateRowDele
dd90: 74 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  te(pParse, pTab,
dda0: 20 70 54 72 69 67 67 65 72 2c 20 69 44 61 74 61   pTrigger, iData
ddb0: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20  Cur, iIdxCur,.  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
dde0: 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 2c 20 30  egR, nPkField, 0
ddf0: 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 70 49  , OE_Replace, pI
de00: 64 78 3d 3d 70 50 6b 29 3b 0a 20 20 20 20 20 20  dx==pPk);.      
de10: 20 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20    seenReplace = 
de20: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
de30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
de40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
de50: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
de60: 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20  ddrUniqueOk);.  
de70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
de80: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
de90: 2c 20 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e  , regIdx, pIdx->
dea0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69 66  nColumn);.    if
deb0: 28 20 72 65 67 52 21 3d 72 65 67 49 64 78 20 29  ( regR!=regIdx )
dec0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ded0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
dee0: 20 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64 29   regR, nPkField)
def0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 70 6b 54  ;.  }.  if( ipkT
df00: 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  op ){.    sqlite
df10: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
df20: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 70 6b 54 6f  P_Goto, 0, ipkTo
df30: 70 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  p+1);.    sqlite
df40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
df50: 20 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a 20 20 7d   ipkBottom);.  }
df60: 0a 20 20 0a 20 20 2a 70 62 4d 61 79 52 65 70 6c  .  .  *pbMayRepl
df70: 61 63 65 20 3d 20 73 65 65 6e 52 65 70 6c 61 63  ace = seenReplac
df80: 65 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  e;.  VdbeModuleC
df90: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 4e 44 3a  omment((v, "END:
dfa0: 20 47 65 6e 43 6e 73 74 43 6b 73 28 25 64 29 22   GenCnstCks(%d)"
dfb0: 2c 20 73 65 65 6e 52 65 70 6c 61 63 65 29 29 3b  , seenReplace));
dfc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
dfd0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
dfe0: 20 63 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20   code to finish 
dff0: 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50  the INSERT or UP
e000: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  DATE operation.*
e010: 2a 20 74 68 61 74 20 77 61 73 20 73 74 61 72 74  * that was start
e020: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
e030: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 47 65 6e  ll to sqlite3Gen
e040: 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
e050: 68 65 63 6b 73 2e 0a 2a 2a 20 41 20 63 6f 6e 73  hecks..** A cons
e060: 65 63 75 74 69 76 65 20 72 61 6e 67 65 20 6f 66  ecutive range of
e070: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
e080: 69 6e 67 20 61 74 20 72 65 67 4e 65 77 44 61 74  ing at regNewDat
e090: 61 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  a contains the.*
e0a0: 2a 20 72 6f 77 69 64 20 61 6e 64 20 74 68 65 20  * rowid and the 
e0b0: 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 20 69 6e  content to be in
e0c0: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  serted..**.** Th
e0d0: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
e0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
e0f0: 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
e100: 73 20 74 68 65 20 66 69 72 73 74 20 73 69 78 0a  s the first six.
e110: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ** arguments to 
e120: 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
e130: 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 2e  onstraintChecks.
e140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e150: 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74 69 6f  CompleteInsertio
e160: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
e170: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
e180: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
e190: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
e1a0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 74          /* the t
e1b0: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
e1c0: 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67  we are inserting
e1d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43   */.  int iDataC
e1e0: 75 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ur,       /* Cur
e1f0: 73 6f 72 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  sor of the canon
e200: 69 63 61 6c 20 64 61 74 61 20 73 6f 75 72 63 65  ical data source
e210: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
e220: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  r,        /* Fir
e230: 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  st index cursor 
e240: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 44  */.  int regNewD
e250: 61 74 61 2c 20 20 20 20 20 2f 2a 20 52 61 6e 67  ata,     /* Rang
e260: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
e270: 20 20 69 6e 74 20 2a 61 52 65 67 49 64 78 2c 20    int *aRegIdx, 
e280: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
e290: 72 20 75 73 65 64 20 62 79 20 65 61 63 68 20 69  r used by each i
e2a0: 6e 64 65 78 2e 20 20 30 20 66 6f 72 20 75 6e 75  ndex.  0 for unu
e2b0: 73 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  sed indices */. 
e2c0: 20 69 6e 74 20 69 73 55 70 64 61 74 65 2c 20 20   int isUpdate,  
e2d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
e2e0: 20 55 50 44 41 54 45 2c 20 46 61 6c 73 65 20 66   UPDATE, False f
e2f0: 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a 20 20 69  or INSERT */.  i
e300: 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20  nt appendBias,  
e310: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
e320: 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20  is is likely to 
e330: 62 65 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  be an append */.
e340: 20 20 69 6e 74 20 75 73 65 53 65 65 6b 52 65 73    int useSeekRes
e350: 75 6c 74 20 20 20 2f 2a 20 54 72 75 65 20 74 6f  ult   /* True to
e360: 20 73 65 74 20 74 68 65 20 55 53 45 53 45 45 4b   set the USESEEK
e370: 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 6e 20 4f  RESULT flag on O
e380: 50 5f 5b 49 64 78 5d 49 6e 73 65 72 74 20 2a 2f  P_[Idx]Insert */
e390: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  .){.  Vdbe *v;  
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
e3b0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
e3c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
e3d0: 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ion */.  Index *
e3e0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  pIdx;        /* 
e3f0: 41 6e 20 69 6e 64 65 78 20 62 65 69 6e 67 20 69  An index being i
e400: 6e 73 65 72 74 65 64 20 6f 72 20 75 70 64 61 74  nserted or updat
e410: 65 64 20 2a 2f 0a 20 20 75 38 20 70 69 6b 5f 66  ed */.  u8 pik_f
e420: 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 66  lags;       /* f
e430: 6c 61 67 20 76 61 6c 75 65 73 20 70 61 73 73 65  lag values passe
e440: 64 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69  d to the btree i
e450: 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 72  nsert */.  int r
e460: 65 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 2f  egData;        /
e470: 2a 20 43 6f 6e 74 65 6e 74 20 72 65 67 69 73 74  * Content regist
e480: 65 72 73 20 28 61 66 74 65 72 20 74 68 65 20 72  ers (after the r
e490: 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e 74 20 72  owid) */.  int r
e4a0: 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  egRec;         /
e4b0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
e4c0: 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 72 65  ng assemblied re
e4d0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 74 61 62  cord for the tab
e4e0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e500: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
e510: 20 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e   u8 bAffinityDon
e520: 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  e = 0; /* True i
e530: 66 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 68 61  f OP_Affinity ha
e540: 73 20 62 65 65 6e 20 72 75 6e 20 61 6c 72 65 61  s been run alrea
e550: 64 79 20 2a 2f 0a 0a 20 20 76 20 3d 20 73 71 6c  dy */..  v = sql
e560: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e570: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
e580: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e590: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
e5a0: 30 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61  0 );  /* This ta
e5b0: 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45  ble is not a VIE
e5c0: 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  W */.  for(i=0, 
e5d0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e5e0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e5f0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b 2b 29 7b  dx->pNext, i++){
e600: 0a 20 20 20 20 69 66 28 20 61 52 65 67 49 64 78  .    if( aRegIdx
e610: 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
e620: 65 3b 0a 20 20 20 20 62 41 66 66 69 6e 69 74 79  e;.    bAffinity
e630: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66  Done = 1;.    if
e640: 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
e650: 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 73  Where ){.      s
e660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e670: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 61  (v, OP_IsNull, a
e680: 52 65 67 49 64 78 5b 69 5d 2c 20 73 71 6c 69 74  RegIdx[i], sqlit
e690: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e6a0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56  r(v)+2);.      V
e6b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e6c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e6d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e6e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
e6f0: 78 43 75 72 2b 69 2c 20 61 52 65 67 49 64 78 5b  xCur+i, aRegIdx[
e700: 69 5d 29 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  i]);.    pik_fla
e710: 67 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  gs = 0;.    if( 
e720: 75 73 65 53 65 65 6b 52 65 73 75 6c 74 20 29 20  useSeekResult ) 
e730: 70 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46 4c  pik_flags = OPFL
e740: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
e750: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
e760: 61 75 74 6f 49 6e 64 65 78 3d 3d 32 20 26 26 20  autoIndex==2 && 
e770: 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
e780: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e790: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
e7a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 69 6b 5f  =0 );.      pik_
e7b0: 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f  flags |= OPFLAG_
e7c0: 4e 43 48 41 4e 47 45 3b 0a 20 20 20 20 7d 0a 20  NCHANGE;.    }. 
e7d0: 20 20 20 69 66 28 20 70 69 6b 5f 66 6c 61 67 73     if( pik_flags
e7e0: 20 29 20 20 73 71 6c 69 74 65 33 56 64 62 65 43   )  sqlite3VdbeC
e7f0: 68 61 6e 67 65 50 35 28 76 2c 20 70 69 6b 5f 66  hangeP5(v, pik_f
e800: 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
e810: 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
e820: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 72 65 67   ) return;.  reg
e830: 44 61 74 61 20 3d 20 72 65 67 4e 65 77 44 61 74  Data = regNewDat
e840: 61 20 2b 20 31 3b 0a 20 20 72 65 67 52 65 63 20  a + 1;.  regRec 
e850: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e860: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
e870: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e880: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
e890: 64 2c 20 72 65 67 44 61 74 61 2c 20 70 54 61 62  d, regData, pTab
e8a0: 2d 3e 6e 43 6f 6c 2c 20 72 65 67 52 65 63 29 3b  ->nCol, regRec);
e8b0: 0a 20 20 69 66 28 20 21 62 41 66 66 69 6e 69 74  .  if( !bAffinit
e8c0: 79 44 6f 6e 65 20 29 20 73 71 6c 69 74 65 33 54  yDone ) sqlite3T
e8d0: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
e8e0: 70 54 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69  pTab, 0);.  sqli
e8f0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
e900: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
e910: 65 2c 20 72 65 67 44 61 74 61 2c 20 70 54 61 62  e, regData, pTab
e920: 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70  ->nCol);.  if( p
e930: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b  Parse->nested ){
e940: 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d  .    pik_flags =
e950: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
e960: 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 4f 50 46   pik_flags = OPF
e970: 4c 41 47 5f 4e 43 48 41 4e 47 45 3b 0a 20 20 20  LAG_NCHANGE;.   
e980: 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 28 69   pik_flags |= (i
e990: 73 55 70 64 61 74 65 3f 4f 50 46 4c 41 47 5f 49  sUpdate?OPFLAG_I
e9a0: 53 55 50 44 41 54 45 3a 4f 50 46 4c 41 47 5f 4c  SUPDATE:OPFLAG_L
e9b0: 41 53 54 52 4f 57 49 44 29 3b 0a 20 20 7d 0a 20  ASTROWID);.  }. 
e9c0: 20 69 66 28 20 61 70 70 65 6e 64 42 69 61 73 20   if( appendBias 
e9d0: 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61 67 73  ){.    pik_flags
e9e0: 20 7c 3d 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e   |= OPFLAG_APPEN
e9f0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  D;.  }.  if( use
ea00: 53 65 65 6b 52 65 73 75 6c 74 20 29 7b 0a 20 20  SeekResult ){.  
ea10: 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f    pik_flags |= O
ea20: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
ea30: 55 4c 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ULT;.  }.  sqlit
ea40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ea50: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 44 61 74 61  OP_Insert, iData
ea60: 43 75 72 2c 20 72 65 67 52 65 63 2c 20 72 65 67  Cur, regRec, reg
ea70: 4e 65 77 44 61 74 61 29 3b 0a 20 20 69 66 28 20  NewData);.  if( 
ea80: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
ea90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
eaa0: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
eab0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50  , pTab->zName, P
eac0: 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  4_TRANSIENT);.  
ead0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
eae0: 68 61 6e 67 65 50 35 28 76 2c 20 70 69 6b 5f 66  hangeP5(v, pik_f
eaf0: 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
eb00: 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
eb10: 20 66 6f 72 20 74 68 65 20 70 54 61 62 20 74 61   for the pTab ta
eb20: 62 6c 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  ble and all its 
eb30: 69 6e 64 69 63 65 73 20 61 6e 64 20 67 65 6e 65  indices and gene
eb40: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rate.** code to 
eb50: 6f 70 65 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c  open and initial
eb60: 69 7a 65 64 20 74 68 6f 73 65 20 63 75 72 73 6f  ized those curso
eb70: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  rs..**.** The cu
eb80: 72 73 6f 72 20 66 6f 72 20 74 68 65 20 6f 62 6a  rsor for the obj
eb90: 65 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ect that contain
eba0: 73 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 64  s the complete d
ebb0: 61 74 61 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ata (normally.**
ebc0: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
ebd0: 66 2c 20 62 75 74 20 74 68 65 20 50 52 49 4d 41  f, but the PRIMA
ebe0: 52 59 20 4b 45 59 20 69 6e 64 65 78 20 69 6e 20  RY KEY index in 
ebf0: 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 57 49  the case of a WI
ec00: 54 48 4f 55 54 0a 2a 2a 20 52 4f 57 49 44 20 74  THOUT.** ROWID t
ec10: 61 62 6c 65 29 20 69 73 20 72 65 74 75 72 6e 65  able) is returne
ec20: 64 20 69 6e 20 2a 70 69 44 61 74 61 43 75 72 2e  d in *piDataCur.
ec30: 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 64 65    The first inde
ec40: 78 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 72  x cursor is.** r
ec50: 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69 49 64  eturned in *piId
ec60: 78 43 75 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  xCur.  The numbe
ec70: 72 20 6f 66 20 69 6e 64 69 63 65 73 20 69 73 20  r of indices is 
ec80: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
ec90: 55 73 65 20 69 42 61 73 65 20 61 73 20 74 68 65  Use iBase as the
eca0: 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 65   first cursor (e
ecb0: 69 74 68 65 72 20 74 68 65 20 2a 70 69 44 61 74  ither the *piDat
ecc0: 61 43 75 72 20 66 6f 72 20 72 6f 77 69 64 20 74  aCur for rowid t
ecd0: 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 74 68 65 20  ables.** or the 
ece0: 66 69 72 73 74 20 69 6e 64 65 78 20 66 6f 72 20  first index for 
ecf0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
ed00: 62 6c 65 73 29 20 69 66 20 69 74 20 69 73 20 6e  bles) if it is n
ed10: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
ed20: 49 66 20 69 42 61 73 65 20 69 73 20 6e 65 67 61  If iBase is nega
ed30: 74 69 76 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63  tive, then alloc
ed40: 61 74 65 20 74 68 65 20 6e 65 78 74 20 61 76 61  ate the next ava
ed50: 69 6c 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 2a  ilable cursor..*
ed60: 2a 0a 2a 2a 20 46 6f 72 20 61 20 72 6f 77 69 64  *.** For a rowid
ed70: 20 74 61 62 6c 65 2c 20 2a 70 69 44 61 74 61 43   table, *piDataC
ed80: 75 72 20 77 69 6c 6c 20 62 65 20 65 78 61 63 74  ur will be exact
ed90: 6c 79 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e  ly one less than
eda0: 20 2a 70 69 49 64 78 43 75 72 2e 0a 2a 2a 20 46   *piIdxCur..** F
edb0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
edc0: 49 44 20 74 61 62 6c 65 2c 20 2a 70 69 44 61 74  ID table, *piDat
edd0: 61 43 75 72 20 77 69 6c 6c 20 62 65 20 73 6f 6d  aCur will be som
ede0: 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 72 61  ewhere in the ra
edf0: 6e 67 65 0a 2a 2a 20 6f 66 20 2a 70 69 49 64 78  nge.** of *piIdx
ee00: 43 75 72 73 2c 20 64 65 70 65 6e 64 69 6e 67 20  Curs, depending 
ee10: 6f 6e 20 77 68 65 72 65 20 74 68 65 20 50 52 49  on where the PRI
ee20: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 61  MARY KEY index a
ee30: 70 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 2a 2a  ppears on the.**
ee40: 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 6c 69   pTab->pIndex li
ee50: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
ee60: 65 33 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e  e3OpenTableAndIn
ee70: 64 69 63 65 73 28 0a 20 20 50 61 72 73 65 20 2a  dices(.  Parse *
ee80: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
ee90: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
eea0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
eeb0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
eec0: 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  e opened */.  in
eed0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 2f  t op,          /
eee0: 2a 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  * OP_OpenRead or
eef0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 2a 2f   OP_OpenWrite */
ef00: 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20 20  .  int iBase,   
ef10: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20      /* Use this 
ef20: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 63 75  for the table cu
ef30: 72 73 6f 72 2c 20 69 66 20 74 68 65 72 65 20 69  rsor, if there i
ef40: 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 2a 61  s one */.  u8 *a
ef50: 54 6f 4f 70 65 6e 2c 20 20 20 20 20 2f 2a 20 49  ToOpen,     /* I
ef60: 66 20 6e 6f 74 20 4e 55 4c 4c 3a 20 62 6f 6f 6c  f not NULL: bool
ef70: 65 61 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62  ean for each tab
ef80: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 2a 2f 0a  le and index */.
ef90: 20 20 69 6e 74 20 2a 70 69 44 61 74 61 43 75 72    int *piDataCur
efa0: 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
efb0: 64 61 74 61 62 61 73 65 20 73 6f 75 72 63 65 20  database source 
efc0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 68 65  cursor number he
efd0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49  re */.  int *piI
efe0: 64 78 43 75 72 20 20 20 20 2f 2a 20 57 72 69 74  dxCur    /* Writ
eff0: 65 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65  e the first inde
f000: 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  x cursor number 
f010: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
f020: 20 69 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   i;.  int iDb;. 
f030: 20 69 6e 74 20 69 44 61 74 61 43 75 72 3b 0a 20   int iDataCur;. 
f040: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
f050: 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
f060: 72 74 28 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 52  rt( op==OP_OpenR
f070: 65 61 64 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4f 70  ead || op==OP_Op
f080: 65 6e 57 72 69 74 65 20 29 3b 0a 20 20 69 66 28  enWrite );.  if(
f090: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
f0a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f0b0: 61 54 6f 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  aToOpen==0 );.  
f0c0: 20 20 2a 70 69 44 61 74 61 43 75 72 20 3d 20 30    *piDataCur = 0
f0d0: 3b 0a 20 20 20 20 2a 70 69 49 64 78 43 75 72 20  ;.    *piIdxCur 
f0e0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
f0f0: 30 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  0;.  }.  iDb = s
f100: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f110: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
f120: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
f130: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
f140: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f150: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f160: 20 20 69 66 28 20 69 42 61 73 65 3c 30 20 29 20    if( iBase<0 ) 
f170: 69 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  iBase = pParse->
f180: 6e 54 61 62 3b 0a 20 20 69 44 61 74 61 43 75 72  nTab;.  iDataCur
f190: 20 3d 20 69 42 61 73 65 2b 2b 3b 0a 20 20 69 66   = iBase++;.  if
f1a0: 28 20 70 69 44 61 74 61 43 75 72 20 29 20 2a 70  ( piDataCur ) *p
f1b0: 69 44 61 74 61 43 75 72 20 3d 20 69 44 61 74 61  iDataCur = iData
f1c0: 43 75 72 3b 0a 20 20 69 66 28 20 48 61 73 52 6f  Cur;.  if( HasRo
f1d0: 77 69 64 28 70 54 61 62 29 20 26 26 20 28 61 54  wid(pTab) && (aT
f1e0: 6f 4f 70 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f  oOpen==0 || aToO
f1f0: 70 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20 73  pen[0]) ){.    s
f200: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
f210: 70 50 61 72 73 65 2c 20 69 44 61 74 61 43 75 72  pParse, iDataCur
f220: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f 70 29  , iDb, pTab, op)
f230: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
f240: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
f250: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
f260: 62 2d 3e 74 6e 75 6d 2c 20 6f 70 3d 3d 4f 50 5f  b->tnum, op==OP_
f270: 4f 70 65 6e 57 72 69 74 65 2c 20 70 54 61 62 2d  OpenWrite, pTab-
f280: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  >zName);.  }.  i
f290: 66 28 20 70 69 49 64 78 43 75 72 20 29 20 2a 70  f( piIdxCur ) *p
f2a0: 69 49 64 78 43 75 72 20 3d 20 69 42 61 73 65 3b  iIdxCur = iBase;
f2b0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 64 78  .  for(i=0, pIdx
f2c0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f2d0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f2e0: 70 4e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20  pNext, i++){.   
f2f0: 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 69   int iIdxCur = i
f300: 42 61 73 65 2b 2b 3b 0a 20 20 20 20 61 73 73 65  Base++;.    asse
f310: 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
f320: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
f330: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
f340: 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 20 26  ->autoIndex==2 &
f350: 26 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  & !HasRowid(pTab
f360: 29 20 26 26 20 70 69 44 61 74 61 43 75 72 20 29  ) && piDataCur )
f370: 7b 0a 20 20 20 20 20 20 2a 70 69 44 61 74 61 43  {.      *piDataC
f380: 75 72 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  ur = iIdxCur;.  
f390: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 54 6f 4f    }.    if( aToO
f3a0: 70 65 6e 3d 3d 30 20 7c 7c 20 61 54 6f 4f 70 65  pen==0 || aToOpe
f3b0: 6e 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  n[i+1] ){.      
f3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f3d0: 33 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  3(v, op, iIdxCur
f3e0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
f3f0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
f400: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
f410: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
f420: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f430: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
f440: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
f450: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 42 61 73  }.  }.  if( iBas
f460: 65 3e 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 29  e>pParse->nTab )
f470: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
f480: 69 42 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  iBase;.  return 
f490: 69 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  i;.}...#ifdef SQ
f4a0: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
f4b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
f4c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
f4d0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
f4e0: 6e 65 76 65 72 20 74 68 65 0a 2a 2a 20 74 72 61  never the.** tra
f4f0: 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
f500: 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 69  on is used.  Thi
f510: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
f520: 73 74 69 6e 67 0a 2a 2a 20 70 75 72 70 6f 73 65  sting.** purpose
f530: 73 20 6f 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65  s only - to make
f540: 20 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 66   sure the transf
f550: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
f560: 72 65 61 6c 6c 79 0a 2a 2a 20 69 73 20 68 61 70  really.** is hap
f570: 70 65 6e 69 6e 67 20 77 68 65 6e 20 69 74 20 69  pening when it i
f580: 73 20 73 75 70 70 6f 73 65 20 74 6f 2e 0a 2a 2f  s suppose to..*/
f590: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65  .int sqlite3_xfe
f5a0: 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  ropt_count;.#end
f5b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53  if /* SQLITE_TES
f5c0: 54 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  T */...#ifndef S
f5d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f  QLITE_OMIT_XFER_
f5e0: 4f 50 54 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  OPT./*.** Check 
f5f0: 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 61 6d  to collation nam
f600: 65 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  es to see if the
f610: 79 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c 65  y are compatible
f620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f630: 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 43 6f  xferCompatibleCo
f640: 6c 6c 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  llation(const ch
f650: 61 72 20 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68  ar *z1, const ch
f660: 61 72 20 2a 7a 32 29 7b 0a 20 20 69 66 28 20 7a  ar *z2){.  if( z
f670: 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  1==0 ){.    retu
f680: 72 6e 20 7a 32 3d 3d 30 3b 0a 20 20 7d 0a 20 20  rn z2==0;.  }.  
f690: 69 66 28 20 7a 32 3d 3d 30 20 29 7b 0a 20 20 20  if( z2==0 ){.   
f6a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f6b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
f6c0: 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 3d 3d  trICmp(z1, z2)==
f6d0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  0;.}.../*.** Che
f6e0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 6e 64  ck to see if ind
f6f0: 65 78 20 70 53 72 63 20 69 73 20 63 6f 6d 70 61  ex pSrc is compa
f700: 74 69 62 6c 65 20 61 73 20 61 20 73 6f 75 72 63  tible as a sourc
f710: 65 20 6f 66 20 64 61 74 61 0a 2a 2a 20 66 6f 72  e of data.** for
f720: 20 69 6e 64 65 78 20 70 44 65 73 74 20 69 6e 20   index pDest in 
f730: 61 6e 20 69 6e 73 65 72 74 20 74 72 61 6e 73 66  an insert transf
f740: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  er optimization.
f750: 20 20 54 68 65 20 72 75 6c 65 73 0a 2a 2a 20 66    The rules.** f
f760: 6f 72 20 61 20 63 6f 6d 70 61 74 69 62 6c 65 20  or a compatible 
f770: 69 6e 64 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  index:.**.**    
f780: 2a 20 20 20 54 68 65 20 69 6e 64 65 78 20 69 73  *   The index is
f790: 20 6f 76 65 72 20 74 68 65 20 73 61 6d 65 20 73   over the same s
f7a0: 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  et of columns.**
f7b0: 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65      *   The same
f7c0: 20 44 45 53 43 20 61 6e 64 20 41 53 43 20 6d 61   DESC and ASC ma
f7d0: 72 6b 69 6e 67 73 20 6f 63 63 75 72 73 20 6f 6e  rkings occurs on
f7e0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20   all columns.** 
f7f0: 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65 20     *   The same 
f800: 6f 6e 45 72 72 6f 72 20 70 72 6f 63 65 73 73 69  onError processi
f810: 6e 67 20 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45  ng (OE_Abort, OE
f820: 5f 49 67 6e 6f 72 65 2c 20 65 74 63 29 0a 2a 2a  _Ignore, etc).**
f830: 20 20 20 20 2a 20 20 20 54 68 65 20 73 61 6d 65      *   The same
f840: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
f850: 6e 63 65 20 6f 6e 20 65 61 63 68 20 63 6f 6c 75  nce on each colu
f860: 6d 6e 0a 2a 2a 20 20 20 20 2a 20 20 20 54 68 65  mn.**    *   The
f870: 20 69 6e 64 65 78 20 68 61 73 20 74 68 65 20 65   index has the e
f880: 78 61 63 74 20 73 61 6d 65 20 57 48 45 52 45 20  xact same WHERE 
f890: 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
f8a0: 20 69 6e 74 20 78 66 65 72 43 6f 6d 70 61 74 69   int xferCompati
f8b0: 62 6c 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  bleIndex(Index *
f8c0: 70 44 65 73 74 2c 20 49 6e 64 65 78 20 2a 70 53  pDest, Index *pS
f8d0: 72 63 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rc){.  int i;.  
f8e0: 61 73 73 65 72 74 28 20 70 44 65 73 74 20 26 26  assert( pDest &&
f8f0: 20 70 53 72 63 20 29 3b 0a 20 20 61 73 73 65 72   pSrc );.  asser
f900: 74 28 20 70 44 65 73 74 2d 3e 70 54 61 62 6c 65  t( pDest->pTable
f910: 21 3d 70 53 72 63 2d 3e 70 54 61 62 6c 65 20 29  !=pSrc->pTable )
f920: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e  ;.  if( pDest->n
f930: 4b 65 79 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e 4b  KeyCol!=pSrc->nK
f940: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74  eyCol ){.    ret
f950: 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66  urn 0;   /* Diff
f960: 65 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  erent number of 
f970: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 7d 0a 20  columns */.  }. 
f980: 20 69 66 28 20 70 44 65 73 74 2d 3e 6f 6e 45 72   if( pDest->onEr
f990: 72 6f 72 21 3d 70 53 72 63 2d 3e 6f 6e 45 72 72  ror!=pSrc->onErr
f9a0: 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
f9b0: 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65   0;   /* Differe
f9c0: 6e 74 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  nt conflict reso
f9d0: 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67 69 65  lution strategie
f9e0: 73 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  s */.  }.  for(i
f9f0: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 4b 65 79  =0; i<pSrc->nKey
fa00: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
fa10: 66 28 20 70 53 72 63 2d 3e 61 69 43 6f 6c 75 6d  f( pSrc->aiColum
fa20: 6e 5b 69 5d 21 3d 70 44 65 73 74 2d 3e 61 69 43  n[i]!=pDest->aiC
fa30: 6f 6c 75 6d 6e 5b 69 5d 20 29 7b 0a 20 20 20 20  olumn[i] ){.    
fa40: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
fa50: 20 44 69 66 66 65 72 65 6e 74 20 63 6f 6c 75 6d   Different colum
fa60: 6e 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  ns indexed */.  
fa70: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 72 63    }.    if( pSrc
fa80: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 21  ->aSortOrder[i]!
fa90: 3d 70 44 65 73 74 2d 3e 61 53 6f 72 74 4f 72 64  =pDest->aSortOrd
faa0: 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72  er[i] ){.      r
fab0: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
fac0: 66 66 65 72 65 6e 74 20 73 6f 72 74 20 6f 72 64  fferent sort ord
fad0: 65 72 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ers */.    }.   
fae0: 20 69 66 28 20 21 78 66 65 72 43 6f 6d 70 61 74   if( !xferCompat
faf0: 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 70 53  ibleCollation(pS
fb00: 72 63 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 70 44  rc->azColl[i],pD
fb10: 65 73 74 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20  est->azColl[i]) 
fb20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fb30: 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e  0;   /* Differen
fb40: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
fb50: 65 6e 63 65 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  ences */.    }. 
fb60: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
fb70: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 53 72 63  ExprCompare(pSrc
fb80: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 2c  ->pPartIdxWhere,
fb90: 20 70 44 65 73 74 2d 3e 70 50 61 72 74 49 64 78   pDest->pPartIdx
fba0: 57 68 65 72 65 2c 20 2d 31 29 20 29 7b 0a 20 20  Where, -1) ){.  
fbb0: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
fbc0: 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 57 48 45  /* Different WHE
fbd0: 52 45 20 63 6c 61 75 73 65 73 20 2a 2f 0a 20 20  RE clauses */.  
fbe0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 74 65  }..  /* If no te
fbf0: 73 74 20 61 62 6f 76 65 20 66 61 69 6c 73 20 74  st above fails t
fc00: 68 65 6e 20 74 68 65 20 69 6e 64 69 63 65 73 20  hen the indices 
fc10: 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62  must be compatib
fc20: 6c 65 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31  le */.  return 1
fc30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
fc40: 70 74 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  pt the transfer 
fc50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20  optimization on 
fc60: 49 4e 53 45 52 54 73 20 6f 66 20 74 68 65 20 66  INSERTs of the f
fc70: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e  orm.**.**     IN
fc80: 53 45 52 54 20 49 4e 54 4f 20 74 61 62 31 20 53  SERT INTO tab1 S
fc90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
fca0: 32 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 66 65  2;.**.** The xfe
fcb0: 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  r optimization t
fcc0: 72 61 6e 73 66 65 72 73 20 72 61 77 20 72 65 63  ransfers raw rec
fcd0: 6f 72 64 73 20 66 72 6f 6d 20 74 61 62 32 20 6f  ords from tab2 o
fce0: 76 65 72 20 74 6f 20 74 61 62 31 2e 20 20 0a 2a  ver to tab1.  .*
fcf0: 2a 20 43 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f  * Columns are no
fd00: 74 20 64 65 63 6f 64 65 64 20 61 6e 64 20 72 65  t decoded and re
fd10: 61 73 73 65 6d 62 6c 69 65 64 2c 20 77 68 69 63  assemblied, whic
fd20: 68 20 67 72 65 61 74 6c 79 20 69 6d 70 72 6f 76  h greatly improv
fd30: 65 73 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  es.** performanc
fd40: 65 2e 20 20 52 61 77 20 69 6e 64 65 78 20 72 65  e.  Raw index re
fd50: 63 6f 72 64 73 20 61 72 65 20 74 72 61 6e 73 66  cords are transf
fd60: 65 72 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  erred in the sam
fd70: 65 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e way..**.** The
fd80: 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
fd90: 6f 6e 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  on is only attem
fda0: 70 74 65 64 20 69 66 20 74 61 62 31 20 61 6e 64  pted if tab1 and
fdb0: 20 74 61 62 32 20 61 72 65 20 63 6f 6d 70 61 74   tab2 are compat
fdc0: 69 62 6c 65 2e 0a 2a 2a 20 54 68 65 72 65 20 61  ible..** There a
fdd0: 72 65 20 6c 6f 74 73 20 6f 66 20 72 75 6c 65 73  re lots of rules
fde0: 20 66 6f 72 20 64 65 74 65 72 6d 69 6e 69 6e 67   for determining
fdf0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
fe00: 20 73 65 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a   see comments.**
fe10: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
fe20: 20 63 6f 64 65 20 66 6f 72 20 64 65 74 61 69 6c   code for detail
fe30: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
fe40: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52  utine returns TR
fe50: 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  UE if the optimi
fe60: 7a 61 74 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  zation is guaran
fe70: 74 65 65 64 20 74 6f 20 62 65 20 75 73 65 64 2e  teed to be used.
fe80: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
fe90: 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  e xfer optimizat
fea0: 69 6f 6e 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f  ion will only wo
feb0: 72 6b 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  rk if the destin
fec0: 61 74 69 6f 6e 20 74 61 62 6c 65 0a 2a 2a 20 69  ation table.** i
fed0: 73 20 65 6d 70 74 79 20 2d 20 61 20 66 61 63 74  s empty - a fact
fee0: 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  or that can only
fef0: 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20 61   be determined a
ff00: 74 20 72 75 6e 2d 74 69 6d 65 2e 20 20 49 6e 20  t run-time.  In 
ff10: 74 68 61 74 0a 2a 2a 20 63 61 73 65 2c 20 74 68  that.** case, th
ff20: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
ff30: 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 74 68  ates code for th
ff40: 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  e xfer optimizat
ff50: 69 6f 6e 20 62 75 74 20 61 6c 73 6f 0a 2a 2a 20  ion but also.** 
ff60: 64 6f 65 73 20 61 20 74 65 73 74 20 74 6f 20 73  does a test to s
ff70: 65 65 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  ee if the destin
ff80: 61 74 69 6f 6e 20 74 61 62 6c 65 20 69 73 20 65  ation table is e
ff90: 6d 70 74 79 20 61 6e 64 20 6a 75 6d 70 73 20 6f  mpty and jumps o
ffa0: 76 65 72 20 74 68 65 0a 2a 2a 20 78 66 65 72 20  ver the.** xfer 
ffb0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 6f 64  optimization cod
ffc0: 65 20 69 66 20 74 68 65 20 74 65 73 74 20 66 61  e if the test fa
ffd0: 69 6c 73 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ils.  In that ca
ffe0: 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
fff0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 46 41 4c 53  .** returns FALS
10000 45 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  E so that the ca
10010 6c 6c 65 72 20 77 69 6c 6c 20 6b 6e 6f 77 20 74  ller will know t
10020 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  o go ahead and g
10030 65 6e 65 72 61 74 65 0a 2a 2a 20 61 6e 20 75 6e  enerate.** an un
10040 6f 70 74 69 6d 69 7a 65 64 20 74 72 61 6e 73 66  optimized transf
10050 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  er.  This routin
10060 65 20 61 6c 73 6f 20 72 65 74 75 72 6e 73 20 46  e also returns F
10070 41 4c 53 45 20 69 66 20 74 68 65 72 65 0a 2a 2a  ALSE if there.**
10080 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
10090 61 74 20 74 68 65 20 78 66 65 72 20 6f 70 74 69  at the xfer opti
100a0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
100b0 61 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  applied..**.** T
100c0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
100d0 20 69 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79   is particularly
100e0 20 75 73 65 66 75 6c 20 61 74 20 6d 61 6b 69 6e   useful at makin
100f0 67 20 56 41 43 55 55 4d 20 72 75 6e 20 66 61 73  g VACUUM run fas
10100 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
10110 6e 74 20 78 66 65 72 4f 70 74 69 6d 69 7a 61 74  nt xferOptimizat
10120 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
10130 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10140 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
10150 2f 0a 20 20 54 61 62 6c 65 20 2a 70 44 65 73 74  /.  Table *pDest
10160 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
10170 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 69 6e   table we are in
10180 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a  serting into */.
10190 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
101a0 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53 45 4c  t,      /* A SEL
101b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
101c0 20 75 73 65 20 61 73 20 74 68 65 20 64 61 74 61   use as the data
101d0 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74   source */.  int
101e0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
101f0 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e     /* How to han
10200 64 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  dle constraint e
10210 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  rrors */.  int i
10220 44 62 44 65 73 74 20 20 20 20 20 20 20 20 20 20  DbDest          
10230 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10240 20 6f 66 20 70 44 65 73 74 20 2a 2f 0a 29 7b 0a   of pDest */.){.
10250 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10260 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
10270 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
10280 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
10290 43 54 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  CT */.  Table *p
102a0 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
102b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
102c0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
102d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 53 45 4c 45  M clause of SELE
102e0 43 54 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  CT */.  Index *p
102f0 53 72 63 49 64 78 2c 20 2a 70 44 65 73 74 49 64  SrcIdx, *pDestId
10300 78 3b 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  x;       /* Sour
10310 63 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69  ce and destinati
10320 6f 6e 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  on indices */.  
10330 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
10340 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20  tem *pItem;     
10350 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f   /* An element o
10360 66 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 20  f pSelect->pSrc 
10370 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
103a0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
103b0 44 62 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  DbSrc;          
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
103d0 68 65 20 64 61 74 61 62 61 73 65 20 6f 66 20 70  he database of p
103e0 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72  Src */.  int iSr
103f0 63 2c 20 69 44 65 73 74 3b 20 20 20 20 20 20 20  c, iDest;       
10400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
10410 73 6f 72 73 20 66 72 6f 6d 20 73 6f 75 72 63 65  sors from source
10420 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e   and destination
10430 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 2c   */.  int addr1,
10440 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20   addr2;         
10450 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 61         /* Loop a
10460 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
10470 74 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20  t emptyDestTest 
10480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
10490 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 65 73  * Address of tes
104a0 74 20 66 6f 72 20 65 6d 70 74 79 20 70 44 65 73  t for empty pDes
104b0 74 20 2a 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79  t */.  int empty
104c0 53 72 63 54 65 73 74 20 3d 20 30 3b 20 20 20 20  SrcTest = 0;    
104d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
104e0 73 73 20 6f 66 20 74 65 73 74 20 66 6f 72 20 65  ss of test for e
104f0 6d 70 74 79 20 70 53 72 63 20 2a 2f 0a 20 20 56  mpty pSrc */.  V
10500 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10520 2f 2a 20 54 68 65 20 56 44 42 45 20 77 65 20 61  /* The VDBE we a
10530 72 65 20 62 75 69 6c 64 69 6e 67 20 2a 2f 0a 20  re building */. 
10540 20 69 6e 74 20 72 65 67 41 75 74 6f 69 6e 63 3b   int regAutoinc;
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10560 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 72 65 67 69    /* Memory regi
10570 73 74 65 72 20 75 73 65 64 20 62 79 20 41 55 54  ster used by AUT
10580 4f 49 4e 43 20 2a 2f 0a 20 20 69 6e 74 20 64 65  OINC */.  int de
10590 73 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 3d  stHasUniqueIdx =
105a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
105b0 75 65 20 69 66 20 70 44 65 73 74 20 68 61 73 20  ue if pDest has 
105c0 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a  a UNIQUE index *
105d0 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c  /.  int regData,
105e0 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20   regRowid;      
105f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
10600 73 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 61  s holding data a
10610 6e 64 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 69  nd rowid */..  i
10620 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  f( pSelect==0 ){
10630 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
10640 20 2f 2a 20 4d 75 73 74 20 62 65 20 6f 66 20 74   /* Must be of t
10650 68 65 20 66 6f 72 6d 20 20 49 4e 53 45 52 54 20  he form  INSERT 
10660 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 20  INTO ... SELECT 
10670 2e 2e 2e 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ... */.  }.  if(
10680 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 7c   pParse->pWith |
10690 7c 20 70 53 65 6c 65 63 74 2d 3e 70 57 69 74 68  | pSelect->pWith
106a0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   ){.    /* Do no
106b0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 70 72 6f  t attempt to pro
106c0 63 65 73 73 20 74 68 69 73 20 71 75 65 72 79 20  cess this query 
106d0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 20  if there are an 
106e0 57 49 54 48 20 63 6c 61 75 73 65 73 0a 20 20 20  WITH clauses.   
106f0 20 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20   ** attached to 
10700 69 74 2e 20 50 72 6f 63 65 65 64 69 6e 67 20 6d  it. Proceeding m
10710 61 79 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  ay generate a fa
10720 6c 73 65 20 22 6e 6f 20 73 75 63 68 20 74 61 62  lse "no such tab
10730 6c 65 3a 20 78 78 78 22 0a 20 20 20 20 2a 2a 20  le: xxx".    ** 
10740 65 72 72 6f 72 20 69 66 20 70 53 65 6c 65 63 74  error if pSelect
10750 20 72 65 61 64 73 20 66 72 6f 6d 20 61 20 43 54   reads from a CT
10760 45 20 6e 61 6d 65 64 20 22 78 78 78 22 2e 20 20  E named "xxx".  
10770 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
10780 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
10790 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
107a0 61 72 73 65 2c 20 70 44 65 73 74 29 20 29 7b 0a  arse, pDest) ){.
107b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
107c0 2f 2a 20 74 61 62 31 20 6d 75 73 74 20 6e 6f 74  /* tab1 must not
107d0 20 68 61 76 65 20 74 72 69 67 67 65 72 73 20 2a   have triggers *
107e0 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  /.  }.#ifndef SQ
107f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10800 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 44 65  LTABLE.  if( pDe
10810 73 74 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  st->tabFlags & T
10820 46 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  F_Virtual ){.   
10830 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10840 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20 62 65  tab1 must not be
10850 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
10860 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   */.  }.#endif. 
10870 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
10880 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
10890 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b 65 79  if( pDest->iPKey
108a0 3e 3d 30 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20  >=0 ) onError = 
108b0 70 44 65 73 74 2d 3e 6b 65 79 43 6f 6e 66 3b 0a  pDest->keyConf;.
108c0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d      if( onError=
108d0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e  =OE_Default ) on
108e0 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
108f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70  ;.  }.  assert(p
10900 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 20 20  Select->pSrc);  
10910 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 64 20 65 76   /* allocated ev
10920 65 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  en if there is n
10930 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  o FROM clause */
10940 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e  .  if( pSelect->
10950 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
10960 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
10970 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
10980 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
10990 79 20 6f 6e 65 20 74 65 72 6d 20 2a 2f 0a 20 20  y one term */.  
109a0 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
109b0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
109c0 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ect ){.    retur
109d0 6e 20 30 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63  n 0;   /* FROM c
109e0 6c 61 75 73 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  lause cannot con
109f0 74 61 69 6e 20 61 20 73 75 62 71 75 65 72 79 20  tain a subquery 
10a00 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  */.  }.  if( pSe
10a10 6c 65 63 74 2d 3e 70 57 68 65 72 65 20 29 7b 0a  lect->pWhere ){.
10a20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
10a30 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
10a40 74 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63  t have a WHERE c
10a50 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69  lause */.  }.  i
10a60 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64  f( pSelect->pOrd
10a70 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
10a80 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43  rn 0;   /* SELEC
10a90 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  T may not have a
10aa0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
10ab0 65 20 2a 2f 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f  e */.  }.  /* Do
10ac0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 74 65 73   not need to tes
10ad0 74 20 66 6f 72 20 61 20 48 41 56 49 4e 47 20 63  t for a HAVING c
10ae0 6c 61 75 73 65 2e 20 20 49 66 20 48 41 56 49 4e  lause.  If HAVIN
10af0 47 20 69 73 20 70 72 65 73 65 6e 74 20 62 75 74  G is present but
10b00 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e  .  ** there is n
10b10 6f 20 4f 52 44 45 52 20 42 59 2c 20 77 65 20 77  o ORDER BY, we w
10b20 69 6c 6c 20 67 65 74 20 61 6e 20 65 72 72 6f 72  ill get an error
10b30 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65  . */.  if( pSele
10b40 63 74 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  ct->pGroupBy ){.
10b50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
10b60 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f  /* SELECT may no
10b70 74 20 68 61 76 65 20 61 20 47 52 4f 55 50 20 42  t have a GROUP B
10b80 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a  Y clause */.  }.
10b90 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
10ba0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
10bb0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45  urn 0;   /* SELE
10bc0 43 54 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CT may not have 
10bd0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 2a  a LIMIT clause *
10be0 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
10bf0 70 53 65 6c 65 63 74 2d 3e 70 4f 66 66 73 65 74  pSelect->pOffset
10c00 3d 3d 30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20  ==0 );  /* Must 
10c10 62 65 20 73 6f 20 69 66 20 70 4c 69 6d 69 74 3d  be so if pLimit=
10c20 3d 30 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c  =0 */.  if( pSel
10c30 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
10c40 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
10c50 2a 20 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74  * SELECT may not
10c60 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
10c70 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  uery */.  }.  if
10c80 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
10c90 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
10ca0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
10cb0 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d  0;   /* SELECT m
10cc0 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e  ay not be DISTIN
10cd0 43 54 20 2a 2f 0a 20 20 7d 0a 20 20 70 45 4c 69  CT */.  }.  pELi
10ce0 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
10cf0 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
10d00 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69  pEList!=0 );.  i
10d10 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
10d20 21 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=1 ){.    retur
10d30 6e 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 72 65  n 0;   /* The re
10d40 73 75 6c 74 20 73 65 74 20 6d 75 73 74 20 68 61  sult set must ha
10d50 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  ve exactly one c
10d60 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 61  olumn */.  }.  a
10d70 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 61  ssert( pEList->a
10d80 5b 30 5d 2e 70 45 78 70 72 20 29 3b 0a 20 20 69  [0].pExpr );.  i
10d90 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
10da0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pExpr->op!=TK_AL
10db0 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
10dc0 30 3b 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  0;   /* The resu
10dd0 6c 74 20 73 65 74 20 6d 75 73 74 20 62 65 20 74  lt set must be t
10de0 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61  he special opera
10df0 74 6f 72 20 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a  tor "*" */.  }..
10e00 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
10e10 6e 74 20 77 65 20 68 61 76 65 20 65 73 74 61 62  nt we have estab
10e20 6c 69 73 68 65 64 20 74 68 61 74 20 74 68 65 20  lished that the 
10e30 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
10e40 74 68 65 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  the.  ** correct
10e50 20 73 79 6e 74 61 63 74 69 63 20 66 6f 72 6d 20   syntactic form 
10e60 74 6f 20 70 61 72 74 69 63 69 70 61 74 65 20 69  to participate i
10e70 6e 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  n this optimizat
10e80 69 6f 6e 2e 20 20 4e 6f 77 0a 20 20 2a 2a 20 77  ion.  Now.  ** w
10e90 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20  e have to check 
10ea0 74 68 65 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20  the semantics.. 
10eb0 20 2a 2f 0a 20 20 70 49 74 65 6d 20 3d 20 70 53   */.  pItem = pS
10ec0 65 6c 65 63 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a  elect->pSrc->a;.
10ed0 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
10ee0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
10ef0 70 50 61 72 73 65 2c 20 30 2c 20 70 49 74 65 6d  pParse, 0, pItem
10f00 29 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30  );.  if( pSrc==0
10f10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10f20 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  ;   /* FROM clau
10f30 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  se does not cont
10f40 61 69 6e 20 61 20 72 65 61 6c 20 74 61 62 6c 65  ain a real table
10f50 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
10f60 72 63 3d 3d 70 44 65 73 74 20 29 7b 0a 20 20 20  rc==pDest ){.   
10f70 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10f80 74 61 62 31 20 61 6e 64 20 74 61 62 32 20 6d 61  tab1 and tab2 ma
10f90 79 20 6e 6f 74 20 62 65 20 74 68 65 20 73 61 6d  y not be the sam
10fa0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20  e table */.  }. 
10fb0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 44   if( HasRowid(pD
10fc0 65 73 74 29 21 3d 48 61 73 52 6f 77 69 64 28 70  est)!=HasRowid(p
10fd0 53 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Src) ){.    retu
10fe0 72 6e 20 30 3b 20 20 20 2f 2a 20 73 6f 75 72 63  rn 0;   /* sourc
10ff0 65 20 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f  e and destinatio
11000 6e 20 6d 75 73 74 20 62 6f 74 68 20 62 65 20 57  n must both be W
11010 49 54 48 4f 55 54 20 52 4f 57 49 44 20 6f 72 20  ITHOUT ROWID or 
11020 6e 6f 74 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64  not */.  }.#ifnd
11030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11040 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
11050 28 20 70 53 72 63 2d 3e 74 61 62 46 6c 61 67 73  ( pSrc->tabFlags
11060 20 26 20 54 46 5f 56 69 72 74 75 61 6c 20 29 7b   & TF_Virtual ){
11070 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
11080 20 2f 2a 20 74 61 62 32 20 6d 75 73 74 20 6e 6f   /* tab2 must no
11090 74 20 62 65 20 61 20 76 69 72 74 75 61 6c 20 74  t be a virtual t
110a0 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64  able */.  }.#end
110b0 69 66 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70  if.  if( pSrc->p
110c0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65  Select ){.    re
110d0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62  turn 0;   /* tab
110e0 32 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 76  2 may not be a v
110f0 69 65 77 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  iew */.  }.  if(
11100 20 70 44 65 73 74 2d 3e 6e 43 6f 6c 21 3d 70 53   pDest->nCol!=pS
11110 72 63 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  rc->nCol ){.    
11120 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4e  return 0;   /* N
11130 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
11140 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
11150 65 20 69 6e 20 74 61 62 31 20 61 6e 64 20 74 61  e in tab1 and ta
11160 62 32 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  b2 */.  }.  if( 
11170 70 44 65 73 74 2d 3e 69 50 4b 65 79 21 3d 70 53  pDest->iPKey!=pS
11180 72 63 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  rc->iPKey ){.   
11190 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
111a0 42 6f 74 68 20 74 61 62 6c 65 73 20 6d 75 73 74  Both tables must
111b0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 49   have the same I
111c0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
111d0 45 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28  EY */.  }.  for(
111e0 69 3d 30 3b 20 69 3c 70 44 65 73 74 2d 3e 6e 43  i=0; i<pDest->nC
111f0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
11200 28 20 70 44 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d  ( pDest->aCol[i]
11210 2e 61 66 66 69 6e 69 74 79 21 3d 70 53 72 63 2d  .affinity!=pSrc-
11220 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74  >aCol[i].affinit
11230 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
11240 6e 20 30 3b 20 20 20 20 2f 2a 20 41 66 66 69 6e  n 0;    /* Affin
11250 69 74 79 20 6d 75 73 74 20 62 65 20 74 68 65 20  ity must be the 
11260 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c 75  same on all colu
11270 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
11280 20 69 66 28 20 21 78 66 65 72 43 6f 6d 70 61 74   if( !xferCompat
11290 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 70 44  ibleCollation(pD
112a0 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  est->aCol[i].zCo
112b0 6c 6c 2c 20 70 53 72 63 2d 3e 61 43 6f 6c 5b 69  ll, pSrc->aCol[i
112c0 5d 2e 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  ].zColl) ){.    
112d0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
112e0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
112f0 65 6e 63 65 20 6d 75 73 74 20 62 65 20 74 68 65  ence must be the
11300 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c   same on all col
11310 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
11320 20 20 69 66 28 20 70 44 65 73 74 2d 3e 61 43 6f    if( pDest->aCo
11330 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 26 26 20  l[i].notNull && 
11340 21 70 53 72 63 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  !pSrc->aCol[i].n
11350 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  otNull ){.      
11360 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
11370 74 61 62 32 20 6d 75 73 74 20 62 65 20 4e 4f 54  tab2 must be NOT
11380 20 4e 55 4c 4c 20 69 66 20 74 61 62 31 20 69 73   NULL if tab1 is
11390 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
113a0 66 6f 72 28 70 44 65 73 74 49 64 78 3d 70 44 65  for(pDestIdx=pDe
113b0 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70 44 65 73  st->pIndex; pDes
113c0 74 49 64 78 3b 20 70 44 65 73 74 49 64 78 3d 70  tIdx; pDestIdx=p
113d0 44 65 73 74 49 64 78 2d 3e 70 4e 65 78 74 29 7b  DestIdx->pNext){
113e0 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 49 64  .    if( pDestId
113f0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
11400 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 64 65 73  one ){.      des
11410 74 48 61 73 55 6e 69 71 75 65 49 64 78 20 3d 20  tHasUniqueIdx = 
11420 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  1;.    }.    for
11430 28 70 53 72 63 49 64 78 3d 70 53 72 63 2d 3e 70  (pSrcIdx=pSrc->p
11440 49 6e 64 65 78 3b 20 70 53 72 63 49 64 78 3b 20  Index; pSrcIdx; 
11450 70 53 72 63 49 64 78 3d 70 53 72 63 49 64 78 2d  pSrcIdx=pSrcIdx-
11460 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
11470 66 28 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c  f( xferCompatibl
11480 65 49 6e 64 65 78 28 70 44 65 73 74 49 64 78 2c  eIndex(pDestIdx,
11490 20 70 53 72 63 49 64 78 29 20 29 20 62 72 65 61   pSrcIdx) ) brea
114a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
114b0 20 70 53 72 63 49 64 78 3d 3d 30 20 29 7b 0a 20   pSrcIdx==0 ){. 
114c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
114d0 20 20 2f 2a 20 70 44 65 73 74 49 64 78 20 68 61    /* pDestIdx ha
114e0 73 20 6e 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69  s no correspondi
114f0 6e 67 20 69 6e 64 65 78 20 69 6e 20 70 53 72 63  ng index in pSrc
11500 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   */.    }.  }.#i
11510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11520 54 5f 43 48 45 43 4b 0a 20 20 69 66 28 20 70 44  T_CHECK.  if( pD
11530 65 73 74 2d 3e 70 43 68 65 63 6b 20 26 26 20 73  est->pCheck && s
11540 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
11550 6d 70 61 72 65 28 70 53 72 63 2d 3e 70 43 68 65  mpare(pSrc->pChe
11560 63 6b 2c 70 44 65 73 74 2d 3e 70 43 68 65 63 6b  ck,pDest->pCheck
11570 2c 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ,-1) ){.    retu
11580 72 6e 20 30 3b 20 20 20 2f 2a 20 54 61 62 6c 65  rn 0;   /* Table
11590 73 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  s have different
115a0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
115b0 74 73 2e 20 20 54 69 63 6b 65 74 20 23 32 32 35  ts.  Ticket #225
115c0 32 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  2 */.  }.#endif.
115d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
115e0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
115f0 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 74 68    /* Disallow th
11600 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
11610 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64  ization if the d
11620 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
11630 20 63 6f 6e 73 74 61 69 6e 73 0a 20 20 2a 2a 20   constains.  ** 
11640 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  any foreign key 
11650 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 54 68  constraints.  Th
11660 69 73 20 69 73 20 6d 6f 72 65 20 72 65 73 74 72  is is more restr
11670 69 63 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  ictive than nece
11680 73 73 61 72 79 2e 0a 20 20 2a 2a 20 42 75 74 20  ssary..  ** But 
11690 74 68 65 20 6d 61 69 6e 20 62 65 6e 65 66 69 63  the main benefic
116a0 69 61 72 79 20 6f 66 20 74 68 65 20 74 72 61 6e  iary of the tran
116b0 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  sfer optimizatio
116c0 6e 20 69 73 20 74 68 65 20 56 41 43 55 55 4d 20  n is the VACUUM 
116d0 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20 61  .  ** command, a
116e0 6e 64 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f  nd the VACUUM co
116f0 6d 6d 61 6e 64 20 64 69 73 61 62 6c 65 73 20 66  mmand disables f
11700 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
11710 72 61 69 6e 74 73 2e 20 20 53 6f 0a 20 20 2a 2a  raints.  So.  **
11720 20 74 68 65 20 65 78 74 72 61 20 63 6f 6d 70 6c   the extra compl
11730 69 63 61 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20  ication to make 
11740 74 68 69 73 20 72 75 6c 65 20 6c 65 73 73 20 72  this rule less r
11750 65 73 74 72 69 63 74 69 76 65 20 69 73 20 70 72  estrictive is pr
11760 6f 62 61 62 6c 79 0a 20 20 2a 2a 20 6e 6f 74 20  obably.  ** not 
11770 77 6f 72 74 68 20 74 68 65 20 65 66 66 6f 72 74  worth the effort
11780 2e 20 20 54 69 63 6b 65 74 20 5b 36 32 38 34 64  .  Ticket [6284d
11790 66 38 39 64 65 62 64 66 61 36 31 64 62 38 30 37  f89debdfa61db807
117a0 33 65 30 36 32 39 30 38 61 66 30 63 39 62 36 31  3e062908af0c9b61
117b0 31 38 65 5d 0a 20 20 2a 2f 0a 20 20 69 66 28 20  18e].  */.  if( 
117c0 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
117d0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 6f 72 65  gs & SQLITE_Fore
117e0 69 67 6e 4b 65 79 73 29 21 3d 30 20 26 26 20 70  ignKeys)!=0 && p
117f0 44 65 73 74 2d 3e 70 46 4b 65 79 21 3d 30 20 29  Dest->pFKey!=0 )
11800 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
11810 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
11820 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
11830 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
11840 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20  ntRows)!=0 ){.  
11850 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
11860 78 66 65 72 20 6f 70 74 20 64 6f 65 73 20 6e 6f  xfer opt does no
11870 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
11880 20 50 52 41 47 4d 41 20 63 6f 75 6e 74 5f 63 68   PRAGMA count_ch
11890 61 6e 67 65 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  anges */.  }..  
118a0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
118b0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
118c0 74 68 61 74 20 74 68 65 20 78 66 65 72 20 6f 70  that the xfer op
118d0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 74  timization is at
118e0 0a 20 20 2a 2a 20 6c 65 61 73 74 20 61 20 70 6f  .  ** least a po
118f0 73 73 69 62 69 6c 69 74 79 2c 20 74 68 6f 75 67  ssibility, thoug
11900 68 20 69 74 20 6d 69 67 68 74 20 6f 6e 6c 79 20  h it might only 
11910 77 6f 72 6b 20 69 66 20 74 68 65 20 64 65 73 74  work if the dest
11920 69 6e 61 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62  ination.  ** tab
11930 6c 65 20 28 74 61 62 31 29 20 69 73 20 69 6e 69  le (tab1) is ini
11940 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 20 20  tially empty..  
11950 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
11960 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
11970 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2b 2b 3b  xferopt_count++;
11980 0a 23 65 6e 64 69 66 0a 20 20 69 44 62 53 72 63  .#endif.  iDbSrc
11990 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
119a0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
119b0 64 62 2c 20 70 53 72 63 2d 3e 70 53 63 68 65 6d  db, pSrc->pSchem
119c0 61 29 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  a);.  v = sqlite
119d0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
119e0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
119f0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
11a00 73 65 2c 20 69 44 62 53 72 63 29 3b 0a 20 20 69  se, iDbSrc);.  i
11a10 53 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Src = pParse->nT
11a20 61 62 2b 2b 3b 0a 20 20 69 44 65 73 74 20 3d 20  ab++;.  iDest = 
11a30 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11a40 20 20 72 65 67 41 75 74 6f 69 6e 63 20 3d 20 61    regAutoinc = a
11a50 75 74 6f 49 6e 63 42 65 67 69 6e 28 70 50 61 72  utoIncBegin(pPar
11a60 73 65 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65  se, iDbDest, pDe
11a70 73 74 29 3b 0a 20 20 72 65 67 44 61 74 61 20 3d  st);.  regData =
11a80 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11a90 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  eg(pParse);.  re
11aa0 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
11ab0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11ac0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 70 65  e);.  sqlite3Ope
11ad0 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
11ae0 44 65 73 74 2c 20 69 44 62 44 65 73 74 2c 20 70  Dest, iDbDest, p
11af0 44 65 73 74 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  Dest, OP_OpenWri
11b00 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 48  te);.  assert( H
11b10 61 73 52 6f 77 69 64 28 70 44 65 73 74 29 20 7c  asRowid(pDest) |
11b20 7c 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49  | destHasUniqueI
11b30 64 78 20 29 3b 0a 20 20 69 66 28 20 28 70 44 65  dx );.  if( (pDe
11b40 73 74 2d 3e 69 50 4b 65 79 3c 30 20 26 26 20 70  st->iPKey<0 && p
11b50 44 65 73 74 2d 3e 70 49 6e 64 65 78 21 3d 30 29  Dest->pIndex!=0)
11b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
11b70 20 2a 2f 0a 20 20 20 7c 7c 20 64 65 73 74 48 61   */.   || destHa
11b80 73 55 6e 69 71 75 65 49 64 78 20 20 20 20 20 20  sUniqueIdx      
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
11bb0 2f 0a 20 20 20 7c 7c 20 28 6f 6e 45 72 72 6f 72  /.   || (onError
11bc0 21 3d 4f 45 5f 41 62 6f 72 74 20 26 26 20 6f 6e  !=OE_Abort && on
11bd0 45 72 72 6f 72 21 3d 4f 45 5f 52 6f 6c 6c 62 61  Error!=OE_Rollba
11be0 63 6b 29 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  ck)   /* (3) */.
11bf0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 73    ){.    /* In s
11c00 6f 6d 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ome circumstance
11c10 73 2c 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  s, we are able t
11c20 6f 20 72 75 6e 20 74 68 65 20 78 66 65 72 20 6f  o run the xfer o
11c30 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
11c40 2a 2a 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 64  ** only if the d
11c50 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
11c60 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   is initially em
11c70 70 74 79 2e 20 20 54 68 69 73 20 63 6f 64 65 20  pty.  This code 
11c80 6d 61 6b 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  makes.    ** tha
11c90 74 20 64 65 74 65 72 6d 69 6e 61 74 69 6f 6e 2e  t determination.
11ca0 20 20 43 6f 6e 64 69 74 69 6f 6e 73 20 75 6e 64    Conditions und
11cb0 65 72 20 77 68 69 63 68 20 74 68 65 20 64 65 73  er which the des
11cc0 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 0a 20 20  tination must.  
11cd0 20 20 2a 2a 20 62 65 20 65 6d 70 74 79 3a 0a 20    ** be empty:. 
11ce0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
11cf0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 54   There is no INT
11d00 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
11d10 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20 69   but there are i
11d20 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 20 20  ndices..    **  
11d30 20 20 20 28 49 66 20 74 68 65 20 64 65 73 74 69     (If the desti
11d40 6e 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e  nation is not in
11d50 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2c 20 74  itially empty, t
11d60 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 73 0a  he rowid fields.
11d70 20 20 20 20 2a 2a 20 20 20 20 20 6f 66 20 69 6e      **     of in
11d80 64 65 78 20 65 6e 74 72 69 65 73 20 6d 69 67 68  dex entries migh
11d90 74 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  t need to change
11da0 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
11db0 20 28 32 29 20 54 68 65 20 64 65 73 74 69 6e 61   (2) The destina
11dc0 74 69 6f 6e 20 68 61 73 20 61 20 75 6e 69 71 75  tion has a uniqu
11dd0 65 20 69 6e 64 65 78 2e 20 20 28 54 68 65 20 78  e index.  (The x
11de0 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
11df0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 69 73 20   .    **     is 
11e00 75 6e 61 62 6c 65 20 74 6f 20 74 65 73 74 20 75  unable to test u
11e10 6e 69 71 75 65 6e 65 73 73 2e 29 0a 20 20 20 20  niqueness.).    
11e20 2a 2a 0a 20 20 20 20 2a 2a 20 28 33 29 20 6f 6e  **.    ** (3) on
11e30 45 72 72 6f 72 20 69 73 20 73 6f 6d 65 74 68 69  Error is somethi
11e40 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 4f 45  ng other than OE
11e50 5f 41 62 6f 72 74 20 61 6e 64 20 4f 45 5f 52 6f  _Abort and OE_Ro
11e60 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  llback..    */. 
11e70 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
11e80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11e90 4f 50 5f 52 65 77 69 6e 64 2c 20 69 44 65 73 74  OP_Rewind, iDest
11ea0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
11eb0 67 65 28 76 29 3b 0a 20 20 20 20 65 6d 70 74 79  ge(v);.    empty
11ec0 44 65 73 74 54 65 73 74 20 3d 20 73 71 6c 69 74  DestTest = sqlit
11ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11ee0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
11ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11f00 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
11f10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48 61 73  );.  }.  if( Has
11f20 52 6f 77 69 64 28 70 53 72 63 29 20 29 7b 0a 20  Rowid(pSrc) ){. 
11f30 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
11f40 62 6c 65 28 70 50 61 72 73 65 2c 20 69 53 72 63  ble(pParse, iSrc
11f50 2c 20 69 44 62 53 72 63 2c 20 70 53 72 63 2c 20  , iDbSrc, pSrc, 
11f60 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
11f70 20 20 65 6d 70 74 79 53 72 63 54 65 73 74 20 3d    emptySrcTest =
11f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f90 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11fa0 20 69 53 72 63 2c 20 30 29 3b 20 56 64 62 65 43   iSrc, 0); VdbeC
11fb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
11fc0 69 66 28 20 70 44 65 73 74 2d 3e 69 50 4b 65 79  if( pDest->iPKey
11fd0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
11fe0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
11ff0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
12000 69 64 2c 20 69 53 72 63 2c 20 72 65 67 52 6f 77  id, iSrc, regRow
12010 69 64 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32  id);.      addr2
12020 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12030 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
12040 69 73 74 73 2c 20 69 44 65 73 74 2c 20 30 2c 20  ists, iDest, 0, 
12050 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
12060 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12070 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
12080 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 70  owidConstraint(p
12090 50 61 72 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  Parse, onError, 
120a0 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  pDest);.      sq
120b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
120c0 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
120d0 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70 28 70     autoIncStep(p
120e0 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f 69 6e  Parse, regAutoin
120f0 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  c, regRowid);.  
12100 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
12110 74 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  t->pIndex==0 ){.
12120 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
12130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12140 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
12150 69 44 65 73 74 2c 20 72 65 67 52 6f 77 69 64 29  iDest, regRowid)
12160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12170 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
12180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12190 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63 2c 20  OP_Rowid, iSrc, 
121a0 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
121b0 20 61 73 73 65 72 74 28 20 28 70 44 65 73 74 2d   assert( (pDest-
121c0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
121d0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3d 3d 30  utoincrement)==0
121e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
121f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12200 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
12210 53 72 63 2c 20 72 65 67 44 61 74 61 29 3b 0a 20  Src, regData);. 
12220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12230 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
12240 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61 74  t, iDest, regDat
12250 61 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  a, regRowid);.  
12260 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12270 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
12280 4e 43 48 41 4e 47 45 7c 4f 50 46 4c 41 47 5f 4c  NCHANGE|OPFLAG_L
12290 41 53 54 52 4f 57 49 44 7c 4f 50 46 4c 41 47 5f  ASTROWID|OPFLAG_
122a0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c  APPEND);.    sql
122b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
122c0 28 76 2c 20 2d 31 2c 20 70 44 65 73 74 2d 3e 7a  (v, -1, pDest->z
122d0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
122e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
122f0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63  v, OP_Next, iSrc
12300 2c 20 61 64 64 72 31 29 3b 20 56 64 62 65 43 6f  , addr1); VdbeCo
12310 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
12320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12330 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
12340 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rc, 0);.    sqli
12350 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12360 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74   OP_Close, iDest
12370 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
12380 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
12390 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 44  ock(pParse, iDbD
123a0 65 73 74 2c 20 70 44 65 73 74 2d 3e 74 6e 75 6d  est, pDest->tnum
123b0 2c 20 31 2c 20 70 44 65 73 74 2d 3e 7a 4e 61 6d  , 1, pDest->zNam
123c0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  e);.    sqlite3T
123d0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
123e0 20 69 44 62 53 72 63 2c 20 70 53 72 63 2d 3e 74   iDbSrc, pSrc->t
123f0 6e 75 6d 2c 20 30 2c 20 70 53 72 63 2d 3e 7a 4e  num, 0, pSrc->zN
12400 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ame);.  }.  for(
12410 70 44 65 73 74 49 64 78 3d 70 44 65 73 74 2d 3e  pDestIdx=pDest->
12420 70 49 6e 64 65 78 3b 20 70 44 65 73 74 49 64 78  pIndex; pDestIdx
12430 3b 20 70 44 65 73 74 49 64 78 3d 70 44 65 73 74  ; pDestIdx=pDest
12440 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
12450 20 66 6f 72 28 70 53 72 63 49 64 78 3d 70 53 72   for(pSrcIdx=pSr
12460 63 2d 3e 70 49 6e 64 65 78 3b 20 41 4c 57 41 59  c->pIndex; ALWAY
12470 53 28 70 53 72 63 49 64 78 29 3b 20 70 53 72 63  S(pSrcIdx); pSrc
12480 49 64 78 3d 70 53 72 63 49 64 78 2d 3e 70 4e 65  Idx=pSrcIdx->pNe
12490 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78  xt){.      if( x
124a0 66 65 72 43 6f 6d 70 61 74 69 62 6c 65 49 6e 64  ferCompatibleInd
124b0 65 78 28 70 44 65 73 74 49 64 78 2c 20 70 53 72  ex(pDestIdx, pSr
124c0 63 49 64 78 29 20 29 20 62 72 65 61 6b 3b 0a 20  cIdx) ) break;. 
124d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
124e0 20 70 53 72 63 49 64 78 20 29 3b 0a 20 20 20 20   pSrcIdx );.    
124f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12500 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
12510 2c 20 69 53 72 63 2c 20 70 53 72 63 49 64 78 2d  , iSrc, pSrcIdx-
12520 3e 74 6e 75 6d 2c 20 69 44 62 53 72 63 29 3b 0a  >tnum, iDbSrc);.
12530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
12540 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
12550 73 65 2c 20 70 53 72 63 49 64 78 29 3b 0a 20 20  se, pSrcIdx);.  
12560 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12570 2c 20 22 25 73 22 2c 20 70 53 72 63 49 64 78 2d  , "%s", pSrcIdx-
12580 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73 71  >zName));.    sq
12590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
125a0 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
125b0 20 69 44 65 73 74 2c 20 70 44 65 73 74 49 64 78   iDest, pDestIdx
125c0 2d 3e 74 6e 75 6d 2c 20 69 44 62 44 65 73 74 29  ->tnum, iDbDest)
125d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
125e0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
125f0 61 72 73 65 2c 20 70 44 65 73 74 49 64 78 29 3b  arse, pDestIdx);
12600 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12610 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
12620 41 47 5f 42 55 4c 4b 43 53 52 29 3b 0a 20 20 20  AG_BULKCSR);.   
12630 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12640 20 22 25 73 22 2c 20 70 44 65 73 74 49 64 78 2d   "%s", pDestIdx-
12650 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 61 64  >zName));.    ad
12660 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
12670 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12680 77 69 6e 64 2c 20 69 53 72 63 2c 20 30 29 3b 20  wind, iSrc, 0); 
12690 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
126a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
126b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
126c0 4b 65 79 2c 20 69 53 72 63 2c 20 72 65 67 44 61  Key, iSrc, regDa
126d0 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
126e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
126f0 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 44 65 73  _IdxInsert, iDes
12700 74 2c 20 72 65 67 44 61 74 61 2c 20 31 29 3b 0a  t, regData, 1);.
12710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
12730 2c 20 69 53 72 63 2c 20 61 64 64 72 31 2b 31 29  , iSrc, addr1+1)
12740 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12750 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12760 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12770 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
12780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12790 50 5f 43 6c 6f 73 65 2c 20 69 53 72 63 2c 20 30  P_Close, iSrc, 0
127a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
127b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
127c0 6c 6f 73 65 2c 20 69 44 65 73 74 2c 20 30 29 3b  lose, iDest, 0);
127d0 0a 20 20 7d 0a 20 20 69 66 28 20 65 6d 70 74 79  .  }.  if( empty
127e0 53 72 63 54 65 73 74 20 29 20 73 71 6c 69 74 65  SrcTest ) sqlite
127f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12800 20 65 6d 70 74 79 53 72 63 54 65 73 74 29 3b 0a   emptySrcTest);.
12810 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12820 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12830 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  regRowid);.  sql
12840 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12850 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  eg(pParse, regDa
12860 74 61 29 3b 0a 20 20 69 66 28 20 65 6d 70 74 79  ta);.  if( empty
12870 44 65 73 74 54 65 73 74 20 29 7b 0a 20 20 20 20  DestTest ){.    
12880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12890 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  2(v, OP_Halt, SQ
128a0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20  LITE_OK, 0);.   
128b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
128c0 48 65 72 65 28 76 2c 20 65 6d 70 74 79 44 65 73  Here(v, emptyDes
128d0 74 54 65 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  tTest);.    sqli
128e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
128f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65 73 74   OP_Close, iDest
12900 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
12910 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
12920 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
12930 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12940 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54 20  E_OMIT_XFER_OPT 
12950 2a 2f 0a                                         */.