/ Hex Artifact Content
Login

Artifact 991e4964e9295da3993e2c0f81c7faf642371848:


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 20 20 62 49 64 4c 69 73 74 49 6e 4f 72 64      bIdListInOrd
5680: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
5690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
56a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
56b0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
56c0: 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %S has no column
56d0: 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
56e0: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 4c 69            pTabLi
56f0: 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d 6e 2d 3e  st, 0, pColumn->
5700: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
5710: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63         pParse->c
5720: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
5730: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69            goto i
5740: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
5750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5770: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
5780: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  many columns of 
5790: 64 61 74 61 20 61 72 65 20 73 75 70 70 6c 69 65  data are supplie
57a0: 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 0a  d.  If the data.
57b0: 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67 20 66    ** is coming f
57c0: 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61  rom a SELECT sta
57d0: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 67 65 6e  tement, then gen
57e0: 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69  erate a co-routi
57f0: 6e 65 20 74 68 61 74 0a 20 20 2a 2a 20 70 72 6f  ne that.  ** pro
5800: 64 75 63 65 73 20 61 20 73 69 6e 67 6c 65 20 72  duces a single r
5810: 6f 77 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ow of the SELECT
5820: 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
5830: 69 6f 6e 2e 20 20 54 68 65 0a 20 20 2a 2a 20 63  ion.  The.  ** c
5840: 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  o-routine is the
5850: 20 63 6f 6d 6d 6f 6e 20 68 65 61 64 65 72 20 74   common header t
5860: 6f 20 74 68 65 20 33 72 64 20 61 6e 64 20 34 74  o the 3rd and 4t
5870: 68 20 74 65 6d 70 6c 61 74 65 73 2e 0a 20 20 2a  h templates..  *
5880: 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 20  /.  if( pSelect 
5890: 29 7b 0a 20 20 20 20 2f 2a 20 44 61 74 61 20 69  ){.    /* Data i
58a0: 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20  s coming from a 
58b0: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
58c0: 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  e a co-routine t
58d0: 6f 20 72 75 6e 20 74 68 65 20 53 45 4c 45 43 54  o run the SELECT
58e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 59   */.    int regY
58f0: 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52  ield;       /* R
5900: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
5910: 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79  co-routine entry
5920: 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  -point */.    in
5930: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
5940: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
5950: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
5960: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
5970: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
5980: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  code */..    reg
5990: 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65  Yield = ++pParse
59a0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72  ->nMem;.    addr
59b0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
59c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
59d0: 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
59e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
59f0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
5a00: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
5a10: 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  rTop);.    sqlit
5a20: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
5a30: 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
5a40: 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29  utine, regYield)
5a50: 3b 0a 20 20 20 20 64 65 73 74 2e 69 53 64 73 74  ;.    dest.iSdst
5a60: 20 3d 20 62 49 64 4c 69 73 74 49 6e 4f 72 64 65   = bIdListInOrde
5a70: 72 20 3f 20 72 65 67 44 61 74 61 20 3a 20 30 3b  r ? regData : 0;
5a80: 0a 20 20 20 20 64 65 73 74 2e 6e 53 64 73 74 20  .    dest.nSdst 
5a90: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
5aa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
5ab0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
5ac0: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
5ad0: 20 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 20    regFromSelect 
5ae0: 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
5af0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5b00: 2d 3e 6e 45 72 72 3d 3d 30 20 7c 7c 20 72 63 20  ->nErr==0 || rc 
5b10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c  );.    if( rc ||
5b20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5b30: 64 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f  d ) goto insert_
5b40: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 73 71 6c  cleanup;.    sql
5b50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5b60: 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
5b70: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20  e, regYield);.  
5b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
5b90: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
5ba0: 20 2d 20 31 29 3b 20 20 20 20 20 20 20 20 20 20   - 1);          
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5bc0: 6c 61 62 65 6c 20 42 3a 20 2a 2f 0a 20 20 20 20  label B: */.    
5bd0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
5be0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 6e  >pEList );.    n
5bf0: 43 6f 6c 75 6d 6e 20 3d 20 70 53 65 6c 65 63 74  Column = pSelect
5c00: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
5c10: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
5c20: 54 65 6d 70 54 61 62 6c 65 20 74 6f 20 54 52 55  TempTable to TRU
5c30: 45 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  E if the result 
5c40: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
5c50: 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 73  atement.    ** s
5c60: 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
5c70: 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72   into a temporar
5c80: 79 20 74 61 62 6c 65 20 28 74 65 6d 70 6c 61 74  y table (templat
5c90: 65 20 34 29 2e 20 20 53 65 74 20 74 6f 0a 20 20  e 4).  Set to.  
5ca0: 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 65 61    ** FALSE if ea
5cb0: 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  ch output row of
5cc0: 20 74 68 65 20 53 45 4c 45 43 54 20 63 61 6e 20   the SELECT can 
5cd0: 62 65 20 77 72 69 74 74 65 6e 20 64 69 72 65 63  be written direc
5ce0: 74 6c 79 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  tly into.    ** 
5cf0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
5d00: 74 61 62 6c 65 20 28 74 65 6d 70 6c 61 74 65 20  table (template 
5d10: 33 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  3)..    **.    *
5d20: 2a 20 41 20 74 65 6d 70 20 74 61 62 6c 65 20 6d  * A temp table m
5d30: 75 73 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ust be used if t
5d40: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 75  he table being u
5d50: 70 64 61 74 65 64 20 69 73 20 61 6c 73 6f 20 6f  pdated is also o
5d60: 6e 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ne.    ** of the
5d70: 20 74 61 62 6c 65 73 20 62 65 69 6e 67 20 72 65   tables being re
5d80: 61 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ad by the SELECT
5d90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 6c 73   statement.  Als
5da0: 6f 20 75 73 65 20 61 20 0a 20 20 20 20 2a 2a 20  o use a .    ** 
5db0: 74 65 6d 70 20 74 61 62 6c 65 20 69 6e 20 74 68  temp table in th
5dc0: 65 20 63 61 73 65 20 6f 66 20 72 6f 77 20 74 72  e case of row tr
5dd0: 69 67 67 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  iggers..    */. 
5de0: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 20     if( pTrigger 
5df0: 7c 7c 20 72 65 61 64 73 54 61 62 6c 65 28 70 50  || readsTable(pP
5e00: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 29  arse, iDb, pTab)
5e10: 20 29 7b 0a 20 20 20 20 20 20 75 73 65 54 65 6d   ){.      useTem
5e20: 70 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  pTable = 1;.    
5e30: 7d 0a 0a 20 20 20 20 69 66 28 20 75 73 65 54 65  }..    if( useTe
5e40: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
5e50: 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63   /* Invoke the c
5e60: 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 78 74 72  oroutine to extr
5e70: 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  act information 
5e80: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 0a  from the SELECT.
5e90: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 64 64        ** and add
5ea0: 20 69 74 20 74 6f 20 61 20 74 72 61 6e 73 69 65   it to a transie
5eb0: 6e 74 20 74 61 62 6c 65 20 73 72 63 54 61 62 2e  nt table srcTab.
5ec0: 20 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72    The code gener
5ed0: 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 68 65  ated.      ** he
5ee0: 72 65 20 69 73 20 66 72 6f 6d 20 74 68 65 20 34  re is from the 4
5ef0: 74 68 20 74 65 6d 70 6c 61 74 65 3a 0a 20 20 20  th template:.   
5f00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
5f10: 20 20 20 20 42 3a 20 6f 70 65 6e 20 74 65 6d 70      B: open temp
5f20: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
5f30: 20 20 20 20 20 4c 3a 20 79 69 65 6c 64 20 58 2c       L: yield X,
5f40: 20 67 6f 74 6f 20 4d 20 61 74 20 45 4f 46 0a 20   goto M at EOF. 
5f50: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
5f60: 69 6e 73 65 72 74 20 72 6f 77 20 66 72 6f 6d 20  insert row from 
5f70: 52 2e 2e 52 2b 6e 20 69 6e 74 6f 20 74 65 6d 70  R..R+n into temp
5f80: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20   table.      ** 
5f90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 4c 0a 20          goto L. 
5fa0: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 4d 3a 20       **      M: 
5fb0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
5fc0: 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20     int regRec;  
5fd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
5fe0: 74 65 72 20 74 6f 20 68 6f 6c 64 20 70 61 63 6b  ter to hold pack
5ff0: 65 64 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20  ed record */.   
6000: 20 20 20 69 6e 74 20 72 65 67 54 65 6d 70 52 6f     int regTempRo
6010: 77 69 64 3b 20 20 20 20 2f 2a 20 52 65 67 69 73  wid;    /* Regis
6020: 74 65 72 20 74 6f 20 68 6f 6c 64 20 74 65 6d 70  ter to hold temp
6030: 20 74 61 62 6c 65 20 52 4f 57 49 44 20 2a 2f 0a   table ROWID */.
6040: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4c 3b        int addrL;
6050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
6060: 62 65 6c 20 22 4c 22 20 2a 2f 0a 0a 20 20 20 20  bel "L" */..    
6070: 20 20 73 72 63 54 61 62 20 3d 20 70 50 61 72 73    srcTab = pPars
6080: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
6090: 20 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65   regRec = sqlite
60a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
60b0: 73 65 29 3b 0a 20 20 20 20 20 20 72 65 67 54 65  se);.      regTe
60c0: 6d 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  mpRowid = sqlite
60d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
60e0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
60f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6100: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
6110: 2c 20 73 72 63 54 61 62 2c 20 6e 43 6f 6c 75 6d  , srcTab, nColum
6120: 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4c 20  n);.      addrL 
6130: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6140: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6150: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 20   dest.iSDParm); 
6160: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6180: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6190: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 46 72  akeRecord, regFr
61a0: 6f 6d 53 65 6c 65 63 74 2c 20 6e 43 6f 6c 75 6d  omSelect, nColum
61b0: 6e 2c 20 72 65 67 52 65 63 29 3b 0a 20 20 20 20  n, regRec);.    
61c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
61d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
61e0: 69 64 2c 20 73 72 63 54 61 62 2c 20 72 65 67 54  id, srcTab, regT
61f0: 65 6d 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  empRowid);.     
6200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6210: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6220: 20 73 72 63 54 61 62 2c 20 72 65 67 52 65 63 2c   srcTab, regRec,
6230: 20 72 65 67 54 65 6d 70 52 6f 77 69 64 29 3b 0a   regTempRowid);.
6240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6250: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
6260: 74 6f 2c 20 30 2c 20 61 64 64 72 4c 29 3b 0a 20  to, 0, addrL);. 
6270: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6280: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
6290: 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
62a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
62b0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 29 3b  pParse, regRec);
62c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
62d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
62e0: 72 73 65 2c 20 72 65 67 54 65 6d 70 52 6f 77 69  rse, regTempRowi
62f0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  d);.    }.  }els
6300: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
6310: 73 20 74 68 65 20 63 61 73 65 20 69 66 20 74 68  s the case if th
6320: 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 49  e data for the I
6330: 4e 53 45 52 54 20 69 73 20 63 6f 6d 69 6e 67 20  NSERT is coming 
6340: 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 0a 20 20  from a VALUES.  
6350: 20 20 2a 2a 20 63 6c 61 75 73 65 0a 20 20 20 20    ** clause.    
6360: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
6370: 78 74 20 73 4e 43 3b 0a 20 20 20 20 6d 65 6d 73  xt sNC;.    mems
6380: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
6390: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
63a0: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
63b0: 65 3b 0a 20 20 20 20 73 72 63 54 61 62 20 3d 20  e;.    srcTab = 
63c0: 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
63d0: 75 73 65 54 65 6d 70 54 61 62 6c 65 3d 3d 30 20  useTempTable==0 
63e0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d  );.    nColumn =
63f0: 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
6400: 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66  nExpr : 0;.    f
6410: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
6420: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
6430: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
6440: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
6450: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
6460: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
6470: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
6480: 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
6490: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
64a0: 68 65 72 65 20 69 73 20 6e 6f 20 49 44 4c 49 53  here is no IDLIS
64b0: 54 20 74 65 72 6d 20 62 75 74 20 74 68 65 20 74  T term but the t
64c0: 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6e 74 65  able has an inte
64d0: 67 65 72 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  ger primary.  **
64e0: 20 6b 65 79 2c 20 74 68 65 20 73 65 74 20 74 68   key, the set th
64f0: 65 20 69 70 6b 43 6f 6c 75 6d 6e 20 76 61 72 69  e ipkColumn vari
6500: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 74 65  able to the inte
6510: 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
6520: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 64  .  ** column ind
6530: 65 78 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ex in the origin
6540: 61 6c 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74  al table definit
6550: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
6560: 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43  pColumn==0 && nC
6570: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 69  olumn>0 ){.    i
6580: 70 6b 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  pkColumn = pTab-
6590: 3e 69 50 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f  >iPKey;.  }..  /
65a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
65b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
65c0: 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20  s in the source 
65d0: 64 61 74 61 20 6d 61 74 63 68 65 73 20 74 68 65  data matches the
65e0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
65f0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
6600: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
6610: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
6620: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
6630: 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) ){.    for(i=0
6640: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
6650: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 48 69 64  i++){.      nHid
6660: 64 65 6e 20 2b 3d 20 28 49 73 48 69 64 64 65 6e  den += (IsHidden
6670: 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
6680: 6f 6c 5b 69 5d 29 20 3f 20 31 20 3a 20 30 29 3b  ol[i]) ? 1 : 0);
6690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
66a0: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e   pColumn==0 && n
66b0: 43 6f 6c 75 6d 6e 20 26 26 20 6e 43 6f 6c 75 6d  Column && nColum
66c0: 6e 21 3d 28 70 54 61 62 2d 3e 6e 43 6f 6c 2d 6e  n!=(pTab->nCol-n
66d0: 48 69 64 64 65 6e 29 20 29 7b 0a 20 20 20 20 73  Hidden) ){.    s
66e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
66f0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
6700: 74 61 62 6c 65 20 25 53 20 68 61 73 20 25 64 20  table %S has %d 
6710: 63 6f 6c 75 6d 6e 73 20 62 75 74 20 25 64 20 76  columns but %d v
6720: 61 6c 75 65 73 20 77 65 72 65 20 73 75 70 70 6c  alues were suppl
6730: 69 65 64 22 2c 0a 20 20 20 20 20 20 20 70 54 61  ied",.       pTa
6740: 62 4c 69 73 74 2c 20 30 2c 20 70 54 61 62 2d 3e  bList, 0, pTab->
6750: 6e 43 6f 6c 2d 6e 48 69 64 64 65 6e 2c 20 6e 43  nCol-nHidden, nC
6760: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  olumn);.    goto
6770: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
6780: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75  .  }.  if( pColu
6790: 6d 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e  mn!=0 && nColumn
67a0: 21 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20 29  !=pColumn->nId )
67b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
67c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
67d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
67e0: 63 6f 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c 75 6d  columns", nColum
67f0: 6e 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29  n, pColumn->nId)
6800: 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72  ;.    goto inser
6810: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  t_cleanup;.  }. 
6820: 20 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c     .  /* Initial
6830: 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ize the count of
6840: 20 72 6f 77 73 20 74 6f 20 62 65 20 69 6e 73 65   rows to be inse
6850: 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rted.  */.  if( 
6860: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6870: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a  TE_CountRows ){.
6880: 20 20 20 20 72 65 67 52 6f 77 43 6f 75 6e 74 20      regRowCount 
6890: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
68a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
68b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
68c0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52 6f 77  teger, 0, regRow
68d0: 43 6f 75 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Count);.  }..  /
68e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
68f0: 20 61 20 76 69 65 77 2c 20 6f 70 65 6e 20 74 68   a view, open th
6900: 65 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 64 20  e table and and 
6910: 61 6c 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  all indices */. 
6920: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
6930: 20 20 20 20 69 6e 74 20 6e 49 64 78 3b 0a 20 20      int nIdx;.  
6940: 20 20 6e 49 64 78 20 3d 20 73 71 6c 69 74 65 33    nIdx = sqlite3
6950: 4f 70 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69  OpenTableAndIndi
6960: 63 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ces(pParse, pTab
6970: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
6980: 2d 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  -1, 0,.         
6990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 44               &iD
69b0: 61 74 61 43 75 72 2c 20 26 69 49 64 78 43 75 72  ataCur, &iIdxCur
69c0: 29 3b 0a 20 20 20 20 61 52 65 67 49 64 78 20 3d  );.    aRegIdx =
69d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
69e0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69  Raw(db, sizeof(i
69f0: 6e 74 29 2a 28 6e 49 64 78 2b 31 29 29 3b 0a 20  nt)*(nIdx+1));. 
6a00: 20 20 20 69 66 28 20 61 52 65 67 49 64 78 3d 3d     if( aRegIdx==
6a10: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
6a20: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
6a30: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
6a40: 30 3b 20 69 3c 6e 49 64 78 3b 20 69 2b 2b 29 7b  0; i<nIdx; i++){
6a50: 0a 20 20 20 20 20 20 61 52 65 67 49 64 78 5b 69  .      aRegIdx[i
6a60: 5d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  ] = ++pParse->nM
6a70: 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  em;.    }.  }.. 
6a80: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
6a90: 74 6f 70 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  top of the main 
6aa0: 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20 2a  insertion loop *
6ab0: 2f 0a 20 20 69 66 28 20 75 73 65 54 65 6d 70 54  /.  if( useTempT
6ac0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
6ad0: 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64 65 73 20  his block codes 
6ae0: 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20  the top of loop 
6af0: 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 6d 70 6c  only.  The compl
6b00: 65 74 65 20 6c 6f 6f 70 20 69 73 20 74 68 65 0a  ete loop is the.
6b10: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
6b20: 20 70 73 65 75 64 6f 63 6f 64 65 20 28 74 65 6d   pseudocode (tem
6b30: 70 6c 61 74 65 20 34 29 3a 0a 20 20 20 20 2a 2a  plate 4):.    **
6b40: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
6b50: 72 65 77 69 6e 64 20 74 65 6d 70 20 74 61 62 6c  rewind temp tabl
6b60: 65 2c 20 69 66 20 65 6d 70 74 79 20 67 6f 74 6f  e, if empty goto
6b70: 20 44 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 43   D.    **      C
6b80: 3a 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73  : loop over rows
6b90: 20 6f 66 20 69 6e 74 65 72 6d 65 64 69 61 74 65   of intermediate
6ba0: 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20   table.    **   
6bb0: 20 20 20 20 20 20 20 20 74 72 61 6e 73 66 65 72          transfer
6bc0: 20 76 61 6c 75 65 73 20 66 6f 72 6d 20 69 6e 74   values form int
6bd0: 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20  ermediate table 
6be0: 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 20 20 20  into <table>.   
6bf0: 20 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20   **         end 
6c00: 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  loop.    **     
6c10: 20 44 3a 20 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20   D: ....    */. 
6c20: 20 20 20 61 64 64 72 49 6e 73 54 6f 70 20 3d 20     addrInsTop = 
6c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c40: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
6c50: 73 72 63 54 61 62 29 3b 20 56 64 62 65 43 6f 76  srcTab); VdbeCov
6c60: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64  erage(v);.    ad
6c70: 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33  drCont = sqlite3
6c80: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6c90: 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  v);.  }else if( 
6ca0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 2f  pSelect ){.    /
6cb0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 64  * This block cod
6cc0: 65 73 20 74 68 65 20 74 6f 70 20 6f 66 20 6c 6f  es the top of lo
6cd0: 6f 70 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  op only.  The co
6ce0: 6d 70 6c 65 74 65 20 6c 6f 6f 70 20 69 73 20 74  mplete loop is t
6cf0: 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
6d00: 69 6e 67 20 70 73 65 75 64 6f 63 6f 64 65 20 28  ing pseudocode (
6d10: 74 65 6d 70 6c 61 74 65 20 33 29 3a 0a 20 20 20  template 3):.   
6d20: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
6d30: 43 3a 20 79 69 65 6c 64 20 58 2c 20 61 74 20 45  C: yield X, at E
6d40: 4f 46 20 67 6f 74 6f 20 44 0a 20 20 20 20 2a 2a  OF goto D.    **
6d50: 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74 20           insert 
6d60: 74 68 65 20 73 65 6c 65 63 74 20 72 65 73 75 6c  the select resul
6d70: 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 20 66  t into <table> f
6d80: 72 6f 6d 20 52 2e 2e 52 2b 6e 0a 20 20 20 20 2a  rom R..R+n.    *
6d90: 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 43  *         goto C
6da0: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 44 3a 20  .    **      D: 
6db0: 2e 2e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ....    */.    a
6dc0: 64 64 72 49 6e 73 54 6f 70 20 3d 20 61 64 64 72  ddrInsTop = addr
6dd0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
6de0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
6df0: 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61  ield, dest.iSDPa
6e00: 72 6d 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  rm);.    VdbeCov
6e10: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
6e20: 20 2f 2a 20 52 75 6e 20 74 68 65 20 42 45 46 4f   /* Run the BEFO
6e30: 52 45 20 61 6e 64 20 49 4e 53 54 45 41 44 20 4f  RE and INSTEAD O
6e40: 46 20 74 72 69 67 67 65 72 73 2c 20 69 66 20 74  F triggers, if t
6e50: 68 65 72 65 20 61 72 65 20 61 6e 79 0a 20 20 2a  here are any.  *
6e60: 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20  /.  endOfLoop = 
6e70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
6e80: 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 74  abel(v);.  if( t
6e90: 6d 61 73 6b 20 26 20 54 52 49 47 47 45 52 5f 42  mask & TRIGGER_B
6ea0: 45 46 4f 52 45 20 29 7b 0a 20 20 20 20 69 6e 74  EFORE ){.    int
6eb0: 20 72 65 67 43 6f 6c 73 20 3d 20 73 71 6c 69 74   regCols = sqlit
6ec0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
6ed0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f  Parse, pTab->nCo
6ee0: 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 62 75  l+1);..    /* bu
6ef0: 69 6c 64 20 74 68 65 20 4e 45 57 2e 2a 20 72 65  ild the NEW.* re
6f00: 66 65 72 65 6e 63 65 20 72 6f 77 2e 20 20 4e 6f  ference row.  No
6f10: 74 65 20 74 68 61 74 20 69 66 20 74 68 65 72 65  te that if there
6f20: 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 0a 20   is an INTEGER. 
6f30: 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
6f40: 59 20 69 6e 74 6f 20 77 68 69 63 68 20 61 20 4e  Y into which a N
6f50: 55 4c 4c 20 69 73 20 62 65 69 6e 67 20 69 6e 73  ULL is being ins
6f60: 65 72 74 65 64 2c 20 74 68 61 74 20 4e 55 4c 4c  erted, that NULL
6f70: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
6f80: 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20  translated into 
6f90: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
6fa0: 74 68 65 20 72 6f 77 2e 20 20 42 75 74 20 6f 6e  the row.  But on
6fb0: 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67 65   a BEFORE trigge
6fc0: 72 2c 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  r,.    ** we do 
6fd0: 6e 6f 74 20 6b 6e 6f 77 20 77 68 61 74 20 74 68  not know what th
6fe0: 65 20 75 6e 69 71 75 65 20 49 44 20 77 69 6c 6c  e unique ID will
6ff0: 20 62 65 20 28 62 65 63 61 75 73 65 20 74 68 65   be (because the
7000: 20 69 6e 73 65 72 74 20 68 61 73 0a 20 20 20 20   insert has.    
7010: 2a 2a 20 6e 6f 74 20 68 61 70 70 65 6e 65 64 20  ** not happened 
7020: 79 65 74 29 20 73 6f 20 77 65 20 73 75 62 73 74  yet) so we subst
7030: 69 74 75 74 65 20 61 20 72 6f 77 69 64 20 6f 66  itute a rowid of
7040: 20 2d 31 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   -1.    */.    i
7050: 66 28 20 69 70 6b 43 6f 6c 75 6d 6e 3c 30 20 29  f( ipkColumn<0 )
7060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7070: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7080: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65 67  Integer, -1, reg
7090: 43 6f 6c 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Cols);.    }else
70a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a  {.      int j1;.
70b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 77        assert( !w
70c0: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 3b 0a 20  ithoutRowid );. 
70d0: 20 20 20 20 20 69 66 28 20 75 73 65 54 65 6d 70       if( useTemp
70e0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
70f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7100: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
7110: 20 73 72 63 54 61 62 2c 20 69 70 6b 43 6f 6c 75   srcTab, ipkColu
7120: 6d 6e 2c 20 72 65 67 43 6f 6c 73 29 3b 0a 20 20  mn, regCols);.  
7130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7140: 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65     assert( pSele
7150: 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f 74 68  ct==0 );  /* Oth
7160: 65 72 77 69 73 65 20 75 73 65 54 65 6d 70 54 61  erwise useTempTa
7170: 62 6c 65 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  ble is true */. 
7180: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
7190: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
71a0: 4c 69 73 74 2d 3e 61 5b 69 70 6b 43 6f 6c 75 6d  List->a[ipkColum
71b0: 6e 5d 2e 70 45 78 70 72 2c 20 72 65 67 43 6f 6c  n].pExpr, regCol
71c0: 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
71d0: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
71e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
71f0: 6f 74 4e 75 6c 6c 2c 20 72 65 67 43 6f 6c 73 29  otNull, regCols)
7200: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
7210: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7230: 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 72 65  _Integer, -1, re
7240: 67 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  gCols);.      sq
7250: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
7260: 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
7270: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7280: 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  1(v, OP_MustBeIn
7290: 74 2c 20 72 65 67 43 6f 6c 73 29 3b 20 56 64 62  t, regCols); Vdb
72a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
72b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 6e    }..    /* Cann
72c0: 6f 74 20 68 61 76 65 20 74 72 69 67 67 65 72 73  ot have triggers
72d0: 20 6f 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   on a virtual ta
72e0: 62 6c 65 2e 20 49 66 20 69 74 20 77 65 72 65 20  ble. If it were 
72f0: 70 6f 73 73 69 62 6c 65 2c 0a 20 20 20 20 2a 2a  possible,.    **
7300: 20 74 68 69 73 20 62 6c 6f 63 6b 20 77 6f 75 6c   this block woul
7310: 64 20 68 61 76 65 20 74 6f 20 61 63 63 6f 75 6e  d have to accoun
7320: 74 20 66 6f 72 20 68 69 64 64 65 6e 20 63 6f 6c  t for hidden col
7330: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
7340: 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75  assert( !IsVirtu
7350: 61 6c 28 70 54 61 62 29 20 29 3b 0a 0a 20 20 20  al(pTab) );..   
7360: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 6e   /* Create the n
7370: 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74 61 0a 20  ew column data. 
7380: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
7390: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
73a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
73b0: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20   pColumn==0 ){. 
73c0: 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a 20 20         j = i;.  
73d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43     for(j=0; j<pC
73f0: 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  olumn->nId; j++)
7400: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7410: 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64  pColumn->a[j].id
7420: 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  x==i ) break;.  
7430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7440: 20 20 20 20 20 20 69 66 28 20 28 21 75 73 65 54        if( (!useT
7450: 65 6d 70 54 61 62 6c 65 20 26 26 20 21 70 4c 69  empTable && !pLi
7460: 73 74 29 20 7c 7c 20 28 70 43 6f 6c 75 6d 6e 20  st) || (pColumn 
7470: 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e  && j>=pColumn->n
7480: 49 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Id) ){.        s
7490: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
74a0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f  Parse, pTab->aCo
74b0: 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 43  l[i].pDflt, regC
74c0: 6f 6c 73 2b 69 2b 31 29 3b 0a 20 20 20 20 20 20  ols+i+1);.      
74d0: 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d  }else if( useTem
74e0: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
74f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7500: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7510: 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 72 65 67  , srcTab, j, reg
7520: 43 6f 6c 73 2b 69 2b 31 29 3b 20 0a 20 20 20 20  Cols+i+1); .    
7530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7540: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
7550: 3d 3d 30 20 29 3b 20 2f 2a 20 4f 74 68 65 72 77  ==0 ); /* Otherw
7560: 69 73 65 20 75 73 65 54 65 6d 70 54 61 62 6c 65  ise useTempTable
7570: 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20   is true */.    
7580: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7590: 6f 64 65 41 6e 64 43 61 63 68 65 28 70 50 61 72  odeAndCache(pPar
75a0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  se, pList->a[j].
75b0: 70 45 78 70 72 2c 20 72 65 67 43 6f 6c 73 2b 69  pExpr, regCols+i
75c0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1);.      }.   
75d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
75e0: 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 54 20  is is an INSERT 
75f0: 6f 6e 20 61 20 76 69 65 77 20 77 69 74 68 20 61  on a view with a
7600: 6e 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53  n INSTEAD OF INS
7610: 45 52 54 20 74 72 69 67 67 65 72 2c 0a 20 20 20  ERT trigger,.   
7620: 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d   ** do not attem
7630: 70 74 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f  pt any conversio
7640: 6e 73 20 62 65 66 6f 72 65 20 61 73 73 65 6d 62  ns before assemb
7650: 6c 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 2e  ling the record.
7660: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
7670: 69 73 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  is a real table,
7680: 20 61 74 74 65 6d 70 74 20 63 6f 6e 76 65 72 73   attempt convers
7690: 69 6f 6e 73 20 61 73 20 72 65 71 75 69 72 65 64  ions as required
76a0: 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   by the.    ** t
76b0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69  able column affi
76c0: 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  nities..    */. 
76d0: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
76e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
76f0: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
7700: 70 54 61 62 2c 20 72 65 67 43 6f 6c 73 2b 31 29  pTab, regCols+1)
7710: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7720: 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72 20 49  Fire BEFORE or I
7730: 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65  NSTEAD OF trigge
7740: 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  rs */.    sqlite
7750: 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72 28  3CodeRowTrigger(
7760: 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
7770: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20  , TK_INSERT, 0, 
7780: 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 2c 20  TRIGGER_BEFORE, 
7790: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 72  .        pTab, r
77a0: 65 67 43 6f 6c 73 2d 70 54 61 62 2d 3e 6e 43 6f  egCols-pTab->nCo
77b0: 6c 2d 31 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e  l-1, onError, en
77c0: 64 4f 66 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 73  dOfLoop);..    s
77d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
77e0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
77f0: 65 67 43 6f 6c 73 2c 20 70 54 61 62 2d 3e 6e 43  egCols, pTab->nC
7800: 6f 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ol+1);.  }..  /*
7810: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   Compute the con
7820: 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tent of the next
7830: 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74 20 69   row to insert i
7840: 6e 74 6f 20 61 20 72 61 6e 67 65 20 6f 66 0a 20  nto a range of. 
7850: 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 62 65   ** registers be
7860: 67 69 6e 6e 69 6e 67 20 61 74 20 72 65 67 49 6e  ginning at regIn
7870: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
7880: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 69 66 28  sView ){.    if(
7890: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
78a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
78b0: 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 56 55   row that the VU
78c0: 70 64 61 74 65 20 6f 70 63 6f 64 65 20 77 69 6c  pdate opcode wil
78d0: 6c 20 64 65 6c 65 74 65 3a 20 6e 6f 6e 65 20 2a  l delete: none *
78e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
78f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7900: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 49 6e 73 29  Null, 0, regIns)
7910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7920: 69 70 6b 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ipkColumn>=0 ){.
7930: 20 20 20 20 20 20 69 66 28 20 75 73 65 54 65 6d        if( useTem
7940: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
7950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7960: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
7970: 2c 20 73 72 63 54 61 62 2c 20 69 70 6b 43 6f 6c  , srcTab, ipkCol
7980: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  umn, regRowid);.
7990: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
79a0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
79b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
79c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
79d0: 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 2b 69   regFromSelect+i
79e0: 70 6b 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77  pkColumn, regRow
79f0: 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
7a00: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
7a10: 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 73   *pOp;.        s
7a20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
7a30: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
7a40: 69 70 6b 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ipkColumn].pExpr
7a50: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
7a60: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
7a70: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d  e3VdbeGetOp(v, -
7a80: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
7a90: 41 4c 57 41 59 53 28 70 4f 70 29 20 26 26 20 70  ALWAYS(pOp) && p
7aa0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
7ab0: 75 6c 6c 20 26 26 20 21 49 73 56 69 72 74 75 61  ull && !IsVirtua
7ac0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
7ad0: 20 20 20 20 20 61 70 70 65 6e 64 46 6c 61 67 20       appendFlag 
7ae0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
7af0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
7b00: 4e 65 77 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  NewRowid;.      
7b10: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 69 44      pOp->p1 = iD
7b20: 61 74 61 43 75 72 3b 0a 20 20 20 20 20 20 20 20  ataCur;.        
7b30: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 52    pOp->p2 = regR
7b40: 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
7b50: 70 4f 70 2d 3e 70 33 20 3d 20 72 65 67 41 75 74  pOp->p3 = regAut
7b60: 6f 69 6e 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oinc;.        }.
7b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
7b80: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
7b90: 4b 45 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69  KEY expression i
7ba0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 75 73 65  s NULL, then use
7bb0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 0a 20 20 20   OP_NewRowid.   
7bc0: 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65 72 61 74     ** to generat
7bd0: 65 20 61 20 75 6e 69 71 75 65 20 70 72 69 6d 61  e a unique prima
7be0: 72 79 20 6b 65 79 20 76 61 6c 75 65 2e 0a 20 20  ry key value..  
7bf0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
7c00: 20 21 61 70 70 65 6e 64 46 6c 61 67 20 29 7b 0a   !appendFlag ){.
7c10: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a          int j1;.
7c20: 20 20 20 20 20 20 20 20 69 66 28 20 21 49 73 56          if( !IsV
7c30: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
7c40: 20 20 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73            j1 = s
7c50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
7c60: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
7c70: 72 65 67 52 6f 77 69 64 29 3b 20 56 64 62 65 43  regRowid); VdbeC
7c80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ca0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
7cb0: 77 52 6f 77 69 64 2c 20 69 44 61 74 61 43 75 72  wRowid, iDataCur
7cc0: 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67 41  , regRowid, regA
7cd0: 75 74 6f 69 6e 63 29 3b 0a 20 20 20 20 20 20 20  utoinc);.       
7ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
7cf0: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
7d00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7d10: 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c          j1 = sql
7d20: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7d30: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
7d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d50: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
7d60: 2c 20 72 65 67 52 6f 77 69 64 2c 20 6a 31 2b 32  , regRowid, j1+2
7d70: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7d80: 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  v);.        }.  
7d90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7da0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
7db0: 73 74 42 65 49 6e 74 2c 20 72 65 67 52 6f 77 69  stBeInt, regRowi
7dc0: 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
7dd0: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
7de0: 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
7df0: 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 77 69  tual(pTab) || wi
7e00: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
7e10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e20: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
7e30: 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 0, regRowid);.
7e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e60: 70 33 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p3(v, OP_NewRowi
7e70: 64 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65 67  d, iDataCur, reg
7e80: 52 6f 77 69 64 2c 20 72 65 67 41 75 74 6f 69 6e  Rowid, regAutoin
7e90: 63 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  c);.      append
7ea0: 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Flag = 1;.    }.
7eb0: 20 20 20 20 61 75 74 6f 49 6e 63 53 74 65 70 28      autoIncStep(
7ec0: 70 50 61 72 73 65 2c 20 72 65 67 41 75 74 6f 69  pParse, regAutoi
7ed0: 6e 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  nc, regRowid);..
7ee0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 64      /* Compute d
7ef0: 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ata for all colu
7f00: 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77 20 65  mns of the new e
7f10: 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e 67 0a  ntry, beginning.
7f20: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
7f30: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20  first column..  
7f40: 20 20 2a 2f 0a 20 20 20 20 6e 48 69 64 64 65 6e    */.    nHidden
7f50: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
7f60: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
7f70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
7f80: 20 69 52 65 67 53 74 6f 72 65 20 3d 20 72 65 67   iRegStore = reg
7f90: 52 6f 77 69 64 2b 31 2b 69 3b 0a 20 20 20 20 20  Rowid+1+i;.     
7fa0: 20 69 66 28 20 69 3d 3d 70 54 61 62 2d 3e 69 50   if( i==pTab->iP
7fb0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Key ){.        /
7fc0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * The value of t
7fd0: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
7fe0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
7ff0: 20 61 6c 77 61 79 73 20 61 20 4e 55 4c 4c 2e 0a   always a NULL..
8000: 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 65          ** Whene
8010: 76 65 72 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20  ver this column 
8020: 69 73 20 72 65 61 64 2c 20 74 68 65 20 72 6f 77  is read, the row
8030: 69 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74  id will be subst
8040: 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 2a  ituted.        *
8050: 2a 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  * in its place. 
8060: 20 48 65 6e 63 65 2c 20 66 69 6c 6c 20 74 68 69   Hence, fill thi
8070: 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  s column with a 
8080: 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a 20 20  NULL to avoid.  
8090: 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20        ** taking 
80a0: 75 70 20 64 61 74 61 20 73 70 61 63 65 20 77 69  up data space wi
80b0: 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  th information t
80c0: 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
80d0: 65 20 75 73 65 64 2e 0a 20 20 20 20 20 20 20 20  e used..        
80e0: 2a 2a 20 41 73 20 74 68 65 72 65 20 6d 61 79 20  ** As there may 
80f0: 62 65 20 73 68 61 6c 6c 6f 77 20 63 6f 70 69 65  be shallow copie
8100: 73 20 6f 66 20 74 68 69 73 20 76 61 6c 75 65 2c  s of this value,
8110: 20 6d 61 6b 65 20 69 74 20 61 20 73 6f 66 74 2d   make it a soft-
8120: 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  NULL */.        
8130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8140: 31 28 76 2c 20 4f 50 5f 53 6f 66 74 4e 75 6c 6c  1(v, OP_SoftNull
8150: 2c 20 69 52 65 67 53 74 6f 72 65 29 3b 0a 20 20  , iRegStore);.  
8160: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8180: 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ( pColumn==0 ){.
8190: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69          if( IsHi
81a0: 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
81b0: 2d 3e 61 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20  ->aCol[i]) ){.  
81c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
81d0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
81e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d  );.          j =
81f0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6e   -1;.          n
8200: 48 69 64 64 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  Hidden++;.      
8210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8220: 20 20 20 6a 20 3d 20 69 20 2d 20 6e 48 69 64 64     j = i - nHidd
8230: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  en;.        }.  
8240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8250: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43     for(j=0; j<pC
8260: 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  olumn->nId; j++)
8270: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
8280: 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64  pColumn->a[j].id
8290: 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  x==i ) break;.  
82a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
82b0: 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 7c 7c        if( j<0 ||
82c0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 7c 7c 20 28   nColumn==0 || (
82d0: 70 43 6f 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43  pColumn && j>=pC
82e0: 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 20 29 7b 0a 20  olumn->nId) ){. 
82f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8300: 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62 6c 65  prCodeFactorable
8310: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61  (pParse, pTab->a
8320: 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 69 52  Col[i].pDflt, iR
8330: 65 67 53 74 6f 72 65 29 3b 0a 20 20 20 20 20 20  egStore);.      
8340: 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d  }else if( useTem
8350: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
8360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8370: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8380: 2c 20 73 72 63 54 61 62 2c 20 6a 2c 20 69 52 65  , srcTab, j, iRe
8390: 67 53 74 6f 72 65 29 3b 20 0a 20 20 20 20 20 20  gStore); .      
83a0: 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63  }else if( pSelec
83b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
83c0: 20 72 65 67 46 72 6f 6d 53 65 6c 65 63 74 21 3d   regFromSelect!=
83d0: 72 65 67 44 61 74 61 20 29 7b 0a 20 20 20 20 20  regData ){.     
83e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
83f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
8400: 70 79 2c 20 72 65 67 46 72 6f 6d 53 65 6c 65 63  py, regFromSelec
8410: 74 2b 6a 2c 20 69 52 65 67 53 74 6f 72 65 29 3b  t+j, iRegStore);
8420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8440: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
8450: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
8460: 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 52 65 67 53  [j].pExpr, iRegS
8470: 74 6f 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tore);.      }. 
8480: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e     }..    /* Gen
8490: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 68  erate code to ch
84a0: 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
84b0: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 69 6e 64  and generate ind
84c0: 65 78 20 6b 65 79 73 20 61 6e 64 0a 20 20 20 20  ex keys and.    
84d0: 2a 2a 20 64 6f 20 74 68 65 20 69 6e 73 65 72 74  ** do the insert
84e0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ion..    */.#ifn
84f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8500: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
8510: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
8520: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
8530: 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
8540: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
8550: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
8560: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
8570: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4d 61 6b    sqlite3VtabMak
8580: 65 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  eWritable(pParse
8590: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 73  , pTab);.      s
85a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
85b0: 28 76 2c 20 4f 50 5f 56 55 70 64 61 74 65 2c 20  (v, OP_VUpdate, 
85c0: 31 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 32 2c  1, pTab->nCol+2,
85d0: 20 72 65 67 49 6e 73 2c 20 70 56 54 61 62 2c 20   regIns, pVTab, 
85e0: 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20  P4_VTAB);.      
85f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8600: 65 50 35 28 76 2c 20 6f 6e 45 72 72 6f 72 3d 3d  eP5(v, onError==
8610: 4f 45 5f 44 65 66 61 75 6c 74 20 3f 20 4f 45 5f  OE_Default ? OE_
8620: 41 62 6f 72 74 20 3a 20 6f 6e 45 72 72 6f 72 29  Abort : onError)
8630: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
8640: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
8650: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8660: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  f.    {.      in
8670: 74 20 69 73 52 65 70 6c 61 63 65 3b 20 20 20 20  t isReplace;    
8680: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
8690: 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6d 61  f constraints ma
86a0: 79 20 63 61 75 73 65 20 61 20 72 65 70 6c 61 63  y cause a replac
86b0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
86c0: 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
86d0: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
86e0: 65 2c 20 70 54 61 62 2c 20 61 52 65 67 49 64 78  e, pTab, aRegIdx
86f0: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  , iDataCur, iIdx
8700: 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 72  Cur,.          r
8710: 65 67 49 6e 73 2c 20 30 2c 20 69 70 6b 43 6f 6c  egIns, 0, ipkCol
8720: 75 6d 6e 3e 3d 30 2c 20 6f 6e 45 72 72 6f 72 2c  umn>=0, onError,
8730: 20 65 6e 64 4f 66 4c 6f 6f 70 2c 20 26 69 73 52   endOfLoop, &isR
8740: 65 70 6c 61 63 65 0a 20 20 20 20 20 20 29 3b 0a  eplace.      );.
8750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 43        sqlite3FkC
8760: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 54 61  heck(pParse, pTa
8770: 62 2c 20 30 2c 20 72 65 67 49 6e 73 2c 20 30 2c  b, 0, regIns, 0,
8780: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
8790: 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  e3CompleteInsert
87a0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
87b0: 2c 20 69 44 61 74 61 43 75 72 2c 20 69 49 64 78  , iDataCur, iIdx
87c0: 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 20 72 65 67 49 6e 73 2c 20 61 52 65 67      regIns, aReg
87f0: 49 64 78 2c 20 30 2c 20 61 70 70 65 6e 64 46 6c  Idx, 0, appendFl
8800: 61 67 2c 20 69 73 52 65 70 6c 61 63 65 3d 3d 30  ag, isReplace==0
8810: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8820: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f  /* Update the co
8830: 75 6e 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  unt of rows that
8840: 20 61 72 65 20 69 6e 73 65 72 74 65 64 0a 20 20   are inserted.  
8850: 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  */.  if( (db->fl
8860: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 75  ags & SQLITE_Cou
8870: 6e 74 52 6f 77 73 29 21 3d 30 20 29 7b 0a 20 20  ntRows)!=0 ){.  
8880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8890: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
88a0: 2c 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31  , regRowCount, 1
88b0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  );.  }..  if( pT
88c0: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 2f 2a  rigger ){.    /*
88d0: 20 43 6f 64 65 20 41 46 54 45 52 20 74 72 69 67   Code AFTER trig
88e0: 67 65 72 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  gers */.    sqli
88f0: 74 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65  te3CodeRowTrigge
8900: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
8910: 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  er, TK_INSERT, 0
8920: 2c 20 54 52 49 47 47 45 52 5f 41 46 54 45 52 2c  , TRIGGER_AFTER,
8930: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 2c 20   .        pTab, 
8940: 72 65 67 44 61 74 61 2d 32 2d 70 54 61 62 2d 3e  regData-2-pTab->
8950: 6e 43 6f 6c 2c 20 6f 6e 45 72 72 6f 72 2c 20 65  nCol, onError, e
8960: 6e 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 0a  ndOfLoop);.  }..
8970: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
8980: 6f 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 73 65  of the main inse
8990: 72 74 69 6f 6e 20 6c 6f 6f 70 2c 20 69 66 20 74  rtion loop, if t
89a0: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 0a 20  he data source. 
89b0: 20 2a 2a 20 69 73 20 61 20 53 45 4c 45 43 54 20   ** is a SELECT 
89c0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
89d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
89e0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
89f0: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75  OfLoop);.  if( u
8a00: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
8a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8a20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
8a30: 20 73 72 63 54 61 62 2c 20 61 64 64 72 43 6f 6e   srcTab, addrCon
8a40: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
8a50: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
8a60: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8a70: 61 64 64 72 49 6e 73 54 6f 70 29 3b 0a 20 20 20  addrInsTop);.   
8a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8a90: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
8aa0: 73 72 63 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  srcTab);.  }else
8ab0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
8ac0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ad0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
8ae0: 2c 20 30 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  , 0, addrCont);.
8af0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
8b00: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
8b10: 6e 73 54 6f 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  nsTop);.  }..  i
8b20: 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
8b30: 61 62 29 20 26 26 20 21 69 73 56 69 65 77 20 29  ab) && !isView )
8b40: 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  {.    /* Close a
8b50: 6c 6c 20 74 61 62 6c 65 73 20 6f 70 65 6e 65 64  ll tables opened
8b60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44 61 74   */.    if( iDat
8b70: 61 43 75 72 3c 69 49 64 78 43 75 72 20 29 20 73  aCur<iIdxCur ) s
8b80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
8b90: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44  (v, OP_Close, iD
8ba0: 61 74 61 43 75 72 29 3b 0a 20 20 20 20 66 6f 72  ataCur);.    for
8bb0: 28 69 64 78 3d 30 2c 20 70 49 64 78 3d 70 54 61  (idx=0, pIdx=pTa
8bc0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
8bd0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
8be0: 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20  t, idx++){.     
8bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8c00: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
8c10: 69 64 78 2b 69 49 64 78 43 75 72 29 3b 0a 20 20  idx+iIdxCur);.  
8c20: 20 20 7d 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f    }.  }..insert_
8c30: 65 6e 64 3a 0a 20 20 2f 2a 20 55 70 64 61 74 65  end:.  /* Update
8c40: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
8c50: 65 6e 63 65 20 74 61 62 6c 65 20 62 79 20 73 74  ence table by st
8c60: 6f 72 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  oring the conten
8c70: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6d 61  t of the.  ** ma
8c80: 78 69 6d 75 6d 20 72 6f 77 69 64 20 63 6f 75 6e  ximum rowid coun
8c90: 74 65 72 20 76 61 6c 75 65 73 20 72 65 63 6f 72  ter values recor
8ca0: 64 65 64 20 77 68 69 6c 65 20 69 6e 73 65 72 74  ded while insert
8cb0: 69 6e 67 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 75  ing into.  ** au
8cc0: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 74 61 62 6c  toincrement tabl
8cd0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
8ce0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
8cf0: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
8d00: 67 67 65 72 54 61 62 3d 3d 30 20 29 7b 0a 20 20  ggerTab==0 ){.  
8d10: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63    sqlite3Autoinc
8d20: 72 65 6d 65 6e 74 45 6e 64 28 70 50 61 72 73 65  rementEnd(pParse
8d30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
8d40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
8d50: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 73 65  ber of rows inse
8d60: 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 72 6f  rted. If this ro
8d70: 75 74 69 6e 65 20 69 73 20 0a 20 20 2a 2a 20 67  utine is .  ** g
8d80: 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 62  enerating code b
8d90: 65 63 61 75 73 65 20 6f 66 20 61 20 63 61 6c 6c  ecause of a call
8da0: 20 74 6f 20 73 71 6c 69 74 65 33 4e 65 73 74 65   to sqlite3Neste
8db0: 64 50 61 72 73 65 28 29 2c 20 64 6f 20 6e 6f 74  dParse(), do not
8dc0: 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  .  ** invoke the
8dd0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
8de0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  on..  */.  if( (
8df0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
8e00: 5f 43 6f 75 6e 74 52 6f 77 73 29 20 26 26 20 21  _CountRows) && !
8e10: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
8e20: 26 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  & !pParse->pTrig
8e30: 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 73 71  gerTab ){.    sq
8e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8e50: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8e60: 20 72 65 67 52 6f 77 43 6f 75 6e 74 2c 20 31 29   regRowCount, 1)
8e70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e80: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 31  eSetNumCols(v, 1
8e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8ea0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8eb0: 30 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  0, COLNAME_NAME,
8ec0: 20 22 72 6f 77 73 20 69 6e 73 65 72 74 65 64 22   "rows inserted"
8ed0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
8ee0: 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74 5f 63 6c  ;.  }..insert_cl
8ef0: 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
8f00: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
8f10: 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 73  , pTabList);.  s
8f20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
8f30: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
8f40: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
8f50: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
8f60: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  ct);.  sqlite3Id
8f70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
8f80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71 6c 69 74  Column);.  sqlit
8f90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 52 65  e3DbFree(db, aRe
8fa0: 67 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 20 4d 61 6b  gIdx);.}../* Mak
8fb0: 65 20 73 75 72 65 20 22 69 73 56 69 65 77 22 20  e sure "isView" 
8fc0: 61 6e 64 20 6f 74 68 65 72 20 6d 61 63 72 6f 73  and other macros
8fd0: 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 20 61   defined above a
8fe0: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74  re undefined. Ot
8ff0: 68 65 72 77 69 73 65 0a 2a 2a 20 74 68 65 6c 79  herwise.** thely
9000: 20 6d 61 79 20 69 6e 74 65 72 66 65 72 65 20 77   may interfere w
9010: 69 74 68 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  ith compilation 
9020: 6f 66 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  of other functio
9030: 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 0a  ns in this file.
9040: 2a 2a 20 28 6f 72 20 69 6e 20 61 6e 6f 74 68 65  ** (or in anothe
9050: 72 20 66 69 6c 65 2c 20 69 66 20 74 68 69 73 20  r file, if this 
9060: 66 69 6c 65 20 62 65 63 6f 6d 65 73 20 70 61 72  file becomes par
9070: 74 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61 6d  t of the amalgam
9080: 61 74 69 6f 6e 29 2e 20 20 2a 2f 0a 23 69 66 64  ation).  */.#ifd
9090: 65 66 20 69 73 56 69 65 77 0a 20 23 75 6e 64 65  ef isView. #unde
90a0: 66 20 69 73 56 69 65 77 0a 23 65 6e 64 69 66 0a  f isView.#endif.
90b0: 23 69 66 64 65 66 20 70 54 72 69 67 67 65 72 0a  #ifdef pTrigger.
90c0: 20 23 75 6e 64 65 66 20 70 54 72 69 67 67 65 72   #undef pTrigger
90d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 74  .#endif.#ifdef t
90e0: 6d 61 73 6b 0a 20 23 75 6e 64 65 66 20 74 6d 61  mask. #undef tma
90f0: 73 6b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  sk.#endif../*.**
9100: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9110: 6f 20 64 6f 20 63 6f 6e 73 74 72 61 69 6e 74 20  o do constraint 
9120: 63 68 65 63 6b 73 20 70 72 69 6f 72 20 74 6f 20  checks prior to 
9130: 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 61 6e 20  an INSERT or an 
9140: 55 50 44 41 54 45 0a 2a 2a 20 6f 6e 20 74 61 62  UPDATE.** on tab
9150: 6c 65 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54  le pTab..**.** T
9160: 68 65 20 72 65 67 4e 65 77 44 61 74 61 20 70 61  he regNewData pa
9170: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 66  rameter is the f
9180: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
9190: 20 61 20 72 61 6e 67 65 20 74 68 61 74 20 63 6f   a range that co
91a0: 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61  ntains.** the da
91b0: 74 61 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ta to be inserte
91c0: 64 20 6f 72 20 74 68 65 20 64 61 74 61 20 61 66  d or the data af
91d0: 74 65 72 20 74 68 65 20 75 70 64 61 74 65 2e 20  ter the update. 
91e0: 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 2a   There will be.*
91f0: 2a 20 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 72  * pTab->nCol+1 r
9200: 65 67 69 73 74 65 72 73 20 69 6e 20 74 68 69 73  egisters in this
9210: 20 72 61 6e 67 65 2e 20 20 54 68 65 20 66 69 72   range.  The fir
9220: 73 74 20 72 65 67 69 73 74 65 72 20 28 74 68 65  st register (the
9230: 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 72 65 67   one.** that reg
9240: 4e 65 77 44 61 74 61 20 70 6f 69 6e 74 73 20 74  NewData points t
9250: 6f 29 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  o) will contain 
9260: 74 68 65 20 6e 65 77 20 72 6f 77 69 64 2c 20 6f  the new rowid, o
9270: 72 20 4e 55 4c 4c 20 69 6e 20 74 68 65 0a 2a 2a  r NULL in the.**
9280: 20 63 61 73 65 20 6f 66 20 61 20 57 49 54 48 4f   case of a WITHO
9290: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
92a0: 20 54 68 65 20 73 65 63 6f 6e 64 20 72 65 67 69   The second regi
92b0: 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
92c0: 65 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  e will.** contai
92d0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
92e0: 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
92f0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 74 68   column.  The th
9300: 69 72 64 20 72 65 67 69 73 74 65 72 20 77 69 6c  ird register wil
9310: 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65  l.** contain the
9320: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
9330: 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 63 6f 6c  second table col
9340: 75 6d 6e 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  umn.  And so for
9350: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  th..**.** The re
9360: 67 4f 6c 64 44 61 74 61 20 70 61 72 61 6d 65 74  gOldData paramet
9370: 65 72 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  er is similar to
9380: 20 72 65 67 4e 65 77 44 61 74 61 20 65 78 63 65   regNewData exce
9390: 70 74 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61  pt that it conta
93a0: 69 6e 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 20  ins.** the data 
93b0: 70 72 69 6f 72 20 74 6f 20 61 6e 20 55 50 44 41  prior to an UPDA
93c0: 54 45 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  TE rather than a
93d0: 66 74 65 72 77 61 72 64 73 2e 20 20 72 65 67 4f  fterwards.  regO
93e0: 6c 64 44 61 74 61 20 69 73 20 7a 65 72 6f 0a 2a  ldData is zero.*
93f0: 2a 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 54 2e  * for an INSERT.
9400: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63    This routine c
9410: 61 6e 20 64 69 73 74 69 6e 67 75 69 73 68 20 62  an distinguish b
9420: 65 74 77 65 65 6e 20 55 50 44 41 54 45 20 61 6e  etween UPDATE an
9430: 64 20 49 4e 53 45 52 54 20 62 79 0a 2a 2a 20 63  d INSERT by.** c
9440: 68 65 63 6b 69 6e 67 20 72 65 67 4f 6c 64 44 61  hecking regOldDa
9450: 74 61 20 66 6f 72 20 7a 65 72 6f 2e 0a 2a 2a 0a  ta for zero..**.
9460: 2a 2a 20 46 6f 72 20 61 6e 20 55 50 44 41 54 45  ** For an UPDATE
9470: 2c 20 74 68 65 20 70 6b 43 68 6e 67 20 62 6f 6f  , the pkChng boo
9480: 6c 65 61 6e 20 69 73 20 74 72 75 65 20 69 66 20  lean is true if 
9490: 74 68 65 20 74 72 75 65 20 70 72 69 6d 61 72 79  the true primary
94a0: 20 6b 65 79 20 28 74 68 65 0a 2a 2a 20 72 6f 77   key (the.** row
94b0: 69 64 20 66 6f 72 20 61 20 6e 6f 72 6d 61 6c 20  id for a normal 
94c0: 74 61 62 6c 65 20 6f 72 20 74 68 65 20 50 52 49  table or the PRI
94d0: 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 61 20 57  MARY KEY for a W
94e0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
94f0: 6c 65 29 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  le).** might be 
9500: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
9510: 55 50 44 41 54 45 2e 20 20 49 66 20 70 6b 43 68  UPDATE.  If pkCh
9520: 6e 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  ng is false, the
9530: 6e 20 74 68 65 20 6b 65 79 20 6f 66 0a 2a 2a 20  n the key of.** 
9540: 74 68 65 20 69 44 61 74 61 43 75 72 20 63 6f 6e  the iDataCur con
9550: 74 65 6e 74 20 74 61 62 6c 65 20 69 73 20 67 75  tent table is gu
9560: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75  aranteed to be u
9570: 6e 63 68 61 6e 67 65 64 20 62 79 20 74 68 65 20  nchanged by the 
9580: 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a 20 46 6f  UPDATE..**.** Fo
9590: 72 20 61 6e 20 49 4e 53 45 52 54 2c 20 74 68 65  r an INSERT, the
95a0: 20 70 6b 43 68 6e 67 20 62 6f 6f 6c 65 61 6e 20   pkChng boolean 
95b0: 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65  indicates whethe
95c0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77  r or not the row
95d0: 69 64 0a 2a 2a 20 77 61 73 20 65 78 70 6c 69 63  id.** was explic
95e0: 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61  itly specified a
95f0: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 49 4e  s part of the IN
9600: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  SERT statement. 
9610: 20 49 66 20 70 6b 43 68 6e 67 0a 2a 2a 20 69 73   If pkChng.** is
9620: 20 7a 65 72 6f 2c 20 69 74 20 6d 65 61 6e 73 20   zero, it means 
9630: 74 68 61 74 20 74 68 65 20 65 69 74 68 65 72 20  that the either 
9640: 72 6f 77 69 64 20 69 73 20 63 6f 6d 70 75 74 65  rowid is compute
9650: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
9660: 6f 72 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 74  or.** that the t
9670: 61 62 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55  able is a WITHOU
9680: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 61 6e  T ROWID table an
9690: 64 20 68 61 73 20 6e 6f 20 72 6f 77 69 64 2e 20  d has no rowid. 
96a0: 20 4f 6e 20 61 6e 20 49 4e 53 45 52 54 2c 0a 2a   On an INSERT,.*
96b0: 2a 20 70 6b 43 68 6e 67 20 77 69 6c 6c 20 6f 6e  * pkChng will on
96c0: 6c 79 20 62 65 20 74 72 75 65 20 69 66 20 74 68  ly be true if th
96d0: 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  e INSERT stateme
96e0: 6e 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20 69  nt provides an i
96f0: 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 20  nteger.** value 
9700: 66 6f 72 20 65 69 74 68 65 72 20 74 68 65 20 72  for either the r
9710: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  owid column or i
9720: 74 73 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ts INTEGER PRIMA
9730: 52 59 20 4b 45 59 20 61 6c 69 61 73 2e 0a 2a 2a  RY KEY alias..**
9740: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
9750: 65 72 61 74 65 64 20 62 79 20 74 68 69 73 20 72  erated by this r
9760: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 73 74 6f 72  outine will stor
9770: 65 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74 72  e new index entr
9780: 69 65 73 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ies into.** regi
9790: 73 74 65 72 73 20 69 64 65 6e 74 69 66 69 65 64  sters identified
97a0: 20 62 79 20 61 52 65 67 49 64 78 5b 5d 2e 20 20   by aRegIdx[].  
97b0: 4e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  No index entry i
97c0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 0a 2a 2a  s created for.**
97d0: 20 69 6e 64 69 63 65 73 20 77 68 65 72 65 20 61   indices where a
97e0: 52 65 67 49 64 78 5b 69 5d 3d 3d 30 2e 20 20 54  RegIdx[i]==0.  T
97f0: 68 65 20 6f 72 64 65 72 20 6f 66 20 69 6e 64 69  he order of indi
9800: 63 65 73 20 69 6e 20 61 52 65 67 49 64 78 5b 5d  ces in aRegIdx[]
9810: 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20   is.** the same 
9820: 61 73 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  as the order of 
9830: 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 6c  indices on the l
9840: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 69 6e  inked list of in
9850: 64 69 63 65 73 0a 2a 2a 20 61 74 20 70 54 61 62  dices.** at pTab
9860: 2d 3e 70 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  ->pIndex..**.** 
9870: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
9880: 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f 70 65  have already ope
9890: 6e 65 64 20 77 72 69 74 65 61 62 6c 65 20 63 75  ned writeable cu
98a0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 6d 61 69  rsors on the mai
98b0: 6e 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 61  n.** table and a
98c0: 6c 6c 20 61 70 70 6c 69 63 61 62 6c 65 20 69 6e  ll applicable in
98d0: 64 69 63 65 73 20 28 74 68 61 74 20 69 73 20 74  dices (that is t
98e0: 6f 20 73 61 79 2c 20 61 6c 6c 20 69 6e 64 69 63  o say, all indic
98f0: 65 73 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20  es for which.** 
9900: 61 52 65 67 49 64 78 5b 5d 20 69 73 20 6e 6f 74  aRegIdx[] is not
9910: 20 7a 65 72 6f 29 2e 20 20 69 44 61 74 61 43 75   zero).  iDataCu
9920: 72 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  r is the cursor 
9930: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 74 61 62  for the main tab
9940: 6c 65 20 77 68 65 6e 0a 2a 2a 20 69 6e 73 65 72  le when.** inser
9950: 74 69 6e 67 20 6f 72 20 75 70 64 61 74 69 6e 67  ting or updating
9960: 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20   a rowid table, 
9970: 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  or the cursor fo
9980: 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  r the PRIMARY KE
9990: 59 0a 2a 2a 20 69 6e 64 65 78 20 77 68 65 6e 20  Y.** index when 
99a0: 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 61 20 57  operating on a W
99b0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
99c0: 6c 65 2e 20 20 69 49 64 78 43 75 72 20 69 73 20  le.  iIdxCur is 
99d0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 66 6f  the cursor.** fo
99e0: 72 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65  r the first inde
99f0: 78 20 69 6e 20 74 68 65 20 70 54 61 62 2d 3e 70  x in the pTab->p
9a00: 49 6e 64 65 78 20 6c 69 73 74 2e 20 20 43 75 72  Index list.  Cur
9a10: 73 6f 72 73 20 66 6f 72 20 6f 74 68 65 72 20 69  sors for other i
9a20: 6e 64 69 63 65 73 0a 2a 2a 20 61 72 65 20 61 74  ndices.** are at
9a30: 20 69 49 64 78 43 75 72 2b 4e 20 66 6f 72 20 74   iIdxCur+N for t
9a40: 68 65 20 4e 2d 74 68 20 65 6c 65 6d 65 6e 74 20  he N-th element 
9a50: 6f 66 20 74 68 65 20 70 54 61 62 2d 3e 70 49 6e  of the pTab->pIn
9a60: 64 65 78 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  dex list..**.** 
9a70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
9a80: 6f 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  o generates code
9a90: 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74 72   to check constr
9aa0: 61 69 6e 74 73 2e 20 20 4e 4f 54 20 4e 55 4c 4c  aints.  NOT NULL
9ab0: 2c 0a 2a 2a 20 43 48 45 43 4b 2c 20 61 6e 64 20  ,.** CHECK, and 
9ac0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
9ad0: 74 73 20 61 72 65 20 61 6c 6c 20 63 68 65 63 6b  ts are all check
9ae0: 65 64 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ed.  If a constr
9af0: 61 69 6e 74 20 66 61 69 6c 73 2c 0a 2a 2a 20 74  aint fails,.** t
9b00: 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  hen the appropri
9b10: 61 74 65 20 61 63 74 69 6f 6e 20 69 73 20 70 65  ate action is pe
9b20: 72 66 6f 72 6d 65 64 2e 20 20 54 68 65 72 65 20  rformed.  There 
9b30: 61 72 65 20 66 69 76 65 20 70 6f 73 73 69 62 6c  are five possibl
9b40: 65 0a 2a 2a 20 61 63 74 69 6f 6e 73 3a 20 52 4f  e.** actions: RO
9b50: 4c 4c 42 41 43 4b 2c 20 41 42 4f 52 54 2c 20 46  LLBACK, ABORT, F
9b60: 41 49 4c 2c 20 52 45 50 4c 41 43 45 2c 20 61 6e  AIL, REPLACE, an
9b70: 64 20 49 47 4e 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20  d IGNORE..**.** 
9b80: 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65   Constraint type
9b90: 20 20 41 63 74 69 6f 6e 20 20 20 20 20 20 20 57    Action       W
9ba0: 68 61 74 20 48 61 70 70 65 6e 73 0a 2a 2a 20 20  hat Happens.**  
9bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
9bc0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d   ----------   --
9bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bf0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61 6e 79 20 20  ------.**  any  
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 52 4f 4c 4c              ROLL
9c10: 42 41 43 4b 20 20 20 20 20 54 68 65 20 63 75 72  BACK     The cur
9c20: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
9c30: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   is rolled back 
9c40: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
9c70: 65 70 28 29 20 72 65 74 75 72 6e 73 20 69 6d 6d  ep() returns imm
9c80: 65 64 69 61 74 65 6c 79 20 77 69 74 68 20 61 0a  ediately with a.
9c90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66    return code of
9cc0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9cd0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79 20 20  NT..**.**  any  
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 41 42 4f 52              ABOR
9cf0: 54 20 20 20 20 20 20 20 20 42 61 63 6b 20 6f 75  T        Back ou
9d00: 74 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 74  t changes from t
9d10: 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6d 6d 61  he current comma
9d20: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 6f 6e 6c 79 20 28 64 6f 20 6e 6f       only (do no
9d50: 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 20  t do a complete 
9d60: 72 6f 6c 6c 62 61 63 6b 29 20 74 68 65 6e 0a 2a  rollback) then.*
9d70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
9da0: 74 65 70 28 29 20 74 6f 20 72 65 74 75 72 6e 20  tep() to return 
9db0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
9de0: 74 68 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  th SQLITE_CONSTR
9df0: 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61 6e 79  AINT..**.**  any
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 41                FA
9e10: 49 4c 20 20 20 20 20 20 20 20 20 53 71 6c 69 74  IL         Sqlit
9e20: 65 33 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e  e3_step() return
9e30: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69  s immediately wi
9e40: 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  th a.**         
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f         return co
9e70: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e  de of SQLITE_CON
9e80: 53 54 52 41 49 4e 54 2e 20 20 54 68 65 0a 2a 2a  STRAINT.  The.**
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
9ec0: 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ot rolled back a
9ed0: 6e 64 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20  nd any.**       
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 73           changes
9f00: 20 74 6f 20 70 72 69 6f 72 20 72 6f 77 73 20 61   to prior rows a
9f10: 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2a 0a  re retained..**.
9f20: 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20  **  any         
9f30: 20 20 20 20 20 49 47 4e 4f 52 45 20 20 20 20 20       IGNORE     
9f40: 20 20 54 68 65 20 61 74 74 65 6d 70 74 20 69 6e    The attempt in
9f50: 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74   insert or updat
9f60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 72 6f 77 20 69 73 20 73 6b 69 70 70 65 64 2c 20  row is skipped, 
9fa0: 77 69 74 68 6f 75 74 20 74 68 72 6f 77 69 6e 67  without throwing
9fb0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20   an error..**   
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f               Pro
9fe0: 63 65 73 73 69 6e 67 20 63 6f 6e 74 69 6e 75 65  cessing continue
9ff0: 73 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  s with the next 
a000: 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  row..**         
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 20 20 28 54 68 65 72 65 20 69 73         (There is
a030: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
a040: 6d 70 20 74 6f 20 69 67 6e 6f 72 65 44 65 73 74  mp to ignoreDest
a050: 2e 29 0a 2a 2a 0a 2a 2a 20 20 4e 4f 54 20 4e 55  .).**.**  NOT NU
a060: 4c 4c 20 20 20 20 20 20 20 20 20 52 45 50 4c 41  LL         REPLA
a070: 43 45 20 20 20 20 20 20 54 68 65 20 4e 55 4c 4c  CE      The NULL
a080: 20 76 61 6c 75 65 20 69 73 20 72 65 70 6c 61 63   value is replac
a090: 65 20 62 79 20 74 68 65 20 64 65 66 61 75 6c 74  e by the default
a0a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61     value for tha
a0d0: 74 20 63 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68  t column.  If th
a0e0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 0a  e default value.
a0f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 20 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 61    is NULL, the a
a120: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 73 61 6d  ction is the sam
a130: 65 20 61 73 20 41 42 4f 52 54 2e 0a 2a 2a 0a 2a  e as ABORT..**.*
a140: 2a 20 20 55 4e 49 51 55 45 20 20 20 20 20 20 20  *  UNIQUE       
a150: 20 20 20 20 52 45 50 4c 41 43 45 20 20 20 20 20      REPLACE     
a160: 20 54 68 65 20 6f 74 68 65 72 20 72 6f 77 20 74   The other row t
a170: 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
a180: 74 68 20 74 68 65 20 72 6f 77 0a 2a 2a 20 20 20  th the row.**   
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 69               bei
a1b0: 6e 67 20 69 6e 73 65 72 74 65 64 20 69 73 20 72  ng inserted is r
a1c0: 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 43  emoved..**.**  C
a1d0: 48 45 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  HECK            
a1e0: 52 45 50 4c 41 43 45 20 20 20 20 20 20 49 6c 6c  REPLACE      Ill
a1f0: 65 67 61 6c 2e 20 20 54 68 65 20 72 65 73 75 6c  egal.  The resul
a200: 74 73 20 69 6e 20 61 6e 20 65 78 63 65 70 74 69  ts in an excepti
a210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 69 63 68 20  on..**.** Which 
a220: 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69  action to take i
a230: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
a240: 74 68 65 20 6f 76 65 72 72 69 64 65 45 72 72 6f  the overrideErro
a250: 72 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  r parameter..** 
a260: 4f 72 20 69 66 20 6f 76 65 72 72 69 64 65 45 72  Or if overrideEr
a270: 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 2c  ror==OE_Default,
a280: 20 74 68 65 6e 20 74 68 65 20 70 50 61 72 73 65   then the pParse
a290: 2d 3e 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  ->onError parame
a2a0: 74 65 72 0a 2a 2a 20 69 73 20 75 73 65 64 2e 20  ter.** is used. 
a2b0: 20 4f 72 20 69 66 20 70 50 61 72 73 65 2d 3e 6f   Or if pParse->o
a2c0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
a2d0: 6c 74 20 74 68 65 6e 20 74 68 65 20 6f 6e 45 72  lt then the onEr
a2e0: 72 6f 72 20 76 61 6c 75 65 0a 2a 2a 20 66 6f 72  ror value.** for
a2f0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
a300: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  is used..*/.void
a310: 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
a320: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
a330: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a340: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
a350: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
a360: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
a370: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a380: 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 73 65  table being inse
a390: 72 74 65 64 20 6f 72 20 75 70 64 61 74 65 64 20  rted or updated 
a3a0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64  */.  int *aRegId
a3b0: 78 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  x,        /* Use
a3c0: 20 72 65 67 69 73 74 65 72 20 61 52 65 67 49 64   register aRegId
a3d0: 78 5b 69 5d 20 66 6f 72 20 69 6e 64 65 78 20 69  x[i] for index i
a3e0: 2e 20 20 30 20 66 6f 72 20 75 6e 75 73 65 64 20  .  0 for unused 
a3f0: 2a 2f 0a 20 20 69 6e 74 20 69 44 61 74 61 43 75  */.  int iDataCu
a400: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  r,        /* Can
a410: 6f 6e 69 63 61 6c 20 64 61 74 61 20 63 75 72 73  onical data curs
a420: 6f 72 20 28 6d 61 69 6e 20 74 61 62 6c 65 20 6f  or (main table o
a430: 72 20 50 4b 20 69 6e 64 65 78 29 20 2a 2f 0a 20  r PK index) */. 
a440: 20 69 6e 74 20 69 49 64 78 43 75 72 2c 20 20 20   int iIdxCur,   
a450: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69        /* First i
a460: 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ndex cursor */. 
a470: 20 69 6e 74 20 72 65 67 4e 65 77 44 61 74 61 2c   int regNewData,
a480: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
a490: 65 67 69 73 74 65 72 20 69 6e 20 61 20 72 61 6e  egister in a ran
a4a0: 67 65 20 68 6f 6c 64 69 6e 67 20 76 61 6c 75 65  ge holding value
a4b0: 73 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20  s to insert */. 
a4c0: 20 69 6e 74 20 72 65 67 4f 6c 64 44 61 74 61 2c   int regOldData,
a4d0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
a4e0: 73 20 63 6f 6e 74 65 6e 74 2e 20 20 30 20 66 6f  s content.  0 fo
a4f0: 72 20 49 4e 53 45 52 54 73 20 2a 2f 0a 20 20 75  r INSERTs */.  u
a500: 38 20 70 6b 43 68 6e 67 2c 20 20 20 20 20 20 20  8 pkChng,       
a510: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
a520: 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f 72 20  if the rowid or 
a530: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 68 61 6e  PRIMARY KEY chan
a540: 67 65 64 20 2a 2f 0a 20 20 75 38 20 6f 76 65 72  ged */.  u8 over
a550: 72 69 64 65 45 72 72 6f 72 2c 20 20 20 20 2f 2a  rideError,    /*
a560: 20 4f 76 65 72 72 69 64 65 20 6f 6e 45 72 72 6f   Override onErro
a570: 72 20 74 6f 20 74 68 69 73 20 69 66 20 6e 6f 74  r to this if not
a580: 20 4f 45 5f 44 65 66 61 75 6c 74 20 2a 2f 0a 20   OE_Default */. 
a590: 20 69 6e 74 20 69 67 6e 6f 72 65 44 65 73 74 2c   int ignoreDest,
a5a0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
a5b0: 20 74 68 69 73 20 6c 61 62 65 6c 20 6f 6e 20 61   this label on a
a5c0: 6e 20 4f 45 5f 49 67 6e 6f 72 65 20 72 65 73 6f  n OE_Ignore reso
a5d0: 6c 75 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  lution */.  int 
a5e0: 2a 70 62 4d 61 79 52 65 70 6c 61 63 65 20 20 20  *pbMayReplace   
a5f0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
a600: 74 72 75 65 20 69 66 20 63 6f 6e 73 74 72 61 69  true if constrai
a610: 6e 74 20 6d 61 79 20 63 61 75 73 65 20 61 20 72  nt may cause a r
a620: 65 70 6c 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 56  eplace */.){.  V
a630: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
a640: 20 20 20 20 2f 2a 20 56 44 42 45 20 75 6e 64 65      /* VDBE unde
a650: 72 20 63 6f 6e 73 74 72 75 74 69 6f 6e 20 2a 2f  r constrution */
a660: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
a670: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
a680: 65 72 20 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65  er to one of the
a690: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 49 6e   indices */.  In
a6a0: 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
a6b0: 20 20 20 2f 2a 20 54 68 65 20 50 52 49 4d 41 52     /* The PRIMAR
a6c0: 59 20 4b 45 59 20 69 6e 64 65 78 20 2a 2f 0a 20  Y KEY index */. 
a6d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
a6e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a6f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
a700: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
a710: 20 20 20 20 20 20 20 2f 2a 20 6c 6f 6f 70 20 63         /* loop c
a720: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
a730: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
a740: 20 2f 2a 20 49 6e 64 65 78 20 6c 6f 6f 70 20 63   /* Index loop c
a750: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
a760: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
a770: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
a780: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6f  lumns */.  int o
a790: 6e 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  nError;         
a7a0: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
a7b0: 6c 75 74 69 6f 6e 20 73 74 72 61 74 65 67 79 20  lution strategy 
a7c0: 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
a7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
a7e0: 72 65 73 73 73 20 6f 66 20 6a 75 6d 70 20 69 6e  resss of jump in
a7f0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
a800: 6e 74 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d  nt seenReplace =
a810: 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 52   0; /* True if R
a820: 45 50 4c 41 43 45 20 69 73 20 75 73 65 64 20 74  EPLACE is used t
a830: 6f 20 72 65 73 6f 6c 76 65 20 49 4e 54 20 50 4b  o resolve INT PK
a840: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
a850: 6e 74 20 6e 50 6b 46 69 65 6c 64 3b 20 20 20 20  nt nPkField;    
a860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a870: 20 66 69 65 6c 64 73 20 69 6e 20 50 52 49 4d 41   fields in PRIMA
a880: 52 59 20 4b 45 59 2e 20 31 20 66 6f 72 20 52 4f  RY KEY. 1 for RO
a890: 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  WID tables */.  
a8a0: 69 6e 74 20 69 70 6b 54 6f 70 20 3d 20 30 3b 20  int ipkTop = 0; 
a8b0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
a8c0: 68 65 20 72 6f 77 69 64 20 63 68 61 6e 67 65 20  he rowid change 
a8d0: 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b  constraint check
a8e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 70 6b 42 6f 74   */.  int ipkBot
a8f0: 74 6f 6d 20 3d 20 30 3b 20 20 20 2f 2a 20 42 6f  tom = 0;   /* Bo
a900: 74 74 6f 6d 20 6f 66 20 74 68 65 20 72 6f 77 69  ttom of the rowi
a910: 64 20 63 68 61 6e 67 65 20 63 6f 6e 73 74 72 61  d change constra
a920: 69 6e 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75  int check */.  u
a930: 38 20 69 73 55 70 64 61 74 65 3b 20 20 20 20 20  8 isUpdate;     
a940: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
a950: 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45  his is an UPDATE
a960: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
a970: 75 38 20 62 41 66 66 69 6e 69 74 79 44 6f 6e 65  u8 bAffinityDone
a980: 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 69   = 0;  /* True i
a990: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
a9a0: 79 20 6f 70 65 72 61 74 69 6f 6e 20 68 61 73 20  y operation has 
a9b0: 62 65 65 6e 20 72 75 6e 20 2a 2f 0a 20 20 69 6e  been run */.  in
a9c0: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 2d 31 3b  t regRowid = -1;
a9d0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
a9e0: 6f 6c 64 69 6e 67 20 52 4f 57 49 44 20 76 61 6c  olding ROWID val
a9f0: 75 65 20 2a 2f 0a 0a 20 20 69 73 55 70 64 61 74  ue */..  isUpdat
aa00: 65 20 3d 20 72 65 67 4f 6c 64 44 61 74 61 21 3d  e = regOldData!=
aa10: 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  0;.  db = pParse
aa20: 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ->db;.  v = sqli
aa30: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
aa40: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
aa50: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
aa60: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
aa70: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 74 61 62   );  /* This tab
aa80: 6c 65 20 69 73 20 6e 6f 74 20 61 20 56 49 45 57  le is not a VIEW
aa90: 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 54 61   */.  nCol = pTa
aaa0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 0a 20 20 2f 2a  b->nCol;.  .  /*
aab0: 20 70 50 6b 20 69 73 20 74 68 65 20 50 52 49 4d   pPk is the PRIM
aac0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
aad0: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
aae0: 74 61 62 6c 65 73 20 61 6e 64 20 4e 55 4c 4c 20  tables and NULL 
aaf0: 66 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  for.  ** normal 
ab00: 72 6f 77 69 64 20 74 61 62 6c 65 73 2e 20 20 6e  rowid tables.  n
ab10: 50 6b 46 69 65 6c 64 20 69 73 20 74 68 65 20 6e  PkField is the n
ab20: 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 66 69 65  umber of key fie
ab30: 6c 64 73 20 69 6e 20 74 68 65 20 0a 20 20 2a 2a  lds in the .  **
ab40: 20 70 50 6b 20 69 6e 64 65 78 20 6f 72 20 31 20   pPk index or 1 
ab50: 66 6f 72 20 61 20 72 6f 77 69 64 20 74 61 62 6c  for a rowid tabl
ab60: 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
ab70: 64 73 2c 20 6e 50 6b 46 69 65 6c 64 20 69 73 20  ds, nPkField is 
ab80: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
ab90: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
aba0: 20 74 72 75 65 20 70 72 69 6d 61 72 79 20 6b 65   true primary ke
abb0: 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  y of the table. 
abc0: 2a 2f 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69  */.  if( HasRowi
abd0: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
abe0: 50 6b 20 3d 20 30 3b 0a 20 20 20 20 6e 50 6b 46  Pk = 0;.    nPkF
abf0: 69 65 6c 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ield = 1;.  }els
ac00: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
ac10: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
ac20: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 6e  dex(pTab);.    n
ac30: 50 6b 46 69 65 6c 64 20 3d 20 70 50 6b 2d 3e 6e  PkField = pPk->n
ac40: 4b 65 79 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  KeyCol;.  }..  /
ac50: 2a 20 52 65 63 6f 72 64 20 74 68 61 74 20 74 68  * Record that th
ac60: 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 73 74  is module has st
ac70: 61 72 74 65 64 20 2a 2f 0a 20 20 56 64 62 65 4d  arted */.  VdbeM
ac80: 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
ac90: 20 22 42 45 47 49 4e 3a 20 47 65 6e 43 6e 73 74   "BEGIN: GenCnst
aca0: 43 6b 73 28 25 64 2c 25 64 2c 25 64 2c 25 64 2c  Cks(%d,%d,%d,%d,
acb0: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d)",.          
acc0: 20 20 20 20 20 20 20 20 20 20 20 69 44 61 74 61             iData
acd0: 43 75 72 2c 20 69 49 64 78 43 75 72 2c 20 72 65  Cur, iIdxCur, re
ace0: 67 4e 65 77 44 61 74 61 2c 20 72 65 67 4f 6c 64  gNewData, regOld
acf0: 44 61 74 61 2c 20 70 6b 43 68 6e 67 29 29 3b 0a  Data, pkChng));.
ad00: 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 4e  .  /* Test all N
ad10: 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
ad20: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nts..  */.  for(
ad30: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
ad40: 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 54  ){.    if( i==pT
ad50: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
ad60: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
ad70: 20 7d 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d   }.    onError =
ad80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e   pTab->aCol[i].n
ad90: 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28 20  otNull;.    if( 
ada0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
adb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
adc0: 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72   if( overrideErr
add0: 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or!=OE_Default )
ade0: 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20  {.      onError 
adf0: 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b  = overrideError;
ae00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
ae10: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
ae20: 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72  lt ){.      onEr
ae30: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
ae40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6e      }.    if( on
ae50: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
ae60: 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  e && pTab->aCol[
ae70: 69 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b 0a 20  i].pDflt==0 ){. 
ae80: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
ae90: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  E_Abort;.    }. 
aea0: 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72     assert( onErr
aeb0: 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  or==OE_Rollback 
aec0: 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  || onError==OE_A
aed0: 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d  bort || onError=
aee0: 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20  =OE_Fail.       
aef0: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
af00: 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72 72 6f  Ignore || onErro
af10: 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 3b  r==OE_Replace );
af20: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45  .    switch( onE
af30: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 63 61  rror ){.      ca
af40: 73 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20  se OE_Abort:.   
af50: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41       sqlite3MayA
af60: 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
af70: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
af80: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 20 20 63  rough */.      c
af90: 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a  ase OE_Rollback:
afa0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46  .      case OE_F
afb0: 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 63  ail: {.        c
afc0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
afd0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
afe0: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
aff0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
b020: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[i].zName);. 
b030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b040: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
b050: 61 6c 74 49 66 4e 75 6c 6c 2c 20 53 51 4c 49 54  altIfNull, SQLIT
b060: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
b070: 4e 55 4c 4c 2c 20 6f 6e 45 72 72 6f 72 2c 0a 20  NULL, onError,. 
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 20 20 20 20 72 65 67 4e 65 77 44           regNewD
b0a0: 61 74 61 2b 31 2b 69 2c 20 7a 4d 73 67 2c 20 50  ata+1+i, zMsg, P
b0b0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
b0c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b0d0: 68 61 6e 67 65 50 35 28 76 2c 20 50 35 5f 43 6f  hangeP5(v, P5_Co
b0e0: 6e 73 74 72 61 69 6e 74 4e 6f 74 4e 75 6c 6c 29  nstraintNotNull)
b0f0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
b100: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b120: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  }.      case OE_
b130: 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20  Ignore: {.      
b140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b150: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
b160: 2c 20 72 65 67 4e 65 77 44 61 74 61 2b 31 2b 69  , regNewData+1+i
b170: 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20  , ignoreDest);. 
b180: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b190: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
b1a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
b1b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
b1c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b1d0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
b1e0: 61 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6a  ace );.        j
b1f0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
b200: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
b210: 75 6c 6c 2c 20 72 65 67 4e 65 77 44 61 74 61 2b  ull, regNewData+
b220: 31 2b 69 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+i); VdbeCovera
b230: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
b240: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b250: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 61 43 6f  Parse, pTab->aCo
b260: 6c 5b 69 5d 2e 70 44 66 6c 74 2c 20 72 65 67 4e  l[i].pDflt, regN
b270: 65 77 44 61 74 61 2b 31 2b 69 29 3b 0a 20 20 20  ewData+1+i);.   
b280: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b290: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
b2a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b2c0: 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c  }..  /* Test all
b2d0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
b2e0: 74 73 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ts.  */.#ifndef 
b2f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
b300: 4b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 43  K.  if( pTab->pC
b310: 68 65 63 6b 20 26 26 20 28 64 62 2d 3e 66 6c 61  heck && (db->fla
b320: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 67 6e 6f  gs & SQLITE_Igno
b330: 72 65 43 68 65 63 6b 73 29 3d 3d 30 20 29 7b 0a  reChecks)==0 ){.
b340: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43      ExprList *pC
b350: 68 65 63 6b 20 3d 20 70 54 61 62 2d 3e 70 43 68  heck = pTab->pCh
b360: 65 63 6b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  eck;.    pParse-
b370: 3e 63 6b 42 61 73 65 20 3d 20 72 65 67 4e 65 77  >ckBase = regNew
b380: 44 61 74 61 2b 31 3b 0a 20 20 20 20 6f 6e 45 72  Data+1;.    onEr
b390: 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72  ror = overrideEr
b3a0: 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror!=OE_Default 
b3b0: 3f 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 20  ? overrideError 
b3c0: 3a 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  : OE_Abort;.    
b3d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 65 63  for(i=0; i<pChec
b3e0: 6b 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  k->nExpr; i++){.
b3f0: 20 20 20 20 20 20 69 6e 74 20 61 6c 6c 4f 6b 20        int allOk 
b400: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b410: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
b420: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
b430: 75 65 28 70 50 61 72 73 65 2c 20 70 43 68 65 63  ue(pParse, pChec
b440: 6b 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61  k->a[i].pExpr, a
b450: 6c 6c 4f 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  llOk, SQLITE_JUM
b460: 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
b470: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
b480: 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
b490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b4a0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
b4b0: 30 2c 20 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a  0, ignoreDest);.
b4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b4d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
b4e0: 20 3d 20 70 43 68 65 63 6b 2d 3e 61 5b 69 5d 2e   = pCheck->a[i].
b4f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
b500: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e  f( zName==0 ) zN
b510: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
b520: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  e;.        if( o
b530: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
b540: 63 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f  ce ) onError = O
b550: 45 5f 41 62 6f 72 74 3b 20 2f 2a 20 49 4d 50 3a  E_Abort; /* IMP:
b560: 20 52 2d 31 35 35 36 39 2d 36 33 36 32 35 20 2a   R-15569-63625 *
b570: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
b580: 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
b590: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
b5a0: 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 2c  ONSTRAINT_CHECK,
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
b5d0: 6e 45 72 72 6f 72 2c 20 7a 4e 61 6d 65 2c 20 50  nError, zName, P
b5e0: 34 5f 54 52 41 4e 53 49 45 4e 54 2c 0a 20 20 20  4_TRANSIENT,.   
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
b610: 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 29 3b 0a  nstraintCheck);.
b620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b630: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b640: 4c 61 62 65 6c 28 76 2c 20 61 6c 6c 4f 6b 29 3b  Label(v, allOk);
b650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
b660: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b670: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
b680: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 72 6f 77   */..  /* If row
b690: 69 64 20 69 73 20 63 68 61 6e 67 69 6e 67 2c 20  id is changing, 
b6a0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  make sure the ne
b6b0: 77 20 72 6f 77 69 64 20 64 6f 65 73 20 6e 6f 74  w rowid does not
b6c0: 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a   previously.  **
b6d0: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 74 61   exist in the ta
b6e0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
b6f0: 70 6b 43 68 6e 67 20 26 26 20 70 50 6b 3d 3d 30  pkChng && pPk==0
b700: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
b710: 52 6f 77 69 64 4f 6b 20 3d 20 73 71 6c 69 74 65  RowidOk = sqlite
b720: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
b730: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  );..    /* Figur
b740: 65 20 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f  e out what actio
b750: 6e 20 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73  n to take in cas
b760: 65 20 6f 66 20 61 20 72 6f 77 69 64 20 63 6f 6c  e of a rowid col
b770: 6c 69 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 6f 6e  lision */.    on
b780: 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 6b 65  Error = pTab->ke
b790: 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f  yConf;.    if( o
b7a0: 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45  verrideError!=OE
b7b0: 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
b7c0: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72    onError = over
b7d0: 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d  rideError;.    }
b7e0: 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72  else if( onError
b7f0: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
b800: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20        onError = 
b810: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  OE_Abort;.    }.
b820: 0a 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74  .    if( isUpdat
b830: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 6b  e ){.      /* pk
b840: 43 68 6e 67 21 3d 30 20 64 6f 65 73 20 6e 6f 74  Chng!=0 does not
b850: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 72   mean that the r
b860: 6f 77 69 64 20 68 61 73 20 63 68 61 6e 67 65 2c  owid has change,
b870: 20 6f 6e 6c 79 20 74 68 61 74 0a 20 20 20 20 20   only that.     
b880: 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 68 61 76   ** it might hav
b890: 65 20 63 68 61 6e 67 65 64 2e 20 20 53 6b 69 70  e changed.  Skip
b8a0: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6c 6f   the conflict lo
b8b0: 67 69 63 20 62 65 6c 6f 77 20 69 66 20 74 68 65  gic below if the
b8c0: 20 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20   rowid.      ** 
b8d0: 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  is unchanged. */
b8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b8f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
b900: 71 2c 20 72 65 67 4e 65 77 44 61 74 61 2c 20 61  q, regNewData, a
b910: 64 64 72 52 6f 77 69 64 4f 6b 2c 20 72 65 67 4f  ddrRowidOk, regO
b920: 6c 64 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  ldData);.      s
b930: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b940: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
b950: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62  NULL);.      Vdb
b960: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b970: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
b980: 68 65 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  he response to a
b990: 20 72 6f 77 69 64 20 63 6f 6e 66 6c 69 63 74 20   rowid conflict 
b9a0: 69 73 20 52 45 50 4c 41 43 45 20 62 75 74 20 74  is REPLACE but t
b9b0: 68 65 20 72 65 73 70 6f 6e 73 65 0a 20 20 20 20  he response.    
b9c0: 2a 2a 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72  ** to some other
b9d0: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
b9e0: 6e 74 20 69 73 20 46 41 49 4c 20 6f 72 20 49 47  nt is FAIL or IG
b9f0: 4e 4f 52 45 2c 20 74 68 65 6e 20 77 65 20 6e 65  NORE, then we ne
ba00: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 66  ed.    ** to def
ba10: 65 72 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 6f  er the running o
ba20: 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6e 66  f the rowid conf
ba30: 6c 69 63 74 20 63 68 65 63 6b 69 6e 67 20 75 6e  lict checking un
ba40: 74 69 6c 20 61 66 74 65 72 0a 20 20 20 20 2a 2a  til after.    **
ba50: 20 74 68 65 20 55 4e 49 51 55 45 20 63 6f 6e 73   the UNIQUE cons
ba60: 74 72 61 69 6e 74 73 20 68 61 76 65 20 72 75 6e  traints have run
ba70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ba80: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
ba90: 6c 61 63 65 20 26 26 20 6f 76 65 72 72 69 64 65  lace && override
baa0: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
bab0: 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  e ){.      for(p
bac0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
bad0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
bae0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
baf0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
bb00: 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20  rror==OE_Ignore 
bb10: 7c 7c 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  || pIdx->onError
bb20: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
bb30: 20 20 20 20 20 20 20 69 70 6b 54 6f 70 20 3d 20         ipkTop = 
bb40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bb50: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
bb60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bb70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bb80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
bb90: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
bba0: 74 68 65 20 6e 65 77 20 72 6f 77 69 64 20 61 6c  the new rowid al
bbb0: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 20  ready exists in 
bbc0: 74 68 65 20 74 61 62 6c 65 2e 20 20 53 6b 69 70  the table.  Skip
bbd0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
bbe0: 6f 77 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 6c  owing conflict l
bbf0: 6f 67 69 63 20 69 66 20 69 74 20 64 6f 65 73 20  ogic if it does 
bc00: 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  not. */.    sqli
bc10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bc20: 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
bc30: 44 61 74 61 43 75 72 2c 20 61 64 64 72 52 6f 77  DataCur, addrRow
bc40: 69 64 4f 6b 2c 20 72 65 67 4e 65 77 44 61 74 61  idOk, regNewData
bc50: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
bc60: 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  age(v);..    /* 
bc70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
bc80: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 61 20  at deals with a 
bc90: 72 6f 77 69 64 20 63 6f 6c 6c 69 73 69 6f 6e 20  rowid collision 
bca0: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
bcb0: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
bcc0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
bcd0: 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f     onError = OE_
bce0: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 2f  Abort;.        /
bcf0: 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
bd00: 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a   the next case *
bd10: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
bd20: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
bd30: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  :.      case OE_
bd40: 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73  Abort:.      cas
bd50: 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20  e OE_Fail: {.   
bd60: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77 69       sqlite3Rowi
bd70: 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  dConstraint(pPar
bd80: 73 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 70 54 61  se, onError, pTa
bd90: 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  b);.        brea
bda0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
bdb0: 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63 65   case OE_Replace
bdc0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  : {.        /* I
bdd0: 66 20 74 68 65 72 65 20 61 72 65 20 44 45 4c 45  f there are DELE
bde0: 54 45 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74  TE triggers on t
bdf0: 68 69 73 20 74 61 62 6c 65 20 61 6e 64 20 74 68  his table and th
be00: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63  e.        ** rec
be10: 75 72 73 69 76 65 2d 74 72 69 67 67 65 72 73 20  ursive-triggers 
be20: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 63 61 6c  flag is set, cal
be30: 6c 20 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c  l GenerateRowDel
be40: 65 74 65 28 29 20 74 6f 0a 20 20 20 20 20 20 20  ete() to.       
be50: 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 63   ** remove the c
be60: 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77 20 66  onflicting row f
be70: 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 54  rom the table. T
be80: 68 69 73 20 77 69 6c 6c 20 66 69 72 65 0a 20 20  his will fire.  
be90: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 72 69        ** the tri
bea0: 67 67 65 72 73 20 61 6e 64 20 72 65 6d 6f 76 65  ggers and remove
beb0: 20 62 6f 74 68 20 74 68 65 20 74 61 62 6c 65 20   both the table 
bec0: 61 6e 64 20 69 6e 64 65 78 20 62 2d 74 72 65 65  and index b-tree
bed0: 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
bee0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
bef0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
bf00: 65 72 65 20 61 72 65 20 6e 6f 20 74 72 69 67 67  ere are no trigg
bf10: 65 72 73 20 6f 72 20 74 68 65 20 72 65 63 75 72  ers or the recur
bf20: 73 69 76 65 2d 74 72 69 67 67 65 72 73 0a 20 20  sive-triggers.  
bf30: 20 20 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73        ** flag is
bf40: 20 6e 6f 74 20 73 65 74 2c 20 62 75 74 20 74 68   not set, but th
bf50: 65 20 74 61 62 6c 65 20 68 61 73 20 6f 6e 65 20  e table has one 
bf60: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 2c  or more indexes,
bf70: 20 63 61 6c 6c 20 0a 20 20 20 20 20 20 20 20 2a   call .        *
bf80: 2a 20 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64  * GenerateRowInd
bf90: 65 78 44 65 6c 65 74 65 28 29 2e 20 54 68 69 73  exDelete(). This
bfa0: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 69 6e 64   removes the ind
bfb0: 65 78 20 62 2d 74 72 65 65 20 65 6e 74 72 69 65  ex b-tree entrie
bfc0: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  s .        ** on
bfd0: 6c 79 2e 20 54 68 65 20 74 61 62 6c 65 20 62 2d  ly. The table b-
bfe0: 74 72 65 65 20 65 6e 74 72 79 20 77 69 6c 6c 20  tree entry will 
bff0: 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  be replaced by t
c000: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 0a 20 20  he new entry .  
c010: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
c020: 20 69 73 20 69 6e 73 65 72 74 65 64 2e 20 20 0a   is inserted.  .
c030: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c040: 20 20 20 2a 2a 20 49 66 20 65 69 74 68 65 72 20     ** If either 
c050: 47 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74  GenerateRowDelet
c060: 65 28 29 20 6f 72 20 47 65 6e 65 72 61 74 65 52  e() or GenerateR
c070: 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28 29 20  owIndexDelete() 
c080: 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 20  is called,.     
c090: 20 20 20 2a 2a 20 61 6c 73 6f 20 69 6e 76 6f 6b     ** also invok
c0a0: 65 20 4d 75 6c 74 69 57 72 69 74 65 28 29 20 74  e MultiWrite() t
c0b0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
c0c0: 74 68 69 73 20 56 44 42 45 20 6d 61 79 20 72 65  this VDBE may re
c0d0: 71 75 69 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  quire.        **
c0e0: 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
c0f0: 61 63 6b 20 28 69 66 20 74 68 65 20 73 74 61 74  ack (if the stat
c100: 65 6d 65 6e 74 20 69 73 20 61 62 6f 72 74 65 64  ement is aborted
c110: 20 61 66 74 65 72 20 74 68 65 20 64 65 6c 65 74   after the delet
c120: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b  e.        ** tak
c130: 65 73 20 70 6c 61 63 65 29 2e 20 45 61 72 6c 69  es place). Earli
c140: 65 72 20 76 65 72 73 69 6f 6e 73 20 63 61 6c 6c  er versions call
c150: 65 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57  ed sqlite3MultiW
c160: 72 69 74 65 28 29 20 72 65 67 61 72 64 6c 65 73  rite() regardles
c170: 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 75  s,.        ** bu
c180: 74 20 62 65 69 6e 67 20 6d 6f 72 65 20 73 65 6c  t being more sel
c190: 65 63 74 69 76 65 20 68 65 72 65 20 61 6c 6c 6f  ective here allo
c1a0: 77 73 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  ws statements li
c1b0: 6b 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ke:.        **. 
c1c0: 20 20 20 20 20 20 20 2a 2a 20 20 20 52 45 50 4c         **   REPL
c1d0: 41 43 45 20 49 4e 54 4f 20 74 28 72 6f 77 69 64  ACE INTO t(rowid
c1e0: 29 20 56 41 4c 55 45 53 28 24 6e 65 77 72 6f 77  ) VALUES($newrow
c1f0: 69 64 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  id).        **. 
c200: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e         ** to run
c210: 20 77 69 74 68 6f 75 74 20 61 20 73 74 61 74 65   without a state
c220: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 66 20  ment journal if 
c230: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 64  there are no ind
c240: 65 78 65 73 20 6f 6e 20 74 68 65 0a 20 20 20 20  exes on the.    
c250: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 0a 20 20      ** table..  
c260: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c270: 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
c280: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
c290: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  if( db->flags&SQ
c2a0: 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
c2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
c2c0: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
c2d0: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50  TriggersExist(pP
c2e0: 61 72 73 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44  arse, pTab, TK_D
c2f0: 45 4c 45 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20  ELETE, 0, 0);.  
c300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c310: 69 66 28 20 70 54 72 69 67 67 65 72 20 7c 7c 20  if( pTrigger || 
c320: 73 71 6c 69 74 65 33 46 6b 52 65 71 75 69 72 65  sqlite3FkRequire
c330: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  d(pParse, pTab, 
c340: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
c350: 20 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57     sqlite3MultiW
c360: 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  rite(pParse);.  
c370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
c380: 65 6e 65 72 61 74 65 52 6f 77 44 65 6c 65 74 65  enerateRowDelete
c390: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
c3a0: 54 72 69 67 67 65 72 2c 20 69 44 61 74 61 43 75  Trigger, iDataCu
c3b0: 72 2c 20 69 49 64 78 43 75 72 2c 0a 20 20 20 20  r, iIdxCur,.    
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
c3e0: 65 67 4e 65 77 44 61 74 61 2c 20 31 2c 20 30 2c  egNewData, 1, 0,
c3f0: 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 31 29 3b   OE_Replace, 1);
c400: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c410: 66 28 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20  f( pTab->pIndex 
c420: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
c430: 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70  ite3MultiWrite(p
c440: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
c450: 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
c460: 65 52 6f 77 49 6e 64 65 78 44 65 6c 65 74 65 28  eRowIndexDelete(
c470: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
c480: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c  ataCur, iIdxCur,
c490: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
c4a0: 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61         seenRepla
c4b0: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
c4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c4d0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e       case OE_Ign
c4e0: 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  ore: {.        /
c4f0: 2a 61 73 73 65 72 74 28 20 73 65 65 6e 52 65 70  *assert( seenRep
c500: 6c 61 63 65 3d 3d 30 20 29 3b 2a 2f 0a 20 20 20  lace==0 );*/.   
c510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c520: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
c530: 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74  o, 0, ignoreDest
c540: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c550: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
c570: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
c580: 64 64 72 52 6f 77 69 64 4f 6b 29 3b 0a 20 20 20  ddrRowidOk);.   
c590: 20 69 66 28 20 69 70 6b 54 6f 70 20 29 7b 0a 20   if( ipkTop ){. 
c5a0: 20 20 20 20 20 69 70 6b 42 6f 74 74 6f 6d 20 3d       ipkBottom =
c5b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c5c0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
c5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c5e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 70 6b  eJumpHere(v, ipk
c5f0: 54 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Top);.    }.  }.
c600: 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 55  .  /* Test all U
c610: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
c620: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 65 6e  s by creating en
c630: 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 55  tries for each U
c640: 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e 64 65 78  NIQUE.  ** index
c650: 20 61 6e 64 20 6d 61 6b 69 6e 67 20 73 75 72 65   and making sure
c660: 20 74 68 61 74 20 64 75 70 6c 69 63 61 74 65 20   that duplicate 
c670: 65 6e 74 72 69 65 73 20 64 6f 20 6e 6f 74 20 61  entries do not a
c680: 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 20 20  lready exist..  
c690: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  ** Compute the r
c6a0: 65 76 69 73 65 64 20 72 65 63 6f 72 64 20 65 6e  evised record en
c6b0: 74 72 69 65 73 20 66 6f 72 20 69 6e 64 69 63 65  tries for indice
c6c0: 73 20 61 73 20 77 65 20 67 6f 2e 0a 20 20 2a 2a  s as we go..  **
c6d0: 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
c6e0: 61 6c 73 6f 20 68 61 6e 64 6c 65 73 20 74 68 65  also handles the
c6f0: 20 63 61 73 65 20 6f 66 20 74 68 65 20 50 52 49   case of the PRI
c700: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
c710: 6f 72 20 61 0a 20 20 2a 2a 20 57 49 54 48 4f 55  or a.  ** WITHOU
c720: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20  T ROWID table.. 
c730: 20 2a 2f 0a 20 20 66 6f 72 28 69 78 3d 30 2c 20   */.  for(ix=0, 
c740: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
c750: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
c760: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 78 2b 2b 29  dx->pNext, ix++)
c770: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 49 64 78  {.    int regIdx
c780: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 61  ;          /* Ra
c790: 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
c7a0: 20 68 6f 6c 64 20 63 6f 6e 65 6e 74 20 66 6f 72   hold conent for
c7b0: 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74   pIdx */.    int
c7c0: 20 72 65 67 52 3b 20 20 20 20 20 20 20 20 20 20   regR;          
c7d0: 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 72 65    /* Range of re
c7e0: 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20  gisters holding 
c7f0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 50 4b 20 2a  conflicting PK *
c800: 2f 0a 20 20 20 20 69 6e 74 20 69 54 68 69 73 43  /.    int iThisC
c810: 75 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ur;        /* Cu
c820: 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 55 4e  rsor for this UN
c830: 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20 20  IQUE index */.  
c840: 20 20 69 6e 74 20 61 64 64 72 55 6e 69 71 75 65    int addrUnique
c850: 4f 6b 3b 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  Ok;    /* Jump h
c860: 65 72 65 20 69 66 20 74 68 65 20 55 4e 49 51 55  ere if the UNIQU
c870: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  E constraint is 
c880: 73 61 74 69 73 66 69 65 64 20 2a 2f 0a 0a 20 20  satisfied */..  
c890: 20 20 69 66 28 20 61 52 65 67 49 64 78 5b 69 78    if( aRegIdx[ix
c8a0: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
c8b0: 20 20 2f 2a 20 53 6b 69 70 20 69 6e 64 69 63 65    /* Skip indice
c8c0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 68  s that do not ch
c8d0: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ange */.    if( 
c8e0: 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 3d 3d 30  bAffinityDone==0
c8f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c900: 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76  3TableAffinity(v
c910: 2c 20 70 54 61 62 2c 20 72 65 67 4e 65 77 44 61  , pTab, regNewDa
c920: 74 61 2b 31 29 3b 0a 20 20 20 20 20 20 62 41 66  ta+1);.      bAf
c930: 66 69 6e 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a  finityDone = 1;.
c940: 20 20 20 20 7d 0a 20 20 20 20 69 54 68 69 73 43      }.    iThisC
c950: 75 72 20 3d 20 69 49 64 78 43 75 72 2b 69 78 3b  ur = iIdxCur+ix;
c960: 0a 20 20 20 20 61 64 64 72 55 6e 69 71 75 65 4f  .    addrUniqueO
c970: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
c980: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
c990: 20 20 2f 2a 20 53 6b 69 70 20 70 61 72 74 69 61    /* Skip partia
c9a0: 6c 20 69 6e 64 69 63 65 73 20 66 6f 72 20 77 68  l indices for wh
c9b0: 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  ich the WHERE cl
c9c0: 61 75 73 65 20 69 73 20 6e 6f 74 20 74 72 75 65  ause is not true
c9d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
c9e0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
c9f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ca00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ca10: 5f 4e 75 6c 6c 2c 20 30 2c 20 61 52 65 67 49 64  _Null, 0, aRegId
ca20: 78 5b 69 78 5d 29 3b 0a 20 20 20 20 20 20 70 50  x[ix]);.      pP
ca30: 61 72 73 65 2d 3e 63 6b 42 61 73 65 20 3d 20 72  arse->ckBase = r
ca40: 65 67 4e 65 77 44 61 74 61 2b 31 3b 0a 20 20 20  egNewData+1;.   
ca50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
ca60: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 49  False(pParse, pI
ca70: 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
ca80: 65 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c  e, addrUniqueOk,
ca90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
caa0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
cab0: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
cac0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6b 42 61      pParse->ckBa
cad0: 73 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  se = 0;.    }.. 
cae0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 72     /* Create a r
caf0: 65 63 6f 72 64 20 66 6f 72 20 74 68 69 73 20 69  ecord for this i
cb00: 6e 64 65 78 20 65 6e 74 72 79 20 61 73 20 69 74  ndex entry as it
cb10: 20 73 68 6f 75 6c 64 20 61 70 70 65 61 72 20 61   should appear a
cb20: 66 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 20  fter.    ** the 
cb30: 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74 65  insert or update
cb40: 2e 20 20 53 74 6f 72 65 20 74 68 61 74 20 72 65  .  Store that re
cb50: 63 6f 72 64 20 69 6e 20 74 68 65 20 61 52 65 67  cord in the aReg
cb60: 49 64 78 5b 69 78 5d 20 72 65 67 69 73 74 65 72  Idx[ix] register
cb70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 49  .    */.    regI
cb80: 64 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  dx = sqlite3GetT
cb90: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
cba0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
cbb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cbc0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
cbd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
cbe0: 46 69 65 6c 64 20 3d 20 70 49 64 78 2d 3e 61 69  Field = pIdx->ai
cbf0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
cc00: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
cc10: 28 20 69 46 69 65 6c 64 3c 30 20 7c 7c 20 69 46  ( iField<0 || iF
cc20: 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  ield==pTab->iPKe
cc30: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  y ){.        if(
cc40: 20 72 65 67 52 6f 77 69 64 3d 3d 72 65 67 49 64   regRowid==regId
cc50: 78 2b 69 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  x+i ) continue; 
cc60: 2f 2a 20 52 4f 57 49 44 20 61 6c 72 65 61 64 79  /* ROWID already
cc70: 20 69 6e 20 72 65 67 49 64 78 2b 69 20 2a 2f 0a   in regIdx+i */.
cc80: 20 20 20 20 20 20 20 20 78 20 3d 20 72 65 67 4e          x = regN
cc90: 65 77 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  ewData;.        
cca0: 72 65 67 52 6f 77 69 64 20 3d 20 20 70 49 64 78  regRowid =  pIdx
ccb0: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
ccc0: 3f 20 2d 31 20 3a 20 72 65 67 49 64 78 2b 69 3b  ? -1 : regIdx+i;
ccd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cce0: 20 20 20 20 20 20 78 20 3d 20 69 46 69 65 6c 64        x = iField
ccf0: 20 2b 20 72 65 67 4e 65 77 44 61 74 61 20 2b 20   + regNewData + 
cd00: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
cd10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cd20: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
cd30: 78 2c 20 72 65 67 49 64 78 2b 69 29 3b 0a 20 20  x, regIdx+i);.  
cd40: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
cd50: 28 76 2c 20 22 25 73 22 2c 20 69 46 69 65 6c 64  (v, "%s", iField
cd60: 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
cd70: 54 61 62 2d 3e 61 43 6f 6c 5b 69 46 69 65 6c 64  Tab->aCol[iField
cd80: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
cd90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cda0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
cdb0: 65 52 65 63 6f 72 64 2c 20 72 65 67 49 64 78 2c  eRecord, regIdx,
cdc0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20   pIdx->nColumn, 
cdd0: 61 52 65 67 49 64 78 5b 69 78 5d 29 3b 0a 20 20  aRegIdx[ix]);.  
cde0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
cdf0: 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 49 64 78  , "for %s", pIdx
ce00: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 73  ->zName));.    s
ce10: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
ce20: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
ce30: 61 72 73 65 2c 20 72 65 67 49 64 78 2c 20 70 49  arse, regIdx, pI
ce40: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 0a 20  dx->nColumn);.. 
ce50: 20 20 20 2f 2a 20 49 6e 20 61 6e 20 55 50 44 41     /* In an UPDA
ce60: 54 45 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 66  TE operation, if
ce70: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
ce80: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
ce90: 6e 64 65 78 20 0a 20 20 20 20 2a 2a 20 6f 66 20  ndex .    ** of 
cea0: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
ceb0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 72 65 20  table and there 
cec0: 68 61 73 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  has been no chan
ced0: 67 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  ge the.    ** pr
cee0: 69 6d 61 72 79 20 6b 65 79 2c 20 74 68 65 6e 20  imary key, then 
cef0: 6e 6f 20 63 6f 6c 6c 69 73 69 6f 6e 20 69 73 20  no collision is 
cf00: 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 65 20 63  possible.  The c
cf10: 6f 6c 6c 69 73 69 6f 6e 20 64 65 74 65 63 74 69  ollision detecti
cf20: 6f 6e 0a 20 20 20 20 2a 2a 20 6c 6f 67 69 63 20  on.    ** logic 
cf30: 62 65 6c 6f 77 20 63 61 6e 20 61 6c 6c 20 62 65  below can all be
cf40: 20 73 6b 69 70 70 65 64 2e 20 2a 2f 0a 20 20 20   skipped. */.   
cf50: 20 69 66 28 20 69 73 55 70 64 61 74 65 20 26 26   if( isUpdate &&
cf60: 20 70 50 6b 3d 3d 70 49 64 78 20 26 26 20 70 6b   pPk==pIdx && pk
cf70: 43 68 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Chng==0 ){.     
cf80: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
cf90: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
cfa0: 55 6e 69 71 75 65 4f 6b 29 3b 0a 20 20 20 20 20  UniqueOk);.     
cfb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
cfc0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
cfd0: 74 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f  t what action to
cfe0: 20 74 61 6b 65 20 69 6e 20 63 61 73 65 20 74 68   take in case th
cff0: 65 72 65 20 69 73 20 61 20 75 6e 69 71 75 65 6e  ere is a uniquen
d000: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
d010: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 49      onError = pI
d020: 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  dx->onError;.   
d030: 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
d040: 5f 4e 6f 6e 65 20 29 7b 20 0a 20 20 20 20 20 20  _None ){ .      
d050: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d060: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d070: 72 65 67 49 64 78 2c 20 70 49 64 78 2d 3e 6e 43  regIdx, pIdx->nC
d080: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
d090: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d0a0: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 55 6e 69  Label(v, addrUni
d0b0: 71 75 65 4f 6b 29 3b 0a 20 20 20 20 20 20 63 6f  queOk);.      co
d0c0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 70 49 64 78  ntinue;  /* pIdx
d0d0: 20 69 73 20 6e 6f 74 20 61 20 55 4e 49 51 55 45   is not a UNIQUE
d0e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a   index */.    }.
d0f0: 20 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65      if( override
d100: 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c  Error!=OE_Defaul
d110: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
d120: 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72  or = overrideErr
d130: 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  or;.    }else if
d140: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ( onError==OE_De
d150: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f  fault ){.      o
d160: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
d170: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  t;.    }.    .  
d180: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
d190: 65 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64  e if the new ind
d1a0: 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ex entry will be
d1b0: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 73   unique */.    s
d1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d1d0: 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 43 6f 6e 66  Int(v, OP_NoConf
d1e0: 6c 69 63 74 2c 20 69 54 68 69 73 43 75 72 2c 20  lict, iThisCur, 
d1f0: 61 64 64 72 55 6e 69 71 75 65 4f 6b 2c 0a 20 20  addrUniqueOk,.  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 20 20 72 65 67 49 64 78 2c 20 70         regIdx, p
d220: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  Idx->nKeyCol); V
d230: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d240: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
d250: 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
d260: 63 6f 6c 6c 69 73 69 6f 6e 73 20 2a 2f 0a 20 20  collisions */.  
d270: 20 20 72 65 67 52 20 3d 20 28 70 49 64 78 3d 3d    regR = (pIdx==
d280: 70 50 6b 29 20 3f 20 72 65 67 49 64 78 20 3a 20  pPk) ? regIdx : 
d290: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
d2a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 6b 46  nge(pParse, nPkF
d2b0: 69 65 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 69  ield);.    if( i
d2c0: 73 55 70 64 61 74 65 20 7c 7c 20 6f 6e 45 72 72  sUpdate || onErr
d2d0: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
d2e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
d2f0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
d300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d310: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
d320: 78 52 6f 77 69 64 2c 20 69 54 68 69 73 43 75 72  xRowid, iThisCur
d330: 2c 20 72 65 67 52 29 3b 0a 20 20 20 20 20 20 20  , regR);.       
d340: 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 6f 6e 6c   /* Conflict onl
d350: 79 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 6f  y if the rowid o
d360: 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 69  f the existing i
d370: 6e 64 65 78 20 65 6e 74 72 79 0a 20 20 20 20 20  ndex entry.     
d380: 20 20 20 2a 2a 20 69 73 20 64 69 66 66 65 72 65     ** is differe
d390: 6e 74 20 66 72 6f 6d 20 6f 6c 64 2d 72 6f 77 69  nt from old-rowi
d3a0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  d */.        if(
d3b0: 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20   isUpdate ){.   
d3c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d3d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
d3e0: 71 2c 20 72 65 67 52 2c 20 61 64 64 72 55 6e 69  q, regR, addrUni
d3f0: 71 75 65 4f 6b 2c 20 72 65 67 4f 6c 64 44 61 74  queOk, regOldDat
d400: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  a);.          sq
d410: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d420: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54 4e  5(v, SQLITE_NOTN
d430: 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
d440: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d470: 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 20 20 2f  int x;.        /
d480: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 50 52  * Extract the PR
d490: 49 4d 41 52 59 20 4b 45 59 20 66 72 6f 6d 20 74  IMARY KEY from t
d4a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
d4b0: 64 65 78 20 65 6e 74 72 79 20 61 6e 64 0a 20 20  dex entry and.  
d4c0: 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
d4d0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 72  t in registers r
d4e0: 65 67 52 2e 2e 72 65 67 52 2b 6e 50 6b 2d 31 20  egR..regR+nPk-1 
d4f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
d500: 49 64 78 21 3d 70 50 6b 20 29 7b 0a 20 20 20 20  Idx!=pPk ){.    
d510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d520: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
d530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
d540: 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
d550: 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20  mnOfIndex(pIdx, 
d560: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
d570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
d580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d590: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
d5a0: 54 68 69 73 43 75 72 2c 20 78 2c 20 72 65 67 52  ThisCur, x, regR
d5b0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
d5c0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
d5d0: 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
d5e0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
d610: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61  aiColumn[i]].zNa
d620: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
d630: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
d640: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
d650: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
d660: 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72   If currently pr
d670: 6f 63 65 73 73 69 6e 67 20 74 68 65 20 50 52 49  ocessing the PRI
d680: 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 20 57 49  MARY KEY of a WI
d690: 54 48 4f 55 54 20 52 4f 57 49 44 20 0a 20 20 20  THOUT ROWID .   
d6a0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c         ** table,
d6b0: 20 6f 6e 6c 79 20 63 6f 6e 66 6c 69 63 74 20 69   only conflict i
d6c0: 66 20 74 68 65 20 6e 65 77 20 50 52 49 4d 41 52  f the new PRIMAR
d6d0: 59 20 4b 45 59 20 76 61 6c 75 65 73 20 61 72 65  Y KEY values are
d6e0: 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 20 20   actually.      
d6f0: 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74      ** different
d700: 20 66 72 6f 6d 20 74 68 65 20 6f 6c 64 2e 0a 20   from the old.. 
d710: 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
d720: 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 55        ** For a U
d730: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 6f 6e 6c  NIQUE index, onl
d740: 79 20 63 6f 6e 66 6c 69 63 74 20 69 66 20 74 68  y conflict if th
d750: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 76 61  e PRIMARY KEY va
d760: 6c 75 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lues.          *
d770: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 65 64  * of the matched
d780: 20 69 6e 64 65 78 20 72 6f 77 20 61 72 65 20 64   index row are d
d790: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
d7a0: 65 20 6f 72 69 67 69 6e 61 6c 20 50 52 49 4d 41  e original PRIMA
d7b0: 52 59 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  RY.          ** 
d7c0: 4b 45 59 20 76 61 6c 75 65 73 20 6f 66 20 74 68  KEY values of th
d7d0: 69 73 20 72 6f 77 20 62 65 66 6f 72 65 20 74 68  is row before th
d7e0: 65 20 75 70 64 61 74 65 2e 20 20 2a 2f 0a 20 20  e update.  */.  
d7f0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
d800: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
d810: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d820: 2b 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  +pPk->nKeyCol;. 
d830: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
d840: 3d 20 4f 50 5f 4e 65 3b 0a 20 20 20 20 20 20 20  = OP_Ne;.       
d850: 20 20 20 69 6e 74 20 72 65 67 43 6d 70 20 3d 20     int regCmp = 
d860: 28 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  (IsPrimaryKeyInd
d870: 65 78 28 70 49 64 78 29 20 3f 20 72 65 67 49 64  ex(pIdx) ? regId
d880: 78 20 3a 20 72 65 67 52 29 3b 0a 20 20 0a 20 20  x : regR);.  .  
d890: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d8a0: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
d8b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d8c0: 20 20 20 63 68 61 72 20 2a 70 34 20 3d 20 28 63     char *p4 = (c
d8d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 4c 6f 63 61  har*)sqlite3Loca
d8e0: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
d8f0: 2c 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  , pPk->azColl[i]
d900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  );.            x
d910: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
d920: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
d930: 20 69 66 28 20 69 3d 3d 28 70 50 6b 2d 3e 6e 4b   if( i==(pPk->nK
d940: 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20 20 20 20  eyCol-1) ){.    
d950: 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4a 75            addrJu
d960: 6d 70 20 3d 20 61 64 64 72 55 6e 69 71 75 65 4f  mp = addrUniqueO
d970: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
d980: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 0a 20 20 20   op = OP_Eq;.   
d990: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9b0: 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d9d0: 20 72 65 67 4f 6c 64 44 61 74 61 2b 31 2b 78 2c   regOldData+1+x,
d9e0: 20 61 64 64 72 4a 75 6d 70 2c 20 72 65 67 43 6d   addrJump, regCm
d9f0: 70 2b 69 2c 20 70 34 2c 20 50 34 5f 43 4f 4c 4c  p+i, p4, P4_COLL
da00: 53 45 51 0a 20 20 20 20 20 20 20 20 20 20 20 20  SEQ.            
da10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
da20: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
da30: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 4f 54  P5(v, SQLITE_NOT
da40: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20  NULL);.         
da50: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
da60: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 29 3b  f(v, op==OP_Eq);
da70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
da80: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
da90: 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20  p==OP_Ne);.     
daa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
dab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
dac0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
dad0: 63 6f 64 65 20 74 68 61 74 20 65 78 65 63 75 74  code that execut
dae0: 65 73 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e  es if the new in
daf0: 64 65 78 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  dex entry is not
db00: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 61   unique */.    a
db10: 73 73 65 72 74 28 20 6f 6e 45 72 72 6f 72 3d 3d  ssert( onError==
db20: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 6f  OE_Rollback || o
db30: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
db40: 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f   || onError==OE_
db50: 46 61 69 6c 0a 20 20 20 20 20 20 20 20 7c 7c 20  Fail.        || 
db60: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f  onError==OE_Igno
db70: 72 65 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f  re || onError==O
db80: 45 5f 52 65 70 6c 61 63 65 20 29 3b 0a 20 20 20  E_Replace );.   
db90: 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72   switch( onError
dba0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
dbb0: 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  E_Rollback:.    
dbc0: 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a    case OE_Abort:
dbd0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46  .      case OE_F
dbe0: 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ail: {.        s
dbf0: 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
dc00: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f  traint(pParse, o
dc10: 6e 45 72 72 6f 72 2c 20 70 49 64 78 29 3b 0a 20  nError, pIdx);. 
dc20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dc30: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
dc40: 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20   OE_Ignore: {.  
dc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
dc70: 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73  to, 0, ignoreDes
dc80: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
dc90: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
dca0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
dcb0: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
dcc0: 69 67 67 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  igger = 0;.     
dcd0: 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45 72 72     assert( onErr
dce0: 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or==OE_Replace )
dcf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dd00: 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72  3MultiWrite(pPar
dd10: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
dd20: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
dd30: 45 5f 52 65 63 54 72 69 67 67 65 72 73 20 29 7b  E_RecTriggers ){
dd40: 0a 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67  .          pTrig
dd50: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
dd60: 67 67 65 72 73 45 78 69 73 74 28 70 50 61 72 73  ggersExist(pPars
dd70: 65 2c 20 70 54 61 62 2c 20 54 4b 5f 44 45 4c 45  e, pTab, TK_DELE
dd80: 54 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  TE, 0, 0);.     
dd90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
dda0: 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44  ite3GenerateRowD
ddb0: 65 6c 65 74 65 28 70 50 61 72 73 65 2c 20 70 54  elete(pParse, pT
ddc0: 61 62 2c 20 70 54 72 69 67 67 65 72 2c 20 69 44  ab, pTrigger, iD
ddd0: 61 74 61 43 75 72 2c 20 69 49 64 78 43 75 72 2c  ataCur, iIdxCur,
dde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 72 65 67 52 2c 20 6e 50 6b 46 69 65 6c 64    regR, nPkField
de10: 2c 20 30 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  , 0, OE_Replace,
de20: 20 70 49 64 78 3d 3d 70 50 6b 29 3b 0a 20 20 20   pIdx==pPk);.   
de30: 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61 63 65       seenReplace
de40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
de50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
de60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
de70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
de80: 2c 20 61 64 64 72 55 6e 69 71 75 65 4f 6b 29 3b  , addrUniqueOk);
de90: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
dea0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
deb0: 72 73 65 2c 20 72 65 67 49 64 78 2c 20 70 49 64  rse, regIdx, pId
dec0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  x->nColumn);.   
ded0: 20 69 66 28 20 72 65 67 52 21 3d 72 65 67 49 64   if( regR!=regId
dee0: 78 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61  x ) sqlite3Relea
def0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
df00: 73 65 2c 20 72 65 67 52 2c 20 6e 50 6b 46 69 65  se, regR, nPkFie
df10: 6c 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ld);.  }.  if( i
df20: 70 6b 54 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c  pkTop ){.    sql
df30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
df40: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 70  , OP_Goto, 0, ip
df50: 6b 54 6f 70 2b 31 29 3b 0a 20 20 20 20 73 71 6c  kTop+1);.    sql
df60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
df70: 28 76 2c 20 69 70 6b 42 6f 74 74 6f 6d 29 3b 0a  (v, ipkBottom);.
df80: 20 20 7d 0a 20 20 0a 20 20 2a 70 62 4d 61 79 52    }.  .  *pbMayR
df90: 65 70 6c 61 63 65 20 3d 20 73 65 65 6e 52 65 70  eplace = seenRep
dfa0: 6c 61 63 65 3b 0a 20 20 56 64 62 65 4d 6f 64 75  lace;.  VdbeModu
dfb0: 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
dfc0: 4e 44 3a 20 47 65 6e 43 6e 73 74 43 6b 73 28 25  ND: GenCnstCks(%
dfd0: 64 29 22 2c 20 73 65 65 6e 52 65 70 6c 61 63 65  d)", seenReplace
dfe0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
dff0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
e000: 74 65 73 20 63 6f 64 65 20 74 6f 20 66 69 6e 69  tes code to fini
e010: 73 68 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72  sh the INSERT or
e020: 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
e030: 6e 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 73 74  n.** that was st
e040: 61 72 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  arted by a prior
e050: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
e060: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
e070: 6e 74 43 68 65 63 6b 73 2e 0a 2a 2a 20 41 20 63  ntChecks..** A c
e080: 6f 6e 73 65 63 75 74 69 76 65 20 72 61 6e 67 65  onsecutive range
e090: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
e0a0: 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77  arting at regNew
e0b0: 44 61 74 61 20 63 6f 6e 74 61 69 6e 73 20 74 68  Data contains th
e0c0: 65 0a 2a 2a 20 72 6f 77 69 64 20 61 6e 64 20 74  e.** rowid and t
e0d0: 68 65 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65  he content to be
e0e0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
e0f0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   The arguments t
e100: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
e110: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d  hould be the sam
e120: 65 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  e as the first s
e130: 69 78 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  ix.** arguments 
e140: 74 6f 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  to sqlite3Genera
e150: 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
e160: 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ks..*/.void sqli
e170: 74 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  te3CompleteInser
e180: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
e190: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54  Parse,      /* T
e1a0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
e1b0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
e1c0: 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ab,        /* th
e1d0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69  e table into whi
e1e0: 63 68 20 77 65 20 61 72 65 20 69 6e 73 65 72 74  ch we are insert
e1f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 44 61  ing */.  int iDa
e200: 74 61 43 75 72 2c 20 20 20 20 20 20 20 2f 2a 20  taCur,       /* 
e210: 43 75 72 73 6f 72 20 6f 66 20 74 68 65 20 63 61  Cursor of the ca
e220: 6e 6f 6e 69 63 61 6c 20 64 61 74 61 20 73 6f 75  nonical data sou
e230: 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  rce */.  int iId
e240: 78 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  xCur,        /* 
e250: 46 69 72 73 74 20 69 6e 64 65 78 20 63 75 72 73  First index curs
e260: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e  or */.  int regN
e270: 65 77 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 52  ewData,     /* R
e280: 61 6e 67 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ange of content 
e290: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 65 67 49 64  */.  int *aRegId
e2a0: 78 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  x,       /* Regi
e2b0: 73 74 65 72 20 75 73 65 64 20 62 79 20 65 61 63  ster used by eac
e2c0: 68 20 69 6e 64 65 78 2e 20 20 30 20 66 6f 72 20  h index.  0 for 
e2d0: 75 6e 75 73 65 64 20 69 6e 64 69 63 65 73 20 2a  unused indices *
e2e0: 2f 0a 20 20 69 6e 74 20 69 73 55 70 64 61 74 65  /.  int isUpdate
e2f0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
e300: 66 6f 72 20 55 50 44 41 54 45 2c 20 46 61 6c 73  for UPDATE, Fals
e310: 65 20 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f 0a  e for INSERT */.
e320: 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
e330: 2c 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ,     /* True if
e340: 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
e350: 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 20  to be an append 
e360: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 53 65 65 6b  */.  int useSeek
e370: 52 65 73 75 6c 74 20 20 20 2f 2a 20 54 72 75 65  Result   /* True
e380: 20 74 6f 20 73 65 74 20 74 68 65 20 55 53 45 53   to set the USES
e390: 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
e3a0: 6e 20 4f 50 5f 5b 49 64 78 5d 49 6e 73 65 72 74  n OP_[Idx]Insert
e3b0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
e3c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e3d0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
e3e0: 6e 74 73 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  nts under constr
e3f0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
e400: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
e410: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 62 65 69 6e  /* An index bein
e420: 67 20 69 6e 73 65 72 74 65 64 20 6f 72 20 75 70  g inserted or up
e430: 64 61 74 65 64 20 2a 2f 0a 20 20 75 38 20 70 69  dated */.  u8 pi
e440: 6b 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  k_flags;       /
e450: 2a 20 66 6c 61 67 20 76 61 6c 75 65 73 20 70 61  * flag values pa
e460: 73 73 65 64 20 74 6f 20 74 68 65 20 62 74 72 65  ssed to the btre
e470: 65 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e  e insert */.  in
e480: 74 20 72 65 67 44 61 74 61 3b 20 20 20 20 20 20  t regData;      
e490: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 72 65 67    /* Content reg
e4a0: 69 73 74 65 72 73 20 28 61 66 74 65 72 20 74 68  isters (after th
e4b0: 65 20 72 6f 77 69 64 29 20 2a 2f 0a 20 20 69 6e  e rowid) */.  in
e4c0: 74 20 72 65 67 52 65 63 3b 20 20 20 20 20 20 20  t regRec;       
e4d0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
e4e0: 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64  lding assemblied
e4f0: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
e500: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
e510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e520: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e530: 2f 0a 20 20 75 38 20 62 41 66 66 69 6e 69 74 79  /.  u8 bAffinity
e540: 44 6f 6e 65 20 3d 20 30 3b 20 2f 2a 20 54 72 75  Done = 0; /* Tru
e550: 65 20 69 66 20 4f 50 5f 41 66 66 69 6e 69 74 79  e if OP_Affinity
e560: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 20 61 6c   has been run al
e570: 72 65 61 64 79 20 2a 2f 0a 0a 20 20 76 20 3d 20  ready */..  v = 
e580: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e590: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
e5a0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
e5b0: 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  rt( pTab->pSelec
e5c0: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69 73  t==0 );  /* This
e5d0: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
e5e0: 56 49 45 57 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  VIEW */.  for(i=
e5f0: 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  0, pIdx=pTab->pI
e600: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
e610: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 2b  =pIdx->pNext, i+
e620: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 65 67  +){.    if( aReg
e630: 49 64 78 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  Idx[i]==0 ) cont
e640: 69 6e 75 65 3b 0a 20 20 20 20 62 41 66 66 69 6e  inue;.    bAffin
e650: 69 74 79 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  ityDone = 1;.   
e660: 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
e670: 49 64 78 57 68 65 72 65 20 29 7b 0a 20 20 20 20  IdxWhere ){.    
e680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e690: 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
e6a0: 2c 20 61 52 65 67 49 64 78 5b 69 5d 2c 20 73 71  , aRegIdx[i], sq
e6b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
e6c0: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20  Addr(v)+2);.    
e6d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
e6e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
e6f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e700: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
e710: 69 49 64 78 43 75 72 2b 69 2c 20 61 52 65 67 49  iIdxCur+i, aRegI
e720: 64 78 5b 69 5d 29 3b 0a 20 20 20 20 70 69 6b 5f  dx[i]);.    pik_
e730: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 69  flags = 0;.    i
e740: 66 28 20 75 73 65 53 65 65 6b 52 65 73 75 6c 74  f( useSeekResult
e750: 20 29 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 4f   ) pik_flags = O
e760: 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
e770: 55 4c 54 3b 0a 20 20 20 20 69 66 28 20 49 73 50  ULT;.    if( IsP
e780: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
e790: 49 64 78 29 20 26 26 20 21 48 61 73 52 6f 77 69  Idx) && !HasRowi
e7a0: 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
e7b0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
e7c0: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 3b 0a 20 20  >nested==0 );.  
e7d0: 20 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 7c 3d      pik_flags |=
e7e0: 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 3b   OPFLAG_NCHANGE;
e7f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e800: 69 6b 5f 66 6c 61 67 73 20 29 20 20 73 71 6c 69  ik_flags )  sqli
e810: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
e820: 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 20  v, pik_flags);. 
e830: 20 7d 0a 20 20 69 66 28 20 21 48 61 73 52 6f 77   }.  if( !HasRow
e840: 69 64 28 70 54 61 62 29 20 29 20 72 65 74 75 72  id(pTab) ) retur
e850: 6e 3b 0a 20 20 72 65 67 44 61 74 61 20 3d 20 72  n;.  regData = r
e860: 65 67 4e 65 77 44 61 74 61 20 2b 20 31 3b 0a 20  egNewData + 1;. 
e870: 20 72 65 67 52 65 63 20 3d 20 73 71 6c 69 74 65   regRec = sqlite
e880: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
e890: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
e8a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
e8b0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 44 61  akeRecord, regDa
e8c0: 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  ta, pTab->nCol, 
e8d0: 72 65 67 52 65 63 29 3b 0a 20 20 69 66 28 20 21  regRec);.  if( !
e8e0: 62 41 66 66 69 6e 69 74 79 44 6f 6e 65 20 29 20  bAffinityDone ) 
e8f0: 73 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69  sqlite3TableAffi
e900: 6e 69 74 79 28 76 2c 20 70 54 61 62 2c 20 30 29  nity(v, pTab, 0)
e910: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
e920: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
e930: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ge(pParse, regDa
e940: 74 61 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b  ta, pTab->nCol);
e950: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
e960: 65 73 74 65 64 20 29 7b 0a 20 20 20 20 70 69 6b  ested ){.    pik
e970: 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  _flags = 0;.  }e
e980: 6c 73 65 7b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  lse{.    pik_fla
e990: 67 73 20 3d 20 4f 50 46 4c 41 47 5f 4e 43 48 41  gs = OPFLAG_NCHA
e9a0: 4e 47 45 3b 0a 20 20 20 20 70 69 6b 5f 66 6c 61  NGE;.    pik_fla
e9b0: 67 73 20 7c 3d 20 28 69 73 55 70 64 61 74 65 3f  gs |= (isUpdate?
e9c0: 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 3a  OPFLAG_ISUPDATE:
e9d0: 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44  OPFLAG_LASTROWID
e9e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 70  );.  }.  if( app
e9f0: 65 6e 64 42 69 61 73 20 29 7b 0a 20 20 20 20 70  endBias ){.    p
ea00: 69 6b 5f 66 6c 61 67 73 20 7c 3d 20 4f 50 46 4c  ik_flags |= OPFL
ea10: 41 47 5f 41 50 50 45 4e 44 3b 0a 20 20 7d 0a 20  AG_APPEND;.  }. 
ea20: 20 69 66 28 20 75 73 65 53 65 65 6b 52 65 73 75   if( useSeekResu
ea30: 6c 74 20 29 7b 0a 20 20 20 20 70 69 6b 5f 66 6c  lt ){.    pik_fl
ea40: 61 67 73 20 7c 3d 20 4f 50 46 4c 41 47 5f 55 53  ags |= OPFLAG_US
ea50: 45 53 45 45 4b 52 45 53 55 4c 54 3b 0a 20 20 7d  ESEEKRESULT;.  }
ea60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ea70: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
ea80: 74 2c 20 69 44 61 74 61 43 75 72 2c 20 72 65 67  t, iDataCur, reg
ea90: 52 65 63 2c 20 72 65 67 4e 65 77 44 61 74 61 29  Rec, regNewData)
eaa0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
eab0: 3e 6e 65 73 74 65 64 20 29 7b 0a 20 20 20 20 73  >nested ){.    s
eac0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ead0: 50 34 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P4(v, -1, pTab->
eae0: 7a 4e 61 6d 65 2c 20 50 34 5f 54 52 41 4e 53 49  zName, P4_TRANSI
eaf0: 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ENT);.  }.  sqli
eb00: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
eb10: 76 2c 20 70 69 6b 5f 66 6c 61 67 73 29 3b 0a 7d  v, pik_flags);.}
eb20: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
eb30: 20 63 75 72 73 6f 72 73 20 66 6f 72 20 74 68 65   cursors for the
eb40: 20 70 54 61 62 20 74 61 62 6c 65 20 61 6e 64 20   pTab table and 
eb50: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
eb60: 61 6e 64 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20  and generate.** 
eb70: 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 61 6e 64  code to open and
eb80: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 6f   initialized tho
eb90: 73 65 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  se cursors..**.*
eba0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66 6f 72  * The cursor for
ebb0: 20 74 68 65 20 6f 62 6a 65 63 74 20 74 68 61 74   the object that
ebc0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
ebd0: 6d 70 6c 65 74 65 20 64 61 74 61 20 28 6e 6f 72  mplete data (nor
ebe0: 6d 61 6c 6c 79 0a 2a 2a 20 74 68 65 20 74 61 62  mally.** the tab
ebf0: 6c 65 20 69 74 73 65 6c 66 2c 20 62 75 74 20 74  le itself, but t
ec00: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
ec10: 6e 64 65 78 20 69 6e 20 74 68 65 20 63 61 73 65  ndex in the case
ec20: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 0a 2a 2a   of a WITHOUT.**
ec30: 20 52 4f 57 49 44 20 74 61 62 6c 65 29 20 69 73   ROWID table) is
ec40: 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 69   returned in *pi
ec50: 44 61 74 61 43 75 72 2e 20 20 54 68 65 20 66 69  DataCur.  The fi
ec60: 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72  rst index cursor
ec70: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
ec80: 69 6e 20 2a 70 69 49 64 78 43 75 72 2e 20 20 54  in *piIdxCur.  T
ec90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  he number of ind
eca0: 69 63 65 73 20 69 73 20 72 65 74 75 72 6e 65 64  ices is returned
ecb0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 69 42 61 73  ..**.** Use iBas
ecc0: 65 20 61 73 20 74 68 65 20 66 69 72 73 74 20 63  e as the first c
ecd0: 75 72 73 6f 72 20 28 65 69 74 68 65 72 20 74 68  ursor (either th
ece0: 65 20 2a 70 69 44 61 74 61 43 75 72 20 66 6f 72  e *piDataCur for
ecf0: 20 72 6f 77 69 64 20 74 61 62 6c 65 73 0a 2a 2a   rowid tables.**
ed00: 20 6f 72 20 74 68 65 20 66 69 72 73 74 20 69 6e   or the first in
ed10: 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
ed20: 52 4f 57 49 44 20 74 61 62 6c 65 73 29 20 69 66  ROWID tables) if
ed30: 20 69 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74   it is non-negat
ed40: 69 76 65 2e 0a 2a 2a 20 49 66 20 69 42 61 73 65  ive..** If iBase
ed50: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
ed60: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  en allocate the 
ed70: 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 63  next available c
ed80: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
ed90: 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2c 20   a rowid table, 
eda0: 2a 70 69 44 61 74 61 43 75 72 20 77 69 6c 6c 20  *piDataCur will 
edb0: 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6c  be exactly one l
edc0: 65 73 73 20 74 68 61 6e 20 2a 70 69 49 64 78 43  ess than *piIdxC
edd0: 75 72 2e 0a 2a 2a 20 46 6f 72 20 61 20 57 49 54  ur..** For a WIT
ede0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
edf0: 2c 20 2a 70 69 44 61 74 61 43 75 72 20 77 69 6c  , *piDataCur wil
ee00: 6c 20 62 65 20 73 6f 6d 65 77 68 65 72 65 20 69  l be somewhere i
ee10: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 6f  n the range.** o
ee20: 66 20 2a 70 69 49 64 78 43 75 72 73 2c 20 64 65  f *piIdxCurs, de
ee30: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 72 65  pending on where
ee40: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
ee50: 20 69 6e 64 65 78 20 61 70 70 65 61 72 73 20 6f   index appears o
ee60: 6e 20 74 68 65 0a 2a 2a 20 70 54 61 62 2d 3e 70  n the.** pTab->p
ee70: 49 6e 64 65 78 20 6c 69 73 74 2e 0a 2a 2f 0a 69  Index list..*/.i
ee80: 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  nt sqlite3OpenTa
ee90: 62 6c 65 41 6e 64 49 6e 64 69 63 65 73 28 0a 20  bleAndIndices(. 
eea0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
eeb0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
eec0: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
eed0: 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 54 61  *pTab,     /* Ta
eee0: 62 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ble to be opened
eef0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
ef00: 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70 65         /* OP_Ope
ef10: 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e  nRead or OP_Open
ef20: 57 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  Write */.  int i
ef30: 42 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 55  Base,       /* U
ef40: 73 65 20 74 68 69 73 20 66 6f 72 20 74 68 65 20  se this for the 
ef50: 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
ef60: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 2a 2f   there is one */
ef70: 0a 20 20 75 38 20 2a 61 54 6f 4f 70 65 6e 2c 20  .  u8 *aToOpen, 
ef80: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
ef90: 4c 4c 3a 20 62 6f 6f 6c 65 61 6e 20 66 6f 72 20  LL: boolean for 
efa0: 65 61 63 68 20 74 61 62 6c 65 20 61 6e 64 20 69  each table and i
efb0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
efc0: 69 44 61 74 61 43 75 72 2c 20 20 2f 2a 20 57 72  iDataCur,  /* Wr
efd0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
efe0: 20 73 6f 75 72 63 65 20 63 75 72 73 6f 72 20 6e   source cursor n
eff0: 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
f000: 69 6e 74 20 2a 70 69 49 64 78 43 75 72 20 20 20  int *piIdxCur   
f010: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
f020: 72 73 74 20 69 6e 64 65 78 20 63 75 72 73 6f 72  rst index cursor
f030: 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
f040: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
f050: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 44 61  t iDb;.  int iDa
f060: 74 61 43 75 72 3b 0a 20 20 49 6e 64 65 78 20 2a  taCur;.  Index *
f070: 70 49 64 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pIdx;.  Vdbe *v;
f080: 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
f090: 4f 50 5f 4f 70 65 6e 52 65 61 64 20 7c 7c 20 6f  OP_OpenRead || o
f0a0: 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  p==OP_OpenWrite 
f0b0: 29 3b 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  );.  if( IsVirtu
f0c0: 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
f0d0: 61 73 73 65 72 74 28 20 61 54 6f 4f 70 65 6e 3d  assert( aToOpen=
f0e0: 3d 30 20 29 3b 0a 20 20 20 20 2a 70 69 44 61 74  =0 );.    *piDat
f0f0: 61 43 75 72 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCur = 0;.    *p
f100: 69 49 64 78 43 75 72 20 3d 20 31 3b 0a 20 20 20  iIdxCur = 1;.   
f110: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f120: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
f130: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
f140: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
f150: 63 68 65 6d 61 29 3b 0a 20 20 76 20 3d 20 73 71  chema);.  v = sq
f160: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f170: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
f180: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 42  v!=0 );.  if( iB
f190: 61 73 65 3c 30 20 29 20 69 42 61 73 65 20 3d 20  ase<0 ) iBase = 
f1a0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
f1b0: 69 44 61 74 61 43 75 72 20 3d 20 69 42 61 73 65  iDataCur = iBase
f1c0: 2b 2b 3b 0a 20 20 69 66 28 20 70 69 44 61 74 61  ++;.  if( piData
f1d0: 43 75 72 20 29 20 2a 70 69 44 61 74 61 43 75 72  Cur ) *piDataCur
f1e0: 20 3d 20 69 44 61 74 61 43 75 72 3b 0a 20 20 69   = iDataCur;.  i
f1f0: 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
f200: 29 20 26 26 20 28 61 54 6f 4f 70 65 6e 3d 3d 30  ) && (aToOpen==0
f210: 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 30 5d 29 20   || aToOpen[0]) 
f220: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ){.    sqlite3Op
f230: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
f240: 69 44 61 74 61 43 75 72 2c 20 69 44 62 2c 20 70  iDataCur, iDb, p
f250: 54 61 62 2c 20 6f 70 29 3b 0a 20 20 7d 65 6c 73  Tab, op);.  }els
f260: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  e{.    sqlite3Ta
f270: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
f280: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
f290: 20 6f 70 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74   op==OP_OpenWrit
f2a0: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  e, pTab->zName);
f2b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 69 49 64 78  .  }.  if( piIdx
f2c0: 43 75 72 20 29 20 2a 70 69 49 64 78 43 75 72 20  Cur ) *piIdxCur 
f2d0: 3d 20 69 42 61 73 65 3b 0a 20 20 66 6f 72 28 69  = iBase;.  for(i
f2e0: 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70  =0, pIdx=pTab->p
f2f0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f300: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69  x=pIdx->pNext, i
f310: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  ++){.    int iId
f320: 78 43 75 72 20 3d 20 69 42 61 73 65 2b 2b 3b 0a  xCur = iBase++;.
f330: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f340: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
f350: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
f360: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
f370: 49 6e 64 65 78 28 70 49 64 78 29 20 26 26 20 21  Index(pIdx) && !
f380: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
f390: 26 20 70 69 44 61 74 61 43 75 72 20 29 7b 0a 20  & piDataCur ){. 
f3a0: 20 20 20 20 20 2a 70 69 44 61 74 61 43 75 72 20       *piDataCur 
f3b0: 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 7d  = iIdxCur;.    }
f3c0: 0a 20 20 20 20 69 66 28 20 61 54 6f 4f 70 65 6e  .    if( aToOpen
f3d0: 3d 3d 30 20 7c 7c 20 61 54 6f 4f 70 65 6e 5b 69  ==0 || aToOpen[i
f3e0: 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  +1] ){.      sql
f3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f400: 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 70  , op, iIdxCur, p
f410: 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
f420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f430: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
f440: 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20  Parse, pIdx);.  
f450: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
f460: 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e  (v, "%s", pIdx->
f470: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
f480: 20 7d 0a 20 20 69 66 28 20 69 42 61 73 65 3e 70   }.  if( iBase>p
f490: 50 61 72 73 65 2d 3e 6e 54 61 62 20 29 20 70 50  Parse->nTab ) pP
f4a0: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 69 42 61  arse->nTab = iBa
f4b0: 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  se;.  return i;.
f4c0: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
f4d0: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65  E_TEST./*.** The
f4e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
f4f0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
f500: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
f510: 65 72 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 66  er the.** transf
f520: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
f530: 69 73 20 75 73 65 64 2e 20 20 54 68 69 73 20 69  is used.  This i
f540: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
f550: 6e 67 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 6f  ng.** purposes o
f560: 6e 6c 79 20 2d 20 74 6f 20 6d 61 6b 65 20 73 75  nly - to make su
f570: 72 65 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  re the transfer 
f580: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 65 61  optimization rea
f590: 6c 6c 79 0a 2a 2a 20 69 73 20 68 61 70 70 65 6e  lly.** is happen
f5a0: 69 6e 67 20 77 68 65 6e 20 69 74 20 69 73 20 73  ing when it is s
f5b0: 75 70 70 6f 73 65 20 74 6f 2e 0a 2a 2f 0a 69 6e  uppose to..*/.in
f5c0: 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  t sqlite3_xferop
f5d0: 74 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 20  t_count;.#endif 
f5e0: 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
f5f0: 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
f600: 54 45 5f 4f 4d 49 54 5f 58 46 45 52 5f 4f 50 54  TE_OMIT_XFER_OPT
f610: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
f620: 63 6f 6c 6c 61 74 69 6f 6e 20 6e 61 6d 65 73 20  collation names 
f630: 74 6f 20 73 65 65 20 69 66 20 74 68 65 79 20 61  to see if they a
f640: 72 65 20 63 6f 6d 70 61 74 69 62 6c 65 2e 0a 2a  re compatible..*
f650: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 78 66 65  /.static int xfe
f660: 72 43 6f 6d 70 61 74 69 62 6c 65 43 6f 6c 6c 61  rCompatibleColla
f670: 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
f680: 2a 7a 31 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *z1, const char 
f690: 2a 7a 32 29 7b 0a 20 20 69 66 28 20 7a 31 3d 3d  *z2){.  if( z1==
f6a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
f6b0: 7a 32 3d 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28  z2==0;.  }.  if(
f6c0: 20 7a 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   z2==0 ){.    re
f6d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
f6e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 49  turn sqlite3StrI
f6f0: 43 6d 70 28 7a 31 2c 20 7a 32 29 3d 3d 30 3b 0a  Cmp(z1, z2)==0;.
f700: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  }.../*.** Check 
f710: 74 6f 20 73 65 65 20 69 66 20 69 6e 64 65 78 20  to see if index 
f720: 70 53 72 63 20 69 73 20 63 6f 6d 70 61 74 69 62  pSrc is compatib
f730: 6c 65 20 61 73 20 61 20 73 6f 75 72 63 65 20 6f  le as a source o
f740: 66 20 64 61 74 61 0a 2a 2a 20 66 6f 72 20 69 6e  f data.** for in
f750: 64 65 78 20 70 44 65 73 74 20 69 6e 20 61 6e 20  dex pDest in an 
f760: 69 6e 73 65 72 74 20 74 72 61 6e 73 66 65 72 20  insert transfer 
f770: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
f780: 68 65 20 72 75 6c 65 73 0a 2a 2a 20 66 6f 72 20  he rules.** for 
f790: 61 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 64  a compatible ind
f7a0: 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ex:.**.**    *  
f7b0: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 6f 76   The index is ov
f7c0: 65 72 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  er the same set 
f7d0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20  of columns.**   
f7e0: 20 2a 20 20 20 54 68 65 20 73 61 6d 65 20 44 45   *   The same DE
f7f0: 53 43 20 61 6e 64 20 41 53 43 20 6d 61 72 6b 69  SC and ASC marki
f800: 6e 67 73 20 6f 63 63 75 72 73 20 6f 6e 20 61 6c  ngs occurs on al
f810: 6c 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20 20 20  l columns.**    
f820: 2a 20 20 20 54 68 65 20 73 61 6d 65 20 6f 6e 45  *   The same onE
f830: 72 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20  rror processing 
f840: 28 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67  (OE_Abort, OE_Ig
f850: 6e 6f 72 65 2c 20 65 74 63 29 0a 2a 2a 20 20 20  nore, etc).**   
f860: 20 2a 20 20 20 54 68 65 20 73 61 6d 65 20 63 6f   *   The same co
f870: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f880: 20 6f 6e 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a   on each column.
f890: 2a 2a 20 20 20 20 2a 20 20 20 54 68 65 20 69 6e  **    *   The in
f8a0: 64 65 78 20 68 61 73 20 74 68 65 20 65 78 61 63  dex has the exac
f8b0: 74 20 73 61 6d 65 20 57 48 45 52 45 20 63 6c 61  t same WHERE cla
f8c0: 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  use.*/.static in
f8d0: 74 20 78 66 65 72 43 6f 6d 70 61 74 69 62 6c 65  t xferCompatible
f8e0: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 44 65  Index(Index *pDe
f8f0: 73 74 2c 20 49 6e 64 65 78 20 2a 70 53 72 63 29  st, Index *pSrc)
f900: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
f910: 65 72 74 28 20 70 44 65 73 74 20 26 26 20 70 53  ert( pDest && pS
f920: 72 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rc );.  assert( 
f930: 70 44 65 73 74 2d 3e 70 54 61 62 6c 65 21 3d 70  pDest->pTable!=p
f940: 53 72 63 2d 3e 70 54 61 62 6c 65 20 29 3b 0a 20  Src->pTable );. 
f950: 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 4b 65 79   if( pDest->nKey
f960: 43 6f 6c 21 3d 70 53 72 63 2d 3e 6e 4b 65 79 43  Col!=pSrc->nKeyC
f970: 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ol ){.    return
f980: 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65 72 65   0;   /* Differe
f990: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  nt number of col
f9a0: 75 6d 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  umns */.  }.  if
f9b0: 28 20 70 44 65 73 74 2d 3e 6f 6e 45 72 72 6f 72  ( pDest->onError
f9c0: 21 3d 70 53 72 63 2d 3e 6f 6e 45 72 72 6f 72 20  !=pSrc->onError 
f9d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f9e0: 20 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20     /* Different 
f9f0: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
fa00: 69 6f 6e 20 73 74 72 61 74 65 67 69 65 73 20 2a  ion strategies *
fa10: 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  /.  }.  for(i=0;
fa20: 20 69 3c 70 53 72 63 2d 3e 6e 4b 65 79 43 6f 6c   i<pSrc->nKeyCol
fa30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
fa40: 70 53 72 63 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pSrc->aiColumn[i
fa50: 5d 21 3d 70 44 65 73 74 2d 3e 61 69 43 6f 6c 75  ]!=pDest->aiColu
fa60: 6d 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 72  mn[i] ){.      r
fa70: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69  eturn 0;   /* Di
fa80: 66 66 65 72 65 6e 74 20 63 6f 6c 75 6d 6e 73 20  fferent columns 
fa90: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 20 20 7d  indexed */.    }
faa0: 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
fab0: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 21 3d 70 44  SortOrder[i]!=pD
fac0: 65 73 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  est->aSortOrder[
fad0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  i] ){.      retu
fae0: 72 6e 20 30 3b 20 20 20 2f 2a 20 44 69 66 66 65  rn 0;   /* Diffe
faf0: 72 65 6e 74 20 73 6f 72 74 20 6f 72 64 65 72 73  rent sort orders
fb00: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
fb10: 28 20 21 78 66 65 72 43 6f 6d 70 61 74 69 62 6c  ( !xferCompatibl
fb20: 65 43 6f 6c 6c 61 74 69 6f 6e 28 70 53 72 63 2d  eCollation(pSrc-
fb30: 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 70 44 65 73 74  >azColl[i],pDest
fb40: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a  ->azColl[i]) ){.
fb50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
fb60: 20 20 2f 2a 20 44 69 66 66 65 72 65 6e 74 20 63    /* Different c
fb70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fb80: 65 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  es */.    }.  }.
fb90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
fba0: 72 43 6f 6d 70 61 72 65 28 70 53 72 63 2d 3e 70  rCompare(pSrc->p
fbb0: 50 61 72 74 49 64 78 57 68 65 72 65 2c 20 70 44  PartIdxWhere, pD
fbc0: 65 73 74 2d 3e 70 50 61 72 74 49 64 78 57 68 65  est->pPartIdxWhe
fbd0: 72 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 72  re, -1) ){.    r
fbe0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
fbf0: 44 69 66 66 65 72 65 6e 74 20 57 48 45 52 45 20  Different WHERE 
fc00: 63 6c 61 75 73 65 73 20 2a 2f 0a 20 20 7d 0a 0a  clauses */.  }..
fc10: 20 20 2f 2a 20 49 66 20 6e 6f 20 74 65 73 74 20    /* If no test 
fc20: 61 62 6f 76 65 20 66 61 69 6c 73 20 74 68 65 6e  above fails then
fc30: 20 74 68 65 20 69 6e 64 69 63 65 73 20 6d 75 73   the indices mus
fc40: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
fc50: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
fc60: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
fc70: 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74  the transfer opt
fc80: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 20 49 4e 53  imization on INS
fc90: 45 52 54 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ERTs of the form
fca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 4e 53 45 52  .**.**     INSER
fcb0: 54 20 49 4e 54 4f 20 74 61 62 31 20 53 45 4c 45  T INTO tab1 SELE
fcc0: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 32 3b 0a  CT * FROM tab2;.
fcd0: 2a 2a 0a 2a 2a 20 54 68 65 20 78 66 65 72 20 6f  **.** The xfer o
fce0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 72 61 6e  ptimization tran
fcf0: 73 66 65 72 73 20 72 61 77 20 72 65 63 6f 72 64  sfers raw record
fd00: 73 20 66 72 6f 6d 20 74 61 62 32 20 6f 76 65 72  s from tab2 over
fd10: 20 74 6f 20 74 61 62 31 2e 20 20 0a 2a 2a 20 43   to tab1.  .** C
fd20: 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 64  olumns are not d
fd30: 65 63 6f 64 65 64 20 61 6e 64 20 72 65 61 73 73  ecoded and reass
fd40: 65 6d 62 6c 69 65 64 2c 20 77 68 69 63 68 20 67  emblied, which g
fd50: 72 65 61 74 6c 79 20 69 6d 70 72 6f 76 65 73 0a  reatly improves.
fd60: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  ** performance. 
fd70: 20 52 61 77 20 69 6e 64 65 78 20 72 65 63 6f 72   Raw index recor
fd80: 64 73 20 61 72 65 20 74 72 61 6e 73 66 65 72 72  ds are transferr
fd90: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
fda0: 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 66  ay..**.** The xf
fdb0: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
fdc0: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
fdd0: 64 20 69 66 20 74 61 62 31 20 61 6e 64 20 74 61  d if tab1 and ta
fde0: 62 32 20 61 72 65 20 63 6f 6d 70 61 74 69 62 6c  b2 are compatibl
fdf0: 65 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  e..** There are 
fe00: 6c 6f 74 73 20 6f 66 20 72 75 6c 65 73 20 66 6f  lots of rules fo
fe10: 72 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 63 6f  r determining co
fe20: 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 73 65  mpatibility - se
fe30: 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 65 6d  e comments.** em
fe40: 62 65 64 64 65 64 20 69 6e 20 74 68 65 20 63 6f  bedded in the co
fe50: 64 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  de for details..
fe60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
fe70: 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ne returns TRUE 
fe80: 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
fe90: 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
fea0: 64 20 74 6f 20 62 65 20 75 73 65 64 2e 0a 2a 2a  d to be used..**
feb0: 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 78   Sometimes the x
fec0: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
fed0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20   will only work 
fee0: 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  if the destinati
fef0: 6f 6e 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 65  on table.** is e
ff00: 6d 70 74 79 20 2d 20 61 20 66 61 63 74 6f 72 20  mpty - a factor 
ff10: 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65  that can only be
ff20: 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
ff30: 75 6e 2d 74 69 6d 65 2e 20 20 49 6e 20 74 68 61  un-time.  In tha
ff40: 74 0a 2a 2a 20 63 61 73 65 2c 20 74 68 69 73 20  t.** case, this 
ff50: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
ff60: 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 78  s code for the x
ff70: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
ff80: 20 62 75 74 20 61 6c 73 6f 0a 2a 2a 20 64 6f 65   but also.** doe
ff90: 73 20 61 20 74 65 73 74 20 74 6f 20 73 65 65 20  s a test to see 
ffa0: 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  if the destinati
ffb0: 6f 6e 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  on table is empt
ffc0: 79 20 61 6e 64 20 6a 75 6d 70 73 20 6f 76 65 72  y and jumps over
ffd0: 20 74 68 65 0a 2a 2a 20 78 66 65 72 20 6f 70 74   the.** xfer opt
ffe0: 69 6d 69 7a 61 74 69 6f 6e 20 63 6f 64 65 20 69  imization code i
fff0: 66 20 74 68 65 20 74 65 73 74 20 66 61 69 6c 73  f the test fails
10000 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
10010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
10020 20 72 65 74 75 72 6e 73 20 46 41 4c 53 45 20 73   returns FALSE s
10030 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  o that the calle
10040 72 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f 20 67  r will know to g
10050 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 6e 65  o ahead and gene
10060 72 61 74 65 0a 2a 2a 20 61 6e 20 75 6e 6f 70 74  rate.** an unopt
10070 69 6d 69 7a 65 64 20 74 72 61 6e 73 66 65 72 2e  imized transfer.
10080 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
10090 6c 73 6f 20 72 65 74 75 72 6e 73 20 46 41 4c 53  lso returns FALS
100a0 45 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 69 73  E if there.** is
100b0 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
100c0 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69 7a  the xfer optimiz
100d0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 61 70 70  ation can be app
100e0 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lied..**.** This
100f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
10100 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 75 73   particularly us
10110 65 66 75 6c 20 61 74 20 6d 61 6b 69 6e 67 20 56  eful at making V
10120 41 43 55 55 4d 20 72 75 6e 20 66 61 73 74 65 72  ACUUM run faster
10130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10140 78 66 65 72 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  xferOptimization
10150 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10160 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
10170 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
10180 20 54 61 62 6c 65 20 2a 70 44 65 73 74 2c 20 20   Table *pDest,  
10190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
101a0 62 6c 65 20 77 65 20 61 72 65 20 69 6e 73 65 72  ble we are inser
101b0 74 69 6e 67 20 69 6e 74 6f 20 2a 2f 0a 20 20 53  ting into */.  S
101c0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
101d0 20 20 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54       /* A SELECT
101e0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 73   statement to us
101f0 65 20 61 73 20 74 68 65 20 64 61 74 61 20 73 6f  e as the data so
10200 75 72 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  urce */.  int on
10210 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
10220 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
10230 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
10240 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 44  rs */.  int iDbD
10250 65 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  est           /*
10260 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 66   The database of
10270 20 70 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 45   pDest */.){.  E
10280 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
102b0 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
102c0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 53 72 63  */.  Table *pSrc
102d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
102e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
102f0 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
10300 6c 61 75 73 65 20 6f 66 20 53 45 4c 45 43 54 20  lause of SELECT 
10310 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 53 72 63  */.  Index *pSrc
10320 49 64 78 2c 20 2a 70 44 65 73 74 49 64 78 3b 20  Idx, *pDestIdx; 
10330 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
10340 61 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  and destination 
10350 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 73 74 72  indices */.  str
10360 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
10370 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 2f 2a   *pItem;      /*
10380 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70   An element of p
10390 53 65 6c 65 63 74 2d 3e 70 53 72 63 20 2a 2f 0a  Select->pSrc */.
103a0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
103d0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 53  er */.  int iDbS
103e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
103f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10400 64 61 74 61 62 61 73 65 20 6f 66 20 70 53 72 63  database of pSrc
10410 20 2a 2f 0a 20 20 69 6e 74 20 69 53 72 63 2c 20   */.  int iSrc, 
10420 69 44 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  iDest;          
10430 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
10440 73 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 61 6e  s from source an
10450 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  d destination */
10460 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
10470 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
10480 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 61 64 64 72      /* Loop addr
10490 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65  esses */.  int e
104a0 6d 70 74 79 44 65 73 74 54 65 73 74 20 3d 20 30  mptyDestTest = 0
104b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
104c0 64 64 72 65 73 73 20 6f 66 20 74 65 73 74 20 66  ddress of test f
104d0 6f 72 20 65 6d 70 74 79 20 70 44 65 73 74 20 2a  or empty pDest *
104e0 2f 0a 20 20 69 6e 74 20 65 6d 70 74 79 53 72 63  /.  int emptySrc
104f0 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
10500 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10510 6f 66 20 74 65 73 74 20 66 6f 72 20 65 6d 70 74  of test for empt
10520 79 20 70 53 72 63 20 2a 2f 0a 20 20 56 64 62 65  y pSrc */.  Vdbe
10530 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10550 54 68 65 20 56 44 42 45 20 77 65 20 61 72 65 20  The VDBE we are 
10560 62 75 69 6c 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  building */.  in
10570 74 20 72 65 67 41 75 74 6f 69 6e 63 3b 20 20 20  t regAutoinc;   
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10590 2a 20 4d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  * Memory registe
105a0 72 20 75 73 65 64 20 62 79 20 41 55 54 4f 49 4e  r used by AUTOIN
105b0 43 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 48  C */.  int destH
105c0 61 73 55 6e 69 71 75 65 49 64 78 20 3d 20 30 3b  asUniqueIdx = 0;
105d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
105e0 69 66 20 70 44 65 73 74 20 68 61 73 20 61 20 55  if pDest has a U
105f0 4e 49 51 55 45 20 69 6e 64 65 78 20 2a 2f 0a 20  NIQUE index */. 
10600 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 72 65   int regData, re
10610 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
10620 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 68    /* Registers h
10630 6f 6c 64 69 6e 67 20 64 61 74 61 20 61 6e 64 20  olding data and 
10640 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 69 66 28 20  rowid */..  if( 
10650 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
10660 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
10670 20 4d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   Must be of the 
10680 66 6f 72 6d 20 20 49 4e 53 45 52 54 20 49 4e 54  form  INSERT INT
10690 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 20 2e 2e 2e  O ... SELECT ...
106a0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   */.  }.  if( pP
106b0 61 72 73 65 2d 3e 70 57 69 74 68 20 7c 7c 20 70  arse->pWith || p
106c0 53 65 6c 65 63 74 2d 3e 70 57 69 74 68 20 29 7b  Select->pWith ){
106d0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
106e0 74 74 65 6d 70 74 20 74 6f 20 70 72 6f 63 65 73  ttempt to proces
106f0 73 20 74 68 69 73 20 71 75 65 72 79 20 69 66 20  s this query if 
10700 74 68 65 72 65 20 61 72 65 20 61 6e 20 57 49 54  there are an WIT
10710 48 20 63 6c 61 75 73 65 73 0a 20 20 20 20 2a 2a  H clauses.    **
10720 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 74 2e   attached to it.
10730 20 50 72 6f 63 65 65 64 69 6e 67 20 6d 61 79 20   Proceeding may 
10740 67 65 6e 65 72 61 74 65 20 61 20 66 61 6c 73 65  generate a false
10750 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
10760 20 78 78 78 22 0a 20 20 20 20 2a 2a 20 65 72 72   xxx".    ** err
10770 6f 72 20 69 66 20 70 53 65 6c 65 63 74 20 72 65  or if pSelect re
10780 61 64 73 20 66 72 6f 6d 20 61 20 43 54 45 20 6e  ads from a CTE n
10790 61 6d 65 64 20 22 78 78 78 22 2e 20 20 2a 2f 0a  amed "xxx".  */.
107a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
107b0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
107c0 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
107d0 65 2c 20 70 44 65 73 74 29 20 29 7b 0a 20 20 20  e, pDest) ){.   
107e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
107f0 74 61 62 31 20 6d 75 73 74 20 6e 6f 74 20 68 61  tab1 must not ha
10800 76 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  ve triggers */. 
10810 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
10820 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10830 42 4c 45 0a 20 20 69 66 28 20 70 44 65 73 74 2d  BLE.  if( pDest-
10840 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 56  >tabFlags & TF_V
10850 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 72 65  irtual ){.    re
10860 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62  turn 0;   /* tab
10870 31 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  1 must not be a 
10880 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
10890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
108a0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ( onError==OE_De
108b0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 69 66 28  fault ){.    if(
108c0 20 70 44 65 73 74 2d 3e 69 50 4b 65 79 3e 3d 30   pDest->iPKey>=0
108d0 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 70 44 65   ) onError = pDe
108e0 73 74 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20 20 20  st->keyConf;.   
108f0 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45   if( onError==OE
10900 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72 72  _Default ) onErr
10910 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  or = OE_Abort;. 
10920 20 7d 0a 20 20 61 73 73 65 72 74 28 70 53 65 6c   }.  assert(pSel
10930 65 63 74 2d 3e 70 53 72 63 29 3b 20 20 20 2f 2a  ect->pSrc);   /*
10940 20 61 6c 6c 6f 63 61 74 65 64 20 65 76 65 6e 20   allocated even 
10950 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 46  if there is no F
10960 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
10970 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  if( pSelect->pSr
10980 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
10990 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
109a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6d 75 73   FROM clause mus
109b0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
109c0 6e 65 20 74 65 72 6d 20 2a 2f 0a 20 20 7d 0a 20  ne term */.  }. 
109d0 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 53   if( pSelect->pS
109e0 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
109f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10a00 3b 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  ;   /* FROM clau
10a10 73 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69  se cannot contai
10a20 6e 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  n a subquery */.
10a30 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63    }.  if( pSelec
10a40 74 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  t->pWhere ){.   
10a50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10a60 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68  SELECT may not h
10a70 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ave a WHERE clau
10a80 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  se */.  }.  if( 
10a90 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
10aa0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
10ab0 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d  0;   /* SELECT m
10ac0 61 79 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 4f  ay not have an O
10ad0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
10ae0 2f 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f  /.  }.  /* Do no
10af0 74 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66  t need to test f
10b00 6f 72 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  or a HAVING clau
10b10 73 65 2e 20 20 49 66 20 48 41 56 49 4e 47 20 69  se.  If HAVING i
10b20 73 20 70 72 65 73 65 6e 74 20 62 75 74 0a 20 20  s present but.  
10b30 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  ** there is no O
10b40 52 44 45 52 20 42 59 2c 20 77 65 20 77 69 6c 6c  RDER BY, we will
10b50 20 67 65 74 20 61 6e 20 65 72 72 6f 72 2e 20 2a   get an error. *
10b60 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  /.  if( pSelect-
10b70 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
10b80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
10b90 53 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 68  SELECT may not h
10ba0 61 76 65 20 61 20 47 52 4f 55 50 20 42 59 20 63  ave a GROUP BY c
10bb0 6c 61 75 73 65 20 2a 2f 0a 20 20 7d 0a 20 20 69  lause */.  }.  i
10bc0 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 4c 69 6d  f( pSelect->pLim
10bd0 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  it ){.    return
10be0 20 30 3b 20 20 20 2f 2a 20 53 45 4c 45 43 54 20   0;   /* SELECT 
10bf0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  may not have a L
10c00 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
10c10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65   }.  assert( pSe
10c20 6c 65 63 74 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  lect->pOffset==0
10c30 20 29 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20   );  /* Must be 
10c40 73 6f 20 69 66 20 70 4c 69 6d 69 74 3d 3d 30 20  so if pLimit==0 
10c50 2a 2f 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  */.  if( pSelect
10c60 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
10c70 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 53  return 0;   /* S
10c80 45 4c 45 43 54 20 6d 61 79 20 6e 6f 74 20 62 65  ELECT may not be
10c90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
10ca0 79 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  y */.  }.  if( p
10cb0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
10cc0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
10cd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
10ce0 20 20 2f 2a 20 53 45 4c 45 43 54 20 6d 61 79 20    /* SELECT may 
10cf0 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 20  not be DISTINCT 
10d00 2a 2f 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20  */.  }.  pEList 
10d10 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
10d20 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
10d30 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ist!=0 );.  if( 
10d40 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
10d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10d60 3b 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c  ;   /* The resul
10d70 74 20 73 65 74 20 6d 75 73 74 20 68 61 76 65 20  t set must have 
10d80 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6c 75  exactly one colu
10d90 6d 6e 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  mn */.  }.  asse
10da0 72 74 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  rt( pEList->a[0]
10db0 2e 70 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20  .pExpr );.  if( 
10dc0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
10dd0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  pr->op!=TK_ALL )
10de0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
10df0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
10e00 73 65 74 20 6d 75 73 74 20 62 65 20 74 68 65 20  set must be the 
10e10 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72  special operator
10e20 20 22 2a 22 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f   "*" */.  }..  /
10e30 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
10e40 77 65 20 68 61 76 65 20 65 73 74 61 62 6c 69 73  we have establis
10e50 68 65 64 20 74 68 61 74 20 74 68 65 20 73 74 61  hed that the sta
10e60 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
10e70 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 73 79  .  ** correct sy
10e80 6e 74 61 63 74 69 63 20 66 6f 72 6d 20 74 6f 20  ntactic form to 
10e90 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
10ea0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
10eb0 2e 20 20 4e 6f 77 0a 20 20 2a 2a 20 77 65 20 68  .  Now.  ** we h
10ec0 61 76 65 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ave to check the
10ed0 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 20 2a 2f   semantics..  */
10ee0 0a 20 20 70 49 74 65 6d 20 3d 20 70 53 65 6c 65  .  pItem = pSele
10ef0 63 74 2d 3e 70 53 72 63 2d 3e 61 3b 0a 20 20 70  ct->pSrc->a;.  p
10f00 53 72 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Src = sqlite3Loc
10f10 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
10f20 72 73 65 2c 20 30 2c 20 70 49 74 65 6d 29 3b 0a  rse, 0, pItem);.
10f30 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
10f40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
10f50 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
10f60 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
10f70 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   a real table */
10f80 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 3d  .  }.  if( pSrc=
10f90 3d 70 44 65 73 74 20 29 7b 0a 20 20 20 20 72 65  =pDest ){.    re
10fa0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62  turn 0;   /* tab
10fb0 31 20 61 6e 64 20 74 61 62 32 20 6d 61 79 20 6e  1 and tab2 may n
10fc0 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 74  ot be the same t
10fd0 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  able */.  }.  if
10fe0 28 20 48 61 73 52 6f 77 69 64 28 70 44 65 73 74  ( HasRowid(pDest
10ff0 29 21 3d 48 61 73 52 6f 77 69 64 28 70 53 72 63  )!=HasRowid(pSrc
11000 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11010 30 3b 20 20 20 2f 2a 20 73 6f 75 72 63 65 20 61  0;   /* source a
11020 6e 64 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  nd destination m
11030 75 73 74 20 62 6f 74 68 20 62 65 20 57 49 54 48  ust both be WITH
11040 4f 55 54 20 52 4f 57 49 44 20 6f 72 20 6e 6f 74  OUT ROWID or not
11050 20 2a 2f 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20   */.  }.#ifndef 
11060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
11070 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
11080 53 72 63 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Src->tabFlags & 
11090 54 46 5f 56 69 72 74 75 61 6c 20 29 7b 0a 20 20  TF_Virtual ){.  
110a0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a    return 0;   /*
110b0 20 74 61 62 32 20 6d 75 73 74 20 6e 6f 74 20 62   tab2 must not b
110c0 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
110d0 65 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  e */.  }.#endif.
110e0 20 20 69 66 28 20 70 53 72 63 2d 3e 70 53 65 6c    if( pSrc->pSel
110f0 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ect ){.    retur
11100 6e 20 30 3b 20 20 20 2f 2a 20 74 61 62 32 20 6d  n 0;   /* tab2 m
11110 61 79 20 6e 6f 74 20 62 65 20 61 20 76 69 65 77  ay not be a view
11120 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   */.  }.  if( pD
11130 65 73 74 2d 3e 6e 43 6f 6c 21 3d 70 53 72 63 2d  est->nCol!=pSrc-
11140 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 72 65 74  >nCol ){.    ret
11150 75 72 6e 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  urn 0;   /* Numb
11160 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6d 75  er of columns mu
11170 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 69  st be the same i
11180 6e 20 74 61 62 31 20 61 6e 64 20 74 61 62 32 20  n tab1 and tab2 
11190 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  */.  }.  if( pDe
111a0 73 74 2d 3e 69 50 4b 65 79 21 3d 70 53 72 63 2d  st->iPKey!=pSrc-
111b0 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  >iPKey ){.    re
111c0 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 42 6f 74  turn 0;   /* Bot
111d0 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 68 61  h tables must ha
111e0 76 65 20 74 68 65 20 73 61 6d 65 20 49 4e 54 45  ve the same INTE
111f0 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
11200 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  */.  }.  for(i=0
11210 3b 20 69 3c 70 44 65 73 74 2d 3e 6e 43 6f 6c 3b  ; i<pDest->nCol;
11220 20 69 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75 6d   i++){.    Colum
11230 6e 20 2a 70 44 65 73 74 43 6f 6c 20 3d 20 26 70  n *pDestCol = &p
11240 44 65 73 74 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20  Dest->aCol[i];. 
11250 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 53 72 63 43     Column *pSrcC
11260 6f 6c 20 3d 20 26 70 53 72 63 2d 3e 61 43 6f 6c  ol = &pSrc->aCol
11270 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  [i];.    if( pDe
11280 73 74 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 21  stCol->affinity!
11290 3d 70 53 72 63 43 6f 6c 2d 3e 61 66 66 69 6e 69  =pSrcCol->affini
112a0 74 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ty ){.      retu
112b0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 41 66 66 69  rn 0;    /* Affi
112c0 6e 69 74 79 20 6d 75 73 74 20 62 65 20 74 68 65  nity must be the
112d0 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 20 63 6f 6c   same on all col
112e0 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  umns */.    }.  
112f0 20 20 69 66 28 20 21 78 66 65 72 43 6f 6d 70 61    if( !xferCompa
11300 74 69 62 6c 65 43 6f 6c 6c 61 74 69 6f 6e 28 70  tibleCollation(p
11310 44 65 73 74 43 6f 6c 2d 3e 7a 43 6f 6c 6c 2c 20  DestCol->zColl, 
11320 70 53 72 63 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 20  pSrcCol->zColl) 
11330 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11340 30 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69  0;    /* Collati
11350 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  ng sequence must
11360 20 62 65 20 74 68 65 20 73 61 6d 65 20 6f 6e 20   be the same on 
11370 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  all columns */. 
11380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 65     }.    if( pDe
11390 73 74 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 26  stCol->notNull &
113a0 26 20 21 70 53 72 63 43 6f 6c 2d 3e 6e 6f 74 4e  & !pSrcCol->notN
113b0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ull ){.      ret
113c0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 74 61 62  urn 0;    /* tab
113d0 32 20 6d 75 73 74 20 62 65 20 4e 4f 54 20 4e 55  2 must be NOT NU
113e0 4c 4c 20 69 66 20 74 61 62 31 20 69 73 20 2a 2f  LL if tab1 is */
113f0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 65  .    }.    /* De
11400 66 61 75 6c 74 20 76 61 6c 75 65 73 20 66 6f 72  fault values for
11410 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
11420 65 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 6e  equent columns n
11430 65 65 64 20 74 6f 20 6d 61 74 63 68 2e 20 2a 2f  eed to match. */
11440 0a 20 20 20 20 69 66 28 20 69 3e 30 0a 20 20 20  .    if( i>0.   
11450 20 20 26 26 20 28 28 70 44 65 73 74 43 6f 6c 2d    && ((pDestCol-
11460 3e 7a 44 66 6c 74 3d 3d 30 29 21 3d 28 70 53 72  >zDflt==0)!=(pSr
11470 63 43 6f 6c 2d 3e 7a 44 66 6c 74 3d 3d 30 29 20  cCol->zDflt==0) 
11480 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44  .         || (pD
11490 65 73 74 43 6f 6c 2d 3e 7a 44 66 6c 74 20 26 26  estCol->zDflt &&
114a0 20 73 74 72 63 6d 70 28 70 44 65 73 74 43 6f 6c   strcmp(pDestCol
114b0 2d 3e 7a 44 66 6c 74 2c 20 70 53 72 63 43 6f 6c  ->zDflt, pSrcCol
114c0 2d 3e 7a 44 66 6c 74 29 21 3d 30 29 29 0a 20 20  ->zDflt)!=0)).  
114d0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
114e0 6e 20 30 3b 20 20 20 20 2f 2a 20 44 65 66 61 75  n 0;    /* Defau
114f0 6c 74 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  lt values must b
11500 65 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 61  e the same for a
11510 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  ll columns */.  
11520 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 44    }.  }.  for(pD
11530 65 73 74 49 64 78 3d 70 44 65 73 74 2d 3e 70 49  estIdx=pDest->pI
11540 6e 64 65 78 3b 20 70 44 65 73 74 49 64 78 3b 20  ndex; pDestIdx; 
11550 70 44 65 73 74 49 64 78 3d 70 44 65 73 74 49 64  pDestIdx=pDestId
11560 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
11570 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
11580 28 70 44 65 73 74 49 64 78 29 20 29 7b 0a 20 20  (pDestIdx) ){.  
11590 20 20 20 20 64 65 73 74 48 61 73 55 6e 69 71 75      destHasUniqu
115a0 65 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eIdx = 1;.    }.
115b0 20 20 20 20 66 6f 72 28 70 53 72 63 49 64 78 3d      for(pSrcIdx=
115c0 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b 20 70 53  pSrc->pIndex; pS
115d0 72 63 49 64 78 3b 20 70 53 72 63 49 64 78 3d 70  rcIdx; pSrcIdx=p
115e0 53 72 63 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  SrcIdx->pNext){.
115f0 20 20 20 20 20 20 69 66 28 20 78 66 65 72 43 6f        if( xferCo
11600 6d 70 61 74 69 62 6c 65 49 6e 64 65 78 28 70 44  mpatibleIndex(pD
11610 65 73 74 49 64 78 2c 20 70 53 72 63 49 64 78 29  estIdx, pSrcIdx)
11620 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
11630 20 20 20 20 69 66 28 20 70 53 72 63 49 64 78 3d      if( pSrcIdx=
11640 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
11650 72 6e 20 30 3b 20 20 20 20 2f 2a 20 70 44 65 73  rn 0;    /* pDes
11660 74 49 64 78 20 68 61 73 20 6e 6f 20 63 6f 72 72  tIdx has no corr
11670 65 73 70 6f 6e 64 69 6e 67 20 69 6e 64 65 78 20  esponding index 
11680 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 20 20 7d  in pSrc */.    }
11690 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
116a0 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
116b0 20 69 66 28 20 70 44 65 73 74 2d 3e 70 43 68 65   if( pDest->pChe
116c0 63 6b 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ck && sqlite3Exp
116d0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 53 72  rListCompare(pSr
116e0 63 2d 3e 70 43 68 65 63 6b 2c 70 44 65 73 74 2d  c->pCheck,pDest-
116f0 3e 70 43 68 65 63 6b 2c 2d 31 29 20 29 7b 0a 20  >pCheck,-1) ){. 
11700 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f     return 0;   /
11710 2a 20 54 61 62 6c 65 73 20 68 61 76 65 20 64 69  * Tables have di
11720 66 66 65 72 65 6e 74 20 43 48 45 43 4b 20 63 6f  fferent CHECK co
11730 6e 73 74 72 61 69 6e 74 73 2e 20 20 54 69 63 6b  nstraints.  Tick
11740 65 74 20 23 32 32 35 32 20 2a 2f 0a 20 20 7d 0a  et #2252 */.  }.
11750 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
11760 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11770 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 69 73 61  GN_KEY.  /* Disa
11780 6c 6c 6f 77 20 74 68 65 20 74 72 61 6e 73 66 65  llow the transfe
11790 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  r optimization i
117a0 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
117b0 6e 20 74 61 62 6c 65 20 63 6f 6e 73 74 61 69 6e  n table constain
117c0 73 0a 20 20 2a 2a 20 61 6e 79 20 66 6f 72 65 69  s.  ** any forei
117d0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
117e0 74 73 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ts.  This is mor
117f0 65 20 72 65 73 74 72 69 63 74 69 76 65 20 74 68  e restrictive th
11800 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  an necessary..  
11810 2a 2a 20 42 75 74 20 74 68 65 20 6d 61 69 6e 20  ** But the main 
11820 62 65 6e 65 66 69 63 69 61 72 79 20 6f 66 20 74  beneficiary of t
11830 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69  he transfer opti
11840 6d 69 7a 61 74 69 6f 6e 20 69 73 20 74 68 65 20  mization is the 
11850 56 41 43 55 55 4d 20 0a 20 20 2a 2a 20 63 6f 6d  VACUUM .  ** com
11860 6d 61 6e 64 2c 20 61 6e 64 20 74 68 65 20 56 41  mand, and the VA
11870 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 64 69 73  CUUM command dis
11880 61 62 6c 65 73 20 66 6f 72 65 69 67 6e 20 6b 65  ables foreign ke
11890 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
118a0 53 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 74 72  So.  ** the extr
118b0 61 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 74  a complication t
118c0 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 75 6c 65  o make this rule
118d0 20 6c 65 73 73 20 72 65 73 74 72 69 63 74 69 76   less restrictiv
118e0 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20  e is probably.  
118f0 2a 2a 20 6e 6f 74 20 77 6f 72 74 68 20 74 68 65  ** not worth the
11900 20 65 66 66 6f 72 74 2e 20 20 54 69 63 6b 65 74   effort.  Ticket
11910 20 5b 36 32 38 34 64 66 38 39 64 65 62 64 66 61   [6284df89debdfa
11920 36 31 64 62 38 30 37 33 65 30 36 32 39 30 38 61  61db8073e062908a
11930 66 30 63 39 62 36 31 31 38 65 5d 0a 20 20 2a 2f  f0c9b6118e].  */
11940 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
11950 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11960 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 29 21  TE_ForeignKeys)!
11970 3d 30 20 26 26 20 70 44 65 73 74 2d 3e 70 46 4b  =0 && pDest->pFK
11980 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey!=0 ){.    ret
11990 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
119a0 66 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  f.  if( (pParse-
119b0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
119c0 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d  ITE_CountRows)!=
119d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
119e0 30 3b 20 20 2f 2a 20 78 66 65 72 20 6f 70 74 20  0;  /* xfer opt 
119f0 64 6f 65 73 20 6e 6f 74 20 70 6c 61 79 20 77 65  does not play we
11a00 6c 6c 20 77 69 74 68 20 50 52 41 47 4d 41 20 63  ll with PRAGMA c
11a10 6f 75 6e 74 5f 63 68 61 6e 67 65 73 20 2a 2f 0a  ount_changes */.
11a20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
11a30 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
11a40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
11a50 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  xfer optimizatio
11a60 6e 20 69 73 20 61 74 0a 20 20 2a 2a 20 6c 65 61  n is at.  ** lea
11a70 73 74 20 61 20 70 6f 73 73 69 62 69 6c 69 74 79  st a possibility
11a80 2c 20 74 68 6f 75 67 68 20 69 74 20 6d 69 67 68  , though it migh
11a90 74 20 6f 6e 6c 79 20 77 6f 72 6b 20 69 66 20 74  t only work if t
11aa0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 20  he destination. 
11ab0 20 2a 2a 20 74 61 62 6c 65 20 28 74 61 62 31 29   ** table (tab1)
11ac0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   is initially em
11ad0 70 74 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  pty..  */.#ifdef
11ae0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
11af0 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
11b00 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
11b10 20 69 44 62 53 72 63 20 3d 20 73 71 6c 69 74 65   iDbSrc = sqlite
11b20 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
11b30 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 72 63 2d  Parse->db, pSrc-
11b40 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 76 20 3d  >pSchema);.  v =
11b50 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
11b60 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
11b70 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
11b80 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 53 72  ma(pParse, iDbSr
11b90 63 29 3b 0a 20 20 69 53 72 63 20 3d 20 70 50 61  c);.  iSrc = pPa
11ba0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
11bb0 44 65 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Dest = pParse->n
11bc0 54 61 62 2b 2b 3b 0a 20 20 72 65 67 41 75 74 6f  Tab++;.  regAuto
11bd0 69 6e 63 20 3d 20 61 75 74 6f 49 6e 63 42 65 67  inc = autoIncBeg
11be0 69 6e 28 70 50 61 72 73 65 2c 20 69 44 62 44 65  in(pParse, iDbDe
11bf0 73 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 72 65  st, pDest);.  re
11c00 67 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 47  gData = sqlite3G
11c10 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11c20 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  );.  regRowid = 
11c30 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11c40 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
11c50 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
11c60 61 72 73 65 2c 20 69 44 65 73 74 2c 20 69 44 62  arse, iDest, iDb
11c70 44 65 73 74 2c 20 70 44 65 73 74 2c 20 4f 50 5f  Dest, pDest, OP_
11c80 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20 61 73  OpenWrite);.  as
11c90 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70  sert( HasRowid(p
11ca0 44 65 73 74 29 20 7c 7c 20 64 65 73 74 48 61 73  Dest) || destHas
11cb0 55 6e 69 71 75 65 49 64 78 20 29 3b 0a 20 20 69  UniqueIdx );.  i
11cc0 66 28 20 28 70 44 65 73 74 2d 3e 69 50 4b 65 79  f( (pDest->iPKey
11cd0 3c 30 20 26 26 20 70 44 65 73 74 2d 3e 70 49 6e  <0 && pDest->pIn
11ce0 64 65 78 21 3d 30 29 20 20 20 20 20 20 20 20 20  dex!=0)         
11cf0 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 7c 7c   /* (1) */.   ||
11d00 20 64 65 73 74 48 61 73 55 6e 69 71 75 65 49 64   destHasUniqueId
11d10 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d30 2a 20 28 32 29 20 2a 2f 0a 20 20 20 7c 7c 20 28  * (2) */.   || (
11d40 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 41 62 6f 72  onError!=OE_Abor
11d50 74 20 26 26 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  t && onError!=OE
11d60 5f 52 6f 6c 6c 62 61 63 6b 29 20 20 20 2f 2a 20  _Rollback)   /* 
11d70 28 33 29 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  (3) */.  ){.    
11d80 2f 2a 20 49 6e 20 73 6f 6d 65 20 63 69 72 63 75  /* In some circu
11d90 6d 73 74 61 6e 63 65 73 2c 20 77 65 20 61 72 65  mstances, we are
11da0 20 61 62 6c 65 20 74 6f 20 72 75 6e 20 74 68 65   able to run the
11db0 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
11dc0 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 69  on.    ** only i
11dd0 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
11de0 6e 20 74 61 62 6c 65 20 69 73 20 69 6e 69 74 69  n table is initi
11df0 61 6c 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  ally empty.  Thi
11e00 73 20 63 6f 64 65 20 6d 61 6b 65 73 0a 20 20 20  s code makes.   
11e10 20 2a 2a 20 74 68 61 74 20 64 65 74 65 72 6d 69   ** that determi
11e20 6e 61 74 69 6f 6e 2e 20 20 43 6f 6e 64 69 74 69  nation.  Conditi
11e30 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63 68 20  ons under which 
11e40 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
11e50 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 65  must.    ** be e
11e60 6d 70 74 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mpty:.    **.   
11e70 20 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73   ** (1) There is
11e80 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
11e90 41 52 59 20 4b 45 59 20 62 75 74 20 74 68 65 72  ARY KEY but ther
11ea0 65 20 61 72 65 20 69 6e 64 69 63 65 73 2e 0a 20  e are indices.. 
11eb0 20 20 20 2a 2a 20 20 20 20 20 28 49 66 20 74 68     **     (If th
11ec0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
11ed0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 65   not initially e
11ee0 6d 70 74 79 2c 20 74 68 65 20 72 6f 77 69 64 20  mpty, the rowid 
11ef0 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 20 20  fields.    **   
11f00 20 20 6f 66 20 69 6e 64 65 78 20 65 6e 74 72 69    of index entri
11f10 65 73 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  es might need to
11f20 20 63 68 61 6e 67 65 2e 29 0a 20 20 20 20 2a 2a   change.).    **
11f30 0a 20 20 20 20 2a 2a 20 28 32 29 20 54 68 65 20  .    ** (2) The 
11f40 64 65 73 74 69 6e 61 74 69 6f 6e 20 68 61 73 20  destination has 
11f50 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
11f60 20 28 54 68 65 20 78 66 65 72 20 6f 70 74 69 6d   (The xfer optim
11f70 69 7a 61 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ization .    ** 
11f80 20 20 20 20 69 73 20 75 6e 61 62 6c 65 20 74 6f      is unable to
11f90 20 74 65 73 74 20 75 6e 69 71 75 65 6e 65 73 73   test uniqueness
11fa0 2e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  .).    **.    **
11fb0 20 28 33 29 20 6f 6e 45 72 72 6f 72 20 69 73 20   (3) onError is 
11fc0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
11fd0 74 68 61 6e 20 4f 45 5f 41 62 6f 72 74 20 61 6e  than OE_Abort an
11fe0 64 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 0a 20  d OE_Rollback.. 
11ff0 20 20 20 2a 2f 0a 20 20 20 20 61 64 64 72 31 20     */.    addr1 
12000 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12010 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12020 2c 20 69 44 65 73 74 2c 20 30 29 3b 20 56 64 62  , iDest, 0); Vdb
12030 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12040 20 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20    emptyDestTest 
12050 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12060 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12070 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
12080 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12090 2c 20 61 64 64 72 31 29 3b 0a 20 20 7d 0a 20 20  , addr1);.  }.  
120a0 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 53 72  if( HasRowid(pSr
120b0 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c) ){.    sqlite
120c0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
120d0 65 2c 20 69 53 72 63 2c 20 69 44 62 53 72 63 2c  e, iSrc, iDbSrc,
120e0 20 70 53 72 63 2c 20 4f 50 5f 4f 70 65 6e 52 65   pSrc, OP_OpenRe
120f0 61 64 29 3b 0a 20 20 20 20 65 6d 70 74 79 53 72  ad);.    emptySr
12100 63 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  cTest = sqlite3V
12110 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12120 52 65 77 69 6e 64 2c 20 69 53 72 63 2c 20 30 29  Rewind, iSrc, 0)
12130 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
12140 29 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  );.    if( pDest
12150 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
12160 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
12170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12180 20 4f 50 5f 52 6f 77 69 64 2c 20 69 53 72 63 2c   OP_Rowid, iSrc,
12190 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
121a0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
121b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
121c0 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 44 65  P_NotExists, iDe
121d0 73 74 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  st, 0, regRowid)
121e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
121f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
12200 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74  qlite3RowidConst
12210 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 6f 6e  raint(pParse, on
12220 45 72 72 6f 72 2c 20 70 44 65 73 74 29 3b 0a 20  Error, pDest);. 
12230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12240 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12250 32 29 3b 0a 20 20 20 20 20 20 61 75 74 6f 49 6e  2);.      autoIn
12260 63 53 74 65 70 28 70 50 61 72 73 65 2c 20 72 65  cStep(pParse, re
12270 67 41 75 74 6f 69 6e 63 2c 20 72 65 67 52 6f 77  gAutoinc, regRow
12280 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  id);.    }else i
12290 66 28 20 70 44 65 73 74 2d 3e 70 49 6e 64 65 78  f( pDest->pIndex
122a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  ==0 ){.      add
122b0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
122c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
122d0 52 6f 77 69 64 2c 20 69 44 65 73 74 2c 20 72 65  Rowid, iDest, re
122e0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  gRowid);.    }el
122f0 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 31 20  se{.      addr1 
12300 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12310 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
12320 20 69 53 72 63 2c 20 72 65 67 52 6f 77 69 64 29   iSrc, regRowid)
12330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12340 28 70 44 65 73 74 2d 3e 74 61 62 46 6c 61 67 73  (pDest->tabFlags
12350 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
12360 65 6e 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ent)==0 );.    }
12370 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12380 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
12390 44 61 74 61 2c 20 69 53 72 63 2c 20 72 65 67 44  Data, iSrc, regD
123a0 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
123b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
123c0 50 5f 49 6e 73 65 72 74 2c 20 69 44 65 73 74 2c  P_Insert, iDest,
123d0 20 72 65 67 44 61 74 61 2c 20 72 65 67 52 6f 77   regData, regRow
123e0 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
123f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12400 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 7c 4f  OPFLAG_NCHANGE|O
12410 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 7c  PFLAG_LASTROWID|
12420 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
12430 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12440 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
12450 44 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  Dest->zName, 0);
12460 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12470 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
12480 74 2c 20 69 53 72 63 2c 20 61 64 64 72 31 29 3b  t, iSrc, addr1);
12490 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
124a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
124b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
124c0 6f 73 65 2c 20 69 53 72 63 2c 20 30 29 3b 0a 20  ose, iSrc, 0);. 
124d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
124e0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
124f0 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 7d  , iDest, 0);.  }
12500 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12510 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
12520 65 2c 20 69 44 62 44 65 73 74 2c 20 70 44 65 73  e, iDbDest, pDes
12530 74 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 44 65 73  t->tnum, 1, pDes
12540 74 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  t->zName);.    s
12550 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
12560 70 50 61 72 73 65 2c 20 69 44 62 53 72 63 2c 20  pParse, iDbSrc, 
12570 70 53 72 63 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pSrc->tnum, 0, p
12580 53 72 63 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Src->zName);.  }
12590 0a 20 20 66 6f 72 28 70 44 65 73 74 49 64 78 3d  .  for(pDestIdx=
125a0 70 44 65 73 74 2d 3e 70 49 6e 64 65 78 3b 20 70  pDest->pIndex; p
125b0 44 65 73 74 49 64 78 3b 20 70 44 65 73 74 49 64  DestIdx; pDestId
125c0 78 3d 70 44 65 73 74 49 64 78 2d 3e 70 4e 65 78  x=pDestIdx->pNex
125d0 74 29 7b 0a 20 20 20 20 66 6f 72 28 70 53 72 63  t){.    for(pSrc
125e0 49 64 78 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78  Idx=pSrc->pIndex
125f0 3b 20 41 4c 57 41 59 53 28 70 53 72 63 49 64 78  ; ALWAYS(pSrcIdx
12600 29 3b 20 70 53 72 63 49 64 78 3d 70 53 72 63 49  ); pSrcIdx=pSrcI
12610 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12620 20 20 69 66 28 20 78 66 65 72 43 6f 6d 70 61 74    if( xferCompat
12630 69 62 6c 65 49 6e 64 65 78 28 70 44 65 73 74 49  ibleIndex(pDestI
12640 64 78 2c 20 70 53 72 63 49 64 78 29 20 29 20 62  dx, pSrcIdx) ) b
12650 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
12660 61 73 73 65 72 74 28 20 70 53 72 63 49 64 78 20  assert( pSrcIdx 
12670 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12680 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
12690 70 65 6e 52 65 61 64 2c 20 69 53 72 63 2c 20 70  penRead, iSrc, p
126a0 53 72 63 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  SrcIdx->tnum, iD
126b0 62 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  bSrc);.    sqlit
126c0 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
126d0 66 6f 28 70 50 61 72 73 65 2c 20 70 53 72 63 49  fo(pParse, pSrcI
126e0 64 78 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  dx);.    VdbeCom
126f0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
12700 53 72 63 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  SrcIdx->zName));
12710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12720 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
12730 6e 57 72 69 74 65 2c 20 69 44 65 73 74 2c 20 70  nWrite, iDest, p
12740 44 65 73 74 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  DestIdx->tnum, i
12750 44 62 44 65 73 74 29 3b 0a 20 20 20 20 73 71 6c  DbDest);.    sql
12760 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
12770 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 44 65  Info(pParse, pDe
12780 73 74 49 64 78 29 3b 0a 20 20 20 20 73 71 6c 69  stIdx);.    sqli
12790 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
127a0 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
127b0 52 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  R);.    VdbeComm
127c0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 44  ent((v, "%s", pD
127d0 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b  estIdx->zName));
127e0 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
127f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12800 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 53 72  , OP_Rewind, iSr
12810 63 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  c, 0); VdbeCover
12820 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
12830 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12840 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 53 72 63   OP_RowKey, iSrc
12850 2c 20 72 65 67 44 61 74 61 29 3b 0a 20 20 20 20  , regData);.    
12860 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12870 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  3(v, OP_IdxInser
12880 74 2c 20 69 44 65 73 74 2c 20 72 65 67 44 61 74  t, iDest, regDat
12890 61 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  a, 1);.    sqlit
128a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
128b0 4f 50 5f 4e 65 78 74 2c 20 69 53 72 63 2c 20 61  OP_Next, iSrc, a
128c0 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
128d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
128e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
128f0 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
12900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12910 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
12920 69 53 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  iSrc, 0);.    sq
12930 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12940 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 44 65  v, OP_Close, iDe
12950 73 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  st, 0);.  }.  if
12960 28 20 65 6d 70 74 79 53 72 63 54 65 73 74 20 29  ( emptySrcTest )
12970 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12980 48 65 72 65 28 76 2c 20 65 6d 70 74 79 53 72 63  Here(v, emptySrc
12990 54 65 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Test);.  sqlite3
129a0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
129b0 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
129c0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
129d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
129e0 2c 20 72 65 67 44 61 74 61 29 3b 0a 20 20 69 66  , regData);.  if
129f0 28 20 65 6d 70 74 79 44 65 73 74 54 65 73 74 20  ( emptyDestTest 
12a00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12a10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48  beAddOp2(v, OP_H
12a20 61 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  alt, SQLITE_OK, 
12a30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
12a40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 65  dbeJumpHere(v, e
12a50 6d 70 74 79 44 65 73 74 54 65 73 74 29 3b 0a 20  mptyDestTest);. 
12a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a70 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
12a80 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a 20 20 20  , iDest, 0);.   
12a90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
12aa0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
12ab0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
12ac0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 58 46  * SQLITE_OMIT_XF
12ad0 45 52 5f 4f 50 54 20 2a 2f 0a                    ER_OPT */.