/ Hex Artifact Content
Login

Artifact 037eb46630f027d0f93584db180d08ce163f3dbb:


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 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 69 6e 73 65 72 74 2e 63 2c 76 20 31 2e 31 33 34  insert.c,v 1.134
0200: 20 32 30 30 35 2f 30 31 2f 32 30 20 31 31 3a 33   2005/01/20 11:3
0210: 32 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37 37  2:24 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 50 33 20 6f  ../*.** Set P3 o
0250: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
0260: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
0270: 6f 64 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ode to a column 
0280: 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69  affinity.** stri
0290: 6e 67 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64  ng for index pId
02a0: 78 2e 20 41 20 63 6f 6c 75 6d 6e 20 61 66 66 69  x. A column affi
02b0: 6e 69 74 79 20 73 74 72 69 6e 67 20 68 61 73 20  nity string has 
02c0: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  one character.**
02d0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
02e0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61   in the table, a
02f0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
0300: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20  affinity of the 
0310: 63 6f 6c 75 6d 6e 3a 0a 2a 2a 0a 2a 2a 20 20 43  column:.**.**  C
0320: 68 61 72 61 63 74 65 72 20 20 20 20 20 20 43 6f  haracter      Co
0330: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 0a 2a 2a  lumn affinity.**
0340: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 0a 2a 2a 20 20 27 6e 27 20 20 20 20 20 20 20 20  .**  'n'        
0370: 20 20 20 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 20      NUMERIC.**  
0380: 27 69 27 20 20 20 20 20 20 20 20 20 20 20 20 49  'i'            I
0390: 4e 54 45 47 45 52 0a 2a 2a 20 20 27 74 27 20 20  NTEGER.**  't'  
03a0: 20 20 20 20 20 20 20 20 20 20 54 45 58 54 0a 2a            TEXT.*
03b0: 2a 20 20 27 6f 27 20 20 20 20 20 20 20 20 20 20  *  'o'          
03c0: 20 20 4e 4f 4e 45 0a 2a 2f 0a 76 6f 69 64 20 73    NONE.*/.void s
03d0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
03e0: 69 74 79 53 74 72 28 56 64 62 65 20 2a 76 2c 20  ityStr(Vdbe *v, 
03f0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
0400: 69 66 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41  if( !pIdx->zColA
0410: 66 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ff ){.    /* The
0420: 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 63 6f   first time a co
0430: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74  lumn affinity st
0440: 72 69 6e 67 20 66 6f 72 20 61 20 70 61 72 74 69  ring for a parti
0450: 63 75 6c 61 72 20 69 6e 64 65 78 20 69 73 0a 20  cular index is. 
0460: 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20     ** required, 
0470: 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
0480: 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 68 65  and populated he
0490: 72 65 2e 20 49 74 20 69 73 20 74 68 65 6e 20 73  re. It is then s
04a0: 74 6f 72 65 64 20 61 73 0a 20 20 20 20 2a 2a 20  tored as.    ** 
04b0: 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20  a member of the 
04c0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
04d0: 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20 75  for subsequent u
04e0: 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
04f0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  * The column aff
0500: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 77 69 6c  inity string wil
0510: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  l eventually be 
0520: 64 65 6c 65 74 65 64 20 62 79 0a 20 20 20 20 2a  deleted by.    *
0530: 2a 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49 6e  * sqliteDeleteIn
0540: 64 65 78 28 29 20 77 68 65 6e 20 74 68 65 20 49  dex() when the I
0550: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 69  ndex structure i
0560: 74 73 65 6c 66 20 69 73 20 63 6c 65 61 6e 65 64  tself is cleaned
0570: 0a 20 20 20 20 2a 2a 20 75 70 2e 0a 20 20 20 20  .    ** up..    
0580: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  */.    int n;.  
0590: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
05a0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  pIdx->pTable;.  
05b0: 20 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20    pIdx->zColAff 
05c0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
05d0: 4d 61 6c 6c 6f 63 28 70 49 64 78 2d 3e 6e 43 6f  Malloc(pIdx->nCo
05e0: 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28  lumn+1);.    if(
05f0: 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20   !pIdx->zColAff 
0600: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
0610: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6e  .    }.    for(n
0620: 3d 30 3b 20 6e 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; n<pIdx->nCol
0630: 75 6d 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  umn; n++){.     
0640: 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 5b 6e   pIdx->zColAff[n
0650: 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  ] = pTab->aCol[p
0660: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
0670: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
0680: 7d 0a 20 20 20 20 70 49 64 78 2d 3e 7a 43 6f 6c  }.    pIdx->zCol
0690: 41 66 66 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  Aff[pIdx->nColum
06a0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  n] = '\0';.  }. 
06b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
06c0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 49  angeP3(v, -1, pI
06d0: 64 78 2d 3e 7a 43 6f 6c 41 66 66 2c 20 30 29 3b  dx->zColAff, 0);
06e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 50 33  .}../*.** Set P3
06f0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
0700: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
0710: 70 63 6f 64 65 20 74 6f 20 61 20 63 6f 6c 75 6d  pcode to a colum
0720: 6e 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 73 74  n affinity.** st
0730: 72 69 6e 67 20 66 6f 72 20 74 61 62 6c 65 20 70  ring for table p
0740: 54 61 62 2e 20 41 20 63 6f 6c 75 6d 6e 20 61 66  Tab. A column af
0750: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 68 61  finity string ha
0760: 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 0a  s one character.
0770: 2a 2a 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ** for each colu
0780: 6d 6e 20 69 6e 64 65 78 65 64 20 62 79 20 74 68  mn indexed by th
0790: 65 20 69 6e 64 65 78 2c 20 61 63 63 6f 72 64 69  e index, accordi
07a0: 6e 67 20 74 6f 20 74 68 65 20 61 66 66 69 6e 69  ng to the affini
07b0: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  ty of the.** col
07c0: 75 6d 6e 3a 0a 2a 2a 0a 2a 2a 20 20 43 68 61 72  umn:.**.**  Char
07d0: 61 63 74 65 72 20 20 20 20 20 20 43 6f 6c 75 6d  acter      Colum
07e0: 6e 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20 20 2d  n affinity.**  -
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
0810: 20 20 27 6e 27 20 20 20 20 20 20 20 20 20 20 20    'n'           
0820: 20 4e 55 4d 45 52 49 43 0a 2a 2a 20 20 27 69 27   NUMERIC.**  'i'
0830: 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
0840: 47 45 52 0a 2a 2a 20 20 27 74 27 20 20 20 20 20  GER.**  't'     
0850: 20 20 20 20 20 20 20 54 45 58 54 0a 2a 2a 20 20         TEXT.**  
0860: 27 6f 27 20 20 20 20 20 20 20 20 20 20 20 20 4e  'o'            N
0870: 4f 4e 45 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ONE.*/.void sqli
0880: 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79  te3TableAffinity
0890: 53 74 72 28 56 64 62 65 20 2a 76 2c 20 54 61 62  Str(Vdbe *v, Tab
08a0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20  le *pTab){.  /* 
08b0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
08c0: 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79   column affinity
08d0: 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 61   string for a pa
08e0: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 0a 20  rticular table. 
08f0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2c   ** is required,
0900: 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
0910: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 68   and populated h
0920: 65 72 65 2e 20 49 74 20 69 73 20 74 68 65 6e 20  ere. It is then 
0930: 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20 61 73 20  .  ** stored as 
0940: 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20  a member of the 
0950: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
0960: 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20 75  for subsequent u
0970: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
0980: 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
0990: 79 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 65 76  y string will ev
09a0: 65 6e 74 75 61 6c 6c 79 20 62 65 20 64 65 6c 65  entually be dele
09b0: 74 65 64 20 62 79 0a 20 20 2a 2a 20 73 71 6c 69  ted by.  ** sqli
09c0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 29  te3DeleteTable()
09d0: 20 77 68 65 6e 20 74 68 65 20 54 61 62 6c 65 20   when the Table 
09e0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
09f0: 20 69 73 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a   is cleaned up..
0a00: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62    */.  if( !pTab
0a10: 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20  ->zColAff ){.   
0a20: 20 63 68 61 72 20 2a 7a 43 6f 6c 41 66 66 3b 0a   char *zColAff;.
0a30: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
0a40: 7a 43 6f 6c 41 66 66 20 3d 20 28 63 68 61 72 20  zColAff = (char 
0a50: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 70  *)sqliteMalloc(p
0a60: 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 3b 0a 20 20  Tab->nCol+1);.  
0a70: 20 20 69 66 28 20 21 7a 43 6f 6c 41 66 66 20 29    if( !zColAff )
0a80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
0a90: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
0aa0: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
0ab0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43  ; i++){.      zC
0ac0: 6f 6c 41 66 66 5b 69 5d 20 3d 20 70 54 61 62 2d  olAff[i] = pTab-
0ad0: 3e 61 43 6f 6c 5b 69 5d 2e 61 66 66 69 6e 69 74  >aCol[i].affinit
0ae0: 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  y;.    }.    zCo
0af0: 6c 41 66 66 5b 70 54 61 62 2d 3e 6e 43 6f 6c 5d  lAff[pTab->nCol]
0b00: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 70 54   = '\0';..    pT
0b10: 61 62 2d 3e 7a 43 6f 6c 41 66 66 20 3d 20 7a 43  ab->zColAff = zC
0b20: 6f 6c 41 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 71  olAff;.  }..  sq
0b30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0b40: 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a  3(v, -1, pTab->z
0b50: 43 6f 6c 41 66 66 2c 20 30 29 3b 0a 7d 0a 0a 0a  ColAff, 0);.}...
0b60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0b70: 6e 65 20 69 73 20 63 61 6c 6c 20 74 6f 20 68 61  ne is call to ha
0b80: 6e 64 6c 65 20 53 51 4c 20 6f 66 20 74 68 65 20  ndle SQL of the 
0b90: 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
0ba0: 0a 2a 2a 0a 2a 2a 20 20 20 20 69 6e 73 65 72 74  .**.**    insert
0bb0: 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44 4c   into TABLE (IDL
0bc0: 49 53 54 29 20 76 61 6c 75 65 73 28 45 58 50 52  IST) values(EXPR
0bd0: 4c 49 53 54 29 0a 2a 2a 20 20 20 20 69 6e 73 65  LIST).**    inse
0be0: 72 74 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49  rt into TABLE (I
0bf0: 44 4c 49 53 54 29 20 73 65 6c 65 63 74 0a 2a 2a  DLIST) select.**
0c00: 0a 2a 2a 20 54 68 65 20 49 44 4c 49 53 54 20 66  .** The IDLIST f
0c10: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 61 62  ollowing the tab
0c20: 6c 65 20 6e 61 6d 65 20 69 73 20 61 6c 77 61 79  le name is alway
0c30: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  s optional.  If 
0c40: 6f 6d 69 74 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  omitted,.** then
0c50: 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63   a list of all c
0c60: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 74  olumns for the t
0c70: 61 62 6c 65 20 69 73 20 73 75 62 73 74 69 74 75  able is substitu
0c80: 74 65 64 2e 20 20 54 68 65 20 49 44 4c 49 53 54  ted.  The IDLIST
0c90: 0a 2a 2a 20 61 70 70 65 61 72 73 20 69 6e 20 74  .** appears in t
0ca0: 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61 72 61 6d  he pColumn param
0cb0: 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d 6e 20 69  eter.  pColumn i
0cc0: 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c 49 53 54  s NULL if IDLIST
0cd0: 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a 0a   is omitted..**.
0ce0: 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 70 61 72  ** The pList par
0cf0: 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 45 58 50  ameter holds EXP
0d00: 52 4c 49 53 54 20 69 6e 20 74 68 65 20 66 69 72  RLIST in the fir
0d10: 73 74 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 49  st form of the I
0d20: 4e 53 45 52 54 0a 2a 2a 20 73 74 61 74 65 6d 65  NSERT.** stateme
0d30: 6e 74 20 61 62 6f 76 65 2c 20 61 6e 64 20 70 53  nt above, and pS
0d40: 65 6c 65 63 74 20 69 73 20 4e 55 4c 4c 2e 20 20  elect is NULL.  
0d50: 46 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66  For the second f
0d60: 6f 72 6d 2c 20 70 4c 69 73 74 20 69 73 0a 2a 2a  orm, pList is.**
0d70: 20 4e 55 4c 4c 20 61 6e 64 20 70 53 65 6c 65 63   NULL and pSelec
0d80: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
0d90: 6f 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  o the select sta
0da0: 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 67  tement used to g
0db0: 65 6e 65 72 61 74 65 0a 2a 2a 20 64 61 74 61 20  enerate.** data 
0dc0: 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 2e 0a  for the insert..
0dd0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
0de0: 65 6e 65 72 61 74 65 64 20 66 6f 6c 6c 6f 77 73  enerated follows
0df0: 20 6f 6e 65 20 6f 66 20 74 68 72 65 65 20 74 65   one of three te
0e00: 6d 70 6c 61 74 65 73 2e 20 20 46 6f 72 20 61 20  mplates.  For a 
0e10: 73 69 6d 70 6c 65 0a 2a 2a 20 73 65 6c 65 63 74  simple.** select
0e20: 20 77 69 74 68 20 64 61 74 61 20 63 6f 6d 69 6e   with data comin
0e30: 67 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20  g from a VALUES 
0e40: 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 64 65  clause, the code
0e50: 20 65 78 65 63 75 74 65 73 0a 2a 2a 20 6f 6e 63   executes.** onc
0e60: 65 20 73 74 72 61 69 67 68 74 20 64 6f 77 6e 20  e straight down 
0e70: 74 68 72 6f 75 67 68 2e 20 20 54 68 65 20 74 65  through.  The te
0e80: 6d 70 6c 61 74 65 20 6c 6f 6f 6b 73 20 6c 69 6b  mplate looks lik
0e90: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
0ea0: 20 20 20 20 20 20 6f 70 65 6e 20 77 72 69 74 65        open write
0eb0: 20 63 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c   cursor to <tabl
0ec0: 65 3e 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63  e> and its indic
0ed0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 75  es.**         pu
0ee0: 74 73 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ts VALUES clause
0ef0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 6e 74   expressions ont
0f00: 6f 20 74 68 65 20 73 74 61 63 6b 0a 2a 2a 20 20  o the stack.**  
0f10: 20 20 20 20 20 20 20 77 72 69 74 65 20 74 68 65         write the
0f20: 20 72 65 73 75 6c 74 69 6e 67 20 72 65 63 6f 72   resulting recor
0f30: 64 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a  d into <table>.*
0f40: 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75  *         cleanu
0f50: 70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  p.**.** If the s
0f60: 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
0f70: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
0f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 61 62  INSERT INTO <tab
0f90: 6c 65 3e 20 53 45 4c 45 43 54 20 2e 2e 2e 0a 2a  le> SELECT ....*
0fa0: 2a 0a 2a 2a 20 41 6e 64 20 74 68 65 20 53 45 4c  *.** And the SEL
0fb0: 45 43 54 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ECT clause does 
0fc0: 6e 6f 74 20 72 65 61 64 20 66 72 6f 6d 20 3c 74  not read from <t
0fd0: 61 62 6c 65 3e 20 61 74 20 61 6e 79 20 74 69 6d  able> at any tim
0fe0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 67  e, then.** the g
0ff0: 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 66 6f  enerated code fo
1000: 6c 6c 6f 77 73 20 74 68 69 73 20 74 65 6d 70 6c  llows this templ
1010: 61 74 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ate:.**.**      
1020: 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20 20 20 20     goto B.**    
1030: 20 20 41 3a 20 73 65 74 75 70 20 66 6f 72 20 74    A: setup for t
1040: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  he SELECT.**    
1050: 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74       loop over t
1060: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
1070: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
1080: 20 20 20 20 20 67 6f 73 75 62 20 43 0a 2a 2a 20       gosub C.** 
1090: 20 20 20 20 20 20 20 20 65 6e 64 20 6c 6f 6f 70          end loop
10a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6c 65 61  .**         clea
10b0: 6e 75 70 20 61 66 74 65 72 20 74 68 65 20 53 45  nup after the SE
10c0: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
10d0: 67 6f 74 6f 20 44 0a 2a 2a 20 20 20 20 20 20 42  goto D.**      B
10e0: 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63 75 72  : open write cur
10f0: 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61  sor to <table> a
1100: 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73 0a 2a  nd its indices.*
1110: 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 41  *         goto A
1120: 0a 2a 2a 20 20 20 20 20 20 43 3a 20 69 6e 73 65  .**      C: inse
1130: 72 74 20 74 68 65 20 73 65 6c 65 63 74 20 72 65  rt the select re
1140: 73 75 6c 74 20 69 6e 74 6f 20 3c 74 61 62 6c 65  sult into <table
1150: 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 74  >.**         ret
1160: 75 72 6e 0a 2a 2a 20 20 20 20 20 20 44 3a 20 63  urn.**      D: c
1170: 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 54 68 65  leanup.**.** The
1180: 20 74 68 69 72 64 20 74 65 6d 70 6c 61 74 65 20   third template 
1190: 69 73 20 75 73 65 64 20 69 66 20 74 68 65 20 69  is used if the i
11a0: 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  nsert statement 
11b0: 74 61 6b 65 73 20 69 74 73 0a 2a 2a 20 76 61 6c  takes its.** val
11c0: 75 65 73 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ues from a SELEC
11d0: 54 20 62 75 74 20 74 68 65 20 64 61 74 61 20 69  T but the data i
11e0: 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
11f0: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 0a 2a 2a   into a table.**
1200: 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 72 65   that is also re
1210: 61 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ad as part of th
1220: 65 20 53 45 4c 45 43 54 2e 20 20 49 6e 20 74 68  e SELECT.  In th
1230: 65 20 74 68 69 72 64 20 66 6f 72 6d 2c 0a 2a 2a  e third form,.**
1240: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
1250: 61 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74  a intermediate t
1260: 61 62 6c 65 20 74 6f 20 73 74 6f 72 65 20 74 68  able to store th
1270: 65 20 72 65 73 75 6c 74 73 20 6f 66 0a 2a 2a 20  e results of.** 
1280: 74 68 65 20 73 65 6c 65 63 74 2e 20 20 54 68 65  the select.  The
1290: 20 74 65 6d 70 6c 61 74 65 20 69 73 20 6c 69 6b   template is lik
12a0: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
12b0: 20 20 20 20 20 20 67 6f 74 6f 20 42 0a 2a 2a 20        goto B.** 
12c0: 20 20 20 20 20 41 3a 20 73 65 74 75 70 20 66 6f       A: setup fo
12d0: 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  r the SELECT.** 
12e0: 20 20 20 20 20 20 20 20 6c 6f 6f 70 20 6f 76 65          loop ove
12f0: 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  r the tables in 
1300: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  the SELECT.**   
1310: 20 20 20 20 20 20 20 20 67 6f 73 75 62 20 43 0a          gosub C.
1320: 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 6c  **         end l
1330: 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  oop.**         c
1340: 6c 65 61 6e 75 70 20 61 66 74 65 72 20 74 68 65  leanup after the
1350: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
1360: 20 20 20 67 6f 74 6f 20 44 0a 2a 2a 20 20 20 20     goto D.**    
1370: 20 20 43 3a 20 69 6e 73 65 72 74 20 74 68 65 20    C: insert the 
1380: 73 65 6c 65 63 74 20 72 65 73 75 6c 74 20 69 6e  select result in
1390: 74 6f 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  to the intermedi
13a0: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ate table.**    
13b0: 20 20 20 20 20 72 65 74 75 72 6e 0a 2a 2a 20 20       return.**  
13c0: 20 20 20 20 42 3a 20 6f 70 65 6e 20 61 20 63 75      B: open a cu
13d0: 72 73 6f 72 20 74 6f 20 61 6e 20 69 6e 74 65 72  rsor to an inter
13e0: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 0a 2a 2a  mediate table.**
13f0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 41 0a           goto A.
1400: 2a 2a 20 20 20 20 20 20 44 3a 20 6f 70 65 6e 20  **      D: open 
1410: 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20  write cursor to 
1420: 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73 20  <table> and its 
1430: 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20 20  indices.**      
1440: 20 20 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65     loop over the
1450: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61   intermediate ta
1460: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
1470: 20 74 72 61 6e 73 66 65 72 20 76 61 6c 75 65 73   transfer values
1480: 20 66 6f 72 6d 20 69 6e 74 65 72 6d 65 64 69 61   form intermedia
1490: 74 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 3c 74  te table into <t
14a0: 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20 20 20  able>.**        
14b0: 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 0a 2a 2a   end the loop.**
14c0: 20 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70           cleanup
14d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14e0: 49 6e 73 65 72 74 28 0a 20 20 50 61 72 73 65 20  Insert(.  Parse 
14f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1500: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
1510: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1520: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
1530: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 69 6e  Name of table in
1540: 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
1550: 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45  inserting */.  E
1560: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
1570: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1580: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73  values to be ins
1590: 65 72 74 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  erted */.  Selec
15a0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
15b0: 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
15c0: 74 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73  tement to use as
15d0: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
15e0: 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43   */.  IdList *pC
15f0: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 43  olumn,      /* C
1600: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 6f 72 72  olumn names corr
1610: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 49 44 4c  esponding to IDL
1620: 49 53 54 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  IST. */.  int on
1630: 45 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 20  Error           
1640: 2f 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65  /* How to handle
1650: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f   constraint erro
1660: 72 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  rs */.){.  Table
1670: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
1680: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f   /* The table to
1690: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a   insert into */.
16a0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 20    char *zTab;   
16b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  of the table int
16d0: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
16e0: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 63 6f  nserting */.  co
16f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
1700: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1710: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
1720: 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
1730: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 69 64  /.  int i, j, id
1740: 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  x;        /* Loo
1750: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1760: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1770: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1780: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
1790: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
17a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
17b0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x;          /* F
17c0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
17d0: 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
17e0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
17f0: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
1800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
1810: 75 6d 6e 73 20 69 6e 20 74 68 65 20 64 61 74 61  umns in the data
1820: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 20 3d   */.  int base =
1830: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56   0;         /* V
1840: 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
1850: 72 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  r for pTab */.  
1860: 69 6e 74 20 69 43 6f 6e 74 3d 30 2c 69 42 72 65  int iCont=0,iBre
1870: 61 6b 3d 30 3b 20 2f 2a 20 42 65 67 69 6e 6e 69  ak=0; /* Beginni
1880: 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68  ng and end of th
1890: 65 20 6c 6f 6f 70 20 6f 76 65 72 20 73 72 63 54  e loop over srcT
18a0: 61 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ab */.  sqlite3 
18b0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
18c0: 20 54 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   The main databa
18d0: 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  se structure */.
18e0: 20 20 69 6e 74 20 6b 65 79 43 6f 6c 75 6d 6e 20    int keyColumn 
18f0: 3d 20 2d 31 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d  = -1;   /* Colum
1900: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 49 4e  n that is the IN
1910: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1920: 59 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 4f 66  Y */.  int endOf
1930: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Loop;        /* 
1940: 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
1950: 64 20 6f 66 20 74 68 65 20 69 6e 73 65 72 74 69  d of the inserti
1960: 6f 6e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  on loop */.  int
1970: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 3b 20 20   useTempTable;  
1980: 20 20 20 2f 2a 20 53 74 6f 72 65 20 53 45 4c 45     /* Store SELE
1990: 43 54 20 72 65 73 75 6c 74 73 20 69 6e 20 69 6e  CT results in in
19a0: 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c 65  termediate table
19b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
19c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 44   = 0;       /* D
19d0: 61 74 61 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ata comes from t
19e0: 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 63 75  his temporary cu
19f0: 72 73 6f 72 20 69 66 20 3e 3d 30 20 2a 2f 0a 20  rsor if >=0 */. 
1a00: 20 69 6e 74 20 69 53 65 6c 65 63 74 4c 6f 6f 70   int iSelectLoop
1a10: 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 72 65 73   = 0;  /* Addres
1a20: 73 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  s of code that i
1a30: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 53 45  mplements the SE
1a40: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 43  LECT */.  int iC
1a50: 6c 65 61 6e 75 70 20 3d 20 30 3b 20 20 20 20 20  leanup = 0;     
1a60: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1a70: 65 20 63 6c 65 61 6e 75 70 20 63 6f 64 65 20 2a  e cleanup code *
1a80: 2f 0a 20 20 69 6e 74 20 69 49 6e 73 65 72 74 42  /.  int iInsertB
1a90: 6c 6f 63 6b 20 3d 20 30 3b 20 2f 2a 20 41 64 64  lock = 0; /* Add
1aa0: 72 65 73 73 20 6f 66 20 74 68 65 20 73 75 62 72  ress of the subr
1ab0: 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 69  outine used to i
1ac0: 6e 73 65 72 74 20 64 61 74 61 20 2a 2f 0a 20 20  nsert data */.  
1ad0: 69 6e 74 20 69 43 6e 74 4d 65 6d 20 3d 20 30 3b  int iCntMem = 0;
1ae0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
1af0: 63 65 6c 6c 20 75 73 65 64 20 66 6f 72 20 74 68  cell used for th
1b00: 65 20 72 6f 77 20 63 6f 75 6e 74 65 72 20 2a 2f  e row counter */
1b10: 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 20 3d 20  .  int newIdx = 
1b20: 2d 31 3b 20 20 20 20 20 20 2f 2a 20 43 75 72 73  -1;      /* Curs
1b30: 6f 72 20 66 6f 72 20 74 68 65 20 4e 45 57 20 74  or for the NEW t
1b40: 61 62 6c 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44  able */.  Db *pD
1b50: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1b60: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1b70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
1b80: 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
1b90: 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  into */.  int co
1ba0: 75 6e 74 65 72 4d 65 6d 20 3d 20 30 3b 20 20 20  unterMem = 0;   
1bb0: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
1bc0: 6f 6c 64 69 6e 67 20 41 55 54 4f 49 4e 43 52 45  olding AUTOINCRE
1bd0: 4d 45 4e 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  MENT counter */.
1be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bf0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69  OMIT_TRIGGER.  i
1c00: 6e 74 20 69 73 56 69 65 77 3b 20 20 20 20 20 20  nt isView;      
1c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c20: 75 65 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67  ue if attempting
1c30: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
1c40: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  a view */.  int 
1c50: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d  triggers_exist =
1c60: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
1c70: 69 66 20 74 68 65 72 65 20 61 72 65 20 46 4f 52  if there are FOR
1c80: 20 45 41 43 48 20 52 4f 57 20 74 72 69 67 67 65   EACH ROW trigge
1c90: 72 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  rs */.#endif..#i
1ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cb0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
1cc0: 20 20 69 6e 74 20 63 6f 75 6e 74 65 72 52 6f 77    int counterRow
1cd0: 69 64 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72  id;     /* Memor
1ce0: 79 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 72  y cell holding r
1cf0: 6f 77 69 64 20 6f 66 20 61 75 74 6f 69 6e 63 20  owid of autoinc 
1d00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 23 65 6e 64 69  counter */.#endi
1d10: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
1d20: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
1d30: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
1d40: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
1d50: 61 6e 75 70 3b 0a 20 20 64 62 20 3d 20 70 50 61  anup;.  db = pPa
1d60: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4c  rse->db;..  /* L
1d70: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
1d80: 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77 69  into which we wi
1d90: 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
1da0: 6e 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  new information.
1db0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1dc0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
1dd0: 31 20 29 3b 0a 20 20 7a 54 61 62 20 3d 20 70 54  1 );.  zTab = pT
1de0: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61  abList->a[0].zNa
1df0: 6d 65 3b 0a 20 20 69 66 28 20 7a 54 61 62 3d 3d  me;.  if( zTab==
1e00: 30 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f  0 ) goto insert_
1e10: 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61 62 20  cleanup;.  pTab 
1e20: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1e30: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
1e40: 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  TabList);.  if( 
1e50: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 67  pTab==0 ){.    g
1e60: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
1e70: 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  up;.  }.  assert
1e80: 28 20 70 54 61 62 2d 3e 69 44 62 3c 64 62 2d 3e  ( pTab->iDb<db->
1e90: 6e 44 62 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  nDb );.  pDb = &
1ea0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
1eb0: 62 5d 3b 0a 20 20 7a 44 62 20 3d 20 70 44 62 2d  b];.  zDb = pDb-
1ec0: 3e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 73 71  >zName;.  if( sq
1ed0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1ee0: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
1ef0: 53 45 52 54 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  SERT, pTab->zNam
1f00: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
1f10: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
1f20: 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
1f30: 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 77   Figure out if w
1f40: 65 20 68 61 76 65 20 61 6e 79 20 74 72 69 67 67  e have any trigg
1f50: 65 72 73 20 61 6e 64 20 69 66 20 74 68 65 20 74  ers and if the t
1f60: 61 62 6c 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20  able being.  ** 
1f70: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
1f80: 20 61 20 76 69 65 77 0a 20 20 2a 2f 0a 23 69 66   a view.  */.#if
1f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fa0: 5f 54 52 49 47 47 45 52 0a 20 20 74 72 69 67 67  _TRIGGER.  trigg
1fb0: 65 72 73 5f 65 78 69 73 74 20 3d 20 73 71 6c 69  ers_exist = sqli
1fc0: 74 65 33 54 72 69 67 67 65 72 73 45 78 69 73 74  te3TriggersExist
1fd0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 54  (pParse, pTab, T
1fe0: 4b 5f 49 4e 53 45 52 54 2c 20 30 29 3b 0a 20 20  K_INSERT, 0);.  
1ff0: 69 73 56 69 65 77 20 3d 20 70 54 61 62 2d 3e 70  isView = pTab->p
2000: 53 65 6c 65 63 74 21 3d 30 3b 0a 23 65 6c 73 65  Select!=0;.#else
2010: 0a 23 20 64 65 66 69 6e 65 20 74 72 69 67 67 65  .# define trigge
2020: 72 73 5f 65 78 69 73 74 20 30 0a 23 20 64 65 66  rs_exist 0.# def
2030: 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65 6e  ine isView 0.#en
2040: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2050: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 23 20 75 6e  E_OMIT_VIEW.# un
2060: 64 65 66 20 69 73 56 69 65 77 0a 23 20 64 65 66  def isView.# def
2070: 69 6e 65 20 69 73 56 69 65 77 20 30 0a 23 65 6e  ine isView 0.#en
2080: 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
2090: 20 74 68 61 74 3a 0a 20 20 2a 20 20 28 61 29 20   that:.  *  (a) 
20a0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  the table is not
20b0: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 0a 20 20 2a   read-only, .  *
20c0: 20 20 28 62 29 20 74 68 61 74 20 69 66 20 69 74    (b) that if it
20d0: 20 69 73 20 61 20 76 69 65 77 20 74 68 65 6e 20   is a view then 
20e0: 4f 4e 20 49 4e 53 45 52 54 20 74 72 69 67 67 65  ON INSERT trigge
20f0: 72 73 20 65 78 69 73 74 0a 20 20 2a 2f 0a 20 20  rs exist.  */.  
2100: 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 65 61  if( sqlite3IsRea
2110: 64 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54  dOnly(pParse, pT
2120: 61 62 2c 20 74 72 69 67 67 65 72 73 5f 65 78 69  ab, triggers_exi
2130: 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  st) ){.    goto 
2140: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
2150: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
2160: 30 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f  0 ) goto insert_
2170: 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 49  cleanup;..  /* I
2180: 66 20 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79  f pTab is really
2190: 20 61 20 76 69 65 77 2c 20 6d 61 6b 65 20 73 75   a view, make su
21a0: 72 65 20 69 74 20 68 61 73 20 62 65 65 6e 20 69  re it has been i
21b0: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
21c0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
21d0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
21e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
21f0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
2200: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
2210: 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  nup;.  }..  /* E
2220: 6e 73 75 72 65 20 61 6c 6c 20 72 65 71 75 69 72  nsure all requir
2230: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
2240: 75 65 6e 63 65 73 20 61 72 65 20 61 76 61 69 6c  uences are avail
2250: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2260: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
2270: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
2280: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
2290: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49  f( sqlite3CheckI
22a0: 6e 64 65 78 43 6f 6c 6c 53 65 71 28 70 50 61 72  ndexCollSeq(pPar
22b0: 73 65 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  se, pIdx) ){.   
22c0: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
22d0: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
22e0: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
22f0: 20 61 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 76   a VDBE.  */.  v
2300: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
2310: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2320: 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 69 6e 73   v==0 ) goto ins
2330: 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 69  ert_cleanup;.  i
2340: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
2350: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  d==0 ) sqlite3Vd
2360: 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 76  beCountChanges(v
2370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
2380: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
2390: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 20  pParse, pSelect 
23a0: 7c 7c 20 74 72 69 67 67 65 72 73 5f 65 78 69 73  || triggers_exis
23b0: 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a  t, pTab->iDb);..
23c0: 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20 61 72    /* if there ar
23d0: 65 20 72 6f 77 20 74 72 69 67 67 65 72 73 2c 20  e row triggers, 
23e0: 61 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 20  allocate a temp 
23f0: 74 61 62 6c 65 20 66 6f 72 20 6e 65 77 2e 2a 20  table for new.* 
2400: 72 65 66 65 72 65 6e 63 65 73 2e 20 2a 2f 0a 20  references. */. 
2410: 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65 78   if( triggers_ex
2420: 69 73 74 20 29 7b 0a 20 20 20 20 6e 65 77 49 64  ist ){.    newId
2430: 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
2440: 2b 2b 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ++;.  }..#ifndef
2450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2460: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
2470: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 41 55  If this is an AU
2480: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c  TOINCREMENT tabl
2490: 65 2c 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73  e, look up the s
24a0: 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69  equence number i
24b0: 6e 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  n the.  ** sqlit
24c0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
24d0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
24e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 63 6f 75   memory cell cou
24f0: 6e 74 65 72 4d 65 6d 2e 20 20 41 6c 73 6f 0a 20  nterMem.  Also. 
2500: 20 2a 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65   ** remember the
2510: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 71   rowid of the sq
2520: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
2530: 62 6c 65 20 65 6e 74 72 79 20 69 6e 20 6d 65 6d  ble entry in mem
2540: 6f 72 79 20 63 65 6c 6c 0a 20 20 2a 2a 20 63 6f  ory cell.  ** co
2550: 75 6e 74 65 72 52 6f 77 69 64 2e 0a 20 20 2a 2f  unterRowid..  */
2560: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74  .  if( pTab->aut
2570: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  oInc ){.    int 
2580: 69 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iCur = pParse->n
2590: 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 62 61 73  Tab;.    int bas
25a0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
25b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
25c0: 20 20 20 63 6f 75 6e 74 65 72 52 6f 77 69 64 20     counterRowid 
25d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
25e0: 3b 0a 20 20 20 20 63 6f 75 6e 74 65 72 4d 65 6d  ;.    counterMem
25f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
2600: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
2610: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
2620: 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62  teger, pTab->iDb
2630: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2640: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2650: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 75 72 2c  _OpenRead, iCur,
2660: 20 70 44 62 2d 3e 70 53 65 71 54 61 62 2d 3e 74   pDb->pSeqTab->t
2670: 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  num);.    sqlite
2680: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2690: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
26a0: 69 43 75 72 2c 20 32 29 3b 0a 20 20 20 20 73 71  iCur, 2);.    sq
26b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
26c0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
26d0: 72 2c 20 62 61 73 65 2b 31 33 29 3b 0a 20 20 20  r, base+13);.   
26e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26f0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
2700: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  iCur, 0);.    sq
2710: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
2720: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
2730: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
2740: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2750: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
2760: 2c 20 32 38 34 31 37 2c 20 62 61 73 65 2b 31 32  , 28417, base+12
2770: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2780: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
2790: 63 6e 6f 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20  cno, iCur, 0);. 
27a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27b0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
27c0: 72 65 2c 20 63 6f 75 6e 74 65 72 52 6f 77 69 64  re, counterRowid
27d0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
27e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
27f0: 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 31  _Column, iCur, 1
2800: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2810: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
2820: 6d 53 74 6f 72 65 2c 20 63 6f 75 6e 74 65 72 4d  mStore, counterM
2830: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  em, 1);.    sqli
2840: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2850: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 61 73 65  OP_Goto, 0, base
2860: 2b 31 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  +13);.    sqlite
2870: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2880: 5f 4e 65 78 74 2c 20 69 43 75 72 2c 20 62 61 73  _Next, iCur, bas
2890: 65 2b 34 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e+4);.    sqlite
28a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
28b0: 5f 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29  _Close, iCur, 0)
28c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
28d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
28e0: 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 20 20  INCREMENT */..  
28f0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2900: 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  w many columns o
2910: 66 20 64 61 74 61 20 61 72 65 20 73 75 70 70 6c  f data are suppl
2920: 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
2930: 61 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e 67  a.  ** is coming
2940: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73   from a SELECT s
2950: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74  tatement, then t
2960: 68 69 73 20 73 74 65 70 20 61 6c 73 6f 20 67 65  his step also ge
2970: 6e 65 72 61 74 65 73 0a 20 20 2a 2a 20 61 6c 6c  nerates.  ** all
2980: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 69 6d 70   the code to imp
2990: 6c 65 6d 65 6e 74 20 74 68 65 20 53 45 4c 45 43  lement the SELEC
29a0: 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
29b0: 69 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75 74  invoke a subrout
29c0: 69 6e 65 0a 20 20 2a 2a 20 74 6f 20 70 72 6f 63  ine.  ** to proc
29d0: 65 73 73 20 65 61 63 68 20 72 6f 77 20 6f 66 20  ess each row of 
29e0: 74 68 65 20 72 65 73 75 6c 74 2e 20 28 54 65 6d  the result. (Tem
29f0: 70 6c 61 74 65 20 32 2e 29 20 49 66 20 74 68 65  plate 2.) If the
2a00: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
2a10: 74 65 6d 65 6e 74 20 75 73 65 73 20 74 68 65 20  tement uses the 
2a20: 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
2a30: 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2a40: 20 69 6e 74 6f 2c 20 74 68 65 6e 20 74 68 65 0a   into, then the.
2a50: 20 20 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20    ** subroutine 
2a60: 69 73 20 61 6c 73 6f 20 63 6f 64 65 64 20 68 65  is also coded he
2a70: 72 65 2e 20 20 54 68 61 74 20 73 75 62 72 6f 75  re.  That subrou
2a80: 74 69 6e 65 20 73 74 6f 72 65 73 20 74 68 65 20  tine stores the 
2a90: 53 45 4c 45 43 54 0a 20 20 2a 2a 20 72 65 73 75  SELECT.  ** resu
2aa0: 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
2ab0: 72 79 20 74 61 62 6c 65 2e 20 28 54 65 6d 70 6c  ry table. (Templ
2ac0: 61 74 65 20 33 2e 29 0a 20 20 2a 2f 0a 20 20 69  ate 3.).  */.  i
2ad0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
2ae0: 20 20 2f 2a 20 44 61 74 61 20 69 73 20 63 6f 6d    /* Data is com
2af0: 69 6e 67 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  ing from a SELEC
2b00: 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
2b10: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2b20: 68 61 74 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  hat SELECT.    *
2b30: 2f 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 69 49  /.    int rc, iI
2b40: 6e 69 74 43 6f 64 65 3b 0a 20 20 20 20 69 49 6e  nitCode;.    iIn
2b50: 69 74 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  itCode = sqlite3
2b60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2b70: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Goto, 0, 0);.   
2b80: 20 69 53 65 6c 65 63 74 4c 6f 6f 70 20 3d 20 73   iSelectLoop = s
2b90: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2ba0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 49  tAddr(v);.    iI
2bb0: 6e 73 65 72 74 42 6c 6f 63 6b 20 3d 20 73 71 6c  nsertBlock = sql
2bc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2bd0: 6c 28 76 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  l(v);.    rc = s
2be0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2bf0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52  rse, pSelect, SR
2c00: 54 5f 53 75 62 72 6f 75 74 69 6e 65 2c 20 69 49  T_Subroutine, iI
2c10: 6e 73 65 72 74 42 6c 6f 63 6b 2c 30 2c 30 2c 30  nsertBlock,0,0,0
2c20: 2c 30 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72  ,0,0);.    if( r
2c30: 63 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  c || pParse->nEr
2c40: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
2c50: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
2c60: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
2c70: 3b 0a 20 20 20 20 69 43 6c 65 61 6e 75 70 20 3d  ;.    iCleanup =
2c80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2c90: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71  Label(v);.    sq
2ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2cb0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
2cc0: 6c 65 61 6e 75 70 29 3b 0a 20 20 20 20 61 73 73  leanup);.    ass
2cd0: 65 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 70 45  ert( pSelect->pE
2ce0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  List );.    nCol
2cf0: 75 6d 6e 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  umn = pSelect->p
2d00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
2d10: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 54 65 6d     /* Set useTem
2d20: 70 54 61 62 6c 65 20 74 6f 20 54 52 55 45 20 69  pTable to TRUE i
2d30: 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
2d40: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2d50: 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ment.    ** shou
2d60: 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
2d70: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  to a temporary t
2d80: 61 62 6c 65 2e 20 20 53 65 74 20 74 6f 20 46 41  able.  Set to FA
2d90: 4c 53 45 20 69 66 20 65 61 63 68 0a 20 20 20 20  LSE if each.    
2da0: 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 53 45  ** row of the SE
2db0: 4c 45 43 54 20 63 61 6e 20 62 65 20 77 72 69 74  LECT can be writ
2dc0: 74 65 6e 20 64 69 72 65 63 74 6c 79 20 69 6e 74  ten directly int
2dd0: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 61 62  o the result tab
2de0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2df0: 2a 20 41 20 74 65 6d 70 20 74 61 62 6c 65 20 6d  * A temp table m
2e00: 75 73 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ust be used if t
2e10: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 75  he table being u
2e20: 70 64 61 74 65 64 20 69 73 20 61 6c 73 6f 20 6f  pdated is also o
2e30: 6e 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ne.    ** of the
2e40: 20 74 61 62 6c 65 73 20 62 65 69 6e 67 20 72 65   tables being re
2e50: 61 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ad by the SELECT
2e60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 6c 73   statement.  Als
2e70: 6f 20 75 73 65 20 61 20 0a 20 20 20 20 2a 2a 20  o use a .    ** 
2e80: 74 65 6d 70 20 74 61 62 6c 65 20 69 6e 20 74 68  temp table in th
2e90: 65 20 63 61 73 65 20 6f 66 20 72 6f 77 20 74 72  e case of row tr
2ea0: 69 67 67 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  iggers..    */. 
2eb0: 20 20 20 69 66 28 20 74 72 69 67 67 65 72 73 5f     if( triggers_
2ec0: 65 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 75  exist ){.      u
2ed0: 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 31 3b  seTempTable = 1;
2ee0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ef0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
2f00: 20 20 20 20 20 20 75 73 65 54 65 6d 70 54 61 62        useTempTab
2f10: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  le = 0;.      wh
2f20: 69 6c 65 28 20 75 73 65 54 65 6d 70 54 61 62 6c  ile( useTempTabl
2f30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2f40: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
2f50: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
2f60: 74 65 33 56 64 62 65 46 69 6e 64 4f 70 28 76 2c  te3VdbeFindOp(v,
2f70: 20 61 64 64 72 2c 20 4f 50 5f 4f 70 65 6e 52 65   addr, OP_OpenRe
2f80: 61 64 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b  ad, pTab->tnum);
2f90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
2fa0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
2fb0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
2fc0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
2fd0: 61 64 64 72 2d 32 29 3b 0a 20 20 20 20 20 20 20  addr-2);.       
2fe0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2ff0: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 26 26 20  ==OP_Integer && 
3000: 70 4f 70 2d 3e 70 31 3d 3d 70 54 61 62 2d 3e 69  pOp->p1==pTab->i
3010: 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Db ){.          
3020: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20 31  useTempTable = 1
3030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3040: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
3050: 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  f( useTempTable 
3060: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ){.      /* Gene
3070: 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
3080: 69 6e 65 20 74 68 61 74 20 53 45 4c 45 43 54 20  ine that SELECT 
3090: 63 61 6c 6c 73 20 74 6f 20 70 72 6f 63 65 73 73  calls to process
30a0: 20 65 61 63 68 20 72 6f 77 20 6f 66 0a 20 20 20   each row of.   
30b0: 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
30c0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
30d0: 75 6c 74 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  ult in a tempora
30e0: 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  ry table.      *
30f0: 2f 0a 20 20 20 20 20 20 73 72 63 54 61 62 20 3d  /.      srcTab =
3100: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
3110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3120: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
3130: 2c 20 69 49 6e 73 65 72 74 42 6c 6f 63 6b 29 3b  , iInsertBlock);
3140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3150: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
3160: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
3170: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
3180: 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74  ite3TableAffinit
3190: 79 53 74 72 28 76 2c 20 70 54 61 62 29 3b 0a 20  yStr(v, pTab);. 
31a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
31c0: 65 63 6e 6f 2c 20 73 72 63 54 61 62 2c 20 30 29  ecno, srcTab, 0)
31d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
31e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
31f0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
3200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3210: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b  Op(v, OP_PutIntK
3220: 65 79 2c 20 73 72 63 54 61 62 2c 20 30 29 3b 0a  ey, srcTab, 0);.
3230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3240: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
3250: 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
3260: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
3270: 69 6e 67 20 63 6f 64 65 20 72 75 6e 73 20 66 69  ing code runs fi
3280: 72 73 74 20 62 65 63 61 75 73 65 20 74 68 65 20  rst because the 
3290: 47 4f 54 4f 20 61 74 20 74 68 65 20 76 65 72 79  GOTO at the very
32a0: 20 74 6f 70 0a 20 20 20 20 20 20 2a 2a 20 6f 66   top.      ** of
32b0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6a 75 6d   the program jum
32c0: 70 73 20 74 6f 20 69 74 2e 20 20 43 72 65 61 74  ps to it.  Creat
32d0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
32e0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6a 75 6d 70  table, then jump
32f0: 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 75  .      ** back u
3300: 70 20 61 6e 64 20 65 78 65 63 75 74 65 20 74 68  p and execute th
3310: 65 20 53 45 4c 45 43 54 20 63 6f 64 65 20 61 62  e SELECT code ab
3320: 6f 76 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ove..      */.  
3330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3340: 68 61 6e 67 65 50 32 28 76 2c 20 69 49 6e 69 74  hangeP2(v, iInit
3350: 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 56 64 62  Code, sqlite3Vdb
3360: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
3390: 70 65 6e 54 65 6d 70 2c 20 73 72 63 54 61 62 2c  penTemp, srcTab,
33a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
33b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
33c0: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
33d0: 20 73 72 63 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e   srcTab, nColumn
33e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3400: 47 6f 74 6f 2c 20 30 2c 20 69 53 65 6c 65 63 74  Goto, 0, iSelect
3410: 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
3420: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
3430: 61 62 65 6c 28 76 2c 20 69 43 6c 65 61 6e 75 70  abel(v, iCleanup
3440: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
3450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3460: 68 61 6e 67 65 50 32 28 76 2c 20 69 49 6e 69 74  hangeP2(v, iInit
3470: 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 56 64 62  Code, sqlite3Vdb
3480: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
3490: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
34a0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
34b0: 74 68 65 20 63 61 73 65 20 69 66 20 74 68 65 20  the case if the 
34c0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 49 4e 53  data for the INS
34d0: 45 52 54 20 69 73 20 63 6f 6d 69 6e 67 20 66 72  ERT is coming fr
34e0: 6f 6d 20 61 20 56 41 4c 55 45 53 0a 20 20 20 20  om a VALUES.    
34f0: 2a 2a 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f  ** clause.    */
3500: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 64 75 6d  .    SrcList dum
3510: 6d 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  my;.    assert( 
3520: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pList!=0 );.    
3530: 73 72 63 54 61 62 20 3d 20 2d 31 3b 0a 20 20 20  srcTab = -1;.   
3540: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 3d 20   useTempTable = 
3550: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
3560: 4c 69 73 74 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  List );.    nCol
3570: 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
3580: 70 72 3b 0a 20 20 20 20 64 75 6d 6d 79 2e 6e 53  pr;.    dummy.nS
3590: 72 63 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc = 0;.    for(
35a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
35b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
35c0: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
35d0: 76 65 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 26  veNames(pParse,&
35e0: 64 75 6d 6d 79 2c 30 2c 30 2c 70 4c 69 73 74 2d  dummy,0,0,pList-
35f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 30 2c 31 29  >a[i].pExpr,0,1)
3600: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
3610: 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b   insert_cleanup;
3620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3630: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
3640: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
3650: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
3660: 73 6f 75 72 63 65 20 64 61 74 61 20 6d 61 74 63  source data matc
3670: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  hes the number. 
3680: 20 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74   ** of columns t
3690: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  o be inserted in
36a0: 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  to the table..  
36b0: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  */.  if( pColumn
36c0: 3d 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 21 3d  ==0 && nColumn!=
36d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
36e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
36f0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
3700: 20 20 22 74 61 62 6c 65 20 25 53 20 68 61 73 20    "table %S has 
3710: 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 25  %d columns but %
3720: 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 73 75  d values were su
3730: 70 70 6c 69 65 64 22 2c 0a 20 20 20 20 20 20 20  pplied",.       
3740: 70 54 61 62 4c 69 73 74 2c 20 30 2c 20 70 54 61  pTabList, 0, pTa
3750: 62 2d 3e 6e 43 6f 6c 2c 20 6e 43 6f 6c 75 6d 6e  b->nCol, nColumn
3760: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65  );.    goto inse
3770: 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  rt_cleanup;.  }.
3780: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 21 3d 30    if( pColumn!=0
3790: 20 26 26 20 6e 43 6f 6c 75 6d 6e 21 3d 70 43 6f   && nColumn!=pCo
37a0: 6c 75 6d 6e 2d 3e 6e 49 64 20 29 7b 0a 20 20 20  lumn->nId ){.   
37b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
37c0: 28 70 50 61 72 73 65 2c 20 22 25 64 20 76 61 6c  (pParse, "%d val
37d0: 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d  ues for %d colum
37e0: 6e 73 22 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 70 43  ns", nColumn, pC
37f0: 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 3b 0a 20 20 20  olumn->nId);.   
3800: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
3810: 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  anup;.  }..  /* 
3820: 49 66 20 74 68 65 20 49 4e 53 45 52 54 20 73 74  If the INSERT st
3830: 61 74 65 6d 65 6e 74 20 69 6e 63 6c 75 64 65 64  atement included
3840: 20 61 6e 20 49 44 4c 49 53 54 20 74 65 72 6d 2c   an IDLIST term,
3850: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a   then make sure.
3860: 20 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e 74    ** all element
3870: 73 20 6f 66 20 74 68 65 20 49 44 4c 49 53 54 20  s of the IDLIST 
3880: 72 65 61 6c 6c 79 20 61 72 65 20 63 6f 6c 75 6d  really are colum
3890: 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
38a0: 61 6e 64 20 0a 20 20 2a 2a 20 72 65 6d 65 6d 62  and .  ** rememb
38b0: 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  er the column in
38c0: 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dices..  **.  **
38d0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
38e0: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
38f0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
3900: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 0a  and that column.
3910: 20 20 2a 2a 20 69 73 20 6e 61 6d 65 64 20 69 6e    ** is named in
3920: 20 74 68 65 20 49 44 4c 49 53 54 2c 20 74 68 65   the IDLIST, the
3930: 6e 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  n record in the 
3940: 6b 65 79 43 6f 6c 75 6d 6e 20 76 61 72 69 61 62  keyColumn variab
3950: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  le.  ** the inde
3960: 78 20 69 6e 74 6f 20 49 44 4c 49 53 54 20 6f 66  x into IDLIST of
3970: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
3980: 20 63 6f 6c 75 6d 6e 2e 20 20 6b 65 79 43 6f 6c   column.  keyCol
3990: 75 6d 6e 20 69 73 0a 20 20 2a 2a 20 74 68 65 20  umn is.  ** the 
39a0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 70 72 69  index of the pri
39b0: 6d 61 72 79 20 6b 65 79 20 61 73 20 69 74 20 61  mary key as it a
39c0: 70 70 65 61 72 73 20 69 6e 20 49 44 4c 49 53 54  ppears in IDLIST
39d0: 2c 20 6e 6f 74 20 61 73 0a 20 20 2a 2a 20 69 73  , not as.  ** is
39e0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 20   appears in the 
39f0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 2e 20  original table. 
3a00: 20 28 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74   (The index of t
3a10: 68 65 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20  he primary.  ** 
3a20: 6b 65 79 20 69 6e 20 74 68 65 20 6f 72 69 67 69  key in the origi
3a30: 6e 61 6c 20 74 61 62 6c 65 20 69 73 20 70 54 61  nal table is pTa
3a40: 62 2d 3e 69 50 4b 65 79 2e 29 0a 20 20 2a 2f 0a  b->iPKey.).  */.
3a50: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 29 7b    if( pColumn ){
3a60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3a70: 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 69 2b  pColumn->nId; i+
3a80: 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 75 6d  +){.      pColum
3a90: 6e 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d 20 2d 31  n->a[i].idx = -1
3aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
3ab0: 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e  i=0; i<pColumn->
3ac0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nId; i++){.     
3ad0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
3ae0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
3af0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3b00: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 75 6d 6e  3StrICmp(pColumn
3b10: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
3b20: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3b30: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
3b40: 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d     pColumn->a[i]
3b50: 2e 69 64 78 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .idx = j;.      
3b60: 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d      if( j==pTab-
3b70: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
3b80: 20 20 20 20 20 20 6b 65 79 43 6f 6c 75 6d 6e 20        keyColumn 
3b90: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
3ba0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3bb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3bc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
3bd0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
3be0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3bf0: 65 33 49 73 52 6f 77 69 64 28 70 43 6f 6c 75 6d  e3IsRowid(pColum
3c00: 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  n->a[i].zName) )
3c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 43  {.          keyC
3c20: 6f 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20  olumn = i;.     
3c30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3c40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3c50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
3c60: 6c 65 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c  le %S has no col
3c70: 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
3c90: 62 4c 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d  bList, 0, pColum
3ca0: 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  n->a[i].zName);.
3cb0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3cc0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
3cd0: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
3ce0: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
3cf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3d00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
3d10: 65 72 65 20 69 73 20 6e 6f 20 49 44 4c 49 53 54  ere is no IDLIST
3d20: 20 74 65 72 6d 20 62 75 74 20 74 68 65 20 74 61   term but the ta
3d30: 62 6c 65 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ble has an integ
3d40: 65 72 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20  er primary.  ** 
3d50: 6b 65 79 2c 20 74 68 65 20 73 65 74 20 74 68 65  key, the set the
3d60: 20 6b 65 79 43 6f 6c 75 6d 6e 20 76 61 72 69 61   keyColumn varia
3d70: 62 6c 65 20 74 6f 20 74 68 65 20 70 72 69 6d 61  ble to the prima
3d80: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 6e  ry key column in
3d90: 64 65 78 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  dex.  ** in the 
3da0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 64  original table d
3db0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  efinition..  */.
3dc0: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30    if( pColumn==0
3dd0: 20 29 7b 0a 20 20 20 20 6b 65 79 43 6f 6c 75 6d   ){.    keyColum
3de0: 6e 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  n = pTab->iPKey;
3df0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
3e00: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 66  the temp table f
3e10: 6f 72 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20  or FOR EACH ROW 
3e20: 74 72 69 67 67 65 72 73 0a 20 20 2a 2f 0a 20 20  triggers.  */.  
3e30: 69 66 28 20 74 72 69 67 67 65 72 73 5f 65 78 69  if( triggers_exi
3e40: 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
3e50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3e60: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 6e 65 77  _OpenPseudo, new
3e70: 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Idx, 0);.    sql
3e80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3e90: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
3ea0: 73 2c 20 6e 65 77 49 64 78 2c 20 70 54 61 62 2d  s, newIdx, pTab-
3eb0: 3e 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 20 20  >nCol);.  }.    
3ec0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
3ed0: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f   the count of ro
3ee0: 77 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ws to be inserte
3ef0: 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  d.  */.  if( db-
3f00: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
3f10: 43 6f 75 6e 74 52 6f 77 73 20 29 7b 0a 20 20 20  CountRows ){.   
3f20: 20 69 43 6e 74 4d 65 6d 20 3d 20 70 50 61 72 73   iCntMem = pPars
3f30: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
3f40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3f50: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
3f60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
3f70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3f80: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 43 6e 74 4d  _MemStore, iCntM
3f90: 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  em, 1);.  }..  /
3fa0: 2a 20 4f 70 65 6e 20 74 61 62 6c 65 73 20 61 6e  * Open tables an
3fb0: 64 20 69 6e 64 69 63 65 73 20 69 66 20 74 68 65  d indices if the
3fc0: 72 65 20 61 72 65 20 6e 6f 20 72 6f 77 20 74 72  re are no row tr
3fd0: 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 66 28 20  iggers */.  if( 
3fe0: 21 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20  !triggers_exist 
3ff0: 29 7b 0a 20 20 20 20 62 61 73 65 20 3d 20 70 50  ){.    base = pP
4000: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
4010: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
4020: 41 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73  AndIndices(pPars
4030: 65 2c 20 70 54 61 62 2c 20 62 61 73 65 2c 20 4f  e, pTab, base, O
4040: 50 5f 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20  P_OpenWrite);.  
4050: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
4060: 61 74 61 20 73 6f 75 72 63 65 20 69 73 20 61 20  ata source is a 
4070: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
4080: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
4090: 20 63 72 65 61 74 65 0a 20 20 2a 2a 20 61 20 6c   create.  ** a l
40a0: 6f 6f 70 20 62 65 63 61 75 73 65 20 74 68 65 72  oop because ther
40b0: 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74 69  e might be multi
40c0: 70 6c 65 20 72 6f 77 73 20 6f 66 20 64 61 74 61  ple rows of data
40d0: 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 0a 20  .  If the data. 
40e0: 20 2a 2a 20 73 6f 75 72 63 65 20 69 73 20 61 20   ** source is a 
40f0: 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 20  subroutine call 
4100: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
4110: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
4120: 77 65 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20  we need.  ** to 
4130: 6c 61 75 6e 63 68 20 74 68 65 20 53 45 4c 45 43  launch the SELEC
4140: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 72 6f 63  T statement proc
4150: 65 73 73 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69  essing..  */.  i
4160: 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  f( useTempTable 
4170: 29 7b 0a 20 20 20 20 69 42 72 65 61 6b 20 3d 20  ){.    iBreak = 
4180: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4190: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
41a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
41b0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 72 63 54   OP_Rewind, srcT
41c0: 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
41d0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
41e0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
41f0: 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  v);.  }else if( 
4200: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
4210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4220: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
4230: 53 65 6c 65 63 74 4c 6f 6f 70 29 3b 0a 20 20 20  SelectLoop);.   
4240: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
4250: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 49 6e 73  lveLabel(v, iIns
4260: 65 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a  ertBlock);.  }..
4270: 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 42 45 46    /* Run the BEF
4280: 4f 52 45 20 61 6e 64 20 49 4e 53 54 45 41 44 20  ORE and INSTEAD 
4290: 4f 46 20 74 72 69 67 67 65 72 73 2c 20 69 66 20  OF triggers, if 
42a0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 0a 20 20  there are any.  
42b0: 2a 2f 0a 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d  */.  endOfLoop =
42c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
42d0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20  Label(v);.  if( 
42e0: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 26  triggers_exist &
42f0: 20 54 52 49 47 47 45 52 5f 42 45 46 4f 52 45 20   TRIGGER_BEFORE 
4300: 29 7b 0a 0a 20 20 20 20 2f 2a 20 62 75 69 6c 64  ){..    /* build
4310: 20 74 68 65 20 4e 45 57 2e 2a 20 72 65 66 65 72   the NEW.* refer
4320: 65 6e 63 65 20 72 6f 77 2e 20 20 4e 6f 74 65 20  ence row.  Note 
4330: 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73  that if there is
4340: 20 61 6e 20 49 4e 54 45 47 45 52 0a 20 20 20 20   an INTEGER.    
4350: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ** PRIMARY KEY i
4360: 6e 74 6f 20 77 68 69 63 68 20 61 20 4e 55 4c 4c  nto which a NULL
4370: 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
4380: 65 64 2c 20 74 68 61 74 20 4e 55 4c 4c 20 77 69  ed, that NULL wi
4390: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 61  ll be.    ** tra
43a0: 6e 73 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 75  nslated into a u
43b0: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 74 68 65  nique ID for the
43c0: 20 72 6f 77 2e 20 20 42 75 74 20 6f 6e 20 61 20   row.  But on a 
43d0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 2c 0a  BEFORE trigger,.
43e0: 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
43f0: 20 6b 6e 6f 77 20 77 68 61 74 20 74 68 65 20 75   know what the u
4400: 6e 69 71 75 65 20 49 44 20 77 69 6c 6c 20 62 65  nique ID will be
4410: 20 28 62 65 63 61 75 73 65 20 74 68 65 20 69 6e   (because the in
4420: 73 65 72 74 20 68 61 73 0a 20 20 20 20 2a 2a 20  sert has.    ** 
4430: 6e 6f 74 20 68 61 70 70 65 6e 65 64 20 79 65 74  not happened yet
4440: 29 20 73 6f 20 77 65 20 73 75 62 73 74 69 74 75  ) so we substitu
4450: 74 65 20 61 20 72 6f 77 69 64 20 6f 66 20 2d 31  te a rowid of -1
4460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4470: 6b 65 79 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  keyColumn<0 ){. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4490: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
44a0: 67 65 72 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  ger, -1, 0);.   
44b0: 20 7d 65 6c 73 65 20 69 66 28 20 75 73 65 54 65   }else if( useTe
44c0: 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  mpTable ){.     
44d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
44e0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
44f0: 73 72 63 54 61 62 2c 20 6b 65 79 43 6f 6c 75 6d  srcTab, keyColum
4500: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
4510: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
4520: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 4f  lect==0 );  /* O
4530: 74 68 65 72 77 69 73 65 20 75 73 65 54 65 6d 70  therwise useTemp
4540: 54 61 62 6c 65 20 69 73 20 74 72 75 65 20 2a 2f  Table is true */
4550: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4560: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
4570: 4c 69 73 74 2d 3e 61 5b 6b 65 79 43 6f 6c 75 6d  List->a[keyColum
4580: 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  n].pExpr);.     
4590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
45a0: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
45b0: 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65   -1, sqlite3Vdbe
45c0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
45d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
45e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
45f0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
4600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4610: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4620: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , -1, 0);.      
4630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4640: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
4650: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  , 0, 0);.    }..
4660: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
4670: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 64 61 74  e new column dat
4680: 61 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  a.    */.    for
4690: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
46a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
46b0: 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29  if( pColumn==0 )
46c0: 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 3b  {.        j = i;
46d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
46e0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
46f0: 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a  <pColumn->nId; j
4700: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
4710: 66 28 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d  f( pColumn->a[j]
4720: 2e 69 64 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b  .idx==i ) break;
4730: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4740: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f   }.      if( pCo
4750: 6c 75 6d 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75  lumn && j>=pColu
4760: 6d 6e 2d 3e 6e 49 64 20 29 7b 0a 20 20 20 20 20  mn->nId ){.     
4770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4780: 64 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  de(pParse, pTab-
4790: 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 29 3b  >aCol[i].pDflt);
47a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
47b0: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b   useTempTable ){
47c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
47d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
47e0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
47f0: 6a 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  j); .      }else
4800: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4810: 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ( pSelect==0 ); 
4820: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  /* Otherwise use
4830: 54 65 6d 70 54 61 62 6c 65 20 69 73 20 74 72 75  TempTable is tru
4840: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43  ite3ExprCodeAndC
4860: 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 4c 69  ache(pParse, pLi
4870: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
4880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4890: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
48a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
48b0: 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  cord, pTab->nCol
48c0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 0);..    /* If
48d0: 20 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45   this is an INSE
48e0: 52 54 20 6f 6e 20 61 20 76 69 65 77 20 77 69 74  RT on a view wit
48f0: 68 20 61 6e 20 49 4e 53 54 45 41 44 20 4f 46 20  h an INSTEAD OF 
4900: 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 2c 0a  INSERT trigger,.
4910: 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 61 74      ** do not at
4920: 74 65 6d 70 74 20 61 6e 79 20 63 6f 6e 76 65 72  tempt any conver
4930: 73 69 6f 6e 73 20 62 65 66 6f 72 65 20 61 73 73  sions before ass
4940: 65 6d 62 6c 69 6e 67 20 74 68 65 20 72 65 63 6f  embling the reco
4950: 72 64 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  rd..    ** If th
4960: 69 73 20 69 73 20 61 20 72 65 61 6c 20 74 61 62  is is a real tab
4970: 6c 65 2c 20 61 74 74 65 6d 70 74 20 63 6f 6e 76  le, attempt conv
4980: 65 72 73 69 6f 6e 73 20 61 73 20 72 65 71 75 69  ersions as requi
4990: 72 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  red by the.    *
49a0: 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 61  * table column a
49b0: 66 66 69 6e 69 74 69 65 73 2e 0a 20 20 20 20 2a  ffinities..    *
49c0: 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  /.    if( !isVie
49d0: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
49e0: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 53  e3TableAffinityS
49f0: 74 72 28 76 2c 20 70 54 61 62 29 3b 0a 20 20 20  tr(v, pTab);.   
4a00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
4a10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4a20: 74 49 6e 74 4b 65 79 2c 20 6e 65 77 49 64 78 2c  tIntKey, newIdx,
4a30: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 72   0);..    /* Fir
4a40: 65 20 42 45 46 4f 52 45 20 6f 72 20 49 4e 53 54  e BEFORE or INST
4a50: 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 73 20  EAD OF triggers 
4a60: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
4a70: 65 33 43 6f 64 65 52 6f 77 54 72 69 67 67 65 72  e3CodeRowTrigger
4a80: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 53 45  (pParse, TK_INSE
4a90: 52 54 2c 20 30 2c 20 54 52 49 47 47 45 52 5f 42  RT, 0, TRIGGER_B
4aa0: 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 0a 20 20  EFORE, pTab, .  
4ab0: 20 20 20 20 20 20 6e 65 77 49 64 78 2c 20 2d 31        newIdx, -1
4ac0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66  , onError, endOf
4ad0: 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 67  Loop) ){.      g
4ae0: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
4af0: 75 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  up;.    }.  }.. 
4b00: 20 2f 2a 20 49 66 20 61 6e 79 20 74 72 69 67 67   /* If any trigg
4b10: 65 72 73 20 65 78 69 73 74 73 2c 20 74 68 65 20  ers exists, the 
4b20: 6f 70 65 6e 69 6e 67 20 6f 66 20 74 61 62 6c 65  opening of table
4b30: 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 73  s and indices is
4b40: 20 64 65 66 65 72 72 65 64 0a 20 20 2a 2a 20 75   deferred.  ** u
4b50: 6e 74 69 6c 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  ntil now..  */. 
4b60: 20 69 66 28 20 74 72 69 67 67 65 72 73 5f 65 78   if( triggers_ex
4b70: 69 73 74 20 26 26 20 21 69 73 56 69 65 77 20 29  ist && !isView )
4b80: 7b 0a 20 20 20 20 62 61 73 65 20 3d 20 70 50 61  {.    base = pPa
4b90: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
4ba0: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 41  qlite3OpenTableA
4bb0: 6e 64 49 6e 64 69 63 65 73 28 70 50 61 72 73 65  ndIndices(pParse
4bc0: 2c 20 70 54 61 62 2c 20 62 61 73 65 2c 20 4f 50  , pTab, base, OP
4bd0: 5f 4f 70 65 6e 57 72 69 74 65 29 3b 0a 20 20 7d  _OpenWrite);.  }
4be0: 0a 0a 20 20 2f 2a 20 50 75 73 68 20 74 68 65 20  ..  /* Push the 
4bf0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
4c00: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
4c10: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20  onto the stack. 
4c20: 20 54 68 65 0a 20 20 2a 2a 20 72 65 63 6f 72 64   The.  ** record
4c30: 20 6e 75 6d 62 65 72 20 69 73 20 61 20 72 61 6e   number is a ran
4c40: 64 6f 6d 6c 79 20 67 65 6e 65 72 61 74 65 20 69  domly generate i
4c50: 6e 74 65 67 65 72 20 63 72 65 61 74 65 64 20 62  nteger created b
4c60: 79 20 4e 65 77 52 65 63 6e 6f 0a 20 20 2a 2a 20  y NewRecno.  ** 
4c70: 65 78 63 65 70 74 20 77 68 65 6e 20 74 68 65 20  except when the 
4c80: 74 61 62 6c 65 20 68 61 73 20 61 6e 20 49 4e 54  table has an INT
4c90: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4ca0: 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20 77 68 69 63   column, in whic
4cb0: 68 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20  h.  ** case the 
4cc0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73  record number is
4cd0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 61   the same as tha
4ce0: 74 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2f 0a  t column. .  */.
4cf0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
4d00: 0a 20 20 20 20 69 66 28 20 6b 65 79 43 6f 6c 75  .    if( keyColu
4d10: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mn>=0 ){.      i
4d20: 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  f( useTempTable 
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4d40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4d50: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4d60: 2c 20 6b 65 79 43 6f 6c 75 6d 6e 29 3b 0a 20 20  , keyColumn);.  
4d70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
4d80: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
4d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4da0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 43 6f  p(v, OP_Dup, nCo
4db0: 6c 75 6d 6e 20 2d 20 6b 65 79 43 6f 6c 75 6d 6e  lumn - keyColumn
4dc0: 20 2d 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20   - 1, 1);.      
4dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4de0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
4df0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b  Parse, pList->a[
4e00: 6b 65 79 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  keyColumn].pExpr
4e10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4e20: 20 2f 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41   /* If the PRIMA
4e30: 52 59 20 4b 45 59 20 65 78 70 72 65 73 73 69 6f  RY KEY expressio
4e40: 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  n is NULL, then 
4e50: 75 73 65 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 0a  use OP_NewRecno.
4e60: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 65 6e 65        ** to gene
4e70: 72 61 74 65 20 61 20 75 6e 69 71 75 65 20 70 72  rate a unique pr
4e80: 69 6d 61 72 79 20 6b 65 79 20 76 61 6c 75 65 2e  imary key value.
4e90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
4ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4eb0: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
4ec0: 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -1, sqlite3VdbeC
4ed0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4ee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4ef0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4f00: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
4f10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f20: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4f30: 2c 20 62 61 73 65 2c 20 63 6f 75 6e 74 65 72 4d  , base, counterM
4f40: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
4f50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4f60: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20  P_MustBeInt, 0, 
4f70: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
4f80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
4fa0: 65 63 6e 6f 2c 20 62 61 73 65 2c 20 63 6f 75 6e  ecno, base, coun
4fb0: 74 65 72 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 23  terMem);.    }.#
4fc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4fd0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
4fe0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
4ff0: 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20  utoInc ){.      
5000: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5010: 28 76 2c 20 4f 50 5f 4d 65 6d 4d 61 78 2c 20 63  (v, OP_MemMax, c
5020: 6f 75 6e 74 65 72 4d 65 6d 2c 20 30 29 3b 0a 20  ounterMem, 0);. 
5030: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
5040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
5050: 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 20 20 20  NCREMENT */..   
5060: 20 2f 2a 20 50 75 73 68 20 6f 6e 74 6f 20 74 68   /* Push onto th
5070: 65 20 73 74 61 63 6b 2c 20 64 61 74 61 20 66 6f  e stack, data fo
5080: 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66  r all columns of
5090: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2c 20   the new entry, 
50a0: 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
50b0: 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
50c0: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
50d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
50e0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
50f0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61        if( i==pTa
5100: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
5110: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
5120: 20 6f 66 20 74 68 65 20 49 4e 54 45 47 45 52 20   of the INTEGER 
5130: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
5140: 6d 6e 20 69 73 20 61 6c 77 61 79 73 20 61 20 4e  mn is always a N
5150: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ULL..        ** 
5160: 57 68 65 6e 65 76 65 72 20 74 68 69 73 20 63 6f  Whenever this co
5170: 6c 75 6d 6e 20 69 73 20 72 65 61 64 2c 20 74 68  lumn is read, th
5180: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
5190: 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74 75  will be substitu
51a0: 74 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ted.        ** i
51b0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 53 6f  n its place.  So
51c0: 20 77 69 6c 6c 20 66 69 6c 6c 20 74 68 69 73 20   will fill this 
51d0: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 4e 55  column with a NU
51e0: 4c 4c 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  LL to avoid.    
51f0: 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 75 70      ** taking up
5200: 20 64 61 74 61 20 73 70 61 63 65 20 77 69 74 68   data space with
5210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
5220: 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
5230: 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  used. */.       
5240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5250: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
5260: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
5270: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5280: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
5290: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
52a0: 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d    j = i;.      }
52b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
52c0: 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d 6e  r(j=0; j<pColumn
52d0: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
52e0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75         if( pColu
52f0: 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69 20  mn->a[j].idx==i 
5300: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
5310: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5320: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 26 26 20   if( pColumn && 
5330: 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20  j>=pColumn->nId 
5340: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5350: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
5360: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  e, pTab->aCol[i]
5370: 2e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 7d  .pDflt);.      }
5380: 65 6c 73 65 20 69 66 28 20 75 73 65 54 65 6d 70  else if( useTemp
5390: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
53a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
53b0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
53c0: 73 72 63 54 61 62 2c 20 6a 29 3b 20 0a 20 20 20  srcTab, j); .   
53d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
53e0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
53f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5400: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69 2b 6e 43  (v, OP_Dup, i+nC
5410: 6f 6c 75 6d 6e 2d 6a 2c 20 31 29 3b 0a 20 20 20  olumn-j, 1);.   
5420: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5430: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5440: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
5450: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
5460: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5470: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5480: 65 20 74 6f 20 63 68 65 63 6b 20 63 6f 6e 73 74  e to check const
5490: 72 61 69 6e 74 73 20 61 6e 64 20 67 65 6e 65 72  raints and gener
54a0: 61 74 65 20 69 6e 64 65 78 20 6b 65 79 73 20 61  ate index keys a
54b0: 6e 64 0a 20 20 20 20 2a 2a 20 64 6f 20 74 68 65  nd.    ** do the
54c0: 20 69 6e 73 65 72 74 69 6f 6e 2e 0a 20 20 20 20   insertion..    
54d0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47 65  */.    sqlite3Ge
54e0: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
54f0: 43 68 65 63 6b 73 28 70 50 61 72 73 65 2c 20 70  Checks(pParse, p
5500: 54 61 62 2c 20 62 61 73 65 2c 20 30 2c 20 6b 65  Tab, base, 0, ke
5510: 79 43 6f 6c 75 6d 6e 3e 3d 30 2c 0a 20 20 20 20  yColumn>=0,.    
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5540: 2c 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66  , onError, endOf
5550: 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Loop);.    sqlit
5560: 65 33 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72 74  e3CompleteInsert
5570: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
5580: 2c 20 62 61 73 65 2c 20 30 2c 30 2c 30 2c 0a 20  , base, 0,0,0,. 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 20 20 20 20 20 20 20 28 74 72 69 67             (trig
55b0: 67 65 72 73 5f 65 78 69 73 74 20 26 20 54 52 49  gers_exist & TRI
55c0: 47 47 45 52 5f 41 46 54 45 52 29 21 3d 30 20 3f  GGER_AFTER)!=0 ?
55d0: 20 6e 65 77 49 64 78 20 3a 20 2d 31 29 3b 0a 20   newIdx : -1);. 
55e0: 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
55f0: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77  the count of row
5600: 73 20 74 68 61 74 20 61 72 65 20 69 6e 73 65 72  s that are inser
5610: 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ted.  */.  if( (
5620: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5630: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 29 21 3d 30  TE_CountRows)!=0
5640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
5660: 65 6d 49 6e 63 72 2c 20 69 43 6e 74 4d 65 6d 2c  emIncr, iCntMem,
5670: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
5680: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29  triggers_exist )
5690: 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61  {.    /* Close a
56a0: 6c 6c 20 74 61 62 6c 65 73 20 6f 70 65 6e 65 64  ll tables opened
56b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 56   */.    if( !isV
56c0: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  iew ){.      sql
56d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
56e0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
56f0: 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
5700: 64 78 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  dx=1, pIdx=pTab-
5710: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
5720: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
5730: 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20   idx++){.       
5740: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5750: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  p(v, OP_Close, i
5760: 64 78 2b 62 61 73 65 2c 20 30 29 3b 0a 20 20 20  dx+base, 0);.   
5770: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
5780: 2f 2a 20 43 6f 64 65 20 41 46 54 45 52 20 74 72  /* Code AFTER tr
5790: 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 69 66  iggers */.    if
57a0: 28 20 73 71 6c 69 74 65 33 43 6f 64 65 52 6f 77  ( sqlite3CodeRow
57b0: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
57c0: 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54 52  TK_INSERT, 0, TR
57d0: 49 47 47 45 52 5f 41 46 54 45 52 2c 20 70 54 61  IGGER_AFTER, pTa
57e0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 65 77  b,.          new
57f0: 49 64 78 2c 20 2d 31 2c 20 6f 6e 45 72 72 6f 72  Idx, -1, onError
5800: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 20 29 7b 0a  , endOfLoop) ){.
5810: 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72        goto inser
5820: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  t_cleanup;.    }
5830: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
5840: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
5850: 70 2c 20 69 66 20 74 68 65 20 64 61 74 61 20 73  p, if the data s
5860: 6f 75 72 63 65 20 69 73 20 61 20 53 45 4c 45 43  ource is a SELEC
5870: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2f  T statement.  */
5880: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
5890: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
58a0: 64 4f 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20  dOfLoop);.  if( 
58b0: 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a  useTempTable ){.
58c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
58d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
58e0: 20 73 72 63 54 61 62 2c 20 69 43 6f 6e 74 29 3b   srcTab, iCont);
58f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5900: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5910: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  iBreak);.    sql
5920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5930: 20 4f 50 5f 43 6c 6f 73 65 2c 20 73 72 63 54 61   OP_Close, srcTa
5940: 62 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  b, 0);.  }else i
5950: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
5960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5970: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43  Op(v, OP_Pop, nC
5980: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 73  olumn, 0);.    s
5990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
59a0: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
59b0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
59c0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
59d0: 28 76 2c 20 69 43 6c 65 61 6e 75 70 29 3b 0a 20  (v, iCleanup);. 
59e0: 20 7d 0a 0a 20 20 69 66 28 20 21 74 72 69 67 67   }..  if( !trigg
59f0: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
5a00: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 74 61   /* Close all ta
5a10: 62 6c 65 73 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  bles opened */. 
5a20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5a30: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
5a40: 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 66   base, 0);.    f
5a50: 6f 72 28 69 64 78 3d 31 2c 20 70 49 64 78 3d 70  or(idx=1, pIdx=p
5a60: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
5a70: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
5a80: 65 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20  ext, idx++){.   
5a90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5aa0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
5ab0: 20 69 64 78 2b 62 61 73 65 2c 20 30 29 3b 0a 20   idx+base, 0);. 
5ac0: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
5ad0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5ae0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a  TOINCREMENT.  /*
5af0: 20 55 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   Update the sqli
5b00: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
5b10: 65 20 62 79 20 73 74 6f 72 69 6e 67 20 74 68 65  e by storing the
5b20: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
5b30: 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 76 61 6c    ** counter val
5b40: 75 65 20 69 6e 20 6d 65 6d 6f 72 79 20 63 6f 75  ue in memory cou
5b50: 6e 74 65 72 4d 65 6d 20 62 61 63 6b 20 69 6e 74  nterMem back int
5b60: 6f 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  o the sqlite_seq
5b70: 75 65 6e 63 65 0a 20 20 2a 2a 20 74 61 62 6c 65  uence.  ** table
5b80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
5b90: 62 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20  b->autoInc ){.  
5ba0: 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 50 61    int iCur = pPa
5bb0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 69  rse->nTab;.    i
5bc0: 6e 74 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65  nt base = sqlite
5bd0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5be0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
5bf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5c00: 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
5c10: 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
5c20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5c30: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 43  OP_OpenWrite, iC
5c40: 75 72 2c 20 70 44 62 2d 3e 70 53 65 71 54 61 62  ur, pDb->pSeqTab
5c50: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c  ->tnum);.    sql
5c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5c70: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
5c80: 73 2c 20 69 43 75 72 2c 20 32 29 3b 0a 20 20 20  s, iCur, 2);.   
5c90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ca0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
5cb0: 20 63 6f 75 6e 74 65 72 52 6f 77 69 64 2c 20 30   counterRowid, 0
5cc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5cd0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
5ce0: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 62 61 73 65 2b  tNull, -1, base+
5cf0: 37 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  7);.    sqlite3V
5d00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
5d10: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
5d20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5d30: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
5d40: 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  iCur, 0);.    sq
5d50: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
5d60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
5d70: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
5d80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5d90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
5da0: 6d 4c 6f 61 64 2c 20 63 6f 75 6e 74 65 72 4d 65  mLoad, counterMe
5db0: 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  m, 0);.    sqlit
5dc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5dd0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 32 2c  P_MakeRecord, 2,
5de0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5df0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e00: 50 75 74 49 6e 74 4b 65 79 2c 20 69 43 75 72 2c  PutIntKey, iCur,
5e10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5e20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e30: 43 6c 6f 73 65 2c 20 69 43 75 72 2c 20 30 29 3b  Close, iCur, 0);
5e40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
5e50: 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68  *.  ** Return th
5e60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
5e70: 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 74 68   inserted. If th
5e80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 0a 20  is routine is . 
5e90: 20 2a 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 63   ** generating c
5ea0: 6f 64 65 20 62 65 63 61 75 73 65 20 6f 66 20 61  ode because of a
5eb0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
5ec0: 4e 65 73 74 65 64 50 61 72 73 65 28 29 2c 20 64  NestedParse(), d
5ed0: 6f 20 6e 6f 74 0a 20 20 2a 2a 20 69 6e 76 6f 6b  o not.  ** invok
5ee0: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
5ef0: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
5f00: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
5f10: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
5f20: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
5f30: 65 64 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  ed==0 && !pParse
5f40: 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20  ->trigStack ){. 
5f50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5f60: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
5f70: 64 2c 20 69 43 6e 74 4d 65 6d 2c 20 30 29 3b 0a  d, iCntMem, 0);.
5f80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5f90: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
5fa0: 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ack, 1, 0);.    
5fb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
5fc0: 6d 43 6f 6c 73 28 76 2c 20 31 29 3b 0a 20 20 20  mCols(v, 1);.   
5fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
5fe0: 6f 6c 4e 61 6d 65 28 76 2c 20 30 2c 20 22 72 6f  olName(v, 0, "ro
5ff0: 77 73 20 69 6e 73 65 72 74 65 64 22 2c 20 50 33  ws inserted", P3
6000: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 0a 69  _STATIC);.  }..i
6010: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3a 0a 20  nsert_cleanup:. 
6020: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
6030: 65 6c 65 74 65 28 70 54 61 62 4c 69 73 74 29 3b  elete(pTabList);
6040: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 73  .  if( pList ) s
6050: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
6060: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 69  lete(pList);.  i
6070: 66 28 20 70 53 65 6c 65 63 74 20 29 20 73 71 6c  f( pSelect ) sql
6080: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
6090: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
60a0: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
60b0: 28 70 43 6f 6c 75 6d 6e 29 3b 0a 7d 0a 0a 2f 2a  (pColumn);.}../*
60c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
60d0: 65 20 74 6f 20 64 6f 20 61 20 63 6f 6e 73 74 72  e to do a constr
60e0: 61 69 6e 74 20 63 68 65 63 6b 20 70 72 69 6f 72  aint check prior
60f0: 20 74 6f 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   to an INSERT or
6100: 20 61 6e 20 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a   an UPDATE..**.*
6110: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
6120: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
6130: 68 65 20 73 74 61 63 6b 20 63 6f 6e 74 61 69 6e  he stack contain
6140: 73 20 28 66 72 6f 6d 20 62 6f 74 74 6f 6d 20 74  s (from bottom t
6150: 6f 20 74 6f 70 29 0a 2a 2a 20 74 68 65 20 66 6f  o top).** the fo
6160: 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 3a 0a  llowing values:.
6170: 2a 2a 0a 2a 2a 20 20 20 20 31 2e 20 20 54 68 65  **.**    1.  The
6180: 20 72 65 63 6e 6f 20 6f 66 20 74 68 65 20 72 6f   recno of the ro
6190: 77 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  w to be updated 
61a0: 62 65 66 6f 72 65 20 74 68 65 20 75 70 64 61 74  before the updat
61b0: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20  e.  This.**     
61c0: 20 20 20 76 61 6c 75 65 20 69 73 20 6f 6d 69 74     value is omit
61d0: 74 65 64 20 75 6e 6c 65 73 73 20 77 65 20 61 72  ted unless we ar
61e0: 65 20 64 6f 69 6e 67 20 61 6e 20 55 50 44 41 54  e doing an UPDAT
61f0: 45 20 74 68 61 74 20 69 6e 76 6f 6c 76 65 73 20  E that involves 
6200: 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 68 61 6e  a.**        chan
6210: 67 65 20 74 6f 20 74 68 65 20 72 65 63 6f 72 64  ge to the record
6220: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 20   number..**.**  
6230: 20 20 32 2e 20 20 54 68 65 20 72 65 63 6e 6f 20    2.  The recno 
6240: 6f 66 20 74 68 65 20 72 6f 77 20 61 66 74 65 72  of the row after
6250: 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   the update..**.
6260: 2a 2a 20 20 20 20 33 2e 20 20 54 68 65 20 64 61  **    3.  The da
6270: 74 61 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ta in the first 
6280: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 65 6e  column of the en
6290: 74 72 79 20 61 66 74 65 72 20 74 68 65 20 75 70  try after the up
62a0: 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 69  date..**.**    i
62b0: 2e 20 20 44 61 74 61 20 66 72 6f 6d 20 6d 69 64  .  Data from mid
62c0: 64 6c 65 20 63 6f 6c 75 6d 6e 73 2e 2e 2e 0a 2a  dle columns....*
62d0: 2a 0a 2a 2a 20 20 20 20 4e 2e 20 20 54 68 65 20  *.**    N.  The 
62e0: 64 61 74 61 20 69 6e 20 74 68 65 20 6c 61 73 74  data in the last
62f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 65   column of the e
6300: 6e 74 72 79 20 61 66 74 65 72 20 74 68 65 20 75  ntry after the u
6310: 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pdate..**.** The
6320: 20 6f 6c 64 20 72 65 63 6e 6f 20 73 68 6f 77 6e   old recno shown
6330: 20 61 73 20 65 6e 74 72 79 20 28 31 29 20 61 62   as entry (1) ab
6340: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 75  ove is omitted u
6350: 6e 6c 65 73 73 20 62 6f 74 68 20 69 73 55 70 64  nless both isUpd
6360: 61 74 65 0a 2a 2a 20 61 6e 64 20 72 65 63 6e 6f  ate.** and recno
6370: 43 68 6e 67 20 61 72 65 20 31 2e 20 20 69 73 55  Chng are 1.  isU
6380: 70 64 61 74 65 20 69 73 20 74 72 75 65 20 66 6f  pdate is true fo
6390: 72 20 55 50 44 41 54 45 73 20 61 6e 64 20 66 61  r UPDATEs and fa
63a0: 6c 73 65 20 66 6f 72 0a 2a 2a 20 49 4e 53 45 52  lse for.** INSER
63b0: 54 73 20 61 6e 64 20 72 65 63 6e 6f 43 68 6e 67  Ts and recnoChng
63c0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
63d0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73  record number is
63e0: 20 62 65 69 6e 67 20 63 68 61 6e 67 65 64 2e 0a   being changed..
63f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
6400: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69 73  enerated by this
6410: 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
6420: 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
6430: 65 73 20 6f 6e 74 6f 0a 2a 2a 20 74 68 65 20 73  es onto.** the s
6440: 74 61 63 6b 20 77 68 69 63 68 20 61 72 65 20 74  tack which are t
6450: 68 65 20 6b 65 79 73 20 66 6f 72 20 6e 65 77 20  he keys for new 
6460: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 66 6f  index entries fo
6470: 72 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  r the new record
6480: 2e 0a 2a 2a 20 54 68 65 20 6f 72 64 65 72 20 6f  ..** The order o
6490: 66 20 69 6e 64 65 78 20 6b 65 79 73 20 69 73 20  f index keys is 
64a0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
64b0: 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64  order of the ind
64c0: 69 63 65 73 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ices on.** the p
64d0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 6c 69  Table->pIndex li
64e0: 73 74 2e 20 20 41 20 6b 65 79 20 69 73 20 6f 6e  st.  A key is on
64f0: 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 20 69  ly created for i
6500: 6e 64 65 78 20 69 20 69 66 20 0a 2a 2a 20 61 49  ndex i if .** aI
6510: 64 78 55 73 65 64 21 3d 30 20 61 6e 64 20 61 49  dxUsed!=0 and aI
6520: 64 78 55 73 65 64 5b 69 5d 21 3d 30 2e 0a 2a 2a  dxUsed[i]!=0..**
6530: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6540: 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 73 20   also generates 
6550: 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 63 6f  code to check co
6560: 6e 73 74 72 61 69 6e 74 73 2e 20 20 4e 4f 54 20  nstraints.  NOT 
6570: 4e 55 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b 2c 20  NULL,.** CHECK, 
6580: 61 6e 64 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  and UNIQUE const
6590: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 63  raints are all c
65a0: 68 65 63 6b 65 64 2e 20 20 49 66 20 61 20 63 6f  hecked.  If a co
65b0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73 2c 0a  nstraint fails,.
65c0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 70 70 72  ** then the appr
65d0: 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e 20 69  opriate action i
65e0: 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20 54 68  s performed.  Th
65f0: 65 72 65 20 61 72 65 20 66 69 76 65 20 70 6f 73  ere are five pos
6600: 73 69 62 6c 65 0a 2a 2a 20 61 63 74 69 6f 6e 73  sible.** actions
6610: 3a 20 52 4f 4c 4c 42 41 43 4b 2c 20 41 42 4f 52  : ROLLBACK, ABOR
6620: 54 2c 20 46 41 49 4c 2c 20 52 45 50 4c 41 43 45  T, FAIL, REPLACE
6630: 2c 20 61 6e 64 20 49 47 4e 4f 52 45 2e 0a 2a 2a  , and IGNORE..**
6640: 0a 2a 2a 20 20 43 6f 6e 73 74 72 61 69 6e 74 20  .**  Constraint 
6650: 74 79 70 65 20 20 41 63 74 69 6f 6e 20 20 20 20  type  Action    
6660: 20 20 20 57 68 61 74 20 48 61 70 70 65 6e 73 0a     What Happens.
6670: 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **  ------------
6680: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  ---  ---------- 
6690: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 61  ----------.**  a
66c0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
66d0: 52 4f 4c 4c 42 41 43 4b 20 20 20 20 20 54 68 65  ROLLBACK     The
66e0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
66f0: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
6700: 61 63 6b 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ack and.**      
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6730: 33 5f 65 78 65 63 28 29 20 72 65 74 75 72 6e 73  3_exec() returns
6740: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69 74   immediately wit
6750: 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  h a.**          
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 64        return cod
6780: 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e 53  e of SQLITE_CONS
6790: 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20 61  TRAINT..**.**  a
67a0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
67b0: 41 42 4f 52 54 20 20 20 20 20 20 20 20 42 61 63  ABORT        Bac
67c0: 6b 20 6f 75 74 20 63 68 61 6e 67 65 73 20 66 72  k out changes fr
67d0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  om the current c
67e0: 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ommand.**       
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6800: 20 20 20 20 20 20 20 20 20 6f 6e 6c 79 20 28 64           only (d
6810: 6f 20 6e 6f 74 20 64 6f 20 61 20 63 6f 6d 70 6c  o not do a compl
6820: 65 74 65 20 72 6f 6c 6c 62 61 63 6b 29 20 74 68  ete rollback) th
6830: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  en.**           
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 20 20 20 20 63 61 75 73 65 20 73 71 6c 69 74       cause sqlit
6860: 65 33 5f 65 78 65 63 28 29 20 74 6f 20 72 65 74  e3_exec() to ret
6870: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
6880: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68a0: 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f    with SQLITE_CO
68b0: 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20  NSTRAINT..**.** 
68c0: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
68d0: 20 20 46 41 49 4c 20 20 20 20 20 20 20 20 20 53    FAIL         S
68e0: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 72 65 74  qlite_exec() ret
68f0: 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  urns immediately
6900: 20 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20   with a.**      
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6930: 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f   code of SQLITE_
6940: 43 4f 4e 53 54 52 41 49 4e 54 2e 20 20 54 68 65  CONSTRAINT.  The
6950: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69     transaction i
6980: 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63  s not rolled bac
6990: 6b 20 61 6e 64 20 61 6e 79 0a 2a 2a 20 20 20 20  k and any.**    
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6f              prio
69c0: 72 20 63 68 61 6e 67 65 73 20 61 72 65 20 72 65  r changes are re
69d0: 74 61 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 61  tained..**.**  a
69e0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
69f0: 49 47 4e 4f 52 45 20 20 20 20 20 20 20 54 68 65  IGNORE       The
6a00: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 61   record number a
6a10: 6e 64 20 64 61 74 61 20 69 73 20 70 6f 70 70 65  nd data is poppe
6a20: 64 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20  d from.**       
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
6a50: 63 6b 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ck and there is 
6a60: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
6a70: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  p.**            
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 74 6f 20 6c 61 62 65 6c 20 69 67 6e      to label ign
6aa0: 6f 72 65 44 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  oreDest..**.**  
6ab0: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20  NOT NULL        
6ac0: 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 54 68   REPLACE      Th
6ad0: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  e NULL value is 
6ae0: 72 65 70 6c 61 63 65 20 62 79 20 74 68 65 20 64  replace by the d
6af0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 66           value f
6b20: 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20  or that column. 
6b30: 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   If the default 
6b40: 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20 20 20  value.**        
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 20 20 69 73 20 4e 55 4c 4c 2c          is NULL,
6b70: 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 20 74   the action is t
6b80: 68 65 20 73 61 6d 65 20 61 73 20 41 42 4f 52 54  he same as ABORT
6b90: 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e 49 51 55 45 20  ..**.**  UNIQUE 
6ba0: 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43            REPLAC
6bb0: 45 20 20 20 20 20 20 54 68 65 20 6f 74 68 65 72  E      The other
6bc0: 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 66 6c 69   row that confli
6bd0: 63 74 73 20 77 69 74 68 20 74 68 65 20 72 6f 77  cts with the row
6be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65     being inserte
6c10: 64 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a  d is removed..**
6c20: 0a 2a 2a 20 20 43 48 45 43 4b 20 20 20 20 20 20  .**  CHECK      
6c30: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
6c40: 20 20 20 49 6c 6c 65 67 61 6c 2e 20 20 54 68 65     Illegal.  The
6c50: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 65   results in an e
6c60: 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xception..**.** 
6c70: 57 68 69 63 68 20 61 63 74 69 6f 6e 20 74 6f 20  Which action to 
6c80: 74 61 6b 65 20 69 73 20 64 65 74 65 72 6d 69 6e  take is determin
6c90: 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 72 69  ed by the overri
6ca0: 64 65 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  deError paramete
6cb0: 72 2e 0a 2a 2a 20 4f 72 20 69 66 20 6f 76 65 72  r..** Or if over
6cc0: 72 69 64 65 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  rideError==OE_De
6cd0: 66 61 75 6c 74 2c 20 74 68 65 6e 20 74 68 65 20  fault, then the 
6ce0: 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 20  pParse->onError 
6cf0: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 69 73 20  parameter.** is 
6d00: 75 73 65 64 2e 20 20 4f 72 20 69 66 20 70 50 61  used.  Or if pPa
6d10: 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  rse->onError==OE
6d20: 5f 44 65 66 61 75 6c 74 20 74 68 65 6e 20 74 68  _Default then th
6d30: 65 20 6f 6e 45 72 72 6f 72 20 76 61 6c 75 65 0a  e onError value.
6d40: 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ** for the const
6d50: 72 61 69 6e 74 20 69 73 20 75 73 65 64 2e 0a 2a  raint is used..*
6d60: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
6d70: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 6f 70   routine must op
6d80: 65 6e 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  en a read/write 
6d90: 63 75 72 73 6f 72 20 66 6f 72 20 70 54 61 62 20  cursor for pTab 
6da0: 77 69 74 68 0a 2a 2a 20 63 75 72 73 6f 72 20 6e  with.** cursor n
6db0: 75 6d 62 65 72 20 22 62 61 73 65 22 2e 20 20 41  umber "base".  A
6dc0: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
6dd0: 61 62 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76  ab must also hav
6de0: 65 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 2f 77  e open.** read/w
6df0: 72 69 74 65 20 63 75 72 73 6f 72 73 20 77 69 74  rite cursors wit
6e00: 68 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  h cursor number 
6e10: 62 61 73 65 2b 69 20 66 6f 72 20 74 68 65 20 69  base+i for the i
6e20: 2d 74 68 20 63 75 72 73 6f 72 2e 0a 2a 2a 20 45  -th cursor..** E
6e30: 78 63 65 70 74 2c 20 69 66 20 74 68 65 72 65 20  xcept, if there 
6e40: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
6e50: 79 20 6f 66 20 61 20 52 45 50 4c 41 43 45 20 61  y of a REPLACE a
6e60: 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 63 75  ction then.** cu
6e70: 72 73 6f 72 73 20 64 6f 20 6e 6f 74 20 6e 65 65  rsors do not nee
6e80: 64 20 74 6f 20 62 65 20 6f 70 65 6e 20 66 6f 72  d to be open for
6e90: 20 69 6e 64 69 63 65 73 20 77 68 65 72 65 20 61   indices where a
6ea0: 49 64 78 55 73 65 64 5b 69 5d 3d 3d 30 2e 0a 2a  IdxUsed[i]==0..*
6eb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 55 70  *.** If the isUp
6ec0: 64 61 74 65 20 66 6c 61 67 20 69 73 20 74 72 75  date flag is tru
6ed0: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
6ee0: 20 74 68 65 20 22 62 61 73 65 22 20 63 75 72 73   the "base" curs
6ef0: 6f 72 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  or is.** initial
6f00: 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
6f10: 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20  n entry that is 
6f20: 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20  being updated.  
6f30: 54 68 65 20 69 73 55 70 64 61 74 65 0a 2a 2a 20  The isUpdate.** 
6f40: 66 6c 61 67 20 63 61 75 73 65 73 20 65 78 74 72  flag causes extr
6f50: 61 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  a code to be gen
6f60: 65 72 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  erated so that t
6f70: 68 65 20 22 62 61 73 65 22 20 63 75 72 73 6f 72  he "base" cursor
6f80: 0a 2a 2a 20 69 73 20 73 74 69 6c 6c 20 70 6f 69  .** is still poi
6f90: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 73 61 6d  nting at the sam
6fa0: 65 20 65 6e 74 72 79 20 61 66 74 65 72 20 74 68  e entry after th
6fb0: 65 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  e routine return
6fc0: 73 2e 0a 2a 2a 20 57 69 74 68 6f 75 74 20 74 68  s..** Without th
6fd0: 65 20 69 73 55 70 64 61 74 65 20 66 6c 61 67 2c  e isUpdate flag,
6fe0: 20 74 68 65 20 22 62 61 73 65 22 20 63 75 72 73   the "base" curs
6ff0: 6f 72 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65  or might be move
7000: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7010: 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
7020: 61 69 6e 74 43 68 65 63 6b 73 28 0a 20 20 50 61  aintChecks(.  Pa
7030: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7040: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
7050: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
7060: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
7070: 20 2f 2a 20 74 68 65 20 74 61 62 6c 65 20 69 6e   /* the table in
7080: 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
7090: 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69  inserting */.  i
70a0: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
70b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61     /* Index of a
70c0: 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73   read/write curs
70d0: 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 70  or pointing at p
70e0: 54 61 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  Tab */.  char *a
70f0: 49 64 78 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  IdxUsed,     /* 
7100: 57 68 69 63 68 20 69 6e 64 69 63 65 73 20 61 72  Which indices ar
7110: 65 20 75 73 65 64 2e 20 20 4e 55 4c 4c 20 6d 65  e used.  NULL me
7120: 61 6e 73 20 61 6c 6c 20 61 72 65 20 75 73 65 64  ans all are used
7130: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 63 6e 6f 43   */.  int recnoC
7140: 68 6e 67 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  hng,      /* Tru
7150: 65 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20  e if the record 
7160: 6e 75 6d 62 65 72 20 77 69 6c 6c 20 63 68 61 6e  number will chan
7170: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70  ge */.  int isUp
7180: 64 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  date,       /* T
7190: 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 2c 20  rue for UPDATE, 
71a0: 46 61 6c 73 65 20 66 6f 72 20 49 4e 53 45 52 54  False for INSERT
71b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 76 65 72 72 69   */.  int overri
71c0: 64 65 45 72 72 6f 72 2c 20 20 2f 2a 20 4f 76 65  deError,  /* Ove
71d0: 72 72 69 64 65 20 6f 6e 45 72 72 6f 72 20 74 6f  rride onError to
71e0: 20 74 68 69 73 20 69 66 20 6e 6f 74 20 4f 45 5f   this if not OE_
71f0: 44 65 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74  Default */.  int
7200: 20 69 67 6e 6f 72 65 44 65 73 74 20 20 20 20 20   ignoreDest     
7210: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73   /* Jump to this
7220: 20 6c 61 62 65 6c 20 6f 6e 20 61 6e 20 4f 45 5f   label on an OE_
7230: 49 67 6e 6f 72 65 20 72 65 73 6f 6c 75 74 69 6f  Ignore resolutio
7240: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  n */.){.  int i;
7250: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
7260: 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6f 6e  t nCol;.  int on
7270: 45 72 72 6f 72 3b 0a 20 20 69 6e 74 20 61 64 64  Error;.  int add
7280: 72 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 3b 0a  r;.  int extra;.
7290: 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 49 6e    int iCur;.  In
72a0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
72b0: 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 30   seenReplace = 0
72c0: 3b 0a 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74  ;.  int jumpInst
72d0: 31 3d 30 2c 20 6a 75 6d 70 49 6e 73 74 32 3b 0a  1=0, jumpInst2;.
72e0: 20 20 69 6e 74 20 63 6f 6e 74 41 64 64 72 3b 0a    int contAddr;.
72f0: 20 20 69 6e 74 20 68 61 73 54 77 6f 52 65 63 6e    int hasTwoRecn
7300: 6f 73 20 3d 20 28 69 73 55 70 64 61 74 65 20 26  os = (isUpdate &
7310: 26 20 72 65 63 6e 6f 43 68 6e 67 29 3b 0a 0a 20  & recnoChng);.. 
7320: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
7330: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
7340: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
7350: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
7360: 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a  Select==0 );  /*
7370: 20 54 68 69 73 20 74 61 62 6c 65 20 69 73 20 6e   This table is n
7380: 6f 74 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 6e  ot a VIEW */.  n
7390: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
73a0: 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c  ;..  /* Test all
73b0: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
73c0: 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  aints..  */.  fo
73d0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
73e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
73f0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
7400: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7410: 20 20 20 7d 0a 20 20 20 20 6f 6e 45 72 72 6f 72     }.    onError
7420: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d   = pTab->aCol[i]
7430: 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 69 66  .notNull;.    if
7440: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ( onError==OE_No
7450: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
7460: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
7470: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
7480: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
7490: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
74a0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
74b0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66   onError==OE_Def
74c0: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e  ault ){.      on
74d0: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
74e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
74f0: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
7500: 61 63 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f  ace && pTab->aCo
7510: 6c 5b 69 5d 2e 70 44 66 6c 74 3d 3d 30 20 29 7b  l[i].pDflt==0 ){
7520: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
7530: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
7540: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7550: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
7560: 20 6e 43 6f 6c 2d 31 2d 69 2c 20 31 29 3b 0a 20   nCol-1-i, 1);. 
7570: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
7580: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7590: 5f 4e 6f 74 4e 75 6c 6c 2c 20 31 2c 20 30 29 3b  _NotNull, 1, 0);
75a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6e 45  .    assert( onE
75b0: 72 72 6f 72 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63  rror==OE_Rollbac
75c0: 6b 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45  k || onError==OE
75d0: 5f 41 62 6f 72 74 20 7c 7c 20 6f 6e 45 72 72 6f  _Abort || onErro
75e0: 72 3d 3d 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20  r==OE_Fail.     
75f0: 20 20 20 7c 7c 20 6f 6e 45 72 72 6f 72 3d 3d 4f     || onError==O
7600: 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 6f 6e 45 72  E_Ignore || onEr
7610: 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror==OE_Replace 
7620: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
7630: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
7640: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
7650: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  :.      case OE_
7660: 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73  Abort:.      cas
7670: 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20  e OE_Fail: {.   
7680: 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20       char *zMsg 
7690: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
76a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
76b0: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
76c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45  _CONSTRAINT, onE
76d0: 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rror);.        s
76e0: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
76f0: 26 7a 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  &zMsg, pTab->zNa
7700: 6d 65 2c 20 22 2e 22 2c 20 70 54 61 62 2d 3e 61  me, ".", pTab->a
7710: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20  Col[i].zName,.  
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74 20        " may not 
7740: 62 65 20 4e 55 4c 4c 22 2c 20 28 63 68 61 72 2a  be NULL", (char*
7750: 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  )0);.        sql
7760: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
7770: 28 76 2c 20 2d 31 2c 20 7a 4d 73 67 2c 20 50 33  (v, -1, zMsg, P3
7780: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
7790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
77a0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  }.      case OE_
77b0: 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20  Ignore: {.      
77c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
77d0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43  Op(v, OP_Pop, nC
77e0: 6f 6c 2b 31 2b 68 61 73 54 77 6f 52 65 63 6e 6f  ol+1+hasTwoRecno
77f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  s, 0);.        s
7800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7810: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
7820: 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20  gnoreDest);.    
7830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7840: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
7850: 5f 52 65 70 6c 61 63 65 3a 20 7b 0a 20 20 20 20  _Replace: {.    
7860: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7870: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ode(pParse, pTab
7880: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 44 66 6c 74 29  ->aCol[i].pDflt)
7890: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
78a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
78b0: 5f 50 75 73 68 2c 20 6e 43 6f 6c 2d 69 2c 20 30  _Push, nCol-i, 0
78c0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
78d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
78e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
78f0: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
7900: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
7910: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 7d  entAddr(v));.  }
7920: 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20  ..  /* Test all 
7930: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
7940: 73 0a 20 20 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 54  s.  */.  /**** T
7950: 42 44 20 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 49  BD ****/..  /* I
7960: 66 20 77 65 20 68 61 76 65 20 61 6e 20 49 4e 54  f we have an INT
7970: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7980: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
7990: 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
79a0: 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
79b0: 72 64 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  rd does not prev
79c0: 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 20 20 45  iously exist.  E
79d0: 78 63 65 70 74 2c 20 69 66 20 74 68 69 73 0a 20  xcept, if this. 
79e0: 20 2a 2a 20 69 73 20 61 6e 20 55 50 44 41 54 45   ** is an UPDATE
79f0: 20 61 6e 64 20 74 68 65 20 70 72 69 6d 61 72 79   and the primary
7a00: 20 6b 65 79 20 69 73 20 6e 6f 74 20 63 68 61 6e   key is not chan
7a10: 67 69 6e 67 2c 20 74 68 61 74 20 69 73 20 4f 4b  ging, that is OK
7a20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 63  ..  */.  if( rec
7a30: 6e 6f 43 68 6e 67 20 29 7b 0a 20 20 20 20 6f 6e  noChng ){.    on
7a40: 45 72 72 6f 72 20 3d 20 70 54 61 62 2d 3e 6b 65  Error = pTab->ke
7a50: 79 43 6f 6e 66 3b 0a 20 20 20 20 69 66 28 20 6f  yConf;.    if( o
7a60: 76 65 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45  verrideError!=OE
7a70: 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
7a80: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72    onError = over
7a90: 72 69 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d  rideError;.    }
7aa0: 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72  else if( onError
7ab0: 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
7ac0: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20        onError = 
7ad0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  OE_Abort;.    }.
7ae0: 20 20 20 20 0a 20 20 20 20 69 66 28 20 69 73 55      .    if( isU
7af0: 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  pdate ){.      s
7b00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7b10: 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 2b  v, OP_Dup, nCol+
7b20: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
7b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
7b40: 20 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 2b 31 2c   OP_Dup, nCol+1,
7b50: 20 31 29 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49   1);.      jumpI
7b60: 6e 73 74 31 20 3d 20 73 71 6c 69 74 65 33 56 64  nst1 = sqlite3Vd
7b70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 45 71  beAddOp(v, OP_Eq
7b80: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
7b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ba0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e  dOp(v, OP_Dup, n
7bb0: 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 6a 75 6d  Col, 1);.    jum
7bc0: 70 49 6e 73 74 32 20 3d 20 73 71 6c 69 74 65 33  pInst2 = sqlite3
7bd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7be0: 4e 6f 74 45 78 69 73 74 73 2c 20 62 61 73 65 2c  NotExists, base,
7bf0: 20 30 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28   0);.    switch(
7c00: 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20   onError ){.    
7c10: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7c20: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
7c30: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  E_Abort;.       
7c40: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
7c50: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
7c60: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
7c70: 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61    case OE_Rollba
7c80: 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ck:.      case O
7c90: 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63  E_Abort:.      c
7ca0: 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20  ase OE_Fail: {. 
7cb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7cc0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
7cd0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
7ce0: 49 4e 54 2c 20 6f 6e 45 72 72 6f 72 2c 0a 20 20  INT, onError,.  
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 22 50 52 49 4d 41 52 59 20         "PRIMARY 
7d10: 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e 69 71  KEY must be uniq
7d20: 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ue", P3_STATIC);
7d30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7d50: 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a 20 7b  se OE_Replace: {
7d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d70: 47 65 6e 65 72 61 74 65 52 6f 77 49 6e 64 65 78  GenerateRowIndex
7d80: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7d90: 62 2c 20 76 2c 20 70 54 61 62 2c 20 62 61 73 65  b, v, pTab, base
7da0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
7db0: 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20  ( isUpdate ){.  
7dc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7dd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
7de0: 75 70 2c 20 6e 43 6f 6c 2b 68 61 73 54 77 6f 52  up, nCol+hasTwoR
7df0: 65 63 6e 6f 73 2c 20 31 29 3b 0a 20 20 20 20 20  ecnos, 1);.     
7e00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7e10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
7e20: 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Ge, base, 0);.  
7e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7e40: 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 31 3b  seenReplace = 1;
7e50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
7e60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
7e70: 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a  se OE_Ignore: {.
7e80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7e90: 73 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29  seenReplace==0 )
7ea0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7eb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
7ec0: 5f 50 6f 70 2c 20 6e 43 6f 6c 2b 31 2b 68 61 73  _Pop, nCol+1+has
7ed0: 54 77 6f 52 65 63 6e 6f 73 2c 20 30 29 3b 0a 20  TwoRecnos, 0);. 
7ee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7ef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
7f00: 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73  to, 0, ignoreDes
7f10: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
7f20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7f30: 0a 20 20 20 20 63 6f 6e 74 41 64 64 72 20 3d 20  .    contAddr = 
7f40: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7f50: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
7f60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7f70: 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 32 2c  P2(v, jumpInst2,
7f80: 20 63 6f 6e 74 41 64 64 72 29 3b 0a 20 20 20 20   contAddr);.    
7f90: 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a  if( isUpdate ){.
7fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7fb0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d  eChangeP2(v, jum
7fc0: 70 49 6e 73 74 31 2c 20 63 6f 6e 74 41 64 64 72  pInst1, contAddr
7fd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7fe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7ff0: 44 75 70 2c 20 6e 43 6f 6c 2b 31 2c 20 31 29 3b  Dup, nCol+1, 1);
8000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8010: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
8020: 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
8030: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8040: 54 65 73 74 20 61 6c 6c 20 55 4e 49 51 55 45 20  Test all UNIQUE 
8050: 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 79 20 63  constraints by c
8060: 72 65 61 74 69 6e 67 20 65 6e 74 72 69 65 73 20  reating entries 
8070: 66 6f 72 20 65 61 63 68 20 55 4e 49 51 55 45 0a  for each UNIQUE.
8080: 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 6d    ** index and m
8090: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 61 74 20  aking sure that 
80a0: 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 69 65  duplicate entrie
80b0: 73 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61 64 79  s do not already
80c0: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 41 64 64   exist..  ** Add
80d0: 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 73   the new records
80e0: 20 74 6f 20 74 68 65 20 69 6e 64 69 63 65 73 20   to the indices 
80f0: 61 73 20 77 65 20 67 6f 2e 0a 20 20 2a 2f 0a 20  as we go..  */. 
8100: 20 65 78 74 72 61 20 3d 20 2d 31 3b 0a 20 20 66   extra = -1;.  f
8110: 6f 72 28 69 43 75 72 3d 30 2c 20 70 49 64 78 3d  or(iCur=0, pIdx=
8120: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
8130: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
8140: 4e 65 78 74 2c 20 69 43 75 72 2b 2b 29 7b 0a 20  Next, iCur++){. 
8150: 20 20 20 69 66 28 20 61 49 64 78 55 73 65 64 20     if( aIdxUsed 
8160: 26 26 20 61 49 64 78 55 73 65 64 5b 69 43 75 72  && aIdxUsed[iCur
8170: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
8180: 20 20 2f 2a 20 53 6b 69 70 20 75 6e 75 73 65 64    /* Skip unused
8190: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 20 20   indices */.    
81a0: 65 78 74 72 61 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  extra++;..    /*
81b0: 20 43 72 65 61 74 65 20 61 20 6b 65 79 20 66 6f   Create a key fo
81c0: 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  r accessing the 
81d0: 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
81e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
81f0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e  dOp(v, OP_Dup, n
8200: 43 6f 6c 2b 65 78 74 72 61 2c 20 31 29 3b 0a 20  Col+extra, 1);. 
8210: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
8220: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
8230: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
8240: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
8250: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[i];.      if( 
8260: 69 64 78 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  idx==pTab->iPKey
8270: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8280: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8290: 4f 50 5f 44 75 70 2c 20 69 2b 65 78 74 72 61 2b  OP_Dup, i+extra+
82a0: 6e 43 6f 6c 2b 31 2c 20 31 29 3b 0a 20 20 20 20  nCol+1, 1);.    
82b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
82c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82d0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69 2b 65  p(v, OP_Dup, i+e
82e0: 78 74 72 61 2b 6e 43 6f 6c 2d 69 64 78 2c 20 31  xtra+nCol-idx, 1
82f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8300: 0a 20 20 20 20 6a 75 6d 70 49 6e 73 74 31 20 3d  .    jumpInst1 =
8310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8320: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
8330: 72 64 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rd, pIdx->nColum
8340: 6e 2c 20 28 31 3c 3c 32 34 29 29 3b 0a 20 20 20  n, (1<<24));.   
8350: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
8360: 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
8370: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  );..    /* Find 
8380: 6f 75 74 20 77 68 61 74 20 61 63 74 69 6f 6e 20  out what action 
8390: 74 6f 20 74 61 6b 65 20 69 6e 20 63 61 73 65 20  to take in case 
83a0: 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
83b0: 78 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  xing conflict */
83c0: 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70  .    onError = p
83d0: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  Idx->onError;.  
83e0: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
83f0: 45 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  E_None ) continu
8400: 65 3b 20 20 2f 2a 20 70 49 64 78 20 69 73 20 6e  e;  /* pIdx is n
8410: 6f 74 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65  ot a UNIQUE inde
8420: 78 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 76 65  x */.    if( ove
8430: 72 72 69 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44  rrideError!=OE_D
8440: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
8450: 6f 6e 45 72 72 6f 72 20 3d 20 6f 76 65 72 72 69  onError = overri
8460: 64 65 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  deError;.    }el
8470: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
8480: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
8490: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
84a0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
84b0: 20 20 69 66 28 20 73 65 65 6e 52 65 70 6c 61 63    if( seenReplac
84c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  e ){.      if( o
84d0: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72  nError==OE_Ignor
84e0: 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45  e ) onError = OE
84f0: 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 20 20  _Replace;.      
8500: 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72  else if( onError
8510: 3d 3d 4f 45 5f 46 61 69 6c 20 29 20 6f 6e 45 72  ==OE_Fail ) onEr
8520: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
8530: 20 20 20 20 7d 0a 20 20 20 20 0a 0a 20 20 20 20      }.    ..    
8540: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
8550: 69 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78  if the new index
8560: 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 75   entry will be u
8570: 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20 73 71 6c  nique */.    sql
8580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8590: 20 4f 50 5f 44 75 70 2c 20 65 78 74 72 61 2b 6e   OP_Dup, extra+n
85a0: 43 6f 6c 2b 31 2b 68 61 73 54 77 6f 52 65 63 6e  Col+1+hasTwoRecn
85b0: 6f 73 2c 20 31 29 3b 0a 20 20 20 20 6a 75 6d 70  os, 1);.    jump
85c0: 49 6e 73 74 32 20 3d 20 73 71 6c 69 74 65 33 56  Inst2 = sqlite3V
85d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
85e0: 73 55 6e 69 71 75 65 2c 20 62 61 73 65 2b 69 43  sUnique, base+iC
85f0: 75 72 2b 31 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  ur+1, 0);..    /
8600: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8610: 74 68 61 74 20 65 78 65 63 75 74 65 73 20 69 66  that executes if
8620: 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20 65   the new index e
8630: 6e 74 72 79 20 69 73 20 6e 6f 74 20 75 6e 69 71  ntry is not uniq
8640: 75 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ue */.    assert
8650: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 6f  ( onError==OE_Ro
8660: 6c 6c 62 61 63 6b 20 7c 7c 20 6f 6e 45 72 72 6f  llback || onErro
8670: 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c 20 6f  r==OE_Abort || o
8680: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 0a  nError==OE_Fail.
8690: 20 20 20 20 20 20 20 20 7c 7c 20 6f 6e 45 72 72          || onErr
86a0: 6f 72 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c  or==OE_Ignore ||
86b0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70   onError==OE_Rep
86c0: 6c 61 63 65 20 29 3b 0a 20 20 20 20 73 77 69 74  lace );.    swit
86d0: 63 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ch( onError ){. 
86e0: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c       case OE_Rol
86f0: 6c 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73  lback:.      cas
8700: 65 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20  e OE_Abort:.    
8710: 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20    case OE_Fail: 
8720: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c  {.        int j,
8730: 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 20 20 20   n1, n2;.       
8740: 20 63 68 61 72 20 7a 45 72 72 4d 73 67 5b 32 30   char zErrMsg[20
8750: 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63  0];.        strc
8760: 70 79 28 7a 45 72 72 4d 73 67 2c 20 70 49 64 78  py(zErrMsg, pIdx
8770: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 31 20 3f 20 22 63  ->nColumn>1 ? "c
8780: 6f 6c 75 6d 6e 73 20 22 20 3a 20 22 63 6f 6c 75  olumns " : "colu
8790: 6d 6e 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e  mn ");.        n
87a0: 31 20 3d 20 73 74 72 6c 65 6e 28 7a 45 72 72 4d  1 = strlen(zErrM
87b0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  sg);.        for
87c0: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
87d0: 6f 6c 75 6d 6e 20 26 26 20 6e 31 3c 73 69 7a 65  olumn && n1<size
87e0: 6f 66 28 7a 45 72 72 4d 73 67 29 2d 33 30 3b 20  of(zErrMsg)-30; 
87f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
8800: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 54 61  char *zCol = pTa
8810: 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  b->aCol[pIdx->ai
8820: 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
8830: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 32 20 3d  ;.          n2 =
8840: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20   strlen(zCol);. 
8850: 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30           if( j>0
8860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8870: 73 74 72 63 70 79 28 26 7a 45 72 72 4d 73 67 5b  strcpy(&zErrMsg[
8880: 6e 31 5d 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20  n1], ", ");.    
8890: 20 20 20 20 20 20 20 20 6e 31 20 2b 3d 20 32 3b          n1 += 2;
88a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
88b0: 20 20 20 20 20 20 20 69 66 28 20 6e 31 2b 6e 32         if( n1+n2
88c0: 3e 73 69 7a 65 6f 66 28 7a 45 72 72 4d 73 67 29  >sizeof(zErrMsg)
88d0: 2d 33 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -30 ){.         
88e0: 20 20 20 73 74 72 63 70 79 28 26 7a 45 72 72 4d     strcpy(&zErrM
88f0: 73 67 5b 6e 31 5d 2c 20 22 2e 2e 2e 22 29 3b 0a  sg[n1], "...");.
8900: 20 20 20 20 20 20 20 20 20 20 20 20 6e 31 20 2b              n1 +
8910: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
8920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8940: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 45 72       strcpy(&zEr
8950: 72 4d 73 67 5b 6e 31 5d 2c 20 7a 43 6f 6c 29 3b  rMsg[n1], zCol);
8960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 31 20  .            n1 
8970: 2b 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20 20 20  += n2;.         
8980: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8990: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 45 72       strcpy(&zEr
89a0: 72 4d 73 67 5b 6e 31 5d 2c 20 0a 20 20 20 20 20  rMsg[n1], .     
89b0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f         pIdx->nCo
89c0: 6c 75 6d 6e 3e 31 20 3f 20 22 20 61 72 65 20 6e  lumn>1 ? " are n
89d0: 6f 74 20 75 6e 69 71 75 65 22 20 3a 20 22 20 69  ot unique" : " i
89e0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 22 29 3b 0a  s not unique");.
89f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8a00: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c  dbeOp3(v, OP_Hal
8a10: 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
8a20: 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  AINT, onError, z
8a30: 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
8a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8a50: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45   }.      case OE
8a60: 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20  _Ignore: {.     
8a70: 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 52     assert( seenR
8a80: 65 70 6c 61 63 65 3d 3d 30 20 29 3b 0a 20 20 20  eplace==0 );.   
8a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8aa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
8ab0: 20 6e 43 6f 6c 2b 65 78 74 72 61 2b 33 2b 68 61   nCol+extra+3+ha
8ac0: 73 54 77 6f 52 65 63 6e 6f 73 2c 20 30 29 3b 0a  sTwoRecnos, 0);.
8ad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8ae0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
8af0: 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65  oto, 0, ignoreDe
8b00: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  st);.        bre
8b10: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8b20: 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63    case OE_Replac
8b30: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e: {.        sql
8b40: 69 74 65 33 47 65 6e 65 72 61 74 65 52 6f 77 44  ite3GenerateRowD
8b50: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8b60: 2c 20 76 2c 20 70 54 61 62 2c 20 62 61 73 65 2c  , v, pTab, base,
8b70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
8b80: 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20   isUpdate ){.   
8b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8ba0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
8bb0: 70 2c 20 6e 43 6f 6c 2b 65 78 74 72 61 2b 31 2b  p, nCol+extra+1+
8bc0: 68 61 73 54 77 6f 52 65 63 6e 6f 73 2c 20 31 29  hasTwoRecnos, 1)
8bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
8be0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8bf0: 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c  OP_MoveGe, base,
8c00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
8c10: 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c 61         seenRepla
8c20: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
8c30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8c40: 20 20 20 7d 0a 20 20 20 20 63 6f 6e 74 41 64 64     }.    contAdd
8c50: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
8c60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
8c70: 20 20 20 61 73 73 65 72 74 28 20 63 6f 6e 74 41     assert( contA
8c80: 64 64 72 3c 28 31 3c 3c 32 34 29 20 29 3b 0a 23  ddr<(1<<24) );.#
8c90: 69 66 20 4e 55 4c 4c 5f 44 49 53 54 49 4e 43 54  if NULL_DISTINCT
8ca0: 5f 46 4f 52 5f 55 4e 49 51 55 45 0a 20 20 20 20  _FOR_UNIQUE.    
8cb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8cc0: 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 31  eP2(v, jumpInst1
8cd0: 2c 20 63 6f 6e 74 41 64 64 72 20 7c 20 28 31 3c  , contAddr | (1<
8ce0: 3c 32 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  <24));.#endif.  
8cf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8d00: 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73  ngeP2(v, jumpIns
8d10: 74 32 2c 20 63 6f 6e 74 41 64 64 72 29 3b 0a 20  t2, contAddr);. 
8d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
8d30: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
8d40: 65 73 20 63 6f 64 65 20 74 6f 20 66 69 6e 69 73  es code to finis
8d50: 68 20 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20  h the INSERT or 
8d60: 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e  UPDATE operation
8d70: 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 73 74 61  .** that was sta
8d80: 72 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  rted by a prior 
8d90: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 47  call to sqlite3G
8da0: 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
8db0: 74 43 68 65 63 6b 73 2e 0a 2a 2a 20 54 68 65 20  tChecks..** The 
8dc0: 73 74 61 63 6b 20 6d 75 73 74 20 63 6f 6e 74 61  stack must conta
8dd0: 69 6e 20 6b 65 79 73 20 66 6f 72 20 61 6c 6c 20  in keys for all 
8de0: 61 63 74 69 76 65 20 69 6e 64 69 63 65 73 20 66  active indices f
8df0: 6f 6c 6c 6f 77 65 64 20 62 79 20 64 61 74 61 0a  ollowed by data.
8e00: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 63 6e 6f  ** and the recno
8e10: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
8e20: 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
8e30: 65 20 63 72 65 61 74 65 73 20 74 68 65 20 6e 65  e creates the ne
8e40: 77 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20  w.** entries in 
8e50: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 6e 64 20  all indices and 
8e60: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
8e70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  e..**.** The arg
8e80: 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20 72  uments to this r
8e90: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
8ea0: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
8eb0: 20 66 69 72 73 74 20 73 69 78 0a 2a 2a 20 61 72   first six.** ar
8ec0: 67 75 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69 74  guments to sqlit
8ed0: 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  e3GenerateConstr
8ee0: 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a 76  aintChecks..*/.v
8ef0: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 70 6c  oid sqlite3Compl
8f00: 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20  eteInsertion(.  
8f10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8f20: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
8f30: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
8f40: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
8f50: 20 20 20 2f 2a 20 74 68 65 20 74 61 62 6c 65 20     /* the table 
8f60: 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
8f70: 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20  e inserting */. 
8f80: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
8f90: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8fa0: 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75   a read/write cu
8fb0: 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  rsor pointing at
8fc0: 20 70 54 61 62 20 2a 2f 0a 20 20 63 68 61 72 20   pTab */.  char 
8fd0: 2a 61 49 64 78 55 73 65 64 2c 20 20 20 20 20 2f  *aIdxUsed,     /
8fe0: 2a 20 57 68 69 63 68 20 69 6e 64 69 63 65 73 20  * Which indices 
8ff0: 61 72 65 20 75 73 65 64 2e 20 20 4e 55 4c 4c 20  are used.  NULL 
9000: 6d 65 61 6e 73 20 61 6c 6c 20 61 72 65 20 75 73  means all are us
9010: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 63 6e  ed */.  int recn
9020: 6f 43 68 6e 67 2c 20 20 20 20 20 20 2f 2a 20 54  oChng,      /* T
9030: 72 75 65 20 69 66 20 74 68 65 20 72 65 63 6f 72  rue if the recor
9040: 64 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 63 68  d number will ch
9050: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ange */.  int is
9060: 55 70 64 61 74 65 2c 20 20 20 20 20 20 20 2f 2a  Update,       /*
9070: 20 54 72 75 65 20 66 6f 72 20 55 50 44 41 54 45   True for UPDATE
9080: 2c 20 46 61 6c 73 65 20 66 6f 72 20 49 4e 53 45  , False for INSE
9090: 52 54 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49  RT */.  int newI
90a0: 64 78 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  dx          /* I
90b0: 6e 64 65 78 20 6f 66 20 4e 45 57 20 74 61 62 6c  ndex of NEW tabl
90c0: 65 20 66 6f 72 20 74 72 69 67 67 65 72 73 2e 20  e for triggers. 
90d0: 20 2d 31 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 29   -1 if none */.)
90e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
90f0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6e 49 64 78  e *v;.  int nIdx
9100: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
9110: 0a 20 20 69 6e 74 20 70 69 6b 5f 66 6c 61 67 73  .  int pik_flags
9120: 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
9130: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9140: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
9160: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
9170: 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c 65 20    /* This table 
9180: 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20 2a 2f  is not a VIEW */
9190: 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70  .  for(nIdx=0, p
91a0: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
91b0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
91c0: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
91d0: 29 7b 7d 0a 20 20 66 6f 72 28 69 3d 6e 49 64 78  ){}.  for(i=nIdx
91e0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
91f0: 20 20 20 20 69 66 28 20 61 49 64 78 55 73 65 64      if( aIdxUsed
9200: 20 26 26 20 61 49 64 78 55 73 65 64 5b 69 5d 3d   && aIdxUsed[i]=
9210: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
9220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9230: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74  dOp(v, OP_IdxPut
9240: 2c 20 62 61 73 65 2b 69 2b 31 2c 20 30 29 3b 0a  , base+i+1, 0);.
9250: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
9260: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
9270: 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e  eRecord, pTab->n
9280: 43 6f 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Col, 0);.  sqlit
9290: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 53  e3TableAffinityS
92a0: 74 72 28 76 2c 20 70 54 61 62 29 3b 0a 23 69 66  tr(v, pTab);.#if
92b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
92c0: 5f 54 52 49 47 47 45 52 0a 20 20 69 66 28 20 6e  _TRIGGER.  if( n
92d0: 65 77 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20  ewIdx>=0 ){.    
92e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
92f0: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 30  (v, OP_Dup, 1, 0
9300: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9310: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
9320: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
9330: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9340: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
9350: 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20 20 7d 0a  newIdx, 0);.  }.
9360: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 50 61  #endif.  if( pPa
9370: 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 7b 0a 20  rse->nested ){. 
9380: 20 20 20 70 69 6b 5f 66 6c 61 67 73 20 3d 20 30     pik_flags = 0
9390: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
93a0: 69 6b 5f 66 6c 61 67 73 20 3d 20 28 4f 50 46 4c  ik_flags = (OPFL
93b0: 41 47 5f 4e 43 48 41 4e 47 45 7c 28 69 73 55 70  AG_NCHANGE|(isUp
93c0: 64 61 74 65 3f 30 3a 4f 50 46 4c 41 47 5f 4c 41  date?0:OPFLAG_LA
93d0: 53 54 52 4f 57 49 44 29 29 3b 0a 20 20 7d 0a 20  STROWID));.  }. 
93e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
93f0: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
9400: 79 2c 20 62 61 73 65 2c 20 70 69 6b 5f 66 6c 61  y, base, pik_fla
9410: 67 73 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  gs);.  .  if( is
9420: 55 70 64 61 74 65 20 26 26 20 72 65 63 6e 6f 43  Update && recnoC
9430: 68 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  hng ){.    sqlit
9440: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9450: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
9460: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
9470: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
9480: 6c 6c 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  ll open cursors 
9490: 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20  for a table and 
94a0: 66 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63  for all.** indic
94b0: 65 73 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  es of that table
94c0: 2e 20 20 54 68 65 20 22 62 61 73 65 22 20 70 61  .  The "base" pa
94d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63  rameter is the c
94e0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 75 73 65  ursor number use
94f0: 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  d.** for the tab
9500: 6c 65 2e 20 20 49 6e 64 69 63 65 73 20 61 72 65  le.  Indices are
9510: 20 6f 70 65 6e 65 64 20 6f 6e 20 73 75 62 73 65   opened on subse
9520: 71 75 65 6e 74 20 63 75 72 73 6f 72 73 2e 0a 2a  quent cursors..*
9530: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70  /.void sqlite3Op
9540: 65 6e 54 61 62 6c 65 41 6e 64 49 6e 64 69 63 65  enTableAndIndice
9550: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
9560: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  se,   /* Parsing
9570: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
9580: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f  ble *pTab,     /
9590: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 6f 70  * Table to be op
95a0: 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 61  ened */.  int ba
95b0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 75  se,        /* Cu
95c0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 61 73 73 69  rsor number assi
95d0: 67 6e 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  gned to the tabl
95e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 20 20 20  e */.  int op   
95f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 4f 70          /* OP_Op
9600: 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65  enRead or OP_Ope
9610: 6e 57 72 69 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  nWrite */.){.  i
9620: 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70  nt i;.  Index *p
9630: 49 64 78 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Idx;.  Vdbe *v =
9640: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
9650: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
9660: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
9670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9680: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
9690: 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 73 71  b->iDb, 0);.  sq
96a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
96b0: 2c 20 6f 70 2c 20 62 61 73 65 2c 20 70 54 61 62  , op, base, pTab
96c0: 2d 3e 74 6e 75 6d 29 3b 0a 20 20 56 64 62 65 43  ->tnum);.  VdbeC
96d0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 73  omment((v, "# %s
96e0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
96f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9700: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
9710: 6d 43 6f 6c 75 6d 6e 73 2c 20 62 61 73 65 2c 20  mColumns, base, 
9720: 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66  pTab->nCol);.  f
9730: 6f 72 28 69 3d 31 2c 20 70 49 64 78 3d 70 54 61  or(i=1, pIdx=pTa
9740: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
9750: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9760: 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t, i++){.    sql
9770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9780: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64   OP_Integer, pId
9790: 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  x->iDb, 0);.    
97a0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
97b0: 2c 20 6f 70 2c 20 69 2b 62 61 73 65 2c 20 70 49  , op, i+base, pI
97c0: 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  dx->tnum,.      
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
97e0: 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e  ar*)&pIdx->keyIn
97f0: 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
9800: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
9810: 65 2d 3e 6e 54 61 62 3c 3d 62 61 73 65 2b 69 20  e->nTab<=base+i 
9820: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  ){.    pParse->n
9830: 54 61 62 20 3d 20 62 61 73 65 2b 69 3b 0a 20 20  Tab = base+i;.  
9840: 7d 0a 7d 0a                                      }.}.