/ Hex Artifact Content
Login

Artifact dc200ae04a36bd36e575272a069e20c528b7fbdf:


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 38 39 20  insert.c,v 1.89 
0200: 32 30 30 33 2f 30 38 2f 30 35 20 31 33 3a 31 33  2003/08/05 13:13
0210: 3a 33 38 20 64 72 68 20 45 78 70 20 24 0a 2a 2f  :38 drh Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  eInt.h"../*.** T
0240: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0250: 61 6c 6c 20 74 6f 20 68 61 6e 64 6c 65 20 53 51  all to handle SQ
0260: 4c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  L of the followi
0270: 6e 67 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  ng forms:.**.** 
0280: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 54     insert into T
0290: 41 42 4c 45 20 28 49 44 4c 49 53 54 29 20 76 61  ABLE (IDLIST) va
02a0: 6c 75 65 73 28 45 58 50 52 4c 49 53 54 29 0a 2a  lues(EXPRLIST).*
02b0: 2a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  *    insert into
02c0: 20 54 41 42 4c 45 20 28 49 44 4c 49 53 54 29 20   TABLE (IDLIST) 
02d0: 73 65 6c 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  select.**.** The
02e0: 20 49 44 4c 49 53 54 20 66 6f 6c 6c 6f 77 69 6e   IDLIST followin
02f0: 67 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  g the table name
0300: 20 69 73 20 61 6c 77 61 79 73 20 6f 70 74 69 6f   is always optio
0310: 6e 61 6c 2e 20 20 49 66 20 6f 6d 69 74 74 65 64  nal.  If omitted
0320: 2c 0a 2a 2a 20 74 68 65 6e 20 61 20 6c 69 73 74  ,.** then a list
0330: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
0340: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
0350: 20 73 75 62 73 74 69 74 75 74 65 64 2e 20 20 54   substituted.  T
0360: 68 65 20 49 44 4c 49 53 54 0a 2a 2a 20 61 70 70  he IDLIST.** app
0370: 65 61 72 73 20 69 6e 20 74 68 65 20 70 43 6f 6c  ears in the pCol
0380: 75 6d 6e 20 70 61 72 61 6d 65 74 65 72 2e 20 20  umn parameter.  
0390: 70 43 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 20  pColumn is NULL 
03a0: 69 66 20 49 44 4c 49 53 54 20 69 73 20 6f 6d 69  if IDLIST is omi
03b0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
03c0: 70 4c 69 73 74 20 70 61 72 61 6d 65 74 65 72 20  pList parameter 
03d0: 68 6f 6c 64 73 20 45 58 50 52 4c 49 53 54 20 69  holds EXPRLIST i
03e0: 6e 20 74 68 65 20 66 69 72 73 74 20 66 6f 72 6d  n the first form
03f0: 20 6f 66 20 74 68 65 20 49 4e 53 45 52 54 0a 2a   of the INSERT.*
0400: 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 76  * statement abov
0410: 65 2c 20 61 6e 64 20 70 53 65 6c 65 63 74 20 69  e, and pSelect i
0420: 73 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 74 68 65  s NULL.  For the
0430: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 2c 20 70 4c   second form, pL
0440: 69 73 74 20 69 73 0a 2a 2a 20 4e 55 4c 4c 20 61  ist is.** NULL a
0450: 6e 64 20 70 53 65 6c 65 63 74 20 69 73 20 61 20  nd pSelect is a 
0460: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
0470: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
0480: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
0490: 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65  .** data for the
04a0: 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 54   insert..**.** T
04b0: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
04c0: 64 20 66 6f 6c 6c 6f 77 73 20 6f 6e 65 20 6f 66  d follows one of
04d0: 20 74 68 72 65 65 20 74 65 6d 70 6c 61 74 65 73   three templates
04e0: 2e 20 20 46 6f 72 20 61 20 73 69 6d 70 6c 65 0a  .  For a simple.
04f0: 2a 2a 20 73 65 6c 65 63 74 20 77 69 74 68 20 64  ** select with d
0500: 61 74 61 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  ata coming from 
0510: 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2c  a VALUES clause,
0520: 20 74 68 65 20 63 6f 64 65 20 65 78 65 63 75 74   the code execut
0530: 65 73 0a 2a 2a 20 6f 6e 63 65 20 73 74 72 61 69  es.** once strai
0540: 67 68 74 20 64 6f 77 6e 20 74 68 72 6f 75 67 68  ght down through
0550: 2e 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  .  The template 
0560: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
0570: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  .**.**         o
0580: 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
0590: 20 74 6f 20 3c 74 61 62 6c 65 3e 20 61 6e 64 20   to <table> and 
05a0: 69 74 73 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20  its indices.**  
05b0: 20 20 20 20 20 20 20 70 75 74 73 20 56 41 4c 55         puts VALU
05c0: 45 53 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  ES clause expres
05d0: 73 69 6f 6e 73 20 6f 6e 74 6f 20 74 68 65 20 73  sions onto the s
05e0: 74 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20  tack.**         
05f0: 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
0600: 69 6e 67 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  ing record into 
0610: 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20 20 20 20  <table>.**      
0620: 20 20 20 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a     cleanup.**.**
0630: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
0640: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
0650: 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20  .**.**   INSERT 
0660: 49 4e 54 4f 20 3c 74 61 62 6c 65 3e 20 53 45 4c  INTO <table> SEL
0670: 45 43 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ECT ....**.** An
0680: 64 20 74 68 65 20 53 45 4c 45 43 54 20 63 6c 61  d the SELECT cla
0690: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 61  use does not rea
06a0: 64 20 66 72 6f 6d 20 3c 74 61 62 6c 65 3e 20 61  d from <table> a
06b0: 74 20 61 6e 79 20 74 69 6d 65 2c 20 74 68 65 6e  t any time, then
06c0: 0a 2a 2a 20 74 68 65 20 67 65 6e 65 72 61 74 65  .** the generate
06d0: 64 20 63 6f 64 65 20 66 6f 6c 6c 6f 77 73 20 74  d code follows t
06e0: 68 69 73 20 74 65 6d 70 6c 61 74 65 3a 0a 2a 2a  his template:.**
06f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f  .**         goto
0700: 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a 20 73 65   B.**      A: se
0710: 74 75 70 20 66 6f 72 20 74 68 65 20 53 45 4c 45  tup for the SELE
0720: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c 6f  CT.**         lo
0730: 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c  op over the tabl
0740: 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  es in the SELECT
0750: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 67 6f  .**           go
0760: 73 75 62 20 43 0a 2a 2a 20 20 20 20 20 20 20 20  sub C.**        
0770: 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20   end loop.**    
0780: 20 20 20 20 20 63 6c 65 61 6e 75 70 20 61 66 74       cleanup aft
0790: 65 72 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  er the SELECT.**
07a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 44 0a           goto D.
07b0: 2a 2a 20 20 20 20 20 20 42 3a 20 6f 70 65 6e 20  **      B: open 
07c0: 77 72 69 74 65 20 63 75 72 73 6f 72 20 74 6f 20  write cursor to 
07d0: 3c 74 61 62 6c 65 3e 20 61 6e 64 20 69 74 73 20  <table> and its 
07e0: 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20 20 20  indices.**      
07f0: 20 20 20 67 6f 74 6f 20 41 0a 2a 2a 20 20 20 20     goto A.**    
0800: 20 20 43 3a 20 69 6e 73 65 72 74 20 74 68 65 20    C: insert the 
0810: 73 65 6c 65 63 74 20 72 65 73 75 6c 74 20 69 6e  select result in
0820: 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a 2a 20 20 20  to <table>.**   
0830: 20 20 20 20 20 20 72 65 74 75 72 6e 0a 2a 2a 20        return.** 
0840: 20 20 20 20 20 44 3a 20 63 6c 65 61 6e 75 70 0a       D: cleanup.
0850: 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20  **.** The third 
0860: 74 65 6d 70 6c 61 74 65 20 69 73 20 75 73 65 64  template is used
0870: 20 69 66 20 74 68 65 20 69 6e 73 65 72 74 20 73   if the insert s
0880: 74 61 74 65 6d 65 6e 74 20 74 61 6b 65 73 20 69  tatement takes i
0890: 74 73 0a 2a 2a 20 76 61 6c 75 65 73 20 66 72 6f  ts.** values fro
08a0: 6d 20 61 20 53 45 4c 45 43 54 20 62 75 74 20 74  m a SELECT but t
08b0: 68 65 20 64 61 74 61 20 69 73 20 62 65 69 6e 67  he data is being
08c0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
08d0: 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20 69   table.** that i
08e0: 73 20 61 6c 73 6f 20 72 65 61 64 20 61 73 20 70  s also read as p
08f0: 61 72 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  art of the SELEC
0900: 54 2e 20 20 49 6e 20 74 68 65 20 74 68 69 72 64  T.  In the third
0910: 20 66 6f 72 6d 2c 0a 2a 2a 20 77 65 20 68 61 76   form,.** we hav
0920: 65 20 74 6f 20 75 73 65 20 61 20 69 6e 74 65 72  e to use a inter
0930: 6d 65 64 69 61 74 65 20 74 61 62 6c 65 20 74 6f  mediate table to
0940: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
0950: 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 6c  ts of.** the sel
0960: 65 63 74 2e 20 20 54 68 65 20 74 65 6d 70 6c 61  ect.  The templa
0970: 74 65 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  te is like this:
0980: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 67  .**.**         g
0990: 6f 74 6f 20 42 0a 2a 2a 20 20 20 20 20 20 41 3a  oto B.**      A:
09a0: 20 73 65 74 75 70 20 66 6f 72 20 74 68 65 20 53   setup for the S
09b0: 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
09c0: 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   loop over the t
09d0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 53 45 4c  ables in the SEL
09e0: 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
09f0: 20 67 6f 73 75 62 20 43 0a 2a 2a 20 20 20 20 20   gosub C.**     
0a00: 20 20 20 20 65 6e 64 20 6c 6f 6f 70 0a 2a 2a 20      end loop.** 
0a10: 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 20          cleanup 
0a20: 61 66 74 65 72 20 74 68 65 20 53 45 4c 45 43 54  after the SELECT
0a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 67 6f 74 6f  .**         goto
0a40: 20 44 0a 2a 2a 20 20 20 20 20 20 43 3a 20 69 6e   D.**      C: in
0a50: 73 65 72 74 20 74 68 65 20 73 65 6c 65 63 74 20  sert the select 
0a60: 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68 65 20  result into the 
0a70: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62  intermediate tab
0a80: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  le.**         re
0a90: 74 75 72 6e 0a 2a 2a 20 20 20 20 20 20 42 3a 20  turn.**      B: 
0aa0: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 74 6f  open a cursor to
0ab0: 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
0ac0: 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
0ad0: 20 20 67 6f 74 6f 20 41 0a 2a 2a 20 20 20 20 20    goto A.**     
0ae0: 20 44 3a 20 6f 70 65 6e 20 77 72 69 74 65 20 63   D: open write c
0af0: 75 72 73 6f 72 20 74 6f 20 3c 74 61 62 6c 65 3e  ursor to <table>
0b00: 20 61 6e 64 20 69 74 73 20 69 6e 64 69 63 65 73   and its indices
0b10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c 6f 6f 70  .**         loop
0b20: 20 6f 76 65 72 20 74 68 65 20 69 6e 74 65 72 6d   over the interm
0b30: 65 64 69 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  ediate table.** 
0b40: 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 66            transf
0b50: 65 72 20 76 61 6c 75 65 73 20 66 6f 72 6d 20 69  er values form i
0b60: 6e 74 65 72 6d 65 64 69 61 74 65 20 74 61 62 6c  ntermediate tabl
0b70: 65 20 69 6e 74 6f 20 3c 74 61 62 6c 65 3e 0a 2a  e into <table>.*
0b80: 2a 20 20 20 20 20 20 20 20 20 65 6e 64 20 74 68  *         end th
0b90: 65 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 20 20 20  e loop.**       
0ba0: 20 20 63 6c 65 61 6e 75 70 0a 2a 2f 0a 76 6f 69    cleanup.*/.voi
0bb0: 64 20 73 71 6c 69 74 65 49 6e 73 65 72 74 28 0a  d sqliteInsert(.
0bc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0bd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
0be0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
0bf0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
0c00: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ,    /* Name of 
0c10: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68  table into which
0c20: 20 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e   we are insertin
0c30: 67 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  g */.  ExprList 
0c40: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pList,      /* 
0c50: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74  List of values t
0c60: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f  o be inserted */
0c70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
0c80: 63 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 53 45  ct,      /* A SE
0c90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
0ca0: 6f 20 75 73 65 20 61 73 20 74 68 65 20 64 61 74  o use as the dat
0cb0: 61 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 49 64  a source */.  Id
0cc0: 4c 69 73 74 20 2a 70 43 6f 6c 75 6d 6e 2c 20 20  List *pColumn,  
0cd0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
0ce0: 6d 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  mes correspondin
0cf0: 67 20 74 6f 20 49 44 4c 49 53 54 2e 20 2a 2f 0a  g to IDLIST. */.
0d00: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 20 20 20    int onError   
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
0d20: 6f 20 68 61 6e 64 6c 65 20 63 6f 6e 73 74 72 61  o handle constra
0d30: 69 6e 74 20 65 72 72 6f 72 73 20 2a 2f 0a 29 7b  int errors */.){
0d40: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
0d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0d60: 74 61 62 6c 65 20 74 6f 20 69 6e 73 65 72 74 20  table to insert 
0d70: 69 6e 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a  into */.  char *
0d80: 7a 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  zTab;           
0d90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0da0: 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
0db0: 77 65 20 61 72 65 20 69 6e 73 65 72 74 69 6e 67  we are inserting
0dc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0dd0: 20 2a 7a 44 62 3b 20 20 20 20 20 20 2f 2a 20 4e   *zDb;      /* N
0de0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0df0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 69 73  ase holding this
0e00: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
0e10: 69 2c 20 6a 2c 20 69 64 78 3b 20 20 20 20 20 20  i, j, idx;      
0e20: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
0e30: 72 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  rs */.  Vdbe *v;
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0e50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
0e60: 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
0e70: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 49 6e   machine */.  In
0e80: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
0e90: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
0ea0: 6e 67 20 6f 76 65 72 20 69 6e 64 69 63 65 73 20  ng over indices 
0eb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
0ec0: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
0ed0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0ee0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
0ef0: 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  the data */.  in
0f00: 74 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20  t base;         
0f10: 20 20 20 20 2f 2a 20 56 44 42 45 20 43 75 72 73      /* VDBE Curs
0f20: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54  or number for pT
0f30: 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ab */.  int iCon
0f40: 74 2c 20 69 42 72 65 61 6b 3b 20 20 20 20 2f 2a  t, iBreak;    /*
0f50: 20 42 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65   Beginning and e
0f60: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6f  nd of the loop o
0f70: 76 65 72 20 73 72 63 54 61 62 20 2a 2f 0a 20 20  ver srcTab */.  
0f80: 73 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20  sqlite *db;     
0f90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
0fa0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
0fb0: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6b 65  ture */.  int ke
0fc0: 79 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  yColumn = -1;   
0fd0: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20 69  /* Column that i
0fe0: 73 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  s the INTEGER PR
0ff0: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 69  IMARY KEY */.  i
1000: 6e 74 20 65 6e 64 4f 66 4c 6f 6f 70 3b 20 20 20  nt endOfLoop;   
1010: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
1020: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
1030: 20 69 6e 73 65 72 74 69 6f 6e 20 6c 6f 6f 70 20   insertion loop 
1040: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 54 65 6d 70  */.  int useTemp
1050: 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 53 74  Table;     /* St
1060: 6f 72 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c  ore SELECT resul
1070: 74 73 20 69 6e 20 69 6e 74 65 72 6d 65 64 69 61  ts in intermedia
1080: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  te table */.  in
1090: 74 20 73 72 63 54 61 62 3b 20 20 20 20 20 20 20  t srcTab;       
10a0: 20 20 20 20 2f 2a 20 44 61 74 61 20 63 6f 6d 65      /* Data come
10b0: 73 20 66 72 6f 6d 20 74 68 69 73 20 74 65 6d 70  s from this temp
10c0: 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 66 20  orary cursor if 
10d0: 3e 3d 30 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  >=0 */.  int iSe
10e0: 6c 65 63 74 4c 6f 6f 70 3b 20 20 20 20 20 20 2f  lectLoop;      /
10f0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 63 6f 64  * Address of cod
1100: 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  e that implement
1110: 73 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a  s the SELECT */.
1120: 20 20 69 6e 74 20 69 43 6c 65 61 6e 75 70 3b 20    int iCleanup; 
1130: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1140: 73 73 20 6f 66 20 74 68 65 20 63 6c 65 61 6e 75  ss of the cleanu
1150: 70 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  p code */.  int 
1160: 69 49 6e 73 65 72 74 42 6c 6f 63 6b 3b 20 20 20  iInsertBlock;   
1170: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1180: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 75  the subroutine u
1190: 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 64 61  sed to insert da
11a0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6e 74  ta */.  int iCnt
11b0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
11c0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 75 73 65   Memory cell use
11d0: 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 63 6f  d for the row co
11e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
11f0: 73 56 69 65 77 3b 20 20 20 20 20 20 20 20 20 20  sView;          
1200: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 74 74 65   /* True if atte
1210: 6d 70 74 69 6e 67 20 74 6f 20 69 6e 73 65 72 74  mpting to insert
1220: 20 69 6e 74 6f 20 61 20 76 69 65 77 20 2a 2f 0a   into a view */.
1230: 0a 20 20 69 6e 74 20 72 6f 77 5f 74 72 69 67 67  .  int row_trigg
1240: 65 72 73 5f 65 78 69 73 74 20 3d 20 30 3b 20 2f  ers_exist = 0; /
1250: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
1260: 61 72 65 20 46 4f 52 20 45 41 43 48 20 52 4f 57  are FOR EACH ROW
1270: 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69   triggers */.  i
1280: 6e 74 20 62 65 66 6f 72 65 5f 74 72 69 67 67 65  nt before_trigge
1290: 72 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  rs;        /* Tr
12a0: 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ue if there are 
12b0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 20  BEFORE triggers 
12c0: 2a 2f 0a 20 20 69 6e 74 20 61 66 74 65 72 5f 74  */.  int after_t
12d0: 72 69 67 67 65 72 73 3b 20 20 20 20 20 20 20 20  riggers;        
12e0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
12f0: 65 20 61 72 65 20 41 46 54 45 52 20 74 72 69 67  e are AFTER trig
1300: 67 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  gers */.  int ne
1310: 77 49 64 78 20 3d 20 2d 31 3b 20 20 20 20 20 20  wIdx = -1;      
1320: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1330: 66 6f 72 20 74 68 65 20 4e 45 57 20 74 61 62 6c  for the NEW tabl
1340: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72  e */..  if( pPar
1350: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
1360: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
1370: 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63   ) goto insert_c
1380: 6c 65 61 6e 75 70 3b 0a 20 20 64 62 20 3d 20 70  leanup;.  db = p
1390: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
13a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
13b0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
13c0: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
13d0: 67 20 6e 65 77 20 69 6e 66 6f 72 6d 61 74 69 6f  g new informatio
13e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
13f0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
1400: 3d 3d 31 20 29 3b 0a 20 20 7a 54 61 62 20 3d 20  ==1 );.  zTab = 
1410: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a  pTabList->a[0].z
1420: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 54 61 62  Name;.  if( zTab
1430: 3d 3d 30 20 29 20 67 6f 74 6f 20 69 6e 73 65 72  ==0 ) goto inser
1440: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 70 54 61  t_cleanup;.  pTa
1450: 62 20 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73  b = sqliteSrcLis
1460: 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
1470: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28  pTabList);.  if(
1480: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
1490: 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61  goto insert_clea
14a0: 6e 75 70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  nup;.  }.  asser
14b0: 74 28 20 70 54 61 62 2d 3e 69 44 62 3c 64 62 2d  t( pTab->iDb<db-
14c0: 3e 6e 44 62 20 29 3b 0a 20 20 7a 44 62 20 3d 20  >nDb );.  zDb = 
14d0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
14e0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  b].zName;.  if( 
14f0: 73 71 6c 69 74 65 41 75 74 68 43 68 65 63 6b 28  sqliteAuthCheck(
1500: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
1510: 4e 53 45 52 54 2c 20 70 54 61 62 2d 3e 7a 4e 61  NSERT, pTab->zNa
1520: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
1530: 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63     goto insert_c
1540: 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  leanup;.  }..  /
1550: 2a 20 45 6e 73 75 72 65 20 74 68 61 74 3a 0a 20  * Ensure that:. 
1560: 20 2a 20 20 28 61 29 20 74 68 65 20 74 61 62 6c   *  (a) the tabl
1570: 65 20 69 73 20 6e 6f 74 20 72 65 61 64 2d 6f 6e  e is not read-on
1580: 6c 79 2c 20 0a 20 20 2a 20 20 28 62 29 20 74 68  ly, .  *  (b) th
1590: 61 74 20 69 66 20 69 74 20 69 73 20 61 20 76 69  at if it is a vi
15a0: 65 77 20 74 68 65 6e 20 4f 4e 20 49 4e 53 45 52  ew then ON INSER
15b0: 54 20 74 72 69 67 67 65 72 73 20 65 78 69 73 74  T triggers exist
15c0: 0a 20 20 2a 2f 0a 20 20 62 65 66 6f 72 65 5f 74  .  */.  before_t
15d0: 72 69 67 67 65 72 73 20 3d 20 73 71 6c 69 74 65  riggers = sqlite
15e0: 54 72 69 67 67 65 72 73 45 78 69 73 74 28 70 50  TriggersExist(pP
15f0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 54 72 69  arse, pTab->pTri
1600: 67 67 65 72 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  gger, TK_INSERT,
1610: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 54 4b 5f 42 45 46 4f           TK_BEFO
1640: 52 45 2c 20 54 4b 5f 52 4f 57 2c 20 30 29 3b 0a  RE, TK_ROW, 0);.
1650: 20 20 61 66 74 65 72 5f 74 72 69 67 67 65 72 73    after_triggers
1660: 20 3d 20 73 71 6c 69 74 65 54 72 69 67 67 65 72   = sqliteTrigger
1670: 73 45 78 69 73 74 28 70 50 61 72 73 65 2c 20 70  sExist(pParse, p
1680: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 2c 20 54  Tab->pTrigger, T
1690: 4b 5f 49 4e 53 45 52 54 2c 0a 20 20 20 20 20 20  K_INSERT,.      
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 54 4b 5f 41 46 54 45 52 2c 20 54 4b 5f 52 4f   TK_AFTER, TK_RO
16d0: 57 2c 20 30 29 3b 0a 20 20 72 6f 77 5f 74 72 69  W, 0);.  row_tri
16e0: 67 67 65 72 73 5f 65 78 69 73 74 20 3d 20 62 65  ggers_exist = be
16f0: 66 6f 72 65 5f 74 72 69 67 67 65 72 73 20 7c 7c  fore_triggers ||
1700: 20 61 66 74 65 72 5f 74 72 69 67 67 65 72 73 3b   after_triggers;
1710: 0a 20 20 69 73 56 69 65 77 20 3d 20 70 54 61 62  .  isView = pTab
1720: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 3b 0a 20 20  ->pSelect!=0;.  
1730: 69 66 28 20 73 71 6c 69 74 65 49 73 52 65 61 64  if( sqliteIsRead
1740: 4f 6e 6c 79 28 70 50 61 72 73 65 2c 20 70 54 61  Only(pParse, pTa
1750: 62 2c 20 62 65 66 6f 72 65 5f 74 72 69 67 67 65  b, before_trigge
1760: 72 73 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  rs) ){.    goto 
1770: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
1780: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 3d 3d    }.  if( pTab==
1790: 30 20 29 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f  0 ) goto insert_
17a0: 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 20 49  cleanup;..  /* I
17b0: 66 20 70 54 61 62 20 69 73 20 72 65 61 6c 6c 79  f pTab is really
17c0: 20 61 20 76 69 65 77 2c 20 6d 61 6b 65 20 73 75   a view, make su
17d0: 72 65 20 69 74 20 68 61 73 20 62 65 65 6e 20 69  re it has been i
17e0: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
17f0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
1800: 20 73 71 6c 69 74 65 56 69 65 77 47 65 74 43 6f   sqliteViewGetCo
1810: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
1820: 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
1830: 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e  oto insert_clean
1840: 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  up;.  }..  /* Al
1850: 6c 6f 63 61 74 65 20 61 20 56 44 42 45 0a 20 20  locate a VDBE.  
1860: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47  */.  v = sqliteG
1870: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1880: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1890: 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70  o insert_cleanup
18a0: 3b 0a 20 20 73 71 6c 69 74 65 42 65 67 69 6e 57  ;.  sqliteBeginW
18b0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
18c0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 20 7c 7c  arse, pSelect ||
18d0: 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f 65 78   row_triggers_ex
18e0: 69 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  ist, pTab->iDb);
18f0: 0a 0a 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20  ..  /* if there 
1900: 61 72 65 20 72 6f 77 20 74 72 69 67 67 65 72 73  are row triggers
1910: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  , allocate a tem
1920: 70 20 74 61 62 6c 65 20 66 6f 72 20 6e 65 77 2e  p table for new.
1930: 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 2a 2f  * references. */
1940: 0a 20 20 69 66 28 20 72 6f 77 5f 74 72 69 67 67  .  if( row_trigg
1950: 65 72 73 5f 65 78 69 73 74 20 29 7b 0a 20 20 20  ers_exist ){.   
1960: 20 6e 65 77 49 64 78 20 3d 20 70 50 61 72 73 65   newIdx = pParse
1970: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nTab++;.  }.. 
1980: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1990: 6f 77 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  ow many columns 
19a0: 6f 66 20 64 61 74 61 20 61 72 65 20 73 75 70 70  of data are supp
19b0: 6c 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  lied.  If the da
19c0: 74 61 0a 20 20 2a 2a 20 69 73 20 63 6f 6d 69 6e  ta.  ** is comin
19d0: 67 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20  g from a SELECT 
19e0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
19f0: 74 68 69 73 20 73 74 65 70 20 61 6c 73 6f 20 67  this step also g
1a00: 65 6e 65 72 61 74 65 73 0a 20 20 2a 2a 20 61 6c  enerates.  ** al
1a10: 6c 20 74 68 65 20 63 6f 64 65 20 74 6f 20 69 6d  l the code to im
1a20: 70 6c 65 6d 65 6e 74 20 74 68 65 20 53 45 4c 45  plement the SELE
1a30: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
1a40: 20 69 6e 76 6f 6b 65 20 61 20 73 75 62 72 6f 75   invoke a subrou
1a50: 74 69 6e 65 0a 20 20 2a 2a 20 74 6f 20 70 72 6f  tine.  ** to pro
1a60: 63 65 73 73 20 65 61 63 68 20 72 6f 77 20 6f 66  cess each row of
1a70: 20 74 68 65 20 72 65 73 75 6c 74 2e 20 28 54 65   the result. (Te
1a80: 6d 70 6c 61 74 65 20 32 2e 29 20 49 66 20 74 68  mplate 2.) If th
1a90: 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
1aa0: 61 74 65 6d 65 6e 74 20 75 73 65 73 20 74 68 65  atement uses the
1ab0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1ac0: 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
1ad0: 64 20 69 6e 74 6f 2c 20 74 68 65 6e 20 74 68 65  d into, then the
1ae0: 0a 20 20 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  .  ** subroutine
1af0: 20 69 73 20 61 6c 73 6f 20 63 6f 64 65 64 20 68   is also coded h
1b00: 65 72 65 2e 20 20 54 68 61 74 20 73 75 62 72 6f  ere.  That subro
1b10: 75 74 69 6e 65 20 73 74 6f 72 65 73 20 74 68 65  utine stores the
1b20: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 72 65 73   SELECT.  ** res
1b30: 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1b40: 61 72 79 20 74 61 62 6c 65 2e 20 28 54 65 6d 70  ary table. (Temp
1b50: 6c 61 74 65 20 33 2e 29 0a 20 20 2a 2f 0a 20 20  late 3.).  */.  
1b60: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
1b70: 20 20 20 2f 2a 20 44 61 74 61 20 69 73 20 63 6f     /* Data is co
1b80: 6d 69 6e 67 20 66 72 6f 6d 20 61 20 53 45 4c 45  ming from a SELE
1b90: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
1ba0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
1bb0: 74 68 61 74 20 53 45 4c 45 43 54 0a 20 20 20 20  that SELECT.    
1bc0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 69  */.    int rc, i
1bd0: 49 6e 69 74 43 6f 64 65 3b 0a 20 20 20 20 69 49  InitCode;.    iI
1be0: 6e 69 74 43 6f 64 65 20 3d 20 73 71 6c 69 74 65  nitCode = sqlite
1bf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1c00: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Goto, 0, 0);.   
1c10: 20 69 53 65 6c 65 63 74 4c 6f 6f 70 20 3d 20 73   iSelectLoop = s
1c20: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
1c30: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 69 49 6e  Addr(v);.    iIn
1c40: 73 65 72 74 42 6c 6f 63 6b 20 3d 20 73 71 6c 69  sertBlock = sqli
1c50: 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  teVdbeMakeLabel(
1c60: 76 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  v);.    rc = sql
1c70: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
1c80: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53  , pSelect, SRT_S
1c90: 75 62 72 6f 75 74 69 6e 65 2c 20 69 49 6e 73 65  ubroutine, iInse
1ca0: 72 74 42 6c 6f 63 6b 2c 20 30 2c 30 2c 30 29 3b  rtBlock, 0,0,0);
1cb0: 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 70  .    if( rc || p
1cc0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
1cd0: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
1ce0: 6c 65 64 20 29 20 67 6f 74 6f 20 69 6e 73 65 72  led ) goto inser
1cf0: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 69  t_cleanup;.    i
1d00: 43 6c 65 61 6e 75 70 20 3d 20 73 71 6c 69 74 65  Cleanup = sqlite
1d10: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1d20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
1d30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
1d40: 2c 20 30 2c 20 69 43 6c 65 61 6e 75 70 29 3b 0a  , 0, iCleanup);.
1d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1d60: 65 63 74 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ect->pEList );. 
1d70: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 53 65     nColumn = pSe
1d80: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
1d90: 78 70 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  xpr;..    /* Set
1da0: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 74 6f   useTempTable to
1db0: 20 54 52 55 45 20 69 66 20 74 68 65 20 72 65 73   TRUE if the res
1dc0: 75 6c 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ult of the SELEC
1dd0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
1de0: 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  ** should be wri
1df0: 74 74 65 6e 20 69 6e 74 6f 20 61 20 74 65 6d 70  tten into a temp
1e00: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 65  orary table.  Se
1e10: 74 20 74 6f 20 46 41 4c 53 45 20 69 66 20 65 61  t to FALSE if ea
1e20: 63 68 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66  ch.    ** row of
1e30: 20 74 68 65 20 53 45 4c 45 43 54 20 63 61 6e 20   the SELECT can 
1e40: 62 65 20 77 72 69 74 74 65 6e 20 64 69 72 65 63  be written direc
1e50: 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 72 65 73  tly into the res
1e60: 75 6c 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ult table..    *
1e70: 2a 0a 20 20 20 20 2a 2a 20 41 20 74 65 6d 70 20  *.    ** A temp 
1e80: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
1e90: 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
1ea0: 62 65 69 6e 67 20 75 70 64 61 74 65 64 20 69 73  being updated is
1eb0: 20 61 6c 73 6f 20 6f 6e 65 0a 20 20 20 20 2a 2a   also one.    **
1ec0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 62   of the tables b
1ed0: 65 69 6e 67 20 72 65 61 64 20 62 79 20 74 68 65  eing read by the
1ee0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1ef0: 74 2e 20 20 41 6c 73 6f 20 75 73 65 20 61 20 0a  t.  Also use a .
1f00: 20 20 20 20 2a 2a 20 74 65 6d 70 20 74 61 62 6c      ** temp tabl
1f10: 65 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f 66  e in the case of
1f20: 20 72 6f 77 20 74 72 69 67 67 65 72 73 2e 0a 20   row triggers.. 
1f30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 6f     */.    if( ro
1f40: 77 5f 74 72 69 67 67 65 72 73 5f 65 78 69 73 74  w_triggers_exist
1f50: 20 29 7b 0a 20 20 20 20 20 20 75 73 65 54 65 6d   ){.      useTem
1f60: 70 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  pTable = 1;.    
1f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1f80: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
1f90: 62 65 46 69 6e 64 4f 70 28 76 2c 20 4f 50 5f 4f  beFindOp(v, OP_O
1fa0: 70 65 6e 52 65 61 64 2c 20 70 54 61 62 2d 3e 74  penRead, pTab->t
1fb0: 6e 75 6d 29 3b 0a 20 20 20 20 20 20 75 73 65 54  num);.      useT
1fc0: 65 6d 70 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  empTable = 0;.  
1fd0: 20 20 20 20 69 66 28 20 61 64 64 72 3e 30 20 29      if( addr>0 )
1fe0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
1ff0: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 56 64   *pOp = sqliteVd
2000: 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 2d  beGetOp(v, addr-
2010: 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2020: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2030: 49 6e 74 65 67 65 72 20 26 26 20 70 4f 70 2d 3e  Integer && pOp->
2040: 70 31 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 7b  p1==pTab->iDb ){
2050: 0a 20 20 20 20 20 20 20 20 20 20 75 73 65 54 65  .          useTe
2060: 6d 70 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  mpTable = 1;.   
2070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2080: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75 73     }..    if( us
2090: 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  eTempTable ){.  
20a0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
20b0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
20c0: 68 61 74 20 53 45 4c 45 43 54 20 63 61 6c 6c 73  hat SELECT calls
20d0: 20 74 6f 20 70 72 6f 63 65 73 73 20 65 61 63 68   to process each
20e0: 20 72 6f 77 20 6f 66 0a 20 20 20 20 20 20 2a 2a   row of.      **
20f0: 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 53 74   the result.  St
2100: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
2110: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
2120: 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
2130: 20 20 20 73 72 63 54 61 62 20 3d 20 70 50 61 72     srcTab = pPar
2140: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2150: 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f    sqliteVdbeReso
2160: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 49 6e 73  lveLabel(v, iIns
2170: 65 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  ertBlock);.     
2180: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2190: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
21a0: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
21b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
21c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
21d0: 65 63 6e 6f 2c 20 73 72 63 54 61 62 2c 20 30 29  ecno, srcTab, 0)
21e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
21f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
2200: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
2210: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
2220: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
2230: 2c 20 73 72 63 54 61 62 2c 20 30 29 3b 0a 20 20  , srcTab, 0);.  
2240: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
2250: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
2260: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 0, 0);..      
2270: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2280: 20 63 6f 64 65 20 72 75 6e 73 20 66 69 72 73 74   code runs first
2290: 20 62 65 63 61 75 73 65 20 74 68 65 20 47 4f 54   because the GOT
22a0: 4f 20 61 74 20 74 68 65 20 76 65 72 79 20 74 6f  O at the very to
22b0: 70 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  p.      ** of th
22c0: 65 20 70 72 6f 67 72 61 6d 20 6a 75 6d 70 73 20  e program jumps 
22d0: 74 6f 20 69 74 2e 20 20 43 72 65 61 74 65 20 74  to it.  Create t
22e0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
22f0: 6c 65 2c 20 74 68 65 6e 20 6a 75 6d 70 0a 20 20  le, then jump.  
2300: 20 20 20 20 2a 2a 20 62 61 63 6b 20 75 70 20 61      ** back up a
2310: 6e 64 20 65 78 65 63 75 74 65 20 74 68 65 20 53  nd execute the S
2320: 45 4c 45 43 54 20 63 6f 64 65 20 61 62 6f 76 65  ELECT code above
2330: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2340: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
2350: 65 50 32 28 76 2c 20 69 49 6e 69 74 43 6f 64 65  eP2(v, iInitCode
2360: 2c 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72  , sqliteVdbeCurr
2370: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
2380: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2390: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d  Op(v, OP_OpenTem
23a0: 70 2c 20 73 72 63 54 61 62 2c 20 30 29 3b 0a 20  p, srcTab, 0);. 
23b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
23c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
23d0: 20 30 2c 20 69 53 65 6c 65 63 74 4c 6f 6f 70 29   0, iSelectLoop)
23e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
23f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2400: 2c 20 69 43 6c 65 61 6e 75 70 29 3b 0a 20 20 20  , iCleanup);.   
2410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2420: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32  liteVdbeChangeP2
2430: 28 76 2c 20 69 49 6e 69 74 43 6f 64 65 2c 20 73  (v, iInitCode, s
2440: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
2450: 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 7d 0a  Addr(v));.    }.
2460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2470: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
2480: 20 69 66 20 74 68 65 20 64 61 74 61 20 66 6f 72   if the data for
2490: 20 74 68 65 20 49 4e 53 45 52 54 20 69 73 20 63   the INSERT is c
24a0: 6f 6d 69 6e 67 20 66 72 6f 6d 20 61 20 56 41 4c  oming from a VAL
24b0: 55 45 53 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73  UES.    ** claus
24c0: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53 72 63  e.    */.    Src
24d0: 4c 69 73 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20  List dummy;.    
24e0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
24f0: 20 29 3b 0a 20 20 20 20 73 72 63 54 61 62 20 3d   );.    srcTab =
2500: 20 2d 31 3b 0a 20 20 20 20 75 73 65 54 65 6d 70   -1;.    useTemp
2510: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 61  Table = 0;.    a
2520: 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
2530: 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c      nColumn = pL
2540: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
2550: 64 75 6d 6d 79 2e 6e 53 72 63 20 3d 20 30 3b 0a  dummy.nSrc = 0;.
2560: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2570: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
2580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78      if( sqliteEx
2590: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
25a0: 72 73 65 2c 20 26 64 75 6d 6d 79 2c 20 30 2c 20  rse, &dummy, 0, 
25b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
25c0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  r) ){.        go
25d0: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
25e0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
25f0: 20 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43   if( sqliteExprC
2600: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 4c 69  heck(pParse, pLi
2610: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
2620: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  0, 0) ){.       
2630: 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65   goto insert_cle
2640: 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
2650: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
2660: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
2670: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2680: 20 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61   the source data
2690: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
26a0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 63 6f 6c 75  ber.  ** of colu
26b0: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74  mns to be insert
26c0: 65 64 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ed into the tabl
26d0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  e..  */.  if( pC
26e0: 6f 6c 75 6d 6e 3d 3d 30 20 26 26 20 6e 43 6f 6c  olumn==0 && nCol
26f0: 75 6d 6e 21 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn!=pTab->nCol 
2700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72  ){.    sqliteErr
2710: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
2720: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 53 20        "table %S 
2730: 68 61 73 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62  has %d columns b
2740: 75 74 20 25 64 20 76 61 6c 75 65 73 20 77 65 72  ut %d values wer
2750: 65 20 73 75 70 70 6c 69 65 64 22 2c 0a 20 20 20  e supplied",.   
2760: 20 20 20 20 70 54 61 62 4c 69 73 74 2c 20 30 2c      pTabList, 0,
2770: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 6e 43 6f   pTab->nCol, nCo
2780: 6c 75 6d 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  lumn);.    goto 
2790: 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75 70 3b 0a  insert_cleanup;.
27a0: 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d    }.  if( pColum
27b0: 6e 21 3d 30 20 26 26 20 6e 43 6f 6c 75 6d 6e 21  n!=0 && nColumn!
27c0: 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20 29 7b  =pColumn->nId ){
27d0: 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72  .    sqliteError
27e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 64 20  Msg(pParse, "%d 
27f0: 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
2800: 6c 75 6d 6e 73 22 2c 20 6e 43 6f 6c 75 6d 6e 2c  lumns", nColumn,
2810: 20 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 29 3b 0a   pColumn->nId);.
2820: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
2830: 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
2840: 2f 2a 20 49 66 20 74 68 65 20 49 4e 53 45 52 54  /* If the INSERT
2850: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 63 6c 75   statement inclu
2860: 64 65 64 20 61 6e 20 49 44 4c 49 53 54 20 74 65  ded an IDLIST te
2870: 72 6d 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  rm, then make su
2880: 72 65 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d  re.  ** all elem
2890: 65 6e 74 73 20 6f 66 20 74 68 65 20 49 44 4c 49  ents of the IDLI
28a0: 53 54 20 72 65 61 6c 6c 79 20 61 72 65 20 63 6f  ST really are co
28b0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62  lumns of the tab
28c0: 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 6d  le and .  ** rem
28d0: 65 6d 62 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e  ember the column
28e0: 20 69 6e 64 69 63 65 73 2e 0a 20 20 2a 2a 0a 20   indices..  **. 
28f0: 20 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   ** If the table
2900: 20 68 61 73 20 61 6e 20 49 4e 54 45 47 45 52 20   has an INTEGER 
2910: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
2920: 6d 6e 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75  mn and that colu
2930: 6d 6e 0a 20 20 2a 2a 20 69 73 20 6e 61 6d 65 64  mn.  ** is named
2940: 20 69 6e 20 74 68 65 20 49 44 4c 49 53 54 2c 20   in the IDLIST, 
2950: 74 68 65 6e 20 72 65 63 6f 72 64 20 69 6e 20 74  then record in t
2960: 68 65 20 6b 65 79 43 6f 6c 75 6d 6e 20 76 61 72  he keyColumn var
2970: 69 61 62 6c 65 0a 20 20 2a 2a 20 74 68 65 20 69  iable.  ** the i
2980: 6e 64 65 78 20 69 6e 74 6f 20 49 44 4c 49 53 54  ndex into IDLIST
2990: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
29a0: 6b 65 79 20 63 6f 6c 75 6d 6e 2e 20 20 6b 65 79  key column.  key
29b0: 43 6f 6c 75 6d 6e 20 69 73 0a 20 20 2a 2a 20 74  Column is.  ** t
29c0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
29d0: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 73 20 69  primary key as i
29e0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 49 44 4c  t appears in IDL
29f0: 49 53 54 2c 20 6e 6f 74 20 61 73 0a 20 20 2a 2a  IST, not as.  **
2a00: 20 69 73 20 61 70 70 65 61 72 73 20 69 6e 20 74   is appears in t
2a10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  he original tabl
2a20: 65 2e 20 20 28 54 68 65 20 69 6e 64 65 78 20 6f  e.  (The index o
2a30: 66 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20  f the primary.  
2a40: 2a 2a 20 6b 65 79 20 69 6e 20 74 68 65 20 6f 72  ** key in the or
2a50: 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 69 73 20  iginal table is 
2a60: 70 54 61 62 2d 3e 69 50 4b 65 79 2e 29 0a 20 20  pTab->iPKey.).  
2a70: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e  */.  if( pColumn
2a80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2a90: 20 69 3c 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 3b   i<pColumn->nId;
2aa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f   i++){.      pCo
2ab0: 6c 75 6d 6e 2d 3e 61 5b 69 5d 2e 69 64 78 20 3d  lumn->a[i].idx =
2ac0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   -1;.    }.    f
2ad0: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 75 6d  or(i=0; i<pColum
2ae0: 6e 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  n->nId; i++){.  
2af0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2b00: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
2b10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2b20: 69 74 65 53 74 72 49 43 6d 70 28 70 43 6f 6c 75  iteStrICmp(pColu
2b30: 6d 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  mn->a[i].zName, 
2b40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
2b50: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
2b60: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 2d 3e 61 5b       pColumn->a[
2b70: 69 5d 2e 69 64 78 20 3d 20 6a 3b 0a 20 20 20 20  i].idx = j;.    
2b80: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
2b90: 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
2ba0: 20 20 20 20 20 20 20 20 6b 65 79 43 6f 6c 75 6d          keyColum
2bb0: 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  n = i;.         
2bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2bd0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2be0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2bf0: 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  j>=pTab->nCol ){
2c00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2c10: 69 74 65 49 73 52 6f 77 69 64 28 70 43 6f 6c 75  iteIsRowid(pColu
2c20: 6d 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  mn->a[i].zName) 
2c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79  ){.          key
2c40: 43 6f 6c 75 6d 6e 20 3d 20 69 3b 0a 20 20 20 20  Column = i;.    
2c50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c60: 20 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72       sqliteError
2c70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
2c80: 6c 65 20 25 53 20 68 61 73 20 6e 6f 20 63 6f 6c  le %S has no col
2c90: 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
2cb0: 62 4c 69 73 74 2c 20 30 2c 20 70 43 6f 6c 75 6d  bList, 0, pColum
2cc0: 6e 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  n->a[i].zName);.
2cd0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
2ce0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
2cf0: 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72 74 5f      goto insert_
2d00: 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2d10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2d20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2d30: 65 72 65 20 69 73 20 6e 6f 20 49 44 4c 49 53 54  ere is no IDLIST
2d40: 20 74 65 72 6d 20 62 75 74 20 74 68 65 20 74 61   term but the ta
2d50: 62 6c 65 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ble has an integ
2d60: 65 72 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20  er primary.  ** 
2d70: 6b 65 79 2c 20 74 68 65 20 73 65 74 20 74 68 65  key, the set the
2d80: 20 6b 65 79 43 6f 6c 75 6d 6e 20 76 61 72 69 61   keyColumn varia
2d90: 62 6c 65 20 74 6f 20 74 68 65 20 70 72 69 6d 61  ble to the prima
2da0: 72 79 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 69 6e  ry key column in
2db0: 64 65 78 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  dex.  ** in the 
2dc0: 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 64  original table d
2dd0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  efinition..  */.
2de0: 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e 3d 3d 30    if( pColumn==0
2df0: 20 29 7b 0a 20 20 20 20 6b 65 79 43 6f 6c 75 6d   ){.    keyColum
2e00: 6e 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  n = pTab->iPKey;
2e10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2e20: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 66  the temp table f
2e30: 6f 72 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20  or FOR EACH ROW 
2e40: 74 72 69 67 67 65 72 73 0a 20 20 2a 2f 0a 20 20  triggers.  */.  
2e50: 69 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73  if( row_triggers
2e60: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 73 71  _exist ){.    sq
2e70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
2e80: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2e90: 6e 65 77 49 64 78 2c 20 30 29 3b 0a 20 20 7d 0a  newIdx, 0);.  }.
2ea0: 20 20 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61      .  /* Initia
2eb0: 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 20 6f  lize the count o
2ec0: 66 20 72 6f 77 73 20 74 6f 20 62 65 20 69 6e 73  f rows to be ins
2ed0: 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28  erted.  */.  if(
2ee0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
2ef0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 7b  ITE_CountRows ){
2f00: 0a 20 20 20 20 69 43 6e 74 4d 65 6d 20 3d 20 70  .    iCntMem = p
2f10: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
2f20: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
2f30: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
2f40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
2f50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
2f60: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 43 6e  OP_MemStore, iCn
2f70: 74 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  tMem, 1);.  }.. 
2f80: 20 2f 2a 20 4f 70 65 6e 20 74 61 62 6c 65 73 20   /* Open tables 
2f90: 61 6e 64 20 69 6e 64 69 63 65 73 20 69 66 20 74  and indices if t
2fa0: 68 65 72 65 20 61 72 65 20 6e 6f 20 72 6f 77 20  here are no row 
2fb0: 74 72 69 67 67 65 72 73 20 2a 2f 0a 20 20 69 66  triggers */.  if
2fc0: 28 20 21 72 6f 77 5f 74 72 69 67 67 65 72 73 5f  ( !row_triggers_
2fd0: 65 78 69 73 74 20 29 7b 0a 20 20 20 20 62 61 73  exist ){.    bas
2fe0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
2ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  ;.    sqliteVdbe
3000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
3010: 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20  ger, pTab->iDb, 
3020: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64  0);.    sqliteVd
3030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
3040: 65 6e 57 72 69 74 65 2c 20 62 61 73 65 2c 20 70  enWrite, base, p
3050: 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  Tab->tnum);.    
3060: 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65  sqliteVdbeChange
3070: 50 33 28 76 2c 20 2d 31 2c 20 70 54 61 62 2d 3e  P3(v, -1, pTab->
3080: 7a 4e 61 6d 65 2c 20 50 33 5f 53 54 41 54 49 43  zName, P3_STATIC
3090: 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 31  );.    for(idx=1
30a0: 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  , pIdx=pTab->pIn
30b0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
30c0: 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20 69 64 78  pIdx->pNext, idx
30d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
30e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
30f0: 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e  _Integer, pIdx->
3100: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
3110: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3120: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
3130: 69 64 78 2b 62 61 73 65 2c 20 70 49 64 78 2d 3e  idx+base, pIdx->
3140: 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  tnum);.      sql
3150: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28  iteVdbeChangeP3(
3160: 76 2c 20 2d 31 2c 20 70 49 64 78 2d 3e 7a 4e 61  v, -1, pIdx->zNa
3170: 6d 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  me, P3_STATIC);.
3180: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
3190: 2d 3e 6e 54 61 62 20 2b 3d 20 69 64 78 3b 0a 20  ->nTab += idx;. 
31a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
31b0: 64 61 74 61 20 73 6f 75 72 63 65 20 69 73 20 61  data source is a
31c0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
31d0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
31e0: 6f 20 63 72 65 61 74 65 0a 20 20 2a 2a 20 61 20  o create.  ** a 
31f0: 6c 6f 6f 70 20 62 65 63 61 75 73 65 20 74 68 65  loop because the
3200: 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74  re might be mult
3210: 69 70 6c 65 20 72 6f 77 73 20 6f 66 20 64 61 74  iple rows of dat
3220: 61 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 0a  a.  If the data.
3230: 20 20 2a 2a 20 73 6f 75 72 63 65 20 69 73 20 61    ** source is a
3240: 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
3250: 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
3260: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
3270: 20 77 65 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f   we need.  ** to
3280: 20 6c 61 75 6e 63 68 20 74 68 65 20 53 45 4c 45   launch the SELE
3290: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 72 6f  CT statement pro
32a0: 63 65 73 73 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  cessing..  */.  
32b0: 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65  if( useTempTable
32c0: 20 29 7b 0a 20 20 20 20 69 42 72 65 61 6b 20 3d   ){.    iBreak =
32d0: 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c   sqliteVdbeMakeL
32e0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
32f0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3300: 4f 50 5f 52 65 77 69 6e 64 2c 20 73 72 63 54 61  OP_Rewind, srcTa
3310: 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
3320: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 56 64  iCont = sqliteVd
3330: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
3340: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53  ;.  }else if( pS
3350: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
3360: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3370: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 53 65 6c  OP_Goto, 0, iSel
3380: 65 63 74 4c 6f 6f 70 29 3b 0a 20 20 20 20 73 71  ectLoop);.    sq
3390: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
33a0: 61 62 65 6c 28 76 2c 20 69 49 6e 73 65 72 74 42  abel(v, iInsertB
33b0: 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lock);.  }..  /*
33c0: 20 52 75 6e 20 74 68 65 20 42 45 46 4f 52 45 20   Run the BEFORE 
33d0: 61 6e 64 20 49 4e 53 54 45 41 44 20 4f 46 20 74  and INSTEAD OF t
33e0: 72 69 67 67 65 72 73 2c 20 69 66 20 74 68 65 72  riggers, if ther
33f0: 65 20 61 72 65 20 61 6e 79 0a 20 20 2a 2f 0a 20  e are any.  */. 
3400: 20 65 6e 64 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c   endOfLoop = sql
3410: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
3420: 28 76 29 3b 0a 20 20 69 66 28 20 62 65 66 6f 72  (v);.  if( befor
3430: 65 5f 74 72 69 67 67 65 72 73 20 29 7b 0a 0a 20  e_triggers ){.. 
3440: 20 20 20 2f 2a 20 62 75 69 6c 64 20 74 68 65 20     /* build the 
3450: 4e 45 57 2e 2a 20 72 65 66 65 72 65 6e 63 65 20  NEW.* reference 
3460: 72 6f 77 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  row.  Note that 
3470: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  if there is an I
3480: 4e 54 45 47 45 52 0a 20 20 20 20 2a 2a 20 50 52  NTEGER.    ** PR
3490: 49 4d 41 52 59 20 4b 45 59 20 69 6e 74 6f 20 77  IMARY KEY into w
34a0: 68 69 63 68 20 61 20 4e 55 4c 4c 20 69 73 20 62  hich a NULL is b
34b0: 65 69 6e 67 20 69 6e 73 65 72 74 65 64 2c 20 74  eing inserted, t
34c0: 68 61 74 20 4e 55 4c 4c 20 77 69 6c 6c 20 62 65  hat NULL will be
34d0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74  .    ** translat
34e0: 65 64 20 69 6e 74 6f 20 61 20 75 6e 69 71 75 65  ed into a unique
34f0: 20 49 44 20 66 6f 72 20 74 68 65 20 72 6f 77 2e   ID for the row.
3500: 20 20 42 75 74 20 6f 6e 20 61 20 42 45 46 4f 52    But on a BEFOR
3510: 45 20 74 72 69 67 67 65 72 2c 0a 20 20 20 20 2a  E trigger,.    *
3520: 2a 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  * we do not know
3530: 20 77 68 61 74 20 74 68 65 20 75 6e 69 71 75 65   what the unique
3540: 20 49 44 20 77 69 6c 6c 20 62 65 20 28 62 65 63   ID will be (bec
3550: 61 75 73 65 20 74 68 65 20 69 6e 73 65 72 74 20  ause the insert 
3560: 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 68  has.    ** not h
3570: 61 70 70 65 6e 65 64 20 79 65 74 29 20 73 6f 20  appened yet) so 
3580: 77 65 20 73 75 62 73 74 69 74 75 74 65 20 61 20  we substitute a 
3590: 72 6f 77 69 64 20 6f 66 20 2d 31 0a 20 20 20 20  rowid of -1.    
35a0: 2a 2f 0a 20 20 20 20 69 66 28 20 6b 65 79 43 6f  */.    if( keyCo
35b0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
35c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
35d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d  v, OP_Integer, -
35e0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  1, 0);.    }else
35f0: 20 69 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c   if( useTempTabl
3600: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
3610: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3620: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
3630: 20 6b 65 79 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20   keyColumn);.   
3640: 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65   }else if( pSele
3650: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
3660: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3670: 50 5f 44 75 70 2c 20 6e 43 6f 6c 75 6d 6e 20 2d  P_Dup, nColumn -
3680: 20 6b 65 79 43 6f 6c 75 6d 6e 20 2d 20 31 2c 20   keyColumn - 1, 
3690: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
36a0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
36b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ode(pParse, pLis
36c0: 74 2d 3e 61 5b 6b 65 79 43 6f 6c 75 6d 6e 5d 2e  t->a[keyColumn].
36d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
36e0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
36f0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
3700: 20 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65   sqliteVdbeCurre
3710: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
3720: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3730: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
3740: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
3750: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
3760: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 30  P_Integer, -1, 0
3770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3790: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
37a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
37b0: 72 65 61 74 65 20 74 68 65 20 6e 65 77 20 63 6f  reate the new co
37c0: 6c 75 6d 6e 20 64 61 74 61 0a 20 20 20 20 2a 2f  lumn data.    */
37d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
37e0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
37f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  {.      if( pCol
3800: 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn==0 ){.      
3810: 20 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d    j = i;.      }
3820: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
3830: 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f 6c 75 6d 6e  r(j=0; j<pColumn
3840: 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nId; j++){.   
3850: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75         if( pColu
3860: 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78 3d 3d 69 20  mn->a[j].idx==i 
3870: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
3880: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
3890: 20 69 66 28 20 70 43 6f 6c 75 6d 6e 20 26 26 20   if( pColumn && 
38a0: 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e 6e 49 64 20  j>=pColumn->nId 
38b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
38c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
38d0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
38e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
38f0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
3900: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
3910: 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43  zDflt, P3_STATIC
3920: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
3930: 66 28 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20  f( useTempTable 
3940: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3950: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3960: 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c  _Column, srcTab,
3970: 20 6a 29 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73   j); .      }els
3980: 65 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b  e if( pSelect ){
3990: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
39a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
39b0: 75 70 2c 20 6e 43 6f 6c 75 6d 6e 2d 6a 2d 31 2c  up, nColumn-j-1,
39c0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
39d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
39e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
39f0: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78   pList->a[j].pEx
3a00: 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
3a10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62   }.    sqliteVdb
3a20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3a30: 65 52 65 63 6f 72 64 2c 20 70 54 61 62 2d 3e 6e  eRecord, pTab->n
3a40: 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Col, 0);.    sql
3a50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3a60: 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 6e 65  OP_PutIntKey, ne
3a70: 77 49 64 78 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  wIdx, 0);..    /
3a80: 2a 20 46 69 72 65 20 42 45 46 4f 52 45 20 6f 72  * Fire BEFORE or
3a90: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
3aa0: 67 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  gers */.    if( 
3ab0: 73 71 6c 69 74 65 43 6f 64 65 52 6f 77 54 72 69  sqliteCodeRowTri
3ac0: 67 67 65 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  gger(pParse, TK_
3ad0: 49 4e 53 45 52 54 2c 20 30 2c 20 54 4b 5f 42 45  INSERT, 0, TK_BE
3ae0: 46 4f 52 45 2c 20 70 54 61 62 2c 20 0a 20 20 20  FORE, pTab, .   
3af0: 20 20 20 20 20 6e 65 77 49 64 78 2c 20 2d 31 2c       newIdx, -1,
3b00: 20 6f 6e 45 72 72 6f 72 2c 20 65 6e 64 4f 66 4c   onError, endOfL
3b10: 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oop) ){.      go
3b20: 74 6f 20 69 6e 73 65 72 74 5f 63 6c 65 61 6e 75  to insert_cleanu
3b30: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
3b40: 2f 2a 20 49 66 20 61 6e 79 20 74 72 69 67 67 65  /* If any trigge
3b50: 72 73 20 65 78 69 73 74 73 2c 20 74 68 65 20 6f  rs exists, the o
3b60: 70 65 6e 69 6e 67 20 6f 66 20 74 61 62 6c 65 73  pening of tables
3b70: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 69 73 20   and indices is 
3b80: 64 65 66 65 72 72 65 64 0a 20 20 2a 2a 20 75 6e  deferred.  ** un
3b90: 74 69 6c 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  til now..  */.  
3ba0: 69 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73  if( row_triggers
3bb0: 5f 65 78 69 73 74 20 26 26 20 21 69 73 56 69 65  _exist && !isVie
3bc0: 77 20 29 7b 0a 20 20 20 20 62 61 73 65 20 3d 20  w ){.    base = 
3bd0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
3be0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
3bf0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3c00: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
3c10: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3c20: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  dOp(v, OP_OpenWr
3c30: 69 74 65 2c 20 62 61 73 65 2c 20 70 54 61 62 2d  ite, base, pTab-
3c40: 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 73 71 6c 69  >tnum);.    sqli
3c50: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
3c60: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  , -1, pTab->zNam
3c70: 65 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  e, P3_STATIC);. 
3c80: 20 20 20 66 6f 72 28 69 64 78 3d 31 2c 20 70 49     for(idx=1, pI
3c90: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
3ca0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
3cb0: 2d 3e 70 4e 65 78 74 2c 20 69 64 78 2b 2b 29 7b  ->pNext, idx++){
3cc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3cd0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3ce0: 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c  eger, pIdx->iDb,
3cf0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
3d00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3d10: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 64 78 2b  _OpenWrite, idx+
3d20: 62 61 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  base, pIdx->tnum
3d30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3d40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3d50: 31 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  1, pIdx->zName, 
3d60: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
3d70: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  }.    pParse->nT
3d80: 61 62 20 2b 3d 20 69 64 78 3b 0a 20 20 7d 0a 0a  ab += idx;.  }..
3d90: 20 20 2f 2a 20 50 75 73 68 20 74 68 65 20 72 65    /* Push the re
3da0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
3db0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e  the new entry on
3dc0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54  to the stack.  T
3dd0: 68 65 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 6e  he.  ** record n
3de0: 75 6d 62 65 72 20 69 73 20 61 20 72 61 6e 64 6f  umber is a rando
3df0: 6d 6c 79 20 67 65 6e 65 72 61 74 65 20 69 6e 74  mly generate int
3e00: 65 67 65 72 20 63 72 65 61 74 65 64 20 62 79 20  eger created by 
3e10: 4e 65 77 52 65 63 6e 6f 0a 20 20 2a 2a 20 65 78  NewRecno.  ** ex
3e20: 63 65 70 74 20 77 68 65 6e 20 74 68 65 20 74 61  cept when the ta
3e30: 62 6c 65 20 68 61 73 20 61 6e 20 49 4e 54 45 47  ble has an INTEG
3e40: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
3e50: 6f 6c 75 6d 6e 2c 20 69 6e 20 77 68 69 63 68 0a  olumn, in which.
3e60: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 72 65    ** case the re
3e70: 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20 74  cord number is t
3e80: 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
3e90: 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2f 0a 20 20  column. .  */.  
3ea0: 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20  if( !isView ){. 
3eb0: 20 20 20 69 66 28 20 6b 65 79 43 6f 6c 75 6d 6e     if( keyColumn
3ec0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
3ed0: 20 75 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b   useTempTable ){
3ee0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
3ef0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
3f00: 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 6b  olumn, srcTab, k
3f10: 65 79 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  eyColumn);.     
3f20: 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65   }else if( pSele
3f30: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
3f40: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f50: 20 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Dup, nColumn
3f60: 20 2d 20 6b 65 79 43 6f 6c 75 6d 6e 20 2d 20 31   - keyColumn - 1
3f70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
3f80: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3f90: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
3fa0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 6b 65 79 43 6f  , pList->a[keyCo
3fb0: 6c 75 6d 6e 5d 2e 70 45 78 70 72 29 3b 0a 20 20  lumn].pExpr);.  
3fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49      }.      /* I
3fd0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
3fe0: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  Y expression is 
3ff0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 75 73 65 20 4f  NULL, then use O
4000: 50 5f 4e 65 77 52 65 63 6e 6f 0a 20 20 20 20 20  P_NewRecno.     
4010: 20 2a 2a 20 74 6f 20 67 65 6e 65 72 61 74 65 20   ** to generate 
4020: 61 20 75 6e 69 71 75 65 20 70 72 69 6d 61 72 79  a unique primary
4030: 20 6b 65 79 20 76 61 6c 75 65 2e 0a 20 20 20 20   key value..    
4040: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
4050: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4060: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
4070: 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74 41  liteVdbeCurrentA
4080: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
4090: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
40a0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
40b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
40c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
40d0: 65 77 52 65 63 6e 6f 2c 20 62 61 73 65 2c 20 30  ewRecno, base, 0
40e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
40f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4100: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
4110: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4120: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4130: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
4140: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  , base, 0);.    
4150: 7d 0a 0a 20 20 20 20 2f 2a 20 50 75 73 68 20 6f  }..    /* Push o
4160: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 64  nto the stack, d
4170: 61 74 61 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 75  ata for all colu
4180: 6d 6e 73 20 6f 66 20 74 68 65 20 6e 65 77 20 65  mns of the new e
4190: 6e 74 72 79 2c 20 62 65 67 69 6e 6e 69 6e 67 0a  ntry, beginning.
41a0: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
41b0: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 2e 0a 20 20  first column..  
41c0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
41d0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
41e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
41f0: 69 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  i==pTab->iPKey )
4200: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
4210: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 4e   value of the IN
4220: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4230: 59 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6c 77 61  Y column is alwa
4240: 79 73 20 61 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  ys a NULL..     
4250: 20 20 20 2a 2a 20 57 68 65 6e 65 76 65 72 20 74     ** Whenever t
4260: 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  his column is re
4270: 61 64 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ad, the record n
4280: 75 6d 62 65 72 20 77 69 6c 6c 20 62 65 20 73 75  umber will be su
4290: 62 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20  bstituted.      
42a0: 20 20 2a 2a 20 69 6e 20 69 74 73 20 70 6c 61 63    ** in its plac
42b0: 65 2e 20 20 53 6f 20 77 69 6c 6c 20 66 69 6c 6c  e.  So will fill
42c0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 77 69 74   this column wit
42d0: 68 20 61 20 4e 55 4c 4c 20 74 6f 20 61 76 6f 69  h a NULL to avoi
42e0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b  d.        ** tak
42f0: 69 6e 67 20 75 70 20 64 61 74 61 20 73 70 61 63  ing up data spac
4300: 65 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69  e with informati
4310: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  on that will nev
4320: 65 72 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20  er be used. */. 
4330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4340: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
4350: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
4360: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4370: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4380: 70 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  pColumn==0 ){.  
4390: 20 20 20 20 20 20 6a 20 3d 20 69 3b 0a 20 20 20        j = i;.   
43a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
43b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 43 6f    for(j=0; j<pCo
43c0: 6c 75 6d 6e 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b  lumn->nId; j++){
43d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
43e0: 43 6f 6c 75 6d 6e 2d 3e 61 5b 6a 5d 2e 69 64 78  Column->a[j].idx
43f0: 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4410: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 75 6d 6e       if( pColumn
4420: 20 26 26 20 6a 3e 3d 70 43 6f 6c 75 6d 6e 2d 3e   && j>=pColumn->
4430: 6e 49 64 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nId ){.        s
4440: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4450: 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20  , OP_String, 0, 
4460: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
4470: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
4480: 2c 20 2d 31 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  , -1, pTab->aCol
4490: 5b 69 5d 2e 7a 44 66 6c 74 2c 20 50 33 5f 53 54  [i].zDflt, P3_ST
44a0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ATIC);.      }el
44b0: 73 65 20 69 66 28 20 75 73 65 54 65 6d 70 54 61  se if( useTempTa
44c0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ble ){.        s
44d0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
44e0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
44f0: 54 61 62 2c 20 6a 29 3b 20 0a 20 20 20 20 20 20  Tab, j); .      
4500: 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 65 63  }else if( pSelec
4510: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
4520: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4530: 4f 50 5f 44 75 70 2c 20 69 2b 6e 43 6f 6c 75 6d  OP_Dup, i+nColum
4540: 6e 2d 6a 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  n-j, 1);.      }
4550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4560: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4570: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  rse, pList->a[j]
4580: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
4590: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
45a0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
45b0: 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
45c0: 73 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 69  s and generate i
45d0: 6e 64 65 78 20 6b 65 79 73 20 61 6e 64 0a 20 20  ndex keys and.  
45e0: 20 20 2a 2a 20 64 6f 20 74 68 65 20 69 6e 73 65    ** do the inse
45f0: 72 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  rtion..    */.  
4600: 20 20 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65    sqliteGenerate
4610: 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73  ConstraintChecks
4620: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 62  (pParse, pTab, b
4630: 61 73 65 2c 20 30 2c 20 6b 65 79 43 6f 6c 75 6d  ase, 0, keyColum
4640: 6e 3e 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20  n>=0,.          
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 30 2c 20 6f 6e 45 72           0, onEr
4670: 72 6f 72 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 3b  ror, endOfLoop);
4680: 0a 20 20 20 20 73 71 6c 69 74 65 43 6f 6d 70 6c  .    sqliteCompl
4690: 65 74 65 49 6e 73 65 72 74 69 6f 6e 28 70 50 61  eteInsertion(pPa
46a0: 72 73 65 2c 20 70 54 61 62 2c 20 62 61 73 65 2c  rse, pTab, base,
46b0: 20 30 2c 30 2c 30 2c 0a 20 20 20 20 20 20 20 20   0,0,0,.        
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 61 66 74 65 72 5f 74 72 69 67 67 65      after_trigge
46e0: 72 73 20 3f 20 6e 65 77 49 64 78 20 3a 20 2d 31  rs ? newIdx : -1
46f0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
4700: 61 74 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ate the count of
4710: 20 72 6f 77 73 20 74 68 61 74 20 61 72 65 20 69   rows that are i
4720: 6e 73 65 72 74 65 64 0a 20 20 2a 2f 0a 20 20 69  nserted.  */.  i
4730: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
4740: 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73  SQLITE_CountRows
4750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4760: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4770: 50 5f 4d 65 6d 49 6e 63 72 2c 20 69 43 6e 74 4d  P_MemIncr, iCntM
4780: 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  em, 0);.  }..  i
4790: 66 28 20 72 6f 77 5f 74 72 69 67 67 65 72 73 5f  f( row_triggers_
47a0: 65 78 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  exist ){.    /* 
47b0: 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65 73  Close all tables
47c0: 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 69   opened */.    i
47d0: 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20  f( !isView ){.  
47e0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
47f0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
4800: 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20   base, 0);.     
4810: 20 66 6f 72 28 69 64 78 3d 31 2c 20 70 49 64 78   for(idx=1, pIdx
4820: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
4830: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
4840: 70 4e 65 78 74 2c 20 69 64 78 2b 2b 29 7b 0a 20  pNext, idx++){. 
4850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
4860: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
4870: 73 65 2c 20 69 64 78 2b 62 61 73 65 2c 20 30 29  se, idx+base, 0)
4880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4890: 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 41 46 54  .    /* Code AFT
48a0: 45 52 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  ER triggers */. 
48b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 43 6f 64     if( sqliteCod
48c0: 65 52 6f 77 54 72 69 67 67 65 72 28 70 50 61 72  eRowTrigger(pPar
48d0: 73 65 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 20 30  se, TK_INSERT, 0
48e0: 2c 20 54 4b 5f 41 46 54 45 52 2c 20 70 54 61 62  , TK_AFTER, pTab
48f0: 2c 20 6e 65 77 49 64 78 2c 20 2d 31 2c 20 0a 20  , newIdx, -1, . 
4900: 20 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72           onError
4910: 2c 20 65 6e 64 4f 66 4c 6f 6f 70 29 20 29 7b 0a  , endOfLoop) ){.
4920: 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 73 65 72        goto inser
4930: 74 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  t_cleanup;.    }
4940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
4950: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
4960: 70 2c 20 69 66 20 74 68 65 20 64 61 74 61 20 73  p, if the data s
4970: 6f 75 72 63 65 20 69 73 20 61 20 53 45 4c 45 43  ource is a SELEC
4980: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2f  T statement.  */
4990: 0a 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73  .  sqliteVdbeRes
49a0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
49b0: 4f 66 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 75  OfLoop);.  if( u
49c0: 73 65 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20  seTempTable ){. 
49d0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
49e0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  Op(v, OP_Next, s
49f0: 72 63 54 61 62 2c 20 69 43 6f 6e 74 29 3b 0a 20  rcTab, iCont);. 
4a00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
4a10: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
4a20: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
4a30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4a40: 43 6c 6f 73 65 2c 20 73 72 63 54 61 62 2c 20 30  Close, srcTab, 0
4a50: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
4a60: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
4a70: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4a80: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
4a90: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4aa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4ab0: 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
4ac0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
4ad0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6c  olveLabel(v, iCl
4ae0: 65 61 6e 75 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  eanup);.  }..  i
4af0: 66 28 20 21 72 6f 77 5f 74 72 69 67 67 65 72 73  f( !row_triggers
4b00: 5f 65 78 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a  _exist ){.    /*
4b10: 20 43 6c 6f 73 65 20 61 6c 6c 20 74 61 62 6c 65   Close all table
4b20: 73 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  s opened */.    
4b30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4b40: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73  v, OP_Close, bas
4b50: 65 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  e, 0);.    for(i
4b60: 64 78 3d 31 2c 20 70 49 64 78 3d 70 54 61 62 2d  dx=1, pIdx=pTab-
4b70: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
4b80: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c  Idx=pIdx->pNext,
4b90: 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 73   idx++){.      s
4ba0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4bb0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 64 78 2b  , OP_Close, idx+
4bc0: 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  base, 0);.    }.
4bd0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 45 6e 64    }..  sqliteEnd
4be0: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
4bf0: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Parse);..  /*.  
4c00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
4c10: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 73  mber of rows ins
4c20: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  erted..  */.  if
4c30: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
4c40: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
4c50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65  {.    sqliteVdbe
4c60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
4c70: 6d 6e 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20  mnName, 0, 0);. 
4c80: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
4c90: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 72 6f  ngeP3(v, -1, "ro
4ca0: 77 73 20 69 6e 73 65 72 74 65 64 22 2c 20 50 33  ws inserted", P3
4cb0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
4cc0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4cd0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 43 6e   OP_MemLoad, iCn
4ce0: 74 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  tMem, 0);.    sq
4cf0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4d00: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 31 2c   OP_Callback, 1,
4d10: 20 30 29 3b 0a 20 20 7d 0a 0a 69 6e 73 65 72 74   0);.  }..insert
4d20: 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
4d30: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
4d40: 70 54 61 62 4c 69 73 74 29 3b 0a 20 20 69 66 28  pTabList);.  if(
4d50: 20 70 4c 69 73 74 20 29 20 73 71 6c 69 74 65 45   pList ) sqliteE
4d60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
4d70: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
4d80: 65 63 74 20 29 20 73 71 6c 69 74 65 53 65 6c 65  ect ) sqliteSele
4d90: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
4da0: 29 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73  );.  sqliteIdLis
4db0: 74 44 65 6c 65 74 65 28 70 43 6f 6c 75 6d 6e 29  tDelete(pColumn)
4dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
4dd0: 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 61  ate code to do a
4de0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
4df0: 6b 20 70 72 69 6f 72 20 74 6f 20 61 6e 20 49 4e  k prior to an IN
4e00: 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 41 54  SERT or an UPDAT
4e10: 45 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  E..**.** When th
4e20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4e30: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 63 6b 20  lled, the stack 
4e40: 63 6f 6e 74 61 69 6e 73 20 28 66 72 6f 6d 20 62  contains (from b
4e50: 6f 74 74 6f 6d 20 74 6f 20 74 6f 70 29 0a 2a 2a  ottom to top).**
4e60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
4e70: 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
4e80: 31 2e 20 20 54 68 65 20 72 65 63 6e 6f 20 6f 66  1.  The recno of
4e90: 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20 75   the row to be u
4ea0: 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  pdated before th
4eb0: 65 20 75 70 64 61 74 65 2e 20 20 54 68 69 73 0a  e update.  This.
4ec0: 2a 2a 20 20 20 20 20 20 20 20 76 61 6c 75 65 20  **        value 
4ed0: 69 73 20 6f 6d 69 74 74 65 64 20 75 6e 6c 65 73  is omitted unles
4ee0: 73 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  s we are doing a
4ef0: 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 69 6e  n UPDATE that in
4f00: 76 6f 6c 76 65 73 20 61 0a 2a 2a 20 20 20 20 20  volves a.**     
4f10: 20 20 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65     change to the
4f20: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 0a   record number..
4f30: 2a 2a 0a 2a 2a 20 20 20 20 32 2e 20 20 54 68 65  **.**    2.  The
4f40: 20 72 65 63 6e 6f 20 6f 66 20 74 68 65 20 72 6f   recno of the ro
4f50: 77 20 61 66 74 65 72 20 74 68 65 20 75 70 64 61  w after the upda
4f60: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 33 2e 20  te..**.**    3. 
4f70: 20 54 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   The data in the
4f80: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
4f90: 20 74 68 65 20 65 6e 74 72 79 20 61 66 74 65 72   the entry after
4fa0: 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2a 0a   the update..**.
4fb0: 2a 2a 20 20 20 20 69 2e 20 20 44 61 74 61 20 66  **    i.  Data f
4fc0: 72 6f 6d 20 6d 69 64 64 6c 65 20 63 6f 6c 75 6d  rom middle colum
4fd0: 6e 73 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  ns....**.**    N
4fe0: 2e 20 20 54 68 65 20 64 61 74 61 20 69 6e 20 74  .  The data in t
4ff0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 6f  he last column o
5000: 66 20 74 68 65 20 65 6e 74 72 79 20 61 66 74 65  f the entry afte
5010: 72 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2a  r the update..**
5020: 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 72 65 63 6e  .** The old recn
5030: 6f 20 73 68 6f 77 6e 20 61 73 20 65 6e 74 72 79  o shown as entry
5040: 20 28 31 29 20 61 62 6f 76 65 20 69 73 20 6f 6d   (1) above is om
5050: 69 74 74 65 64 20 75 6e 6c 65 73 73 20 62 6f 74  itted unless bot
5060: 68 20 69 73 55 70 64 61 74 65 0a 2a 2a 20 61 6e  h isUpdate.** an
5070: 64 20 72 65 63 6e 6f 43 68 6e 67 20 61 72 65 20  d recnoChng are 
5080: 31 2e 20 20 69 73 55 70 64 61 74 65 20 69 73 20  1.  isUpdate is 
5090: 74 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 73  true for UPDATEs
50a0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 2a   and false for.*
50b0: 2a 20 49 4e 53 45 52 54 73 20 61 6e 64 20 72 65  * INSERTs and re
50c0: 63 6e 6f 43 68 6e 67 20 69 73 20 74 72 75 65 20  cnoChng is true 
50d0: 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  if the record nu
50e0: 6d 62 65 72 20 69 73 20 62 65 69 6e 67 20 63 68  mber is being ch
50f0: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  anged..**.** The
5100: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
5110: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
5120: 70 75 73 68 65 73 20 61 64 64 69 74 69 6f 6e 61  pushes additiona
5130: 6c 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 0a 2a  l entries onto.*
5140: 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 63  * the stack whic
5150: 68 20 61 72 65 20 74 68 65 20 6b 65 79 73 20 66  h are the keys f
5160: 6f 72 20 6e 65 77 20 69 6e 64 65 78 20 65 6e 74  or new index ent
5170: 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
5180: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 54 68 65 20   record..** The 
5190: 6f 72 64 65 72 20 6f 66 20 69 6e 64 65 78 20 6b  order of index k
51a0: 65 79 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  eys is the same 
51b0: 61 73 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  as the order of 
51c0: 74 68 65 20 69 6e 64 69 63 65 73 20 6f 6e 0a 2a  the indices on.*
51d0: 2a 20 74 68 65 20 70 54 61 62 6c 65 2d 3e 70 49  * the pTable->pI
51e0: 6e 64 65 78 20 6c 69 73 74 2e 20 20 41 20 6b 65  ndex list.  A ke
51f0: 79 20 69 73 20 6f 6e 6c 79 20 63 72 65 61 74 65  y is only create
5200: 64 20 66 6f 72 20 69 6e 64 65 78 20 69 20 69 66  d for index i if
5210: 20 0a 2a 2a 20 61 49 64 78 55 73 65 64 21 3d 30   .** aIdxUsed!=0
5220: 20 61 6e 64 20 61 49 64 78 55 73 65 64 5b 69 5d   and aIdxUsed[i]
5230: 21 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  !=0..**.** This 
5240: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 67 65 6e  routine also gen
5250: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63  erates code to c
5260: 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
5270: 2e 20 20 4e 4f 54 20 4e 55 4c 4c 2c 0a 2a 2a 20  .  NOT NULL,.** 
5280: 43 48 45 43 4b 2c 20 61 6e 64 20 55 4e 49 51 55  CHECK, and UNIQU
5290: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  E constraints ar
52a0: 65 20 61 6c 6c 20 63 68 65 63 6b 65 64 2e 20 20  e all checked.  
52b0: 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  If a constraint 
52c0: 66 61 69 6c 73 2c 0a 2a 2a 20 74 68 65 6e 20 74  fails,.** then t
52d0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 61  he appropriate a
52e0: 63 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ction is perform
52f0: 65 64 2e 20 20 54 68 65 72 65 20 61 72 65 20 66  ed.  There are f
5300: 69 76 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20  ive possible.** 
5310: 61 63 74 69 6f 6e 73 3a 20 52 4f 4c 4c 42 41 43  actions: ROLLBAC
5320: 4b 2c 20 41 42 4f 52 54 2c 20 46 41 49 4c 2c 20  K, ABORT, FAIL, 
5330: 52 45 50 4c 41 43 45 2c 20 61 6e 64 20 49 47 4e  REPLACE, and IGN
5340: 4f 52 45 2e 0a 2a 2a 0a 2a 2a 20 20 43 6f 6e 73  ORE..**.**  Cons
5350: 74 72 61 69 6e 74 20 74 79 70 65 20 20 41 63 74  traint type  Act
5360: 69 6f 6e 20 20 20 20 20 20 20 57 68 61 74 20 48  ion       What H
5370: 61 70 70 65 6e 73 0a 2a 2a 20 20 2d 2d 2d 2d 2d  appens.**  -----
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
5390: 2d 2d 2d 2d 2d 2d 20 20 20 2d 2d 2d 2d 2d 2d 2d  ------   -------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20  -.**  any       
53d0: 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20         ROLLBACK 
53e0: 20 20 20 20 54 68 65 20 63 75 72 72 65 6e 74 20      The current 
53f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
5400: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 0a 2a  olled back and.*
5410: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 72   sqlite_exec() r
5440: 65 74 75 72 6e 73 20 69 6d 6d 65 64 69 61 74 65  eturns immediate
5450: 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20 20 20 20  ly with a.**    
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5480: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
5490: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a 2a  E_CONSTRAINT..**
54a0: 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20  .**  any        
54b0: 20 20 20 20 20 20 41 42 4f 52 54 20 20 20 20 20        ABORT     
54c0: 20 20 20 42 61 63 6b 20 6f 75 74 20 63 68 61 6e     Back out chan
54d0: 67 65 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ges from the cur
54e0: 72 65 6e 74 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  rent command.** 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5510: 6e 6c 79 20 28 64 6f 20 6e 6f 74 20 64 6f 20 61  nly (do not do a
5520: 20 63 6f 6d 70 6c 65 74 65 20 72 6f 6c 6c 62 61   complete rollba
5530: 63 6b 29 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ck) then.**     
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 20 20 20 20 20 63 61 75 73 65             cause
5560: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 74   sqlite_exec() t
5570: 6f 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  o return immedia
5580: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  tely.**         
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 20 20 20 77 69 74 68 20 53 51 4c 49         with SQLI
55b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 0a 2a  TE_CONSTRAINT..*
55c0: 2a 0a 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20  *.**  any       
55d0: 20 20 20 20 20 20 20 46 41 49 4c 20 20 20 20 20         FAIL     
55e0: 20 20 20 20 53 71 6c 69 74 65 5f 65 78 65 63 28      Sqlite_exec(
55f0: 29 20 72 65 74 75 72 6e 73 20 69 6d 6d 65 64 69  ) returns immedi
5600: 61 74 65 6c 79 20 77 69 74 68 20 61 0a 2a 2a 20  ately with a.** 
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
5630: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
5640: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e  LITE_CONSTRAINT.
5650: 20 20 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 20    The.**        
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74          transact
5680: 69 6f 6e 20 69 73 20 6e 6f 74 20 72 6f 6c 6c 65  ion is not rolle
5690: 64 20 62 61 63 6b 20 61 6e 64 20 61 6e 79 0a 2a  d back and any.*
56a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 70 72 69 6f 72 20 63 68 61 6e 67 65 73 20 61   prior changes a
56d0: 72 65 20 72 65 74 61 69 6e 65 64 2e 0a 2a 2a 0a  re retained..**.
56e0: 2a 2a 20 20 61 6e 79 20 20 20 20 20 20 20 20 20  **  any         
56f0: 20 20 20 20 20 49 47 4e 4f 52 45 20 20 20 20 20       IGNORE     
5700: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
5710: 62 65 72 20 61 6e 64 20 64 61 74 61 20 69 73 20  ber and data is 
5720: 70 6f 70 70 65 64 20 66 72 6f 6d 0a 2a 2a 20 20  popped from.**  
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
5750: 65 20 73 74 61 63 6b 20 61 6e 64 20 74 68 65 72  e stack and ther
5760: 65 20 69 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  e is an immediat
5770: 65 20 6a 75 6d 70 0a 2a 2a 20 20 20 20 20 20 20  e jump.**       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 20 20 20 20 20 74 6f 20 6c 61 62 65           to labe
57a0: 6c 20 69 67 6e 6f 72 65 44 65 73 74 2e 0a 2a 2a  l ignoreDest..**
57b0: 0a 2a 2a 20 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  .**  NOT NULL   
57c0: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 20 20        REPLACE   
57d0: 20 20 20 54 68 65 20 4e 55 4c 4c 20 76 61 6c 75     The NULL valu
57e0: 65 20 69 73 20 72 65 70 6c 61 63 65 20 62 79 20  e is replace by 
57f0: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
5820: 6c 75 65 20 66 6f 72 20 74 68 61 74 20 63 6f 6c  lue for that col
5830: 75 6d 6e 2e 20 20 49 66 20 74 68 65 20 64 65 66  umn.  If the def
5840: 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 20 20  ault value.**   
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
5870: 4e 55 4c 4c 2c 20 74 68 65 20 61 63 74 69 6f 6e  NULL, the action
5880: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
5890: 41 42 4f 52 54 2e 0a 2a 2a 0a 2a 2a 20 20 55 4e  ABORT..**.**  UN
58a0: 49 51 55 45 20 20 20 20 20 20 20 20 20 20 20 52  IQUE           R
58b0: 45 50 4c 41 43 45 20 20 20 20 20 20 54 68 65 20  EPLACE      The 
58c0: 6f 74 68 65 72 20 72 6f 77 20 74 68 61 74 20 63  other row that c
58d0: 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 74 68  onflicts with th
58e0: 65 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  e row.**        
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 20 20 62 65 69 6e 67 20 69 6e          being in
5910: 73 65 72 74 65 64 20 69 73 20 72 65 6d 6f 76 65  serted is remove
5920: 64 2e 0a 2a 2a 0a 2a 2a 20 20 43 48 45 43 4b 20  d..**.**  CHECK 
5930: 20 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41             REPLA
5940: 43 45 20 20 20 20 20 20 49 6c 6c 65 67 61 6c 2e  CE      Illegal.
5950: 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 69 6e    The results in
5960: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a   an exception..*
5970: 2a 0a 2a 2a 20 57 68 69 63 68 20 61 63 74 69 6f  *.** Which actio
5980: 6e 20 74 6f 20 74 61 6b 65 20 69 73 20 64 65 74  n to take is det
5990: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
59a0: 76 65 72 72 69 64 65 45 72 72 6f 72 20 70 61 72  verrideError par
59b0: 61 6d 65 74 65 72 2e 0a 2a 2a 20 4f 72 20 69 66  ameter..** Or if
59c0: 20 6f 76 65 72 72 69 64 65 45 72 72 6f 72 3d 3d   overrideError==
59d0: 4f 45 5f 44 65 66 61 75 6c 74 2c 20 74 68 65 6e  OE_Default, then
59e0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 6f 6e 45   the pParse->onE
59f0: 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 0a 2a  rror parameter.*
5a00: 2a 20 69 73 20 75 73 65 64 2e 20 20 4f 72 20 69  * is used.  Or i
5a10: 66 20 70 50 61 72 73 65 2d 3e 6f 6e 45 72 72 6f  f pParse->onErro
5a20: 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 74 68  r==OE_Default th
5a30: 65 6e 20 74 68 65 20 6f 6e 45 72 72 6f 72 20 76  en the onError v
5a40: 61 6c 75 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20  alue.** for the 
5a50: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 75 73  constraint is us
5a60: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ed..**.** The ca
5a70: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
5a80: 73 74 20 6f 70 65 6e 20 61 20 72 65 61 64 2f 77  st open a read/w
5a90: 72 69 74 65 20 63 75 72 73 6f 72 20 66 6f 72 20  rite cursor for 
5aa0: 70 54 61 62 20 77 69 74 68 0a 2a 2a 20 63 75 72  pTab with.** cur
5ab0: 73 6f 72 20 6e 75 6d 62 65 72 20 22 62 61 73 65  sor number "base
5ac0: 22 2e 20 20 41 6c 6c 20 69 6e 64 69 63 65 73 20  ".  All indices 
5ad0: 6f 66 20 70 54 61 62 20 6d 75 73 74 20 61 6c 73  of pTab must als
5ae0: 6f 20 68 61 76 65 20 6f 70 65 6e 0a 2a 2a 20 72  o have open.** r
5af0: 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
5b00: 73 20 77 69 74 68 20 63 75 72 73 6f 72 20 6e 75  s with cursor nu
5b10: 6d 62 65 72 20 62 61 73 65 2b 69 20 66 6f 72 20  mber base+i for 
5b20: 74 68 65 20 69 2d 74 68 20 63 75 72 73 6f 72 2e  the i-th cursor.
5b30: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 74  .** Except, if t
5b40: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73 69  here is no possi
5b50: 62 69 6c 69 74 79 20 6f 66 20 61 20 52 45 50 4c  bility of a REPL
5b60: 41 43 45 20 61 63 74 69 6f 6e 20 74 68 65 6e 0a  ACE action then.
5b70: 2a 2a 20 63 75 72 73 6f 72 73 20 64 6f 20 6e 6f  ** cursors do no
5b80: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6f 70 65  t need to be ope
5b90: 6e 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 68  n for indices wh
5ba0: 65 72 65 20 61 49 64 78 55 73 65 64 5b 69 5d 3d  ere aIdxUsed[i]=
5bb0: 3d 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  =0..**.** If the
5bc0: 20 69 73 55 70 64 61 74 65 20 66 6c 61 67 20 69   isUpdate flag i
5bd0: 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
5be0: 20 74 68 61 74 20 74 68 65 20 22 62 61 73 65 22   that the "base"
5bf0: 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 69 6e   cursor is.** in
5c00: 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 69 6e 67  itially pointing
5c10: 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
5c20: 74 20 69 73 20 62 65 69 6e 67 20 75 70 64 61 74  t is being updat
5c30: 65 64 2e 20 20 54 68 65 20 69 73 55 70 64 61 74  ed.  The isUpdat
5c40: 65 0a 2a 2a 20 66 6c 61 67 20 63 61 75 73 65 73  e.** flag causes
5c50: 20 65 78 74 72 61 20 63 6f 64 65 20 74 6f 20 62   extra code to b
5c60: 65 20 67 65 6e 65 72 61 74 65 64 20 73 6f 20 74  e generated so t
5c70: 68 61 74 20 74 68 65 20 22 62 61 73 65 22 20 63  hat the "base" c
5c80: 75 72 73 6f 72 0a 2a 2a 20 69 73 20 73 74 69 6c  ursor.** is stil
5c90: 6c 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  l pointing at th
5ca0: 65 20 73 61 6d 65 20 65 6e 74 72 79 20 61 66 74  e same entry aft
5cb0: 65 72 20 74 68 65 20 72 6f 75 74 69 6e 65 20 72  er the routine r
5cc0: 65 74 75 72 6e 73 2e 0a 2a 2a 20 57 69 74 68 6f  eturns..** Witho
5cd0: 75 74 20 74 68 65 20 69 73 55 70 64 61 74 65 20  ut the isUpdate 
5ce0: 66 6c 61 67 2c 20 74 68 65 20 22 62 61 73 65 22  flag, the "base"
5cf0: 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65   cursor might be
5d00: 20 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   moved..*/.void 
5d10: 73 71 6c 69 74 65 47 65 6e 65 72 61 74 65 43 6f  sqliteGenerateCo
5d20: 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 0a  nstraintChecks(.
5d30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5d40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5d50: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5d60: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
5d70: 20 20 20 20 20 2f 2a 20 74 68 65 20 74 61 62 6c       /* the tabl
5d80: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
5d90: 61 72 65 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f  are inserting */
5da0: 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20  .  int base,    
5db0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
5dc0: 6f 66 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  of a read/write 
5dd0: 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
5de0: 61 74 20 70 54 61 62 20 2a 2f 0a 20 20 63 68 61  at pTab */.  cha
5df0: 72 20 2a 61 49 64 78 55 73 65 64 2c 20 20 20 20  r *aIdxUsed,    
5e00: 20 2f 2a 20 57 68 69 63 68 20 69 6e 64 69 63 65   /* Which indice
5e10: 73 20 61 72 65 20 75 73 65 64 2e 20 20 4e 55 4c  s are used.  NUL
5e20: 4c 20 6d 65 61 6e 73 20 61 6c 6c 20 61 72 65 20  L means all are 
5e30: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  used */.  int re
5e40: 63 6e 6f 43 68 6e 67 2c 20 20 20 20 20 20 2f 2a  cnoChng,      /*
5e50: 20 54 72 75 65 20 69 66 20 74 68 65 20 72 65 63   True if the rec
5e60: 6f 72 64 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20  ord number will 
5e70: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
5e80: 69 73 55 70 64 61 74 65 2c 20 20 20 20 20 20 20  isUpdate,       
5e90: 2f 2a 20 54 72 75 65 20 66 6f 72 20 55 50 44 41  /* True for UPDA
5ea0: 54 45 2c 20 46 61 6c 73 65 20 66 6f 72 20 49 4e  TE, False for IN
5eb0: 53 45 52 54 20 2a 2f 0a 20 20 69 6e 74 20 6f 76  SERT */.  int ov
5ec0: 65 72 72 69 64 65 45 72 72 6f 72 2c 20 20 2f 2a  errideError,  /*
5ed0: 20 4f 76 65 72 72 69 64 65 20 6f 6e 45 72 72 6f   Override onErro
5ee0: 72 20 74 6f 20 74 68 69 73 20 69 66 20 6e 6f 74  r to this if not
5ef0: 20 4f 45 5f 44 65 66 61 75 6c 74 20 2a 2f 0a 20   OE_Default */. 
5f00: 20 69 6e 74 20 69 67 6e 6f 72 65 44 65 73 74 20   int ignoreDest 
5f10: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20       /* Jump to 
5f20: 74 68 69 73 20 6c 61 62 65 6c 20 6f 6e 20 61 6e  this label on an
5f30: 20 4f 45 5f 49 67 6e 6f 72 65 20 72 65 73 6f 6c   OE_Ignore resol
5f40: 75 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ution */.){.  in
5f50: 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  t i;.  Vdbe *v;.
5f60: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
5f70: 74 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 69 6e 74  t onError;.  int
5f80: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 65 78 74   addr;.  int ext
5f90: 72 61 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  ra;.  int iCur;.
5fa0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
5fb0: 20 69 6e 74 20 73 65 65 6e 52 65 70 6c 61 63 65   int seenReplace
5fc0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 75 6d 70   = 0;.  int jump
5fd0: 49 6e 73 74 31 2c 20 6a 75 6d 70 49 6e 73 74 32  Inst1, jumpInst2
5fe0: 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 41 64 64 72  ;.  int contAddr
5ff0: 3b 0a 20 20 69 6e 74 20 68 61 73 54 77 6f 52 65  ;.  int hasTwoRe
6000: 63 6e 6f 73 20 3d 20 28 69 73 55 70 64 61 74 65  cnos = (isUpdate
6010: 20 26 26 20 72 65 63 6e 6f 43 68 6e 67 29 3b 0a   && recnoChng);.
6020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
6030: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
6040: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6050: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
6060: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f  pSelect==0 );  /
6070: 2a 20 54 68 69 73 20 74 61 62 6c 65 20 69 73 20  * This table is 
6080: 6e 6f 74 20 61 20 56 49 45 57 20 2a 2f 0a 20 20  not a VIEW */.  
6090: 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  nCol = pTab->nCo
60a0: 6c 3b 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61 6c  l;..  /* Test al
60b0: 6c 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  l NOT NULL const
60c0: 72 61 69 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 66  raints..  */.  f
60d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
60e0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
60f0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
6100: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6110: 20 20 20 20 7d 0a 20 20 20 20 6f 6e 45 72 72 6f      }.    onErro
6120: 72 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  r = pTab->aCol[i
6130: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 20 20 69  ].notNull;.    i
6140: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  f( onError==OE_N
6150: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
6160: 20 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65      if( override
6170: 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c  Error!=OE_Defaul
6180: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
6190: 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72  or = overrideErr
61a0: 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  or;.    }else if
61b0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6f 6e  ( pParse->db->on
61c0: 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c  Error!=OE_Defaul
61d0: 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72  t ){.      onErr
61e0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  or = pParse->db-
61f0: 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65  >onError;.    }e
6200: 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  lse if( onError=
6210: 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
6220: 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f       onError = O
6230: 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  E_Abort;.    }. 
6240: 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d     if( onError==
6250: 4f 45 5f 52 65 70 6c 61 63 65 20 26 26 20 70 54  OE_Replace && pT
6260: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c  ab->aCol[i].zDfl
6270: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 6e  t==0 ){.      on
6280: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
6290: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
62a0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
62b0: 50 5f 44 75 70 2c 20 6e 43 6f 6c 2d 31 2d 69 2c  P_Dup, nCol-1-i,
62c0: 20 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20   1);.    addr = 
62d0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
62e0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 31  v, OP_NotNull, 1
62f0: 2c 20 30 29 3b 0a 20 20 20 20 73 77 69 74 63 68  , 0);.    switch
6300: 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ( onError ){.   
6310: 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
6320: 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ack:.      case 
6330: 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20 20  OE_Abort:.      
6340: 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b 0a  case OE_Fail: {.
6350: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
6360: 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
6370: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6380: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
6390: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f  TE_CONSTRAINT, o
63a0: 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  nError);.       
63b0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
63c0: 28 26 7a 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e  (&zMsg, pTab->zN
63d0: 61 6d 65 2c 20 22 2e 22 2c 20 70 54 61 62 2d 3e  ame, ".", pTab->
63e0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20  aCol[i].zName,. 
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 20 20 20 20 20 22 20 6d 61 79 20 6e 6f 74         " may not
6410: 20 62 65 20 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20   be NULL", 0);. 
6420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
6430: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
6440: 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49   zMsg, P3_DYNAMI
6450: 43 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  C);.        brea
6460: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6470: 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a   case OE_Ignore:
6480: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6490: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
64a0: 5f 50 6f 70 2c 20 6e 43 6f 6c 2b 31 2b 68 61 73  _Pop, nCol+1+has
64b0: 54 77 6f 52 65 63 6e 6f 73 2c 20 30 29 3b 0a 20  TwoRecnos, 0);. 
64c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
64d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
64e0: 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74  o, 0, ignoreDest
64f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6510: 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63 65 3a  case OE_Replace:
6520: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
6530: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6540: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
6550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
6560: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
6570: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e  , pTab->aCol[i].
6580: 7a 44 66 6c 74 2c 20 50 33 5f 53 54 41 54 49 43  zDflt, P3_STATIC
6590: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
65a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
65b0: 5f 50 75 73 68 2c 20 6e 43 6f 6c 2d 69 2c 20 30  _Push, nCol-i, 0
65c0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
65d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
65e0: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
65f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6600: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32  liteVdbeChangeP2
6610: 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65  (v, addr, sqlite
6620: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6630: 76 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  v));.  }..  /* T
6640: 65 73 74 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f  est all CHECK co
6650: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
6660: 20 2f 2a 2a 2a 2a 20 54 42 44 20 2a 2a 2a 2a 2f   /**** TBD ****/
6670: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
6680: 65 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  e an INTEGER PRI
6690: 4d 41 52 59 20 4b 45 59 2c 20 6d 61 6b 65 20 73  MARY KEY, make s
66a0: 75 72 65 20 74 68 65 20 70 72 69 6d 61 72 79 20  ure the primary 
66b0: 6b 65 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  key.  ** of the 
66c0: 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20  new record does 
66d0: 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 65  not previously e
66e0: 78 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 69  xist.  Except, i
66f0: 66 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 61  f this.  ** is a
6700: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 74 68 65  n UPDATE and the
6710: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
6720: 6e 6f 74 20 63 68 61 6e 67 69 6e 67 2c 20 74 68  not changing, th
6730: 61 74 20 69 73 20 4f 4b 2e 0a 20 20 2a 2f 0a 20  at is OK..  */. 
6740: 20 69 66 28 20 72 65 63 6e 6f 43 68 6e 67 20 29   if( recnoChng )
6750: 7b 0a 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20  {.    onError = 
6760: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 3b 0a 20  pTab->keyConf;. 
6770: 20 20 20 69 66 28 20 6f 76 65 72 72 69 64 65 45     if( overrideE
6780: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
6790: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
67a0: 72 20 3d 20 6f 76 65 72 72 69 64 65 45 72 72 6f  r = overrideErro
67b0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
67c0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6f 6e 45   pParse->db->onE
67d0: 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61 75 6c 74  rror!=OE_Default
67e0: 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f   ){.      onErro
67f0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  r = pParse->db->
6800: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  onError;.    }el
6810: 73 65 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  se if( onError==
6820: 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
6830: 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d 20 4f 45      onError = OE
6840: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
6850: 20 20 0a 20 20 20 20 69 66 28 20 69 73 55 70 64    .    if( isUpd
6860: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
6870: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6880: 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 2b 31 2c 20  OP_Dup, nCol+1, 
6890: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
68a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
68b0: 44 75 70 2c 20 6e 43 6f 6c 2b 31 2c 20 31 29 3b  Dup, nCol+1, 1);
68c0: 0a 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 31  .      jumpInst1
68d0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
68e0: 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20  Op(v, OP_Eq, 0, 
68f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
6900: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6910: 20 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 2c 20 31   OP_Dup, nCol, 1
6920: 29 3b 0a 20 20 20 20 6a 75 6d 70 49 6e 73 74 32  );.    jumpInst2
6930: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41 64 64   = sqliteVdbeAdd
6940: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  Op(v, OP_NotExis
6950: 74 73 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  ts, base, 0);.  
6960: 20 20 73 77 69 74 63 68 28 20 6f 6e 45 72 72 6f    switch( onErro
6970: 72 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61 75  r ){.      defau
6980: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 6f 6e  lt: {.        on
6990: 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72 74  Error = OE_Abort
69a0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c  ;.        /* Fal
69b0: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
69c0: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
69d0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
69e0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3a 0a 20 20 20  OE_Rollback:.   
69f0: 20 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74     case OE_Abort
6a00: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f  :.      case OE_
6a10: 46 61 69 6c 3a 20 7b 0a 20 20 20 20 20 20 20 20  Fail: {.        
6a20: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6a30: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
6a40: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f  TE_CONSTRAINT, o
6a50: 6e 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  nError);.       
6a60: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
6a70: 65 50 33 28 76 2c 20 2d 31 2c 20 22 50 52 49 4d  eP3(v, -1, "PRIM
6a80: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
6a90: 75 6e 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54  unique", P3_STAT
6aa0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  IC);.        bre
6ab0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6ac0: 20 20 63 61 73 65 20 4f 45 5f 52 65 70 6c 61 63    case OE_Replac
6ad0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e: {.        sql
6ae0: 69 74 65 47 65 6e 65 72 61 74 65 52 6f 77 49 6e  iteGenerateRowIn
6af0: 64 65 78 44 65 6c 65 74 65 28 70 50 61 72 73 65  dexDelete(pParse
6b00: 2d 3e 64 62 2c 20 76 2c 20 70 54 61 62 2c 20 62  ->db, v, pTab, b
6b10: 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
6b20: 20 69 66 28 20 69 73 55 70 64 61 74 65 20 29 7b   if( isUpdate ){
6b30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6b40: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6b50: 5f 44 75 70 2c 20 6e 43 6f 6c 2b 68 61 73 54 77  _Dup, nCol+hasTw
6b60: 6f 52 65 63 6e 6f 73 2c 20 31 29 3b 0a 20 20 20  oRecnos, 1);.   
6b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
6b80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
6b90: 65 54 6f 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eTo, base, 0);. 
6ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6bb0: 20 73 65 65 6e 52 65 70 6c 61 63 65 20 3d 20 31   seenReplace = 1
6bc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
6be0: 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 7b  ase OE_Ignore: {
6bf0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6c00: 20 73 65 65 6e 52 65 70 6c 61 63 65 3d 3d 30 20   seenReplace==0 
6c10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6c20: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
6c30: 5f 50 6f 70 2c 20 6e 43 6f 6c 2b 31 2b 68 61 73  _Pop, nCol+1+has
6c40: 54 77 6f 52 65 63 6e 6f 73 2c 20 30 29 3b 0a 20  TwoRecnos, 0);. 
6c50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
6c60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
6c70: 6f 2c 20 30 2c 20 69 67 6e 6f 72 65 44 65 73 74  o, 0, ignoreDest
6c80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6ca0: 20 20 20 20 63 6f 6e 74 41 64 64 72 20 3d 20 73      contAddr = s
6cb0: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
6cc0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
6cd0: 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32 28  iteVdbeChangeP2(
6ce0: 76 2c 20 6a 75 6d 70 49 6e 73 74 32 2c 20 63 6f  v, jumpInst2, co
6cf0: 6e 74 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28  ntAddr);.    if(
6d00: 20 69 73 55 70 64 61 74 65 20 29 7b 0a 20 20 20   isUpdate ){.   
6d10: 20 20 20 73 71 6c 69 74 65 56 64 62 65 43 68 61     sqliteVdbeCha
6d20: 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73  ngeP2(v, jumpIns
6d30: 74 31 2c 20 63 6f 6e 74 41 64 64 72 29 3b 0a 20  t1, contAddr);. 
6d40: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6d50: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
6d60: 6e 43 6f 6c 2b 31 2c 20 31 29 3b 0a 20 20 20 20  nCol+1, 1);.    
6d70: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
6d80: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
6d90: 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  base, 0);.    }.
6da0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 61    }..  /* Test a
6db0: 6c 6c 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ll UNIQUE constr
6dc0: 61 69 6e 74 73 20 62 79 20 63 72 65 61 74 69 6e  aints by creatin
6dd0: 67 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  g entries for ea
6de0: 63 68 20 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69  ch UNIQUE.  ** i
6df0: 6e 64 65 78 20 61 6e 64 20 6d 61 6b 69 6e 67 20  ndex and making 
6e00: 73 75 72 65 20 74 68 61 74 20 64 75 70 6c 69 63  sure that duplic
6e10: 61 74 65 20 65 6e 74 72 69 65 73 20 64 6f 20 6e  ate entries do n
6e20: 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
6e30: 2e 0a 20 20 2a 2a 20 41 64 64 20 74 68 65 20 6e  ..  ** Add the n
6e40: 65 77 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68  ew records to th
6e50: 65 20 69 6e 64 69 63 65 73 20 61 73 20 77 65 20  e indices as we 
6e60: 67 6f 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  go..  */.  extra
6e70: 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 43 75   = -1;.  for(iCu
6e80: 72 3d 30 2c 20 70 49 64 78 3d 70 54 61 62 2d 3e  r=0, pIdx=pTab->
6e90: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
6ea0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 2c 20  dx=pIdx->pNext, 
6eb0: 69 43 75 72 2b 2b 29 7b 0a 20 20 20 20 69 66 28  iCur++){.    if(
6ec0: 20 61 49 64 78 55 73 65 64 20 26 26 20 61 49 64   aIdxUsed && aId
6ed0: 78 55 73 65 64 5b 69 43 75 72 5d 3d 3d 30 20 29  xUsed[iCur]==0 )
6ee0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 53   continue;  /* S
6ef0: 6b 69 70 20 75 6e 75 73 65 64 20 69 6e 64 69 63  kip unused indic
6f00: 65 73 20 2a 2f 0a 20 20 20 20 65 78 74 72 61 2b  es */.    extra+
6f10: 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  +;..    /* Creat
6f20: 65 20 61 20 6b 65 79 20 66 6f 72 20 61 63 63 65  e a key for acce
6f30: 73 73 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  ssing the index 
6f40: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 73 71 6c  entry */.    sql
6f50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6f60: 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 2b 65 78 74  OP_Dup, nCol+ext
6f70: 72 61 2c 20 31 29 3b 0a 20 20 20 20 66 6f 72 28  ra, 1);.    for(
6f80: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
6f90: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6fa0: 20 20 69 6e 74 20 69 64 78 20 3d 20 70 49 64 78    int idx = pIdx
6fb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
6fc0: 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d 70 54       if( idx==pT
6fd0: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
6fe0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
6ff0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
7000: 69 2b 65 78 74 72 61 2b 6e 43 6f 6c 2b 31 2c 20  i+extra+nCol+1, 
7010: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
7020: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
7030: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
7040: 75 70 2c 20 69 2b 65 78 74 72 61 2b 6e 43 6f 6c  up, i+extra+nCol
7050: 2d 69 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  -idx, 1);.      
7060: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a 75 6d 70  }.    }.    jump
7070: 49 6e 73 74 31 20 3d 20 73 71 6c 69 74 65 56 64  Inst1 = sqliteVd
7080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
7090: 6b 65 49 64 78 4b 65 79 2c 20 70 49 64 78 2d 3e  keIdxKey, pIdx->
70a0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
70b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
70c0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
70d0: 29 20 73 71 6c 69 74 65 41 64 64 49 64 78 4b 65  ) sqliteAddIdxKe
70e0: 79 54 79 70 65 28 76 2c 20 70 49 64 78 29 3b 0a  yType(v, pIdx);.
70f0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
7100: 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20   what action to 
7110: 74 61 6b 65 20 69 6e 20 63 61 73 65 20 74 68 65  take in case the
7120: 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 69 6e  re is an indexin
7130: 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  g conflict */.  
7140: 20 20 6f 6e 45 72 72 6f 72 20 3d 20 70 49 64 78    onError = pIdx
7150: 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69  ->onError;.    i
7160: 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e  f( onError==OE_N
7170: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  one ) continue; 
7180: 20 2f 2a 20 70 49 64 78 20 69 73 20 6e 6f 74 20   /* pIdx is not 
7190: 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 2a  a UNIQUE index *
71a0: 2f 0a 20 20 20 20 69 66 28 20 6f 76 65 72 72 69  /.    if( overri
71b0: 64 65 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61  deError!=OE_Defa
71c0: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
71d0: 72 72 6f 72 20 3d 20 6f 76 65 72 72 69 64 65 45  rror = overrideE
71e0: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rror;.    }else 
71f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
7200: 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 44 65 66 61  onError!=OE_Defa
7210: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 6f 6e 45  ult ){.      onE
7220: 72 72 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 64  rror = pParse->d
7230: 62 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  b->onError;.    
7240: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 45 72 72 6f  }else if( onErro
7250: 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
7260: 0a 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 20 3d  .      onError =
7270: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d   OE_Abort;.    }
7280: 0a 20 20 20 20 69 66 28 20 73 65 65 6e 52 65 70  .    if( seenRep
7290: 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66  lace ){.      if
72a0: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 49 67  ( onError==OE_Ig
72b0: 6e 6f 72 65 20 29 20 6f 6e 45 72 72 6f 72 20 3d  nore ) onError =
72c0: 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20   OE_Replace;.   
72d0: 20 20 20 65 6c 73 65 20 69 66 28 20 6f 6e 45 72     else if( onEr
72e0: 72 6f 72 3d 3d 4f 45 5f 46 61 69 6c 20 29 20 6f  ror==OE_Fail ) o
72f0: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 41 62 6f 72  nError = OE_Abor
7300: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 0a 20  t;.    }.    .. 
7310: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
7320: 65 65 20 69 66 20 74 68 65 20 6e 65 77 20 69 6e  ee if the new in
7330: 64 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  dex entry will b
7340: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 20 20  e unique */.    
7350: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7360: 76 2c 20 4f 50 5f 44 75 70 2c 20 65 78 74 72 61  v, OP_Dup, extra
7370: 2b 6e 43 6f 6c 2b 31 2b 68 61 73 54 77 6f 52 65  +nCol+1+hasTwoRe
7380: 63 6e 6f 73 2c 20 31 29 3b 0a 20 20 20 20 6a 75  cnos, 1);.    ju
7390: 6d 70 49 6e 73 74 32 20 3d 20 73 71 6c 69 74 65  mpInst2 = sqlite
73a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
73b0: 49 73 55 6e 69 71 75 65 2c 20 62 61 73 65 2b 69  IsUnique, base+i
73c0: 43 75 72 2b 31 2c 20 30 29 3b 0a 0a 20 20 20 20  Cur+1, 0);..    
73d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
73e0: 20 74 68 61 74 20 65 78 65 63 75 74 65 73 20 69   that executes i
73f0: 66 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 20  f the new index 
7400: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 75 6e 69  entry is not uni
7410: 71 75 65 20 2a 2f 0a 20 20 20 20 73 77 69 74 63  que */.    switc
7420: 68 28 20 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  h( onError ){.  
7430: 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c      case OE_Roll
7440: 62 61 63 6b 3a 0a 20 20 20 20 20 20 63 61 73 65  back:.      case
7450: 20 4f 45 5f 41 62 6f 72 74 3a 0a 20 20 20 20 20   OE_Abort:.     
7460: 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 7b   case OE_Fail: {
7470: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20  .        int j, 
7480: 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 20 20 20 20  n1, n2;.        
7490: 63 68 61 72 20 7a 45 72 72 4d 73 67 5b 32 30 30  char zErrMsg[200
74a0: 5d 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  ];.        strcp
74b0: 79 28 7a 45 72 72 4d 73 67 2c 20 70 49 64 78 2d  y(zErrMsg, pIdx-
74c0: 3e 6e 43 6f 6c 75 6d 6e 3e 31 20 3f 20 22 63 6f  >nColumn>1 ? "co
74d0: 6c 75 6d 6e 73 20 22 20 3a 20 22 63 6f 6c 75 6d  lumns " : "colum
74e0: 6e 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 31  n ");.        n1
74f0: 20 3d 20 73 74 72 6c 65 6e 28 7a 45 72 72 4d 73   = strlen(zErrMs
7500: 67 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  g);.        for(
7510: 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
7520: 6c 75 6d 6e 20 26 26 20 6e 31 3c 73 69 7a 65 6f  lumn && n1<sizeo
7530: 66 28 7a 45 72 72 4d 73 67 29 2d 33 30 3b 20 6a  f(zErrMsg)-30; j
7540: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
7550: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 54 61 62  har *zCol = pTab
7560: 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
7570: 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
7580: 0a 20 20 20 20 20 20 20 20 20 20 6e 32 20 3d 20  .          n2 = 
7590: 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20 20  strlen(zCol);.  
75a0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
75b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
75c0: 74 72 63 70 79 28 26 7a 45 72 72 4d 73 67 5b 6e  trcpy(&zErrMsg[n
75d0: 31 5d 2c 20 22 2c 20 22 29 3b 0a 20 20 20 20 20  1], ", ");.     
75e0: 20 20 20 20 20 20 20 6e 31 20 2b 3d 20 32 3b 0a         n1 += 2;.
75f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7600: 20 20 20 20 20 20 69 66 28 20 6e 31 2b 6e 32 3e        if( n1+n2>
7610: 73 69 7a 65 6f 66 28 7a 45 72 72 4d 73 67 29 2d  sizeof(zErrMsg)-
7620: 33 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  30 ){.          
7630: 20 20 73 74 72 63 70 79 28 26 7a 45 72 72 4d 73    strcpy(&zErrMs
7640: 67 5b 6e 31 5d 2c 20 22 2e 2e 2e 22 29 3b 0a 20  g[n1], "...");. 
7650: 20 20 20 20 20 20 20 20 20 20 20 6e 31 20 2b 3d             n1 +=
7660: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
7670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7690: 20 20 20 20 73 74 72 63 70 79 28 26 7a 45 72 72      strcpy(&zErr
76a0: 4d 73 67 5b 6e 31 5d 2c 20 7a 43 6f 6c 29 3b 0a  Msg[n1], zCol);.
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 31 20 2b              n1 +
76c0: 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = n2;.          
76d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
76e0: 20 20 20 20 73 74 72 63 70 79 28 26 7a 45 72 72      strcpy(&zErr
76f0: 4d 73 67 5b 6e 31 5d 2c 20 0a 20 20 20 20 20 20  Msg[n1], .      
7700: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c        pIdx->nCol
7710: 75 6d 6e 3e 31 20 3f 20 22 20 61 72 65 20 6e 6f  umn>1 ? " are no
7720: 74 20 75 6e 69 71 75 65 22 20 3a 20 22 20 69 73  t unique" : " is
7730: 20 6e 6f 74 20 75 6e 69 71 75 65 22 29 3b 0a 20   not unique");. 
7740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62         sqliteVdb
7750: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c  eAddOp(v, OP_Hal
7760: 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
7770: 41 49 4e 54 2c 20 6f 6e 45 72 72 6f 72 29 3b 0a  AINT, onError);.
7780: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
7790: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
77a0: 2c 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  , sqliteStrDup(z
77b0: 45 72 72 4d 73 67 29 2c 20 50 33 5f 44 59 4e 41  ErrMsg), P3_DYNA
77c0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 62 72  MIC);.        br
77d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
77e0: 20 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72     case OE_Ignor
77f0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e: {.        ass
7800: 65 72 74 28 20 73 65 65 6e 52 65 70 6c 61 63 65  ert( seenReplace
7810: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==0 );.        s
7820: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
7830: 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 2b 65  , OP_Pop, nCol+e
7840: 78 74 72 61 2b 33 2b 68 61 73 54 77 6f 52 65 63  xtra+3+hasTwoRec
7850: 6e 6f 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nos, 0);.       
7860: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
7870: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
7880: 69 67 6e 6f 72 65 44 65 73 74 29 3b 0a 20 20 20  ignoreDest);.   
7890: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
78a0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
78b0: 45 5f 52 65 70 6c 61 63 65 3a 20 7b 0a 20 20 20  E_Replace: {.   
78c0: 20 20 20 20 20 73 71 6c 69 74 65 47 65 6e 65 72       sqliteGener
78d0: 61 74 65 52 6f 77 44 65 6c 65 74 65 28 70 50 61  ateRowDelete(pPa
78e0: 72 73 65 2d 3e 64 62 2c 20 76 2c 20 70 54 61 62  rse->db, v, pTab
78f0: 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  , base, 0);.    
7900: 20 20 20 20 69 66 28 20 69 73 55 70 64 61 74 65      if( isUpdate
7910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7920: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
7930: 20 4f 50 5f 44 75 70 2c 20 6e 43 6f 6c 2b 65 78   OP_Dup, nCol+ex
7940: 74 72 61 2b 31 2b 68 61 73 54 77 6f 52 65 63 6e  tra+1+hasTwoRecn
7950: 6f 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  os, 1);.        
7960: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7970: 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 54 6f 2c 20  p(v, OP_MoveTo, 
7980: 62 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  base, 0);.      
7990: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65 65 6e    }.        seen
79a0: 52 65 70 6c 61 63 65 20 3d 20 31 3b 0a 20 20 20  Replace = 1;.   
79b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
79c0: 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c    }.      defaul
79d0: 74 3a 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20  t: assert(0);.  
79e0: 20 20 7d 0a 20 20 20 20 63 6f 6e 74 41 64 64 72    }.    contAddr
79f0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
7a00: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 23 69 66  rentAddr(v);.#if
7a10: 20 4e 55 4c 4c 5f 44 49 53 54 49 4e 43 54 5f 46   NULL_DISTINCT_F
7a20: 4f 52 5f 55 4e 49 51 55 45 0a 20 20 20 20 73 71  OR_UNIQUE.    sq
7a30: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 32  liteVdbeChangeP2
7a40: 28 76 2c 20 6a 75 6d 70 49 6e 73 74 31 2c 20 63  (v, jumpInst1, c
7a50: 6f 6e 74 41 64 64 72 29 3b 0a 23 65 6e 64 69 66  ontAddr);.#endif
7a60: 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 43  .    sqliteVdbeC
7a70: 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49  hangeP2(v, jumpI
7a80: 6e 73 74 32 2c 20 63 6f 6e 74 41 64 64 72 29 3b  nst2, contAddr);
7a90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
7aa0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
7ab0: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 66 69 6e  ates code to fin
7ac0: 69 73 68 20 74 68 65 20 49 4e 53 45 52 54 20 6f  ish the INSERT o
7ad0: 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69  r UPDATE operati
7ae0: 6f 6e 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 73  on.** that was s
7af0: 74 61 72 74 65 64 20 62 79 20 61 20 70 72 69 6f  tarted by a prio
7b00: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
7b10: 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
7b20: 6e 74 43 68 65 63 6b 73 2e 0a 2a 2a 20 54 68 65  ntChecks..** The
7b30: 20 73 74 61 63 6b 20 6d 75 73 74 20 63 6f 6e 74   stack must cont
7b40: 61 69 6e 20 6b 65 79 73 20 66 6f 72 20 61 6c 6c  ain keys for all
7b50: 20 61 63 74 69 76 65 20 69 6e 64 69 63 65 73 20   active indices 
7b60: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 64 61 74 61  followed by data
7b70: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 63 6e  .** and the recn
7b80: 6f 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  o for the new en
7b90: 74 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  try.  This routi
7ba0: 6e 65 20 63 72 65 61 74 65 73 20 74 68 65 20 6e  ne creates the n
7bb0: 65 77 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e  ew.** entries in
7bc0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 6e 64   all indices and
7bd0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
7be0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  le..**.** The ar
7bf0: 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 20  guments to this 
7c00: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
7c10: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
7c20: 65 20 66 69 72 73 74 20 73 69 78 0a 2a 2a 20 61  e first six.** a
7c30: 72 67 75 6d 65 6e 74 73 20 74 6f 20 73 71 6c 69  rguments to sqli
7c40: 74 65 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72  teGenerateConstr
7c50: 61 69 6e 74 43 68 65 63 6b 73 2e 0a 2a 2f 0a 76  aintChecks..*/.v
7c60: 6f 69 64 20 73 71 6c 69 74 65 43 6f 6d 70 6c 65  oid sqliteComple
7c70: 74 65 49 6e 73 65 72 74 69 6f 6e 28 0a 20 20 50  teInsertion(.  P
7c80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7c90: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
7ca0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
7cb0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
7cc0: 20 20 2f 2a 20 74 68 65 20 74 61 62 6c 65 20 69    /* the table i
7cd0: 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
7ce0: 20 69 6e 73 65 72 74 69 6e 67 20 2a 2f 0a 20 20   inserting */.  
7cf0: 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20  int base,       
7d00: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
7d10: 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  a read/write cur
7d20: 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  sor pointing at 
7d30: 70 54 61 62 20 2a 2f 0a 20 20 63 68 61 72 20 2a  pTab */.  char *
7d40: 61 49 64 78 55 73 65 64 2c 20 20 20 20 20 2f 2a  aIdxUsed,     /*
7d50: 20 57 68 69 63 68 20 69 6e 64 69 63 65 73 20 61   Which indices a
7d60: 72 65 20 75 73 65 64 2e 20 20 4e 55 4c 4c 20 6d  re used.  NULL m
7d70: 65 61 6e 73 20 61 6c 6c 20 61 72 65 20 75 73 65  eans all are use
7d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 63 6e 6f  d */.  int recno
7d90: 43 68 6e 67 2c 20 20 20 20 20 20 2f 2a 20 54 72  Chng,      /* Tr
7da0: 75 65 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ue if the record
7db0: 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 63 68 61   number will cha
7dc0: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55  nge */.  int isU
7dd0: 70 64 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  pdate,       /* 
7de0: 54 72 75 65 20 66 6f 72 20 55 50 44 41 54 45 2c  True for UPDATE,
7df0: 20 46 61 6c 73 65 20 66 6f 72 20 49 4e 53 45 52   False for INSER
7e00: 54 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 49 64  T */.  int newId
7e10: 78 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  x          /* In
7e20: 64 65 78 20 6f 66 20 4e 45 57 20 74 61 62 6c 65  dex of NEW table
7e30: 20 66 6f 72 20 74 72 69 67 67 65 72 73 2e 20 20   for triggers.  
7e40: 2d 31 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 29 7b  -1 if none */.){
7e50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
7e60: 20 2a 76 3b 0a 20 20 69 6e 74 20 6e 49 64 78 3b   *v;.  int nIdx;
7e70: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
7e80: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 47 65 74  .  v = sqliteGet
7e90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
7ea0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
7eb0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
7ec0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 2f  pSelect==0 );  /
7ed0: 2a 20 54 68 69 73 20 74 61 62 6c 65 20 69 73 20  * This table is 
7ee0: 6e 6f 74 20 61 20 56 49 45 57 20 2a 2f 0a 20 20  not a VIEW */.  
7ef0: 66 6f 72 28 6e 49 64 78 3d 30 2c 20 70 49 64 78  for(nIdx=0, pIdx
7f00: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
7f10: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
7f20: 70 4e 65 78 74 2c 20 6e 49 64 78 2b 2b 29 7b 7d  pNext, nIdx++){}
7f30: 0a 20 20 66 6f 72 28 69 3d 6e 49 64 78 2d 31 3b  .  for(i=nIdx-1;
7f40: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7f50: 20 69 66 28 20 61 49 64 78 55 73 65 64 20 26 26   if( aIdxUsed &&
7f60: 20 61 49 64 78 55 73 65 64 5b 69 5d 3d 3d 30 20   aIdxUsed[i]==0 
7f70: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7f80: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
7f90: 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 62 61  v, OP_IdxPut, ba
7fa0: 73 65 2b 69 2b 31 2c 20 30 29 3b 0a 20 20 7d 0a  se+i+1, 0);.  }.
7fb0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
7fc0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
7fd0: 72 64 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  rd, pTab->nCol, 
7fe0: 30 29 3b 0a 20 20 69 66 28 20 6e 65 77 49 64 78  0);.  if( newIdx
7ff0: 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
8000: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
8010: 5f 44 75 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Dup, 1, 0);.   
8020: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
8030: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 30  (v, OP_Dup, 1, 0
8040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 56 64 62  );.    sqliteVdb
8050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
8060: 49 6e 74 4b 65 79 2c 20 6e 65 77 49 64 78 2c 20  IntKey, newIdx, 
8070: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
8080: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8090: 50 75 74 49 6e 74 4b 65 79 2c 20 62 61 73 65 2c  PutIntKey, base,
80a0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
80b0: 63 6b 3f 30 3a 31 29 3b 0a 20 20 69 66 28 20 69  ck?0:1);.  if( i
80c0: 73 55 70 64 61 74 65 20 26 26 20 72 65 63 6e 6f  sUpdate && recno
80d0: 43 68 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Chng ){.    sqli
80e0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
80f0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
8100: 7d 0a 7d 0a                                      }.}.