/ Hex Artifact Content
Login

Artifact 3a90bb98cd246f88cc26c44f24d5b47760bc5cba:


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 36 31 20  insert.c,v 1.61 
0200: 32 30 30 32 2f 30 36 2f 31 31 20 30 32 3a 32 35  2002/06/11 02:25
0210: 3a 34 32 20 64 61 6e 69 65 6c 6b 31 39 37 37 20  :42 danielk1977 
0220: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0230: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0240: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0250: 69 6e 65 20 69 73 20 63 61 6c 6c 20 74 6f 20 68  ine is call to h
0260: 61 6e 64 6c 65 20 53 51 4c 20 6f 66 20 74 68 65  andle SQL of the
0270: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
0280: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 69 6e 73 65 72  :.**.**    inser
0290: 74 20 69 6e 74 6f 20 54 41 42 4c 45 20 28 49 44  t into TABLE (ID
02a0: 4c 49 53 54 29 20 76 61 6c 75 65 73 28 45 58 50  LIST) values(EXP
02b0: 52 4c 49 53 54 29 0a 2a 2a 20 20 20 20 69 6e 73  RLIST).**    ins
02c0: 65 72 74 20 69 6e 74 6f 20 54 41 42 4c 45 20 28  ert into TABLE (
02d0: 49 44 4c 49 53 54 29 20 73 65 6c 65 63 74 0a 2a  IDLIST) select.*
02e0: 2a 0a 2a 2a 20 54 68 65 20 49 44 4c 49 53 54 20  *.** The IDLIST 
02f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 61  following the ta
0300: 62 6c 65 20 6e 61 6d 65 20 69 73 20 61 6c 77 61  ble name is alwa
0310: 79 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  ys optional.  If
0320: 20 6f 6d 69 74 74 65 64 2c 0a 2a 2a 20 74 68 65   omitted,.** the
0330: 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  n a list of all 
0340: 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20  columns for the 
0350: 74 61 62 6c 65 20 69 73 20 73 75 62 73 74 69 74  table is substit
0360: 75 74 65 64 2e 20 20 54 68 65 20 49 44 4c 49 53  uted.  The IDLIS
0370: 54 0a 2a 2a 20 61 70 70 65 61 72 73 20 69 6e 20  T.** appears in 
0380: 74 68 65 20 70 43 6f 6c 75 6d 6e 20 70 61 72 61  the pColumn para
0390: 6d 65 74 65 72 2e 20 20 70 43 6f 6c 75 6d 6e 20  meter.  pColumn 
03a0: 69 73 20 4e 55 4c 4c 20 69 66 20 49 44 4c 49 53  is NULL if IDLIS
03b0: 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a  T is omitted..**
03c0: 0a 2a 2a 20 54 68 65 20 70 4c 69 73 74 20 70 61  .** The pList pa
03d0: 72 61 6d 65 74 65 72 20 68 6f 6c 64 73 20 45 58  rameter holds EX
03e0: 50 52 4c 49 53 54 20 69 6e 20 74 68 65 20 66 69  PRLIST in the fi
03f0: 72 73 74 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  rst form of the 
0400: 49 4e 53 45 52 54 0a 2a 2a 20 73 74 61 74 65 6d  INSERT.** statem
0410: 65 6e 74 20 61 62 6f 76 65 2c 20 61 6e 64 20 70  ent above, and p
0420: 53 65 6c 65 63 74 20 69 73 20 4e 55 4c 4c 2e 20  Select is NULL. 
0430: 20 46 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   For the second 
0440: 66 6f 72 6d 2c 20 70 4c 69 73 74 20 69 73 0a 2a  form, pList is.*
0450: 2a 20 4e 55 4c 4c 20 61 6e 64 20 70 53 65 6c 65  * NULL and pSele
0460: 63 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ct is a pointer 
0470: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  to the select st
0480: 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
0490: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 64 61 74 61  generate.** data
04a0: 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 2e   for the insert.
04b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 49  .*/.void sqliteI
04c0: 6e 73 65 72 74 28 0a 20 20 50 61 72 73 65 20 2a  nsert(.  Parse *
04d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
04e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
04f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
0500: 62 6c 65 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e  bleName,    /* N
0510: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 69 6e 74  ame of table int
0520: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
0530: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 45 78  nserting */.  Ex
0540: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
0550: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
0560: 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73 65  alues to be inse
0570: 72 74 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  rted */.  Select
0580: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
0590: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
05a0: 65 6d 65 6e 74 20 74 6f 20 75 73 65 20 61 73 20  ement to use as 
05b0: 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 20  the data source 
05c0: 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 43 6f  */.  IdList *pCo
05d0: 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 43 6f  lumn,      /* Co
05e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 63 6f 72 72 65  lumn names corre
05f0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 49 44 4c 49  sponding to IDLI
0600: 53 54 2e 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ST. */.  int onE
0610: 72 72 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rror           /
0620: 2a 20 48 6f 77 20 74 6f 20 68 61 6e 64 6c 65 20  * How to handle 
0630: 63 6f 6e 73 74 72 61 69 6e 74 20 65 72 72 6f 72  constraint error
0640: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
0650: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
0660: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
0670: 69 6e 73 65 72 74 20 69 6e 74 6f 20 2a 2f 0a 20  insert into */. 
0680: 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b   char *zTab = 0;
0690: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
06a0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f  f the table into
06b0: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e   which we are in
06c0: 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  serting */.  int
06d0: 20 69 2c 20 6a 2c 20 69 64 78 3b 20 20 20 20 20   i, j, idx;     
06e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
06f0: 65 72 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ers */.  Vdbe *v
0700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0710: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
0720: 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
0730: 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 49  l machine */.  I
0740: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
0750: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
0760: 69 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73  ing over indices
0770: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
0780: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 3b 20 20  .  int srcTab;  
0790: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65           /* Date
07a0: 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 69 73   comes from this
07b0: 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
07c0: 72 20 69 66 20 3e 3d 30 20 2a 2f 0a 20 20 69 6e  r if >=0 */.  in
07d0: 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t nColumn;      
07e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
07f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
0800: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 62 61  data */.  int ba
0810: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
0820: 2f 2a 20 46 69 72 73 74 20 61 76 61 69 6c 61 62  /* First availab
0830: 6c 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69  le cursor */.  i
0840: 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
0850: 3b 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e  ;    /* Beginnin
0860: 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  g and end of the
0870: 20 6c 6f 6f 70 20 6f 76 65 72 20 73 72 63 54 61   loop over srcTa
0880: 62 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64  b */.  sqlite *d
0890: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
08a0: 54 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  The main databas
08b0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
08c0: 20 69 6e 74 20 6f 70 65 6e 4f 70 3b 20 20 20 20   int openOp;    
08d0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
08e0: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 63 75   used to open cu
08f0: 72 73 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b  rsors */.  int k
0900: 65 79 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20  eyColumn = -1;  
0910: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20   /* Column that 
0920: 69 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  is the INTEGER P
0930: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
0940: 69 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20  int endOfLoop;  
0950: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
0960: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
0970: 65 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70  e insertion loop
0980: 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 6f 77 5f 74   */..  int row_t
0990: 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20  riggers_exist = 
09a0: 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  0; /* True if th
09b0: 65 72 65 20 61 72 65 20 46 4f 52 20 45 41 43 48  ere are FOR EACH
09c0: 20 52 4f 57 20 74 72 69 67 67 65 72 73 20 2a 2f   ROW triggers */
09d0: 0a 20 20 69 6e 74 20 6e 65 77 49 64 78 20 3d 20  .  int newIdx = 
09e0: 2d 31 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  -1;..  if( pPars
09f0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
0a00: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
0a10: 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c  ) goto insert_cl
0a20: 65 61 6e 75 70 3b 0a 20 20 64 62 20 3d 20 70 50  eanup;.  db = pP
0a30: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
0a40: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
0a50: 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 77   into which we w
0a60: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
0a70: 20 6e 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   new information
0a80: 2e 0a 20 20 2a 2f 0a 20 20 7a 54 61 62 20 3d 20  ..  */.  zTab = 
0a90: 73 71 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 46  sqliteTableNameF
0aa0: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 4e  romToken(pTableN
0ab0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 61 62  ame);.  if( zTab
0ac0: 3d 3d 30 20 29 20 67 6f 74 6f 20 69 6e 73 65 72  ==0 ) goto inser
0ad0: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61  t_cleanup;.  pTa
0ae0: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
0af0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
0b00: 7a 54 61 62 29 3b 0a 20 20 69 66 28 20 70 54 61  zTab);.  if( pTa
0b10: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
0b20: 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61  teSetString(&pPa
0b30: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e  rse->zErrMsg, "n
0b40: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 22 2c  o such table: ",
0b50: 20 7a 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 70   zTab, 0);.    p
0b60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
0b70: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
0b80: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
0b90: 2a 20 45 6e 73 75 72 65 20 74 68 61 74 3a 0a 20  * Ensure that:. 
0ba0: 20 2a 20 20 28 61 29 20 74 68 65 20 74 61 62 6c   *  (a) the tabl
0bb0: 65 20 69 73 20 6e 6f 74 20 72 65 61 64 2d 6f 6e  e is not read-on
0bc0: 6c 79 2c 20 0a 20 20 2a 20 20 28 62 29 20 74 68  ly, .  *  (b) th
0bd0: 61 74 20 69 66 20 69 74 20 69 73 20 61 20 76 69  at if it is a vi
0be0: 65 77 20 74 68 65 6e 20 4f 4e 20 49 4e 53 45 52  ew then ON INSER
0bf0: 54 20 74 72 69 67 67 65 72 73 20 65 78 69 73 74  T triggers exist
0c00: 0a 20 20 2a 2f 0a 20 20 72 6f 77 5f 74 72 69 67  .  */.  row_trig
0c10: 67 65 72 73 5f 65 78 69 73 74 20 3d 20 0a 20 20  gers_exist = .  
0c20: 20 20 73 71 6c 69 74 65 54 72 69 67 67 65 72 73    sqliteTriggers
0c30: 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  Exist(pParse, pT
0c40: 61 62 2d 3e 70 54 72 69 67 67 65 72 2c 20 54 4b  ab->pTrigger, TK
0c50: 5f 49 4e 53 45 52 54 2c 20 0a 20 20 20 20 20 20  _INSERT, .      
0c60: 20 20 54 4b 5f 42 45 46 4f 52 45 2c 20 54 4b 5f    TK_BEFORE, TK_
0c70: 52 4f 57 2c 20 30 29 20 7c 7c 0a 20 20 20 20 73  ROW, 0) ||.    s
0c80: 71 6c 69 74 65 54 72 69 67 67 65 72 73 45 78 69  qliteTriggersExi
0c90: 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  st(pParse, pTab-
0ca0: 3e 70 54 72 69 67 67 65 72 2c 20 54 4b 5f 49 4e  >pTrigger, TK_IN
0cb0: 53 45 52 54 2c 20 54 4b 5f 41 46 54 45 52 2c 20  SERT, TK_AFTER, 
0cc0: 54 4b 5f 52 4f 57 2c 20 30 29 3b 0a 20 20 69 66  TK_ROW, 0);.  if
0cd0: 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79  ( pTab->readOnly
0ce0: 20 7c 7c 20 28 70 54 61 62 2d 3e 70 53 65 6c 65   || (pTab->pSele
0cf0: 63 74 20 26 26 20 21 72 6f 77 5f 74 72 69 67 67  ct && !row_trigg
0d00: 65 72 73 5f 65 78 69 73 74 29 20 29 7b 0a 20 20  ers_exist) ){.  
0d10: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
0d20: 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  g(&pParse->zErrM
0d30: 73 67 2c 20 0a 20 20 20 20 20 20 70 54 61 62 2d  sg, .      pTab-
0d40: 3e 70 53 65 6c 65 63 74 20 3f 20 22 76 69 65 77  >pSelect ? "view
0d50: 20 22 20 3a 20 22 74 61 62 6c 65 20 22 2c 0a 20   " : "table ",. 
0d60: 20 20 20 20 20 7a 54 61 62 2c 0a 20 20 20 20 20       zTab,.     
0d70: 20 22 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d 6f   " may not be mo
0d80: 64 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  dified", 0);.   
0d90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
0da0: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
0db0: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
0dc0: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29  sqliteFree(zTab)
0dd0: 3b 0a 20 20 7a 54 61 62 20 3d 20 30 3b 0a 0a 20  ;.  zTab = 0;.. 
0de0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
0df0: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
0e00: 75 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  up;..  /* Alloca
0e10: 74 65 20 61 20 56 44 42 45 0a 20 20 2a 2f 0a 20  te a VDBE.  */. 
0e20: 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64   v = sqliteGetVd
0e30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
0e40: 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 69 6e  ( v==0 ) goto in
0e50: 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  sert_cleanup;.  
0e60: 73 71 6c 69 74 65 42 65 67 69 6e 57 72 69 74 65  sqliteBeginWrite
0e70: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
0e80: 2c 20 70 53 65 6c 65 63 74 20 7c 7c 20 72 6f 77  , pSelect || row
0e90: 5f 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 29  _triggers_exist)
0ea0: 3b 0a 0a 20 20 2f 2a 20 69 66 20 74 68 65 72 65  ;..  /* if there
0eb0: 20 61 72 65 20 72 6f 77 20 74 72 69 67 67 65 72   are row trigger
0ec0: 73 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 74 65  s, allocate a te
0ed0: 6d 70 20 74 61 62 6c 65 20 66 6f 72 20 6e 65 77  mp table for new
0ee0: 2e 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 2a  .* references. *
0ef0: 2f 0a 20 20 69 66 28 20 72 6f 77 5f 74 72 69 67  /.  if( row_trig
0f00: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
0f10: 20 20 6e 65 77 49 64 78 20 3d 20 70 50 61 72 73    newIdx = pPars
0f20: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a  e->nTab++;.  }..
0f30: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
0f40: 68 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  how many columns
0f50: 20 6f 66 20 64 61 74 61 20 61 72 65 20 73 75 70   of data are sup
0f60: 70 6c 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  plied.  If the d
0f70: 61 74 61 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69  ata.  ** is comi
0f80: 6e 67 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  ng from a SELECT
0f90: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
0fa0: 20 74 68 69 73 20 73 74 65 70 20 68 61 73 20 74   this step has t
0fb0: 6f 20 67 65 6e 65 72 61 74 65 0a 20 20 2a 2a 20  o generate.  ** 
0fc0: 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 74 6f 20  all the code to 
0fd0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 53 45  implement the SE
0fe0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
0ff0: 6e 64 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  nd leave the dat
1000: 61 0a 20 20 2a 2a 20 69 6e 20 61 20 74 65 6d 70  a.  ** in a temp
1010: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 49 66  orary table.  If
1020: 20 64 61 74 61 20 69 73 20 63 6f 6d 69 6e 67 20   data is coming 
1030: 66 72 6f 6d 20 61 6e 20 65 78 70 72 65 73 73 69  from an expressi
1040: 6f 6e 20 6c 69 73 74 2c 0a 20 20 2a 2a 20 74 68  on list,.  ** th
1050: 65 6e 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  en we just have 
1060: 74 6f 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  to count the num
1070: 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ber of expressio
1080: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
1090: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 69 6e  Select ){.    in
10a0: 74 20 72 63 3b 0a 20 20 20 20 73 72 63 54 61 62  t rc;.    srcTab
10b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10c0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  +;.    sqliteVdb
10d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
10e0: 6e 54 65 6d 70 2c 20 73 72 63 54 61 62 2c 20 30  nTemp, srcTab, 0
10f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1100: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
1110: 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54 61   pSelect, SRT_Ta
1120: 62 6c 65 2c 20 73 72 63 54 61 62 2c 20 30 2c 30  ble, srcTab, 0,0
1130: 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ,0);.    if( rc 
1140: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1150: 7c 7c 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  || sqlite_malloc
1160: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 69  _failed ) goto i
1170: 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a 20  nsert_cleanup;. 
1180: 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65     assert( pSele
1190: 63 74 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  ct->pEList );.  
11a0: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 53 65 6c    nColumn = pSel
11b0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
11c0: 70 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pr;.  }else{.   
11d0: 20 53 72 63 4c 69 73 74 20 64 75 6d 6d 79 3b 0a   SrcList dummy;.
11e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
11f0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 73 72 63 54  t!=0 );.    srcT
1200: 61 62 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  ab = -1;.    ass
1210: 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20  ert( pList );.  
1220: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73    nColumn = pLis
1230: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 64 75  t->nExpr;.    du
1240: 6d 6d 79 2e 6e 53 72 63 20 3d 20 30 3b 0a 20 20  mmy.nSrc = 0;.  
1250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1260: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1270: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
1280: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
1290: 65 2c 20 30 2c 20 26 64 75 6d 6d 79 2c 20 30 2c  e, 0, &dummy, 0,
12a0: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
12b0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67  pr) ){.        g
12c0: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
12d0: 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
12e0: 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72    if( sqliteExpr
12f0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 4c  Check(pParse, pL
1300: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
1310: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
1320: 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c    goto insert_cl
1330: 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
1340: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
1350: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d  ake sure the num
1360: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
1370: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74  n the source dat
1380: 61 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  a matches the nu
1390: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 63 6f 6c  mber.  ** of col
13a0: 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 73 65 72  umns to be inser
13b0: 74 65 64 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ted into the tab
13c0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
13d0: 43 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43 6f  Column==0 && nCo
13e0: 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 6e 43 6f 6c  lumn!=pTab->nCol
13f0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 4e 75   ){.    char zNu
1400: 6d 31 5b 33 30 5d 3b 0a 20 20 20 20 63 68 61 72  m1[30];.    char
1410: 20 7a 4e 75 6d 32 5b 33 30 5d 3b 0a 20 20 20 20   zNum2[30];.    
1420: 73 70 72 69 6e 74 66 28 7a 4e 75 6d 31 2c 22 25  sprintf(zNum1,"%
1430: 64 22 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  d", nColumn);.  
1440: 20 20 73 70 72 69 6e 74 66 28 7a 4e 75 6d 32 2c    sprintf(zNum2,
1450: 22 25 64 22 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  "%d", pTab->nCol
1460: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  );.    sqliteSet
1470: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
1480: 7a 45 72 72 4d 73 67 2c 20 22 74 61 62 6c 65 20  zErrMsg, "table 
1490: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
14a0: 20 20 20 20 20 20 20 22 20 68 61 73 20 22 2c 20         " has ", 
14b0: 7a 4e 75 6d 32 2c 20 22 20 63 6f 6c 75 6d 6e 73  zNum2, " columns
14c0: 20 62 75 74 20 22 2c 0a 20 20 20 20 20 20 20 7a   but ",.       z
14d0: 4e 75 6d 31 2c 20 22 20 76 61 6c 75 65 73 20 77  Num1, " values w
14e0: 65 72 65 20 73 75 70 70 6c 69 65 64 22 2c 20 30  ere supplied", 0
14f0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
1500: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
1510: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
1520: 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d    }.  if( pColum
1530: 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 21  n!=0 && nColumn!
1540: 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20 29 7b  =pColumn->nId ){
1550: 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d 31 5b  .    char zNum1[
1560: 33 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 4e  30];.    char zN
1570: 75 6d 32 5b 33 30 5d 3b 0a 20 20 20 20 73 70 72  um2[30];.    spr
1580: 69 6e 74 66 28 7a 4e 75 6d 31 2c 22 25 64 22 2c  intf(zNum1,"%d",
1590: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73   nColumn);.    s
15a0: 70 72 69 6e 74 66 28 7a 4e 75 6d 32 2c 22 25 64  printf(zNum2,"%d
15b0: 22 2c 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29  ", pColumn->nId)
15c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
15d0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
15e0: 45 72 72 4d 73 67 2c 20 7a 4e 75 6d 31 2c 20 22  ErrMsg, zNum1, "
15f0: 20 76 61 6c 75 65 73 20 66 6f 72 20 22 2c 0a 20   values for ",. 
1600: 20 20 20 20 20 20 7a 4e 75 6d 32 2c 20 22 20 63        zNum2, " c
1610: 6f 6c 75 6d 6e 73 22 2c 20 30 29 3b 0a 20 20 20  olumns", 0);.   
1620: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1630: 0a 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74  .    goto insert
1640: 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
1650: 20 2f 2a 20 49 66 20 74 68 65 20 49 4e 53 45 52   /* If the INSER
1660: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 63 6c  T statement incl
1670: 75 64 65 64 20 61 6e 20 49 44 4c 49 53 54 20 74  uded an IDLIST t
1680: 65 72 6d 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  erm, then make s
1690: 75 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65  ure.  ** all ele
16a0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 49 44 4c  ments of the IDL
16b0: 49 53 54 20 72 65 61 6c 6c 79 20 61 72 65 20 63  IST really are c
16c0: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
16d0: 62 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65  ble and .  ** re
16e0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6c 75 6d  member the colum
16f0: 6e 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 0a  n indices..  **.
1700: 20 20 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c    ** If the tabl
1710: 65 20 68 61 73 20 61 6e 20 49 4e 54 45 47 45 52  e has an INTEGER
1720: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
1730: 75 6d 6e 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  umn and that col
1740: 75 6d 6e 0a 20 20 2a 2a 20 69 73 20 6e 61 6d 65  umn.  ** is name
1750: 64 20 69 6e 20 74 68 65 20 49 44 4c 49 53 54 2c  d in the IDLIST,
1760: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 69 6e 20   then record in 
1770: 74 68 65 20 6b 65 79 43 6f 6c 75 6d 6e 20 76 61  the keyColumn va
1780: 72 69 61 62 6c 65 0a 20 20 2a 2a 20 74 68 65 20  riable.  ** the 
1790: 69 6e 64 65 78 20 69 6e 74 6f 20 49 44 4c 49 53  index into IDLIS
17a0: 54 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79  T of the primary
17b0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 2e 20 20 6b 65   key column.  ke
17c0: 79 43 6f 6c 75 6d 6e 20 69 73 0a 20 20 2a 2a 20  yColumn is.  ** 
17d0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
17e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61 73 20   primary key as 
17f0: 69 74 20 61 70 70 65 61 72 73 20 69 6e 20 49 44  it appears in ID
1800: 4c 49 53 54 2c 20 6e 6f 74 20 61 73 0a 20 20 2a  LIST, not as.  *
1810: 2a 20 69 73 20 61 70 70 65 61 72 73 20 69 6e 20  * is appears in 
1820: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62  the original tab
1830: 6c 65 2e 20 20 28 54 68 65 20 69 6e 64 65 78 20  le.  (The index 
1840: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20  of the primary. 
1850: 20 2a 2a 20 6b 65 79 20 69 6e 20 74 68 65 20 6f   ** key in the o
1860: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 69 73  riginal table is
1870: 20 70 54 61 62 2d 3e 69 50 4b 65 79 2e 29 0a 20   pTab->iPKey.). 
1880: 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d   */.  if( pColum
1890: 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  n ){.    for(i=0
18a0: 3b 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64  ; i<pColumn->nId
18b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  ; i++){.      pC
18c0: 6f 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78 20  olumn->a[i].idx 
18d0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
18e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75  for(i=0; i<pColu
18f0: 6d 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  mn->nId; i++){. 
1900: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1910: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1920: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1930: 6c 69 74 65 53 74 72 49 43 6d 70 28 70 43 6f 6c  liteStrICmp(pCol
1940: 75 6d 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  umn->a[i].zName,
1950: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1960: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
1970: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61        pColumn->a
1980: 5b 69 5d 2e 69 64 78 20 3d 20 6a 3b 0a 20 20 20  [i].idx = j;.   
1990: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54         if( j==pT
19a0: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
19b0: 20 20 20 20 20 20 20 20 20 6b 65 79 43 6f 6c 75           keyColu
19c0: 6d 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  mn = i;.        
19d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
19e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a00: 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
1a10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a20: 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73  SetString(&pPars
1a30: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 61 62  e->zErrMsg, "tab
1a40: 6c 65 20 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  le ", pTab->zNam
1a50: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  e,.           " 
1a60: 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
1a70: 6d 65 64 20 22 2c 20 70 43 6f 6c 75 6d 6e 2d 3e  med ", pColumn->
1a80: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  a[i].zName, 0);.
1a90: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1aa0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
1ab0: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
1ac0: 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
1ad0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1ae0: 74 68 65 72 65 20 69 73 20 6e 6f 20 49 44 4c 49  there is no IDLI
1af0: 53 54 20 74 65 72 6d 20 62 75 74 20 74 68 65 20  ST term but the 
1b00: 74 61 62 6c 65 20 68 61 73 20 61 6e 20 69 6e 74  table has an int
1b10: 65 67 65 72 20 70 72 69 6d 61 72 79 0a 20 20 2a  eger primary.  *
1b20: 2a 20 6b 65 79 2c 20 74 68 65 20 73 65 74 20 74  * key, the set t
1b30: 68 65 20 6b 65 79 43 6f 6c 75 6d 6e 20 76 61 72  he keyColumn var
1b40: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 70 72 69  iable to the pri
1b50: 6d 61 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  mary key column 
1b60: 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 74 68  index.  ** in th
1b70: 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  e original table
1b80: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a   definition..  *
1b90: 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d  /.  if( pColumn=
1ba0: 3d 30 20 29 7b 0a 20 20 20 20 6b 65 79 43 6f 6c  =0 ){.    keyCol
1bb0: 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  umn = pTab->iPKe
1bc0: 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  y;.  }..  /* Ope
1bd0: 6e 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  n the temp table
1be0: 20 66 6f 72 20 46 4f 52 20 45 41 43 48 20 52 4f   for FOR EACH RO
1bf0: 57 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20  W triggers */.  
1c00: 69 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73  if( row_triggers
1c10: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 73 71  _exist ){.    sq
1c20: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
1c30: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 6e 65   OP_OpenTemp, ne
1c40: 77 49 64 78 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wIdx, 0);.  }.  
1c50: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
1c60: 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  ze the count of 
1c70: 72 6f 77 73 20 74 6f 20 62 65 20 69 6e 73 65 72  rows to be inser
1c80: 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ted.  */.  if( d
1c90: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1ca0: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 26 26 20 21  E_CountRows && !
1cb0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
1cc0: 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 56  k ){.    sqliteV
1cd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1ce0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 20 20  nteger, 0, 0);  
1cf0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1d00: 65 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  e row count */. 
1d10: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 61   }..  /* Open ta
1d20: 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
1d30: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
1d40: 20 72 6f 77 20 74 72 69 67 67 65 72 73 20 2a 2f   row triggers */
1d50: 0a 20 20 69 66 28 20 21 72 6f 77 5f 74 72 69 67  .  if( !row_trig
1d60: 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20  gers_exist ){.  
1d70: 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d    base = pParse-
1d80: 3e 6e 54 61 62 3b 0a 20 20 20 20 6f 70 65 6e 4f  >nTab;.    openO
1d90: 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65 6d 70  p = pTab->isTemp
1da0: 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75 78 20   ? OP_OpenWrAux 
1db0: 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a  : OP_OpenWrite;.
1dc0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
1dd0: 64 4f 70 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 62  dOp(v, openOp, b
1de0: 61 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29  ase, pTab->tnum)
1df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
1e00: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
1e10: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f  pTab->zName, P3_
1e20: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 66 6f 72  STATIC);.    for
1e30: 28 69 64 78 3d 31 2c 20 70 49 64 78 3d 70 54 61  (idx=1, pIdx=pTa
1e40: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
1e50: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1e60: 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20  t, idx++){.     
1e70: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
1e80: 28 76 2c 20 6f 70 65 6e 4f 70 2c 20 69 64 78 2b  (v, openOp, idx+
1e90: 62 61 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  base, pIdx->tnum
1ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
1eb0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
1ec0: 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
1ed0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
1ee0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  }.    pParse->nT
1ef0: 61 62 20 2b 3d 20 69 64 78 3b 0a 20 20 7d 0a 0a  ab += idx;.  }..
1f00: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1f10: 20 73 6f 75 72 63 65 20 69 73 20 61 20 53 45 4c   source is a SEL
1f20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1f30: 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 63  hen we have to c
1f40: 72 65 61 74 65 0a 20 20 2a 2a 20 61 20 6c 6f 6f  reate.  ** a loo
1f50: 70 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  p because there 
1f60: 6d 69 67 68 74 20 62 65 20 6d 75 6c 74 69 70 6c  might be multipl
1f70: 65 20 72 6f 77 73 20 6f 66 20 64 61 74 61 2e 20  e rows of data. 
1f80: 20 49 66 20 74 68 65 20 64 61 74 61 0a 20 20 2a   If the data.  *
1f90: 2a 20 73 6f 75 72 63 65 20 69 73 20 61 6e 20 65  * source is an e
1fa0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
1fb0: 74 68 65 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  then exactly one
1fc0: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
1fd0: 65 72 74 65 64 0a 20 20 2a 2a 20 61 6e 64 20 74  erted.  ** and t
1fe0: 68 65 20 6c 6f 6f 70 20 69 73 20 6e 6f 74 20 75  he loop is not u
1ff0: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
2000: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
2010: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
2020: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2030: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
2040: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
2050: 6e 64 2c 20 73 72 63 54 61 62 2c 20 69 42 72 65  nd, srcTab, iBre
2060: 61 6b 29 3b 0a 20 20 20 20 69 43 6f 6e 74 20 3d  ak);.    iCont =
2070: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
2080: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 0a  ntAddr(v);.  }..
2090: 20 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73 71    endOfLoop = sq
20a0: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
20b0: 6c 28 76 29 3b 0a 20 20 69 66 28 20 72 6f 77 5f  l(v);.  if( row_
20c0: 74 72 69 67 67 65 72 73 5f 65 78 69 73 74 20 29  triggers_exist )
20d0: 7b 0a 0a 20 20 20 20 2f 2a 20 62 75 69 6c 64 20  {..    /* build 
20e0: 74 68 65 20 6e 65 77 2e 2a 20 72 65 66 65 72 65  the new.* refere
20f0: 6e 63 65 20 72 6f 77 20 2a 2f 0a 20 20 20 20 73  nce row */.    s
2100: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2110: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 33  , OP_Integer, 13
2120: 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , 0);.    for(i=
2130: 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; i<pTab->nCol;
2140: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2150: 20 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20   pColumn==0 ){. 
2160: 20 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a 20 20         j = i;.  
2170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2180: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43     for(j=0; j<pC
2190: 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  olumn->nId; j++)
21a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
21b0: 70 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64  pColumn->a[j].id
21c0: 78 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  x==i ) break;.  
21d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21e0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d        if( pColum
21f0: 6e 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d  n && j>=pColumn-
2200: 3e 6e 49 64 20 29 7b 0a 20 20 20 20 20 20 20 20  >nId ){.        
2210: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2220: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
2230: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2240: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
2250: 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f  v, -1, pTab->aCo
2260: 6c 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53  l[i].zDflt, P3_S
2270: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  TATIC);.      }e
2280: 6c 73 65 20 69 66 28 20 73 72 63 54 61 62 3e 3d  lse if( srcTab>=
2290: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
22a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
22b0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
22c0: 62 2c 20 6a 29 3b 20 0a 20 20 20 20 20 20 7d 65  b, j); .      }e
22d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22e0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
22f0: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  se, pList->a[j].
2300: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2310: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2320: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2330: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 54 61 62  MakeRecord, pTab
2340: 2d 3e 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  ->nCol, 0);.    
2350: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
2360: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
2370: 20 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20 20 20   newIdx, 0);.   
2380: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2390: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 6e  (v, OP_Rewind, n
23a0: 65 77 49 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20  ewIdx, 0);..    
23b0: 2f 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20 74  /* Fire BEFORE t
23c0: 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20 69  riggers */.    i
23d0: 66 28 20 73 71 6c 69 74 65 43 6f 64 65 52 6f 77  f( sqliteCodeRow
23e0: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
23f0: 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54 4b  TK_INSERT, 0, TK
2400: 5f 42 45 46 4f 52 45 2c 20 70 54 61 62 2c 20 6e  _BEFORE, pTab, n
2410: 65 77 49 64 78 2c 20 2d 31 2c 20 0a 20 20 20 20  ewIdx, -1, .    
2420: 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64      onError, end
2430: 4f 66 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20  OfLoop) ){.     
2440: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
2450: 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  anup;.    }..   
2460: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62   /* Open the tab
2470: 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
2480: 66 6f 72 20 74 68 65 20 49 4e 53 45 52 54 20 2a  for the INSERT *
2490: 2f 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 2d  /.    if( !pTab-
24a0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
24b0: 20 20 62 61 73 65 20 3d 20 70 50 61 72 73 65 2d    base = pParse-
24c0: 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20 6f 70 65  >nTab;.      ope
24d0: 6e 4f 70 20 3d 20 70 54 61 62 2d 3e 69 73 54 65  nOp = pTab->isTe
24e0: 6d 70 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 41 75  mp ? OP_OpenWrAu
24f0: 78 20 3a 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  x : OP_OpenWrite
2500: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
2510: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 65 6e 4f  beAddOp(v, openO
2520: 70 2c 20 62 61 73 65 2c 20 70 54 61 62 2d 3e 74  p, base, pTab->t
2530: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  num);.      sqli
2540: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
2550: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
2560: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
2570: 20 20 20 20 20 66 6f 72 28 69 64 78 3d 31 2c 20       for(idx=1, 
2580: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
2590: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
25a0: 64 78 2d 3e 70 4e 65 78 74 2c 20 69 64 78 2b 2b  dx->pNext, idx++
25b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
25d0: 65 6e 4f 70 2c 20 69 64 78 2b 62 61 73 65 2c 20  enOp, idx+base, 
25e0: 70 49 64 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pIdx->tnum);.   
25f0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43       sqliteVdbeC
2600: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
2610: 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 50 33 5f 53  Idx->zName, P3_S
2620: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
2630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
2640: 61 62 20 2b 3d 20 69 64 78 3b 0a 20 20 20 20 7d  ab += idx;.    }
2650: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 73 68 20  .  }..  /* Push 
2660: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
2670: 72 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  r for the new en
2680: 74 72 79 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  try onto the sta
2690: 63 6b 2e 20 20 54 68 65 0a 20 20 2a 2a 20 72 65  ck.  The.  ** re
26a0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 61  cord number is a
26b0: 20 72 61 6e 64 6f 6d 6c 79 20 67 65 6e 65 72 61   randomly genera
26c0: 74 65 20 69 6e 74 65 67 65 72 20 63 72 65 61 74  te integer creat
26d0: 65 64 20 62 79 20 4e 65 77 52 65 63 6e 6f 0a 20  ed by NewRecno. 
26e0: 20 2a 2a 20 65 78 63 65 70 74 20 77 68 65 6e 20   ** except when 
26f0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
2700: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2710: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2c 20 69 6e 20   KEY column, in 
2720: 77 68 69 63 68 0a 20 20 2a 2a 20 63 61 73 65 20  which.  ** case 
2730: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
2740: 72 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  r is the same as
2750: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 0a 20   that column. . 
2760: 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 2d   */.  if( !pTab-
2770: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2780: 69 66 28 20 6b 65 79 43 6f 6c 75 6d 6e 3e 3d 30  if( keyColumn>=0
2790: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 72   ){.      if( sr
27a0: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 20  cTab>=0 ){.     
27b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
27c0: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
27d0: 20 73 72 63 54 61 62 2c 20 6b 65 79 43 6f 6c 75   srcTab, keyColu
27e0: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
27f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2800: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2810: 20 70 4c 69 73 74 2d 3e 61 5b 6b 65 79 43 6f 6c   pList->a[keyCol
2820: 75 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a 0a 20 20  umn].pExpr);..  
2830: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2840: 50 52 49 4d 41 52 59 20 4b 45 59 20 65 78 70 72  PRIMARY KEY expr
2850: 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  ession is NULL, 
2860: 74 68 65 6e 20 75 73 65 20 4f 50 5f 4e 65 77 52  then use OP_NewR
2870: 65 63 6e 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  ecno.        ** 
2880: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 75 6e  to generate a un
2890: 69 71 75 65 20 70 72 69 6d 61 72 79 20 6b 65 79  ique primary key
28a0: 20 76 61 6c 75 65 2e 0a 20 20 20 20 20 20 20 20   value..        
28b0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
28c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
28d0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
28e0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
28f0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
2900: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2910: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
2920: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
2930: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2940: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 62 61 73  OP_NewRecno, bas
2950: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
2960: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
2970: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
2980: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
2990: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
29a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
29b0: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 62 61   OP_NewRecno, ba
29c0: 73 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  se, 0);.    }.. 
29d0: 20 20 20 2f 2a 20 50 75 73 68 20 6f 6e 74 6f 20     /* Push onto 
29e0: 74 68 65 20 73 74 61 63 6b 2c 20 64 61 74 61 20  the stack, data 
29f0: 66 6f 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  for all columns 
2a00: 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  of the new entry
2a10: 2c 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  , beginning.    
2a20: 2a 2a 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ** with the firs
2a30: 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  t column..    */
2a40: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2a50: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
2a60: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70  {.      if( i==p
2a70: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
2a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
2a90: 75 65 20 6f 66 20 74 68 65 20 49 4e 54 45 47 45  ue of the INTEGE
2aa0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
2ab0: 6c 75 6d 6e 20 69 73 20 61 6c 77 61 79 73 20 61  lumn is always a
2ac0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 2a   NULL..        *
2ad0: 2a 20 57 68 65 6e 65 76 65 72 20 74 68 69 73 20  * Whenever this 
2ae0: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 61 64 2c 20  column is read, 
2af0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
2b00: 72 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69  r will be substi
2b10: 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tuted.        **
2b20: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20   in its place.  
2b30: 53 6f 20 77 69 6c 6c 20 66 69 6c 6c 20 74 68 69  So will fill thi
2b40: 73 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20  s column with a 
2b50: 4e 55 4c 4c 20 74 6f 20 61 76 6f 69 64 0a 20 20  NULL to avoid.  
2b60: 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20        ** taking 
2b70: 75 70 20 64 61 74 61 20 73 70 61 63 65 20 77 69  up data space wi
2b80: 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  th information t
2b90: 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
2ba0: 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 20  e used. */.     
2bb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2bc0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c  Op(v, OP_String,
2bd0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
2be0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2bf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
2c00: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
2c10: 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d    j = i;.      }
2c20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
2c30: 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d 6e  r(j=0; j<pColumn
2c40: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
2c50: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75         if( pColu
2c60: 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69 20  mn->a[j].idx==i 
2c70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2c80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c90: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 26 26 20   if( pColumn && 
2ca0: 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20  j>=pColumn->nId 
2cb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2cc0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2cd0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
2ce0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
2cf0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
2d00: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
2d10: 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43  zDflt, P3_STATIC
2d20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2d30: 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a  f( srcTab>=0 ){.
2d40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
2d50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
2d60: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6a 29  lumn, srcTab, j)
2d70: 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ; .      }else{.
2d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78          sqliteEx
2d90: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2da0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
2db0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2dc0: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2dd0: 65 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  e code to check 
2de0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20  constraints and 
2df0: 67 65 6e 65 72 61 74 65 20 69 6e 64 65 78 20 6b  generate index k
2e00: 65 79 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  eys and.    ** d
2e10: 6f 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 2e  o the insertion.
2e20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
2e30: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
2e40: 61 69 6e 74 43 68 65 63 6b 73 28 70 50 61 72 73  aintChecks(pPars
2e50: 65 2c 20 70 54 61 62 2c 20 62 61 73 65 2c 20 30  e, pTab, base, 0
2e60: 2c 30 2c 30 2c 6f 6e 45 72 72 6f 72 2c 65 6e 64  ,0,0,onError,end
2e70: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c  OfLoop);.    sql
2e80: 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e 73 65 72  iteCompleteInser
2e90: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
2ea0: 62 2c 20 62 61 73 65 2c 20 30 2c 30 2c 30 29 3b  b, base, 0,0,0);
2eb0: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
2ec0: 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 72 6f 77  the count of row
2ed0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 73 65 72  s that are inser
2ee0: 74 65 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ted.    */.    i
2ef0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
2f00: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
2f10: 29 21 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  )!=0 && !pParse-
2f20: 3e 74 72 69 67 53 74 61 63 6b 29 7b 0a 20 20 20  >trigStack){.   
2f30: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2f40: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
2f50: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
2f60: 7d 0a 0a 20 20 69 66 28 20 72 6f 77 5f 74 72 69  }..  if( row_tri
2f70: 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20  ggers_exist ){. 
2f80: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20     /* Close all 
2f90: 74 61 62 6c 65 73 20 6f 70 65 6e 65 64 20 2a 2f  tables opened */
2fa0: 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 2d 3e  .    if( !pTab->
2fb0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
2fc0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2fd0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61  (v, OP_Close, ba
2fe0: 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  se, 0);.      fo
2ff0: 72 28 69 64 78 3d 31 2c 20 70 49 64 78 3d 70 54  r(idx=1, pIdx=pT
3000: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
3010: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
3020: 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  xt, idx++){.    
3030: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3040: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
3050: 20 69 64 78 2b 62 61 73 65 2c 20 30 29 3b 0a 20   idx+base, 0);. 
3060: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3070: 20 20 2f 2a 20 43 6f 64 65 20 41 46 54 45 52 20    /* Code AFTER 
3080: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 20 20  triggers */.    
3090: 69 66 28 20 73 71 6c 69 74 65 43 6f 64 65 52 6f  if( sqliteCodeRo
30a0: 77 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  wTrigger(pParse,
30b0: 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30 2c 20 54   TK_INSERT, 0, T
30c0: 4b 5f 41 46 54 45 52 2c 20 70 54 61 62 2c 20 6e  K_AFTER, pTab, n
30d0: 65 77 49 64 78 2c 20 2d 31 2c 20 0a 20 20 20 20  ewIdx, -1, .    
30e0: 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 65        onError, e
30f0: 6e 64 4f 66 4c 6f 6f 70 29 20 29 7b 0a 20 20 20  ndOfLoop) ){.   
3100: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
3110: 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
3120: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74  }..  /* The bott
3130: 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2c 20  om of the loop, 
3140: 69 66 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  if the data sour
3150: 63 65 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  ce is a SELECT s
3160: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2f 0a 20 20  tatement.  */.  
3170: 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76  sqliteVdbeResolv
3180: 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4f 66 4c  eLabel(v, endOfL
3190: 6f 6f 70 29 3b 0a 20 20 69 66 28 20 73 72 63 54  oop);.  if( srcT
31a0: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ab>=0 ){.    sql
31b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
31c0: 4f 50 5f 4e 65 78 74 2c 20 73 72 63 54 61 62 2c  OP_Next, srcTab,
31d0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 73 71 6c   iCont);.    sql
31e0: 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  iteVdbeResolveLa
31f0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
3200: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3210: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
3220: 20 73 72 63 54 61 62 2c 20 30 29 3b 0a 20 20 7d   srcTab, 0);.  }
3230: 0a 0a 20 20 69 66 28 20 21 72 6f 77 5f 74 72 69  ..  if( !row_tri
3240: 67 67 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20  ggers_exist ){. 
3250: 20 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20     /* Close all 
3260: 74 61 62 6c 65 73 20 6f 70 65 6e 65 64 20 2a 2f  tables opened */
3270: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41  .    sqliteVdbeA
3280: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
3290: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  , base, 0);.    
32a0: 66 6f 72 28 69 64 78 3d 31 2c 20 70 49 64 78 3d  for(idx=1, pIdx=
32b0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
32c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
32d0: 4e 65 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20 20  Next, idx++){.  
32e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
32f0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
3300: 20 69 64 78 2b 62 61 73 65 2c 20 30 29 3b 0a 20   idx+base, 0);. 
3310: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
3320: 74 65 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  teEndWriteOperat
3330: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ion(pParse);..  
3340: 2f 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  /*.  ** Return t
3350: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
3360: 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  s inserted..  */
3370: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
3380: 20 26 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52   & SQLITE_CountR
3390: 6f 77 73 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ows && !pParse->
33a0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
33b0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
33c0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 43 6f 75  (v, OP_ColumnCou
33d0: 6e 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  nt, 1, 0);.    s
33e0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
33f0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  , OP_ColumnName,
3400: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
3410: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3420: 2c 20 2d 31 2c 20 22 72 6f 77 73 20 69 6e 73 65  , -1, "rows inse
3430: 72 74 65 64 22 2c 20 50 33 5f 53 54 41 54 49 43  rted", P3_STATIC
3440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
3450: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
3460: 6c 62 61 63 6b 2c 20 31 2c 20 30 29 3b 0a 20 20  lback, 1, 0);.  
3470: 7d 0a 0a 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  }..insert_cleanu
3480: 70 3a 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  p:.  if( pList )
3490: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
34a0: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
34b0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 20 73 71  if( pSelect ) sq
34c0: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
34d0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 20  (pSelect);.  if 
34e0: 28 20 7a 54 61 62 20 29 20 73 71 6c 69 74 65 46  ( zTab ) sqliteF
34f0: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c  ree(zTab);.  sql
3500: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
3510: 70 43 6f 6c 75 6d 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  pColumn);.}../*.
3520: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
3530: 20 74 6f 20 64 6f 20 61 20 63 6f 6e 73 74 72 61   to do a constra
3540: 69 6e 74 20 63 68 65 63 6b 20 70 72 69 6f 72 20  int check prior 
3550: 74 6f 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  to an INSERT or 
3560: 61 6e 20 55 50 44 41 54 45 2e 0a 2a 2a 0a 2a 2a  an UPDATE..**.**
3570: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
3580: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
3590: 65 20 73 74 61 63 6b 20 63 6f 6e 74 61 69 6e 73  e stack contains
35a0: 20 28 66 72 6f 6d 20 62 6f 74 74 6f 6d 20 74 6f   (from bottom to
35b0: 20 74 6f 70 29 0a 2a 2a 20 74 68 65 20 66 6f 6c   top).** the fol
35c0: 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 3a 0a 2a  lowing values:.*
35d0: 2a 0a 2a 2a 20 20 20 20 31 2e 20 20 54 68 65 20  *.**    1.  The 
35e0: 72 65 63 6e 6f 20 6f 66 20 74 68 65 20 72 6f 77  recno of the row
35f0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 62   to be updated b
3600: 65 66 6f 72 65 20 69 74 20 69 73 20 75 70 64 61  efore it is upda
3610: 74 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20  ted.  This.**   
3620: 20 20 20 20 20 76 61 6c 75 65 20 69 73 20 6f 6d       value is om
3630: 69 74 74 65 64 20 75 6e 6c 65 73 73 20 77 65 20  itted unless we 
3640: 61 72 65 20 64 6f 69 6e 67 20 61 6e 20 55 50 44  are doing an UPD
3650: 41 54 45 20 74 68 61 74 20 69 6e 76 6f 6c 76 65  ATE that involve
3660: 73 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63 68  s a.**        ch
3670: 61 6e 67 65 20 74 6f 20 74 68 65 20 72 65 63 6f  ange to the reco
3680: 72 64 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  rd number..**.**
3690: 20 20 20 20 32 2e 20 20 54 68 65 20 72 65 63 6e      2.  The recn
36a0: 6f 20 6f 66 20 74 68 65 20 72 6f 77 20 61 66 74  o of the row aft
36b0: 65 72 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a  er the update..*
36c0: 2a 0a 2a 2a 20 20 20 20 33 2e 20 20 54 68 65 20  *.**    3.  The 
36d0: 64 61 74 61 20 69 6e 20 74 68 65 20 66 69 72 73  data in the firs
36e0: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
36f0: 65 6e 74 72 79 20 61 66 74 65 72 20 74 68 65 20  entry after the 
3700: 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  update..**.**   
3710: 20 69 2e 20 20 44 61 74 61 20 66 72 6f 6d 20 6d   i.  Data from m
3720: 69 64 64 6c 65 20 63 6f 6c 75 6d 6e 73 2e 2e 2e  iddle columns...
3730: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 2e 20 20 54 68  .**.**    N.  Th
3740: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 6c 61  e data in the la
3750: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
3760: 20 65 6e 74 72 79 20 61 66 74 65 72 20 74 68 65   entry after the
3770: 20 75 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54   update..**.** T
3780: 68 65 20 6f 6c 64 20 72 65 63 6e 6f 20 73 68 6f  he old recno sho
3790: 77 6e 20 61 73 20 65 6e 74 72 79 20 28 31 29 20  wn as entry (1) 
37a0: 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64  above is omitted
37b0: 20 75 6e 6c 65 73 73 20 62 6f 74 68 20 69 73 55   unless both isU
37c0: 70 64 61 74 65 0a 2a 2a 20 61 6e 64 20 72 65 63  pdate.** and rec
37d0: 6e 6f 43 68 6e 67 20 61 72 65 20 31 2e 20 20 69  noChng are 1.  i
37e0: 73 55 70 64 61 74 65 20 69 73 20 74 72 75 65 20  sUpdate is true 
37f0: 66 6f 72 20 55 50 44 41 54 45 73 20 61 6e 64 20  for UPDATEs and 
3800: 66 61 6c 73 65 20 66 6f 72 0a 2a 2a 20 49 4e 53  false for.** INS
3810: 45 52 54 73 20 61 6e 64 20 72 65 63 6e 6f 43 68  ERTs and recnoCh
3820: 6e 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ng is true if th
3830: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
3840: 69 73 20 62 65 69 6e 67 20 63 68 61 6e 67 65 64  is being changed
3850: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
3860: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
3870: 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
3880: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  s additional ent
3890: 72 69 65 73 20 6f 6e 74 6f 0a 2a 2a 20 74 68 65  ries onto.** the
38a0: 20 73 74 61 63 6b 20 77 68 69 63 68 20 61 72 65   stack which are
38b0: 20 74 68 65 20 6b 65 79 73 20 66 6f 72 20 6e 65   the keys for ne
38c0: 77 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  w index entries 
38d0: 66 6f 72 20 74 68 65 20 6e 65 77 20 72 65 63 6f  for the new reco
38e0: 72 64 2e 0a 2a 2a 20 54 68 65 20 6f 72 64 65 72  rd..** The order
38f0: 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 73 20 69   of index keys i
3900: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
3910: 65 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69  e order of the i
3920: 6e 64 69 63 65 73 20 6f 6e 0a 2a 2a 20 74 68 65  ndices on.** the
3930: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
3940: 6c 69 73 74 2e 20 20 41 20 6b 65 79 20 69 73 20  list.  A key is 
3950: 6f 6e 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  only created for
3960: 20 69 6e 64 65 78 20 69 20 69 66 20 0a 2a 2a 20   index i if .** 
3970: 61 49 64 78 55 73 65 64 21 3d 30 20 61 6e 64 20  aIdxUsed!=0 and 
3980: 61 49 64 78 55 73 65 64 5b 69 5d 21 3d 30 2e 0a  aIdxUsed[i]!=0..
3990: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
39a0: 6e 65 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65  ne also generate
39b0: 73 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  s code to check 
39c0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 4e 4f  constraints.  NO
39d0: 54 20 4e 55 4c 4c 2c 0a 2a 2a 20 43 48 45 43 4b  T NULL,.** CHECK
39e0: 2c 20 61 6e 64 20 55 4e 49 51 55 45 20 63 6f 6e  , and UNIQUE con
39f0: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
3a00: 20 63 68 65 63 6b 65 64 2e 20 20 49 66 20 61 20   checked.  If a 
3a10: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 73  constraint fails
3a20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 70  ,.** then the ap
3a30: 70 72 6f 70 72 69 61 74 65 20 61 63 74 69 6f 6e  propriate action
3a40: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 20   is performed.  
3a50: 54 68 65 72 65 20 61 72 65 20 66 69 76 65 20 70  There are five p
3a60: 6f 73 73 69 62 6c 65 0a 2a 2a 20 61 63 74 69 6f  ossible.** actio
3a70: 6e 73 3a 20 52 4f 4c 4c 42 41 43 4b 2c 20 41 42  ns: ROLLBACK, AB
3a80: 4f 52 54 2c 20 46 41 49 4c 2c 20 52 45 50 4c 41  ORT, FAIL, REPLA
3a90: 43 45 2c 20 61 6e 64 20 49 47 4e 4f 52 45 2e 0a  CE, and IGNORE..
3aa0: 2a 2a 0a 2a 2a 20 20 43 6f 6e 73 74 72 61 69 6e  **.**  Constrain
3ab0: 74 20 74 79 70 65 20 20 41 63 74 69 6f 6e 20 20  t type  Action  
3ac0: 20 20 20 20 20 57 68 61 74 20 48 61 70 70 65 6e       What Happen
3ad0: 73 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.**  ----------
3ae0: 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
3af0: 2d 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -   ------------
3b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
3b20: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
3b30: 20 20 52 4f 4c 4c 42 41 43 4b 20 20 20 20 20 54    ROLLBACK     T
3b40: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
3b50: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
3b60: 20 62 61 63 6b 20 61 6e 64 0a 2a 2a 20 20 20 20   back and.**    
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
3b90: 74 65 5f 65 78 65 63 28 29 20 72 65 74 75 72 6e  te_exec() return
3ba0: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 77 69  s immediately wi
3bb0: 74 68 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  th a.**         
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f         return co
3be0: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e  de of SQLITE_CON
3bf0: 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20 20  STRAINT..**.**  
3c00: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
3c10: 20 41 42 4f 52 54 20 20 20 20 20 20 20 20 42 61   ABORT        Ba
3c20: 63 6b 20 6f 75 74 20 63 68 61 6e 67 65 73 20 66  ck out changes f
3c30: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
3c40: 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 20 20 20 20 20  command.**      
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 20 6f 6e 6c 79 20 28            only (
3c70: 64 6f 20 6e 6f 74 20 64 6f 20 61 20 63 6f 6d 70  do not do a comp
3c80: 6c 65 74 65 20 72 6f 6c 6c 62 61 63 6b 29 20 74  lete rollback) t
3c90: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hen.**          
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 63 61 75 73 65 20 73 71 6c 69        cause sqli
3cc0: 74 65 5f 65 78 65 63 28 29 20 74 6f 20 72 65 74  te_exec() to ret
3cd0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
3ce0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 43 4f    with SQLITE_CO
3d10: 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a 0a 2a 2a 20  NSTRAINT..**.** 
3d20: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
3d30: 20 20 46 41 49 4c 20 20 20 20 20 20 20 20 20 53    FAIL         S
3d40: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 72 65 74  qlite_exec() ret
3d50: 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  urns immediately
3d60: 20 77 69 74 68 20 61 0a 2a 2a 20 20 20 20 20 20   with a.**      
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3d90: 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f   code of SQLITE_
3da0: 43 4f 4e 53 54 52 41 49 4e 54 2e 20 20 54 68 65  CONSTRAINT.  The
3db0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69     transaction i
3de0: 73 20 6e 6f 74 20 72 6f 6c 6c 65 64 20 62 61 63  s not rolled bac
3df0: 6b 20 61 6e 64 20 61 6e 79 0a 2a 2a 20 20 20 20  k and any.**    
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6f              prio
3e20: 72 20 63 68 61 6e 67 65 73 20 61 72 65 20 72 65  r changes are re
3e30: 74 61 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 61  tained..**.**  a
3e40: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
3e50: 49 47 4e 4f 52 45 20 20 20 20 20 20 20 54 68 65  IGNORE       The
3e60: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 61   record number a
3e70: 6e 64 20 64 61 74 61 20 69 73 20 70 6f 70 70 65  nd data is poppe
3e80: 64 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20  d from.**       
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
3eb0: 63 6b 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ck and there is 
3ec0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
3ed0: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  p.**            
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 74 6f 20 6c 61 62 65 6c 20 69 67 6e      to label ign
3f00: 6f 72 65 44 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  oreDest..**.**  
3f10: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20  NOT NULL        
3f20: 20 52 45 50 4c 41 43 45 20 20 20 20 20 20 54 68   REPLACE      Th
3f30: 65 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  e NULL value is 
3f40: 72 65 70 6c 61 63 65 20 62 79 20 74 68 65 20 64  replace by the d
3f50: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 66           value f
3f80: 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20  or that column. 
3f90: 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   If the default 
3fa0: 76 61 6c 75 65 0a 2a 2a 20 20 20 20 20 20 20 20  value.**        
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 20 20 20 69 73 20 4e 55 4c 4c 2c          is NULL,
3fd0: 20 74 68 65 20 61 63 74 69 6f 6e 20 69 73 20 74   the action is t
3fe0: 68 65 20 73 61 6d 65 20 61 73 20 41 42 4f 52 54  he same as ABORT
3ff0: 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e 49 51 55 45 20  ..**.**  UNIQUE 
4000: 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43            REPLAC
4010: 45 20 20 20 20 20 20 54 68 65 20 6f 74 68 65 72  E      The other
4020: 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 66 6c 69   row that confli
4030: 63 74 73 20 77 69 74 68 20 74 68 65 20 72 6f 77  cts with the row
4040: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 20 20 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65     being inserte
4070: 64 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a  d is removed..**
4080: 0a 2a 2a 20 20 43 48 45 43 4b 20 20 20 20 20 20  .**  CHECK      
4090: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
40a0: 20 20 20 49 6c 6c 65 67 61 6c 2e 20 20 54 68 65     Illegal.  The
40b0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 65   results in an e
40c0: 78 63 65 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xception..**.** 
40d0: 57 68 69 63 68 20 61 63 74 69 6f 6e 20 74 6f 20  Which action to 
40e0: 74 61 6b 65 20 69 73 20 64 65 74 65 72 6d 69 6e  take is determin
40f0: 65 64 20 62 79 20 74 68 65 20 6f 76 65 72 72 69  ed by the overri
4100: 64 65 45 72 72 6f 72 20 70 61 72 61 6d 65 74 65  deError paramete
4110: 72 2e 0a 2a 2a 20 4f 72 20 69 66 20 6f 76 65 72  r..** Or if over
4120: 72 69 64 65 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  rideError==OE_De
4130: 66 61 75 6c 74 2c 20 74 68 65 6e 20 74 68 65 20  fault, then the 
4140: 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 20  pParse->onError 
4150: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 69 73 20  parameter.** is 
4160: 75 73 65 64 2e 20 20 4f 72 20 69 66 20 70 50 61  used.  Or if pPa
4170: 72 73 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  rse->onError==OE
4180: 5f 44 65 66 61 75 6c 74 20 74 68 65 6e 20 74 68  _Default then th
4190: 65 20 6f 6e 45 72 72 6f 72 20 76 61 6c 75 65 0a  e onError value.
41a0: 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ** for the const
41b0: 72 61 69 6e 74 20 69 73 20 75 73 65 64 2e 0a 2a  raint is used..*
41c0: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
41d0: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 6f 70   routine must op
41e0: 65 6e 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  en a read/write 
41f0: 63 75 72 73 6f 72 20 66 6f 72 20 70 54 61 62 20  cursor for pTab 
4200: 77 69 74 68 0a 2a 2a 20 63 75 72 73 6f 72 20 6e  with.** cursor n
4210: 75 6d 62 65 72 20 22 62 61 73 65 22 2e 20 20 41  umber "base".  A
4220: 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
4230: 61 62 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76  ab must also hav
4240: 65 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 2f 77  e open.** read/w
4250: 72 69 74 65 20 63 75 72 73 6f 72 73 20 77 69 74  rite cursors wit
4260: 68 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  h cursor number 
4270: 62 61 73 65 2b 69 20 66 6f 72 20 74 68 65 20 69  base+i for the i
4280: 2d 74 68 20 63 75 72 73 6f 72 2e 0a 2a 2a 20 45  -th cursor..** E
4290: 78 63 65 70 74 2c 20 69 66 20 74 68 65 72 65 20  xcept, if there 
42a0: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
42b0: 79 20 6f 66 20 61 20 52 45 50 4c 41 43 45 20 61  y of a REPLACE a
42c0: 63 74 69 6f 6e 20 74 68 65 6e 0a 2a 2a 20 63 75  ction then.** cu
42d0: 72 73 6f 72 73 20 64 6f 20 6e 6f 74 20 6e 65 65  rsors do not nee
42e0: 64 20 74 6f 20 62 65 20 6f 70 65 6e 20 66 6f 72  d to be open for
42f0: 20 69 6e 64 69 63 65 73 20 77 68 65 72 65 20 61   indices where a
4300: 49 64 78 55 73 65 64 5b 69 5d 3d 3d 30 2e 0a 2a  IdxUsed[i]==0..*
4310: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 55 70  *.** If the isUp
4320: 64 61 74 65 20 66 6c 61 67 20 69 73 20 74 72 75  date flag is tru
4330: 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
4340: 20 74 68 65 20 22 62 61 73 65 22 20 63 75 72 73   the "base" curs
4350: 6f 72 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  or is.** initial
4360: 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
4370: 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20  n entry that is 
4380: 62 65 69 6e 67 20 75 70 64 61 74 65 64 2e 20 20  being updated.  
4390: 54 68 65 20 69 73 55 70 64 61 74 65 0a 2a 2a 20  The isUpdate.** 
43a0: 66 6c 61 67 20 63 61 75 73 65 73 20 65 78 74 72  flag causes extr
43b0: 61 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  a code to be gen
43c0: 65 72 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  erated so that t
43d0: 68 65 20 22 62 61 73 65 22 20 63 75 72 73 6f 72  he "base" cursor
43e0: 0a 2a 2a 20 69 73 20 73 74 69 6c 6c 20 70 6f 69  .** is still poi
43f0: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 73 61 6d  nting at the sam
4400: 65 20 65 6e 74 72 79 20 61 66 74 65 72 20 74 68  e entry after th
4410: 65 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  e routine return
4420: 73 2e 0a 2a 2a 20 57 69 74 68 6f 75 74 20 74 68  s..** Without th
4430: 65 20 69 73 55 70 64 61 74 65 20 66 6c 61 67 2c  e isUpdate flag,
4440: 20 74 68 65 20 22 62 61 73 65 22 20 63 75 72 73   the "base" curs
4450: 6f 72 20 6d 69 67 68 74 20 62 65 20 6d 6f 76 65  or might be move
4460: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4470: 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  eGenerateConstra
4480: 69 6e 74 43 68 65 63 6b 73 28 0a 20 20 50 61 72  intChecks(.  Par
4490: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
44a0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
44b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
44c0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
44d0: 2f 2a 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  /* the table int
44e0: 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 69  o which we are i
44f0: 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  nserting */.  in
4500: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
4510: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61 20    /* Index of a 
4520: 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
4530: 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 70 54  r pointing at pT
4540: 61 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 49  ab */.  char *aI
4550: 64 78 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 57  dxUsed,     /* W
4560: 68 69 63 68 20 69 6e 64 69 63 65 73 20 61 72 65  hich indices are
4570: 20 75 73 65 64 2e 20 20 4e 55 4c 4c 20 6d 65 61   used.  NULL mea
4580: 6e 73 20 61 6c 6c 20 61 72 65 20 75 73 65 64 20  ns all are used 
4590: 2a 2f 0a 20 20 69 6e 74 20 72 65 63 6e 6f 43 68  */.  int recnoCh
45a0: 6e 67 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ng,      /* True
45b0: 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e   if the record n
45c0: 75 6d 62 65 72 20 77 69 6c 6c 20 63 68 61 6e 67  umber will chang
45d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70 64  e */.  int isUpd
45e0: 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ate,       /* Tr
45f0: 75 65 20 66 6f 72 20 55 50 44 41 54 45 2c 20 46  ue for UPDATE, F
4600: 61 6c 73 65 20 66 6f 72 20 49 4e 53 45 52 54 20  alse for INSERT 
4610: 2a 2f 0a 20 20 69 6e 74 20 6f 76 65 72 72 69 64  */.  int overrid
4620: 65 45 72 72 6f 72 2c 20 20 2f 2a 20 4f 76 65 72  eError,  /* Over
4630: 72 69 64 65 20 6f 6e 45 72 72 6f 72 20 74 6f 20  ride onError to 
4640: 74 68 69 73 20 69 66 20 6e 6f 74 20 4f 45 5f 44  this if not OE_D
4650: 65 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20  efault */.  int 
4660: 69 67 6e 6f 72 65 44 65 73 74 20 20 20 20 20 20  ignoreDest      
4670: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
4680: 6c 61 62 65 6c 20 6f 6e 20 61 6e 20 4f 45 5f 49  label on an OE_I
4690: 67 6e 6f 72 65 20 72 65 73 6f 6c 75 74 69 6f 6e  gnore resolution
46a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
46b0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
46c0: 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6f 6e 45   nCol;.  int onE
46d0: 72 72 6f 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  rror;.  int addr
46e0: 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 3b 0a 20  ;.  int extra;. 
46f0: 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 49 6e 64   int iCur;.  Ind
4700: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
4710: 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 30 3b  seenReplace = 0;
4720: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 31  .  int jumpInst1
4730: 2c 20 6a 75 6d 70 49 6e 73 74 32 3b 0a 20 20 69  , jumpInst2;.  i
4740: 6e 74 20 63 6f 6e 74 41 64 64 72 3b 0a 20 20 69  nt contAddr;.  i
4750: 6e 74 20 68 61 73 54 77 6f 52 65 63 6e 6f 73 20  nt hasTwoRecnos 
4760: 3d 20 28 69 73 55 70 64 61 74 65 20 26 26 20 72  = (isUpdate && r
4770: 65 63 6e 6f 43 68 6e 67 29 3b 0a 0a 20 20 76 20  ecnoChng);..  v 
4780: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
4790: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
47a0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
47b0: 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65 6c 65  ert( pTab->pSele
47c0: 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 68 69  ct==0 );  /* Thi
47d0: 73 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  s table is not a
47e0: 20 56 49 45 57 20 2a 2f 0a 20 20 6e 43 6f 6c 20   VIEW */.  nCol 
47f0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 0a 20  = pTab->nCol;.. 
4800: 20 2f 2a 20 54 65 73 74 20 61 6c 6c 20 4e 4f 54   /* Test all NOT
4810: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4820: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
4830: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
4840: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 54 61 62  .    if( i==pTab
4850: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
4860: 20 2f 2a 20 46 69 78 20 6d 65 3a 20 4d 61 6b 65   /* Fix me: Make
4870: 20 73 75 72 65 20 74 68 65 20 49 4e 54 45 47 45   sure the INTEGE
4880: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  R PRIMARY KEY is
4890: 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20   not NULL. */.  
48a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
48b0: 20 20 7d 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20    }.    onError 
48c0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  = pTab->aCol[i].
48d0: 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 69 66 28  notNull;.    if(
48e0: 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
48f0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
4900: 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72    if( overrideEr
4910: 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror!=OE_Default 
4920: 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  ){.      onError
4930: 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72   = overrideError
4940: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4950: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
4960: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
4970: 72 72 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 64  rror = pParse->d
4980: 62 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  b->onError;.    
4990: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
49a0: 45 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72  E_Default ) onEr
49b0: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
49c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6e      }.    if( on
49d0: 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
49e0: 65 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  e && pTab->aCol[
49f0: 69 5d 2e 7a 44 66 6c 74 3d 3d 30 20 29 7b 0a 20  i].zDflt==0 ){. 
4a00: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
4a10: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  E_Abort;.    }. 
4a20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4a30: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 43  Op(v, OP_Dup, nC
4a40: 6f 6c 2d 31 2d 69 2c 20 31 29 3b 0a 20 20 20 20  ol-1-i, 1);.    
4a50: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
4a60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
4a70: 4e 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Null, 1, 0);.   
4a80: 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f 72   switch( onError
4a90: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
4aa0: 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  E_Rollback:.    
4ab0: 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a    case OE_Abort:
4ac0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46  .      case OE_F
4ad0: 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ail: {.        s
4ae0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4af0: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
4b00: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e  E_CONSTRAINT, on
4b10: 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  Error);.        
4b20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4b30: 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e       case OE_Ign
4b40: 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ore: {.        s
4b50: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4b60: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 2b 31  , OP_Pop, nCol+1
4b70: 2b 68 61 73 54 77 6f 52 65 63 6e 6f 73 2c 20 30  +hasTwoRecnos, 0
4b80: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4b90: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4ba0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65  _Goto, 0, ignore
4bb0: 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Dest);.        b
4bc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4bd0: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c      case OE_Repl
4be0: 61 63 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ace: {.        s
4bf0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4c00: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
4c10: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
4c20: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4c30: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
4c40: 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54  [i].zDflt, P3_ST
4c50: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73  ATIC);.        s
4c60: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4c70: 2c 20 4f 50 5f 50 75 73 68 2c 20 6e 43 6f 6c 2d  , OP_Push, nCol-
4c80: 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  i, 0);.        b
4c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4ca0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
4cb0: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
4cc0: 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e    sqliteVdbeChan
4cd0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 73 71  geP2(v, addr, sq
4ce0: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
4cf0: 64 64 72 28 76 29 29 3b 0a 20 20 7d 0a 0a 20 20  ddr(v));.  }..  
4d00: 2f 2a 20 54 65 73 74 20 61 6c 6c 20 43 48 45 43  /* Test all CHEC
4d10: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  K constraints.  
4d20: 2a 2f 0a 20 20 2f 2a 2a 2a 2a 20 54 42 44 20 2a  */.  /**** TBD *
4d30: 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ***/..  /* If we
4d40: 20 68 61 76 65 20 61 6e 20 49 4e 54 45 47 45 52   have an INTEGER
4d50: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 6d 61   PRIMARY KEY, ma
4d60: 6b 65 20 73 75 72 65 20 74 68 65 20 70 72 69 6d  ke sure the prim
4d70: 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 66 20  ary key.  ** of 
4d80: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 64  the new record d
4d90: 6f 65 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73  oes not previous
4da0: 6c 79 20 65 78 69 73 74 2e 20 20 45 78 63 65 70  ly exist.  Excep
4db0: 74 2c 20 69 66 20 74 68 69 73 0a 20 20 2a 2a 20  t, if this.  ** 
4dc0: 69 73 20 61 6e 20 55 50 44 41 54 45 20 61 6e 64  is an UPDATE and
4dd0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
4de0: 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 69 6e 67   is not changing
4df0: 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 0a 20 20  , that is OK..  
4e00: 2a 2a 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  ** Also, if the 
4e10: 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
4e20: 69 6f 6e 20 70 6f 6c 69 63 79 20 69 73 20 52 45  ion policy is RE
4e30: 50 4c 41 43 45 2c 20 74 68 65 6e 20 77 65 0a 20  PLACE, then we. 
4e40: 20 2a 2a 20 63 61 6e 20 73 6b 69 70 20 74 68 69   ** can skip thi
4e50: 73 20 74 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  s test..  */.  i
4e60: 66 28 20 28 72 65 63 6e 6f 43 68 6e 67 20 7c 7c  f( (recnoChng ||
4e70: 20 21 69 73 55 70 64 61 74 65 29 20 26 26 20 70   !isUpdate) && p
4e80: 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
4e90: 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70  .    onError = p
4ea0: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20 20  Tab->keyConf;.  
4eb0: 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45 72    if( overrideEr
4ec0: 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror!=OE_Default 
4ed0: 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72  ){.      onError
4ee0: 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72   = overrideError
4ef0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4f00: 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
4f10: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
4f20: 72 72 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 64  rror = pParse->d
4f30: 62 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  b->onError;.    
4f40: 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
4f50: 45 5f 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72  E_Default ) onEr
4f60: 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ror = OE_Abort;.
4f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 6e      }.    if( on
4f80: 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
4f90: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  e ){.      if( i
4fa0: 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  sUpdate ){.     
4fb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4fc0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 43  Op(v, OP_Dup, nC
4fd0: 6f 6c 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  ol+1, 1);.      
4fe0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4ff0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 43 6f  p(v, OP_Dup, nCo
5000: 6c 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  l+1, 1);.       
5010: 20 6a 75 6d 70 49 6e 73 74 31 20 3d 20 73 71 6c   jumpInst1 = sql
5020: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
5030: 4f 50 5f 45 71 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Eq, 0, 0);.  
5040: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5050: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5060: 50 5f 44 75 70 2c 20 6e 43 6f 6c 2c 20 31 29 3b  P_Dup, nCol, 1);
5070: 0a 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 32  .      jumpInst2
5080: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
5090: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  Op(v, OP_NotExis
50a0: 74 73 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  ts, base, 0);.  
50b0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72      switch( onEr
50c0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ror ){.        c
50d0: 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a  ase OE_Rollback:
50e0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
50f0: 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 20 20  _Abort:.        
5100: 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a  case OE_Fail: {.
5110: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5120: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5130: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  Halt, SQLITE_CON
5140: 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72  STRAINT, onError
5150: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5160: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5170: 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 49 67        case OE_Ig
5180: 6e 6f 72 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  nore: {.        
5190: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
51a0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
51b0: 6c 2b 31 2b 68 61 73 54 77 6f 52 65 63 6e 6f 73  l+1+hasTwoRecnos
51c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
51d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
51e0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
51f0: 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20 20  gnoreDest);.    
5200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
5220: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 30  efault: assert(0
5230: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5240: 20 63 6f 6e 74 41 64 64 72 20 3d 20 73 71 6c 69   contAddr = sqli
5250: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
5260: 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
5270: 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  teVdbeChangeP2(v
5280: 2c 20 6a 75 6d 70 49 6e 73 74 32 2c 20 63 6f 6e  , jumpInst2, con
5290: 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 69 66  tAddr);.      if
52a0: 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20  ( isUpdate ){.  
52b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
52c0: 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70  ChangeP2(v, jump
52d0: 49 6e 73 74 31 2c 20 63 6f 6e 74 41 64 64 72 29  Inst1, contAddr)
52e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
52f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5300: 44 75 70 2c 20 6e 43 6f 6c 2b 31 2c 20 31 29 3b  Dup, nCol+1, 1);
5310: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
5320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
5330: 6f 76 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b  oveTo, base, 0);
5340: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5350: 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c   }..  /* Test al
5360: 6c 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  l UNIQUE constra
5370: 69 6e 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  ints by creating
5380: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
5390: 68 20 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e  h UNIQUE.  ** in
53a0: 64 65 78 20 61 6e 64 20 6d 61 6b 69 6e 67 20 73  dex and making s
53b0: 75 72 65 20 74 68 61 74 20 64 75 70 6c 69 63 61  ure that duplica
53c0: 74 65 20 65 6e 74 72 69 65 73 20 64 6f 20 6e 6f  te entries do no
53d0: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
53e0: 0a 20 20 2a 2a 20 41 64 64 20 74 68 65 20 6e 65  .  ** Add the ne
53f0: 77 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  w records to the
5400: 20 69 6e 64 69 63 65 73 20 61 73 20 77 65 20 67   indices as we g
5410: 6f 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 20  o..  */.  extra 
5420: 3d 20 30 3b 0a 20 20 66 6f 72 28 65 78 74 72 61  = 0;.  for(extra
5430: 3d 28 2d 31 29 2c 20 69 43 75 72 3d 30 2c 20 70  =(-1), iCur=0, p
5440: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
5450: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
5460: 78 2d 3e 70 4e 65 78 74 2c 20 69 43 75 72 2b 2b  x->pNext, iCur++
5470: 29 7b 0a 20 20 20 20 69 66 28 20 61 49 64 78 55  ){.    if( aIdxU
5480: 73 65 64 20 26 26 20 61 49 64 78 55 73 65 64 5b  sed && aIdxUsed[
5490: 69 43 75 72 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  iCur]==0 ) conti
54a0: 6e 75 65 3b 0a 20 20 20 20 65 78 74 72 61 2b 2b  nue;.    extra++
54b0: 3b 20 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65  ;    .    sqlite
54c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
54d0: 44 75 70 2c 20 6e 43 6f 6c 2b 65 78 74 72 61 2c  Dup, nCol+extra,
54e0: 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   1);.    for(i=0
54f0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
5500: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
5510: 6e 74 20 69 64 78 20 3d 20 70 49 64 78 2d 3e 61  nt idx = pIdx->a
5520: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
5530: 20 20 69 66 28 20 69 64 78 3d 3d 70 54 61 62 2d    if( idx==pTab-
5540: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
5550: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5560: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 69 2b 65  p(v, OP_Dup, i+e
5570: 78 74 72 61 2b 6e 43 6f 6c 2b 31 2c 20 31 29 3b  xtra+nCol+1, 1);
5580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5590: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
55a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
55b0: 20 69 2b 65 78 74 72 61 2b 6e 43 6f 6c 2d 69 64   i+extra+nCol-id
55c0: 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  x, 1);.      }. 
55d0: 20 20 20 7d 0a 20 20 20 20 6a 75 6d 70 49 6e 73     }.    jumpIns
55e0: 74 31 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  t1 = sqliteVdbeA
55f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 49  ddOp(v, OP_MakeI
5600: 64 78 4b 65 79 2c 20 70 49 64 78 2d 3e 6e 43 6f  dxKey, pIdx->nCo
5610: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 6f 6e  lumn, 0);.    on
5620: 45 72 72 6f 72 20 3d 20 70 49 64 78 2d 3e 6f 6e  Error = pIdx->on
5630: 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 6f  Error;.    if( o
5640: 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
5650: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5660: 69 66 28 20 6f 76 65 72 72 69 64 65 45 72 72 6f  if( overrideErro
5670: 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r!=OE_Default ){
5680: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
5690: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3b 0a   overrideError;.
56a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
56b0: 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
56c0: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
56d0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  or = pParse->db-
56e0: 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  >onError;.      
56f0: 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
5700: 44 65 66 61 75 6c 74 20 29 20 6f 6e 45 72 72 6f  Default ) onErro
5710: 72 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  r = OE_Abort;.  
5720: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64    }.    sqliteVd
5730: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
5740: 70 2c 20 65 78 74 72 61 2b 6e 43 6f 6c 2b 31 2b  p, extra+nCol+1+
5750: 68 61 73 54 77 6f 52 65 63 6e 6f 73 2c 20 31 29  hasTwoRecnos, 1)
5760: 3b 0a 20 20 20 20 6a 75 6d 70 49 6e 73 74 32 20  ;.    jumpInst2 
5770: 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f  = sqliteVdbeAddO
5780: 70 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  p(v, OP_IsUnique
5790: 2c 20 62 61 73 65 2b 69 43 75 72 2b 31 2c 20 30  , base+iCur+1, 0
57a0: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
57b0: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
57c0: 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b  case OE_Rollback
57d0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  :.      case OE_
57e0: 41 62 6f 72 74 3a 0a 20 20 20 20 20 20 63 61 73  Abort:.      cas
57f0: 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a 20 20 20  e OE_Fail: {.   
5800: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5810: 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  ddOp(v, OP_Halt,
5820: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
5830: 4e 54 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a 20 20  NT, onError);.  
5840: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5850: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5860: 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b 0a 20 20 20  OE_Ignore: {.   
5870: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65       assert( see
5880: 6e 52 65 70 6c 61 63 65 3d 3d 30 20 29 3b 0a 20  nReplace==0 );. 
5890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
58a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
58b0: 2c 20 6e 43 6f 6c 2b 65 78 74 72 61 2b 33 2b 68  , nCol+extra+3+h
58c0: 61 73 54 77 6f 52 65 63 6e 6f 73 2c 20 30 29 3b  asTwoRecnos, 0);
58d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
58e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
58f0: 6f 74 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65  oto, 0, ignoreDe
5900: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  st);.        bre
5910: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5920: 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63    case OE_Replac
5930: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e: {.        sql
5940: 69 74 65 47 65 6e 65 72 61 74 65 52 6f 77 44 65  iteGenerateRowDe
5950: 6c 65 74 65 28 76 2c 20 70 54 61 62 2c 20 62 61  lete(v, pTab, ba
5960: 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  se, 0);.        
5970: 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b 0a  if( isUpdate ){.
5980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5990: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
59a0: 44 75 70 2c 20 6e 43 6f 6c 2b 65 78 74 72 61 2b  Dup, nCol+extra+
59b0: 31 2b 68 61 73 54 77 6f 52 65 63 6e 6f 73 2c 20  1+hasTwoRecnos, 
59c0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
59d0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
59e0: 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20 62 61 73 65   OP_MoveTo, base
59f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
5a00: 20 20 20 20 20 20 20 20 73 65 65 6e 52 65 70 6c          seenRepl
5a10: 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
5a20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5a30: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61        default: a
5a40: 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
5a50: 20 20 20 20 63 6f 6e 74 41 64 64 72 20 3d 20 73      contAddr = s
5a60: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
5a70: 41 64 64 72 28 76 29 3b 0a 23 69 66 20 4e 55 4c  Addr(v);.#if NUL
5a80: 4c 5f 44 49 53 54 49 4e 43 54 5f 46 4f 52 5f 55  L_DISTINCT_FOR_U
5a90: 4e 49 51 55 45 0a 20 20 20 20 73 71 6c 69 74 65  NIQUE.    sqlite
5aa0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
5ab0: 6a 75 6d 70 49 6e 73 74 31 2c 20 63 6f 6e 74 41  jumpInst1, contA
5ac0: 64 64 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ddr);.#endif.   
5ad0: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
5ae0: 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 32  eP2(v, jumpInst2
5af0: 2c 20 63 6f 6e 74 41 64 64 72 29 3b 0a 20 20 7d  , contAddr);.  }
5b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5b10: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
5b20: 20 63 6f 64 65 20 74 6f 20 66 69 6e 69 73 68 20   code to finish 
5b30: 74 68 65 20 49 4e 53 45 52 54 20 6f 72 20 55 50  the INSERT or UP
5b40: 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  DATE operation.*
5b50: 2a 20 74 68 61 74 20 77 61 73 20 73 74 61 72 74  * that was start
5b60: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
5b70: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 47 65 6e 65  ll to sqliteGene
5b80: 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68  rateConstraintCh
5b90: 65 63 6b 73 2e 0a 2a 2a 20 54 68 65 20 73 74 61  ecks..** The sta
5ba0: 63 6b 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  ck must contain 
5bb0: 6b 65 79 73 20 66 6f 72 20 61 6c 6c 20 61 63 74  keys for all act
5bc0: 69 76 65 20 69 6e 64 69 63 65 73 20 66 6f 6c 6c  ive indices foll
5bd0: 6f 77 65 64 20 62 79 20 64 61 74 61 0a 2a 2a 20  owed by data.** 
5be0: 61 6e 64 20 74 68 65 20 72 65 63 6e 6f 20 66 6f  and the recno fo
5bf0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e  r the new entry.
5c00: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63    This routine c
5c10: 72 65 61 74 65 73 20 74 68 65 20 6e 65 77 0a 2a  reates the new.*
5c20: 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6c 6c  * entries in all
5c30: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 69 6e 20   indices and in 
5c40: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
5c50: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  **.** The argume
5c60: 6e 74 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  nts to this rout
5c70: 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 74 68  ine should be th
5c80: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 66 69  e same as the fi
5c90: 72 73 74 20 73 69 78 0a 2a 2a 20 61 72 67 75 6d  rst six.** argum
5ca0: 65 6e 74 73 20 74 6f 20 73 71 6c 69 74 65 47 65  ents to sqliteGe
5cb0: 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
5cc0: 43 68 65 63 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Checks..*/.void 
5cd0: 73 71 6c 69 74 65 43 6f 6d 70 6c 65 74 65 49 6e  sqliteCompleteIn
5ce0: 73 65 72 74 69 6f 6e 28 0a 20 20 50 61 72 73 65  sertion(.  Parse
5cf0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
5d00: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
5d10: 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
5d20: 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 2f 2a  *pTab,        /*
5d30: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20   the table into 
5d40: 77 68 69 63 68 20 77 65 20 61 72 65 20 69 6e 73  which we are ins
5d50: 65 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  erting */.  int 
5d60: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
5d70: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61 20 72 65  /* Index of a re
5d80: 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20  ad/write cursor 
5d90: 70 6f 69 6e 74 69 6e 67 20 61 74 20 70 54 61 62  pointing at pTab
5da0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 49 64 78   */.  char *aIdx
5db0: 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 57 68 69  Used,     /* Whi
5dc0: 63 68 20 69 6e 64 69 63 65 73 20 61 72 65 20 75  ch indices are u
5dd0: 73 65 64 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  sed.  NULL means
5de0: 20 61 6c 6c 20 61 72 65 20 75 73 65 64 20 2a 2f   all are used */
5df0: 0a 20 20 69 6e 74 20 72 65 63 6e 6f 43 68 6e 67  .  int recnoChng
5e00: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
5e10: 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  f the record num
5e20: 62 65 72 20 77 69 6c 6c 20 63 68 61 6e 67 65 20  ber will change 
5e30: 2a 2f 0a 20 20 69 6e 74 20 69 73 55 70 64 61 74  */.  int isUpdat
5e40: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
5e50: 20 66 6f 72 20 55 50 44 41 54 45 2c 20 46 61 6c   for UPDATE, Fal
5e60: 73 65 20 66 6f 72 20 49 4e 53 45 52 54 20 2a 2f  se for INSERT */
5e70: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  .){.  int i;.  V
5e80: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6e 49  dbe *v;.  int nI
5e90: 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  dx;.  Index *pId
5ea0: 78 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  x;..  v = sqlite
5eb0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
5ec0: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
5ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
5ee0: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
5ef0: 20 20 2f 2a 20 54 68 69 73 20 74 61 62 6c 65 20    /* This table 
5f00: 69 73 20 6e 6f 74 20 61 20 56 49 45 57 20 2a 2f  is not a VIEW */
5f10: 0a 20 20 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70  .  for(nIdx=0, p
5f20: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
5f30: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
5f40: 78 2d 3e 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b  x->pNext, nIdx++
5f50: 29 7b 7d 0a 20 20 66 6f 72 28 69 3d 6e 49 64 78  ){}.  for(i=nIdx
5f60: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
5f70: 20 20 20 20 69 66 28 20 61 49 64 78 55 73 65 64      if( aIdxUsed
5f80: 20 26 26 20 61 49 64 78 55 73 65 64 5b 69 5d 3d   && aIdxUsed[i]=
5f90: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5fa0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5fb0: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c  Op(v, OP_IdxPut,
5fc0: 20 62 61 73 65 2b 69 2b 31 2c 20 30 29 3b 0a 20   base+i+1, 0);. 
5fd0: 20 7d 0a 20 20 73 71 6c 69 74 65 56 64 62 65 41   }.  sqliteVdbeA
5fe0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
5ff0: 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f  ecord, pTab->nCo
6000: 6c 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 56  l, 0);.  sqliteV
6010: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6020: 75 74 49 6e 74 4b 65 79 2c 20 62 61 73 65 2c 20  utIntKey, base, 
6030: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
6040: 6b 3f 30 3a 31 29 3b 0a 20 20 69 66 28 20 69 73  k?0:1);.  if( is
6050: 55 70 64 61 74 65 20 26 26 20 72 65 63 6e 6f 43  Update && recnoC
6060: 68 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  hng ){.    sqlit
6070: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6080: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  _Pop, 1, 0);.  }
6090: 0a 7d 0a                                         .}.