/ Hex Artifact Content
Login

Artifact b18a5c7cc68fe77fd6cc30f6bbeefc3ece909108:


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 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 3c 3c 3c 3c    PRAGMA.**.<<<<
02e0: 3c 3c 3c 20 62 75 69 6c 64 2e 63 0a 2a 2a 20 24  <<< build.c.** $
02f0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
0300: 32 36 33 20 32 30 30 34 2f 31 31 2f 30 35 20 30  263 2004/11/05 0
0310: 33 3a 35 36 3a 30 32 20 64 72 68 20 45 78 70 20  3:56:02 drh Exp 
0320: 24 0a 3d 3d 3d 3d 3d 3d 3d 0a 2a 2a 20 24 49 64  $.=======.** $Id
0330: 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e 32 36  : build.c,v 1.26
0340: 33 20 32 30 30 34 2f 31 31 2f 30 35 20 30 33 3a  3 2004/11/05 03:
0350: 35 36 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a  56:02 drh Exp $.
0360: 3e 3e 3e 3e 3e 3e 3e 20 31 2e 32 36 32 0a 2a 2f  >>>>>>> 1.262.*/
0370: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0380: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0390: 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a   <ctype.h>../*.*
03a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
03b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
03c0: 6e 65 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  new SQL statemen
03d0: 74 20 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74  t is beginning t
03e0: 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20  o.** be parsed. 
03f0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
0400: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
0410: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 65 65  the database nee
0420: 64 73 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64  ds.** to be read
0430: 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45   from the SQLITE
0440: 5f 4d 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49  _MASTER and SQLI
0450: 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74  TE_TEMP_MASTER t
0460: 61 62 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20  ables..** If it 
0470: 64 6f 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20  does, then read 
0480: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
0490: 74 65 33 42 65 67 69 6e 50 61 72 73 65 28 50 61  te3BeginParse(Pa
04a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
04b0: 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20   explainFlag){. 
04c0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04d0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04e0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
04f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
0500: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0510: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0520: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0530: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0540: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0550: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0560: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0570: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0580: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0590: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
05a0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
05b0: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
05c0: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
05d0: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
05e0: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
05f0: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0600: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0610: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0620: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0630: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0640: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0650: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0660: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0670: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0680: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0690: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
06a0: 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v;..  if( sqlite
06b0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
06c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
06d0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
06e0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42   return;..  /* B
06f0: 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69  egin by generati
0700: 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74  ng some terminat
0710: 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20  ion code at the 
0720: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  end of the.  ** 
0730: 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a  vdbe program.  *
0740: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
0750: 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  >db;.  v = sqlit
0760: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
0770: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
0780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0790: 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  Op(v, OP_Halt, 0
07a0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
07b0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
07c0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
07d0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
07e0: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
07f0: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
0800: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
0810: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
0820: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
0830: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
0840: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
0850: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
0860: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
0870: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
0880: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
0890: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
08a0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
08b0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
08c0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
08d0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
08e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
08f0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
0900: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
0910: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  mask;.      int 
0920: 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  iDb;.      sqlit
0930: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
0940: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0950: 47 6f 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56  Goto-1, sqlite3V
0960: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
0970: 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44  ));.      for(iD
0980: 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62  b=0, mask=1; iDb
0990: 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c  <db->nDb; mask<<
09a0: 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  =1, iDb++){.    
09b0: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
09c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
09d0: 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  sk)==0 ) continu
09e0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
09f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
0a00: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
0a10: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
0a20: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
0a30: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
0a40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
0a50: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
0a60: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
0a70: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
0a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
0a90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0aa0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
0ab0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
0ac0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
0ad0: 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68  * Add a No-op th
0ae0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
0af0: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
0b00: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51   the compiled SQ
0b10: 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  L.    ** stateme
0b20: 6e 74 20 61 73 20 69 74 73 20 50 33 20 61 72 67  nt as its P3 arg
0b30: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65  ument.  This doe
0b40: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
0b50: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20   functionality. 
0b60: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f     ** of the pro
0b70: 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  gram. .    **.  
0b80: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
0b90: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
0ba0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 66  qlite3_trace() f
0bb0: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20 20  unctionality..  
0bc0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0bd0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0be0: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0bf0: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0c00: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0c10: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0c20: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0c30: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0c40: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0c50: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0c60: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0c70: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0c80: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0c90: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0ca0: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0cb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0cc0: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0ce0: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0cf0: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0d00: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0d30: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0d40: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0d50: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0d60: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0d70: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0d80: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0d90: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0da0: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0db0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0dc0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0dd0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0de0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0df0: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0e00: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0e10: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0e20: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0e30: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0e40: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0e50: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0e60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
0e70: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
0e80: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
0e90: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
0ea0: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
0eb0: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
0ec0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
0ed0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
0ee0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
0ef0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
0f00: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
0f10: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
0f20: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
0f30: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
0f40: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
0f50: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
0f60: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
0f70: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
0f80: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
0f90: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
0fa0: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
0fb0: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
0fc0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
0fd0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
0fe0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
0ff0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1000: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1010: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1020: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1030: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1040: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1050: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1060: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1070: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1080: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1090: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
10a0: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
10b0: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
10c0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
10d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
10e0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
10f0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1100: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1110: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1120: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1130: 20 20 69 6e 74 20 72 63 3b 0a 23 20 64 65 66 69    int rc;.# defi
1140: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1150: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1160: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1170: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1180: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
1190: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
11a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
11b0: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
11c0: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
11d0: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
11e0: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
11f0: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1200: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1210: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1220: 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
1230: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1240: 28 61 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  (ap);.  pParse->
1250: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1260: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1270: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1280: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1290: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
12a0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 72 63 20 3d  SAVE_SZ);.  rc =
12b0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
12c0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
12d0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  0);.  sqliteFree
12e0: 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  (zSql);.  memcpy
12f0: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1300: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
1310: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
1320: 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ted--;.}../*.** 
1330: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1340: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1350: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
1360: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1370: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
1380: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
1390: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
13a0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
13b0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
13c0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
13d0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
13e0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
13f0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1400: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1410: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1420: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1430: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
1440: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
1450: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
1460: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
1470: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
1480: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
1490: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
14a0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
14b0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
14c0: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
14d0: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
14e0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
14f0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
1500: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
1510: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
1520: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
1530: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
1540: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
1550: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1560: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1570: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
1580: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
1590: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
15a0: 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( zName!=0 );. 
15b0: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
15c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
15d0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
15e0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
15f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1600: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
1610: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
1620: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
1630: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
1640: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1650: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
1660: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1670: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
1680: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
1690: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
16a0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
16b0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61  db->aDb[j].tblHa
16c0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
16d0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
16e0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
16f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1700: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1710: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1720: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1730: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1740: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1750: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1760: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1770: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1780: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1790: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
17b0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
17c0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
17d0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
17e0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
17f0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
1800: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
1810: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1820: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1830: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
1840: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
1850: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
1860: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
1870: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1880: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
1890: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
18a0: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
18b0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
18c0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
18d0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
18e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
18f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
1900: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
1910: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1920: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1930: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1940: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1950: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1960: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1970: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1980: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1990: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
19a0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
19b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19c0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
19d0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
19e0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
19f0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
1a00: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
1a10: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
1a20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a30: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a40: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
1a50: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
1a60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1a70: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
1a80: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1a90: 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ab0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1ac0: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e  \"%s\" is not in
1ad0: 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1ae0: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
1af0: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20  e, zDbase);.    
1b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1b10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b20: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1b30: 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ble: %s", zName)
1b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1b50: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1b60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1b70: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
1b80: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1b90: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1ba0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
1bb0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
1bc0: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
1bd0: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
1be0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
1bf0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c00: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1c10: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
1c20: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1c30: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1c40: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1c50: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1c60: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c70: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
1c80: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
1c90: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
1ca0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1cb0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
1cc0: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
1cd0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1ce0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
1cf0: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
1d00: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1d10: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
1d20: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
1d30: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1d40: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
1d50: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
1d60: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
1d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d80: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1d90: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
1da0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1db0: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1dc0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1dd0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
1de0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1df0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1e00: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
1e10: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
1e20: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
1e30: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
1e40: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
1e50: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
1e60: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
1e70: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
1e80: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
1e90: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
1ea0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61  db->aDb[j].idxHa
1eb0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
1ec0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
1ed0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
1ee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
1f00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
1f10: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
1f20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
1f30: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
1f40: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
1f50: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
1f60: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
1f70: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1f80: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1f90: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1fa0: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1fb0: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1fc0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1fd0: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1fe0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
1ff0: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
2000: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
2010: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
2020: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
2030: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
2040: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2050: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2060: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2070: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2080: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2090: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
20a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
20b0: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
20c0: 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74  *pOld;..  assert
20d0: 28 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e  ( db!=0 && p->zN
20e0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64  ame!=0 );.  pOld
20f0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2100: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
2110: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70  >iDb].idxHash, p
2120: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2140: 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61     strlen(p->zNa
2150: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
2160: 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64   pOld!=0 && pOld
2170: 21 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=p ){.    sqlit
2180: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
2190: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
21a0: 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61  xHash, pOld->zNa
21b0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
21c0: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
21d0: 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  pOld->zName)+1, 
21e0: 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 66 72 65  pOld);.  }.  fre
21f0: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2200: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
2210: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
2220: 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
2230: 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e  remove.** the in
2240: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
2250: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
2260: 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72  d free its memor
2270: 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e  y.** structures.
2280: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2290: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
22a0: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
22b0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
22c0: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
22d0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
22e0: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  x;.  int len;.. 
22f0: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2300: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2310: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2320: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2330: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49 64  Db].idxHash, zId
2340: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
2350: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2360: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2370: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2380: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2390: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
23a0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
23b0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
23c0: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
23d0: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
23e0: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
23f0: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2400: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2410: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2420: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2430: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2440: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2450: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2460: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2470: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2480: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2490: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
24a0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
24b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
24c0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
24d0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
24e0: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
24f0: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2500: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2510: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2520: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2530: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
2540: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2550: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
2560: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2570: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
2580: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
2590: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
25a0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
25b0: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
25c0: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
25d0: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
25e0: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
25f0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2600: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
2610: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
2620: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
2630: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
2640: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2650: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
2660: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
2670: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
2680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
2690: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
26a0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
26b0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68  int iDb){.  Hash
26c0: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
26d0: 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73  ash temp1;.  Has
26e0: 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69  h temp2;.  int i
26f0: 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  , j;..  assert( 
2700: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
2710: 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66  ->nDb );.  db->f
2720: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2730: 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66  Initialized;.  f
2740: 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e  or(i=iDb; i<db->
2750: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
2760: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2770: 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20  b[i];.    temp1 
2780: 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a  = pDb->tblHash;.
2790: 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d      temp2 = pDb-
27a0: 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73  >trigHash;.    s
27b0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
27c0: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53  pDb->trigHash, S
27d0: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
27e0: 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  G, 0);.    sqlit
27f0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  e3HashClear(&pDb
2800: 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71  ->aFKey);.    sq
2810: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2820: 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20  pDb->idxHash);. 
2830: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
2840: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
2850: 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp2); pElem; pEl
2860: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2870: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
2880: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
2890: 69 67 67 65 72 28 28 54 72 69 67 67 65 72 2a 29  igger((Trigger*)
28a0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
28b0: 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Elem));.    }.  
28c0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
28d0: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
28e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
28f0: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53  &pDb->tblHash, S
2900: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2910: 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70  G, 0);.    for(p
2920: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
2930: 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45  irst(&temp1); pE
2940: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2950: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2960: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2970: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
2980: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
2990: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
29a0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
29b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29c0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65  te3HashClear(&te
29d0: 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61  mp1);.    DbClea
29e0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  rProperty(db, i,
29f0: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2a00: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30  );.    if( iDb>0
2a10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
2a20: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
2a30: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2a40: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2a50: 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49  Changes;..  /* I
2a60: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
2a70: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2a80: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
2a90: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
2aa0: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
2ab0: 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75  then from the au
2ac0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2ad0: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
2ae0: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
2af0: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
2b00: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
2b10: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
2b20: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
2b30: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
2b40: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
2b50: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2b60: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
2b70: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
2b80: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2b90: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2ba0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2bb0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2bc0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2bd0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2be0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
2bf0: 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70  ( pDb->pAux && p
2c00: 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70  Db->xFreeAux ) p
2c10: 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62  Db->xFreeAux(pDb
2c20: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70  ->pAux);.      p
2c30: 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  Db->pAux = 0;.  
2c40: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
2c50: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
2c60: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2c70: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2c80: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2c90: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2ca0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
2cb0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
2cc0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
2cd0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
2ce0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
2cf0: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
2d00: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
2d10: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
2d20: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
2d30: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
2d40: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
2d50: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
2d60: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
2d70: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
2d80: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
2d90: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
2da0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
2db0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
2dc0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
2dd0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
2de0: 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44  qliteFree(db->aD
2df0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
2e00: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
2e10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2e20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2e30: 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20  lled whenever a 
2e40: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
2e50: 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a    If there were.
2e60: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
2e70: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
2e80: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77  nsaction, then w
2e90: 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20  e have to reset 
2ea0: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  the.** internal 
2eb0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2ec0: 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d  reload them from
2ed0: 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   disk..*/.void s
2ee0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e  qlite3RollbackIn
2ef0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2f00: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
2f10: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
2f20: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2f30: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
2f40: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
2f50: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
2f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f80: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
2f90: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
2fa0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
2fb0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2fc0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
2fd0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2fe0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
2ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3000: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
3010: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20  from a table or 
3020: 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  view..*/.static 
3030: 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74  void sqliteReset
3040: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
3050: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
3060: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
3070: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
3080: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  Table!=0 );.  fo
3090: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
30a0: 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  le->aCol; i<pTab
30b0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
30c0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Col++){.    sqli
30d0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
30e0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
30f0: 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  ree(pCol->zDflt)
3100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3110: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
3120: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
3130: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
3140: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
3150: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
3160: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
3170: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
3180: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
3190: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
31a0: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
31b0: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
31c0: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
31d0: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
31e0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
31f0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
3200: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
3210: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
3220: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
3230: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
3240: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
3250: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
3260: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
3270: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
3280: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
3290: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
32a0: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
32b0: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
32c0: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
32d0: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
32e0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
32f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
3300: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
3310: 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * Indices associ
3320: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
3330: 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64  ble are unlinked
3340: 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a   from the "db".*
3350: 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  * data structure
3360: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49   if db!=NULL.  I
3370: 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69  f db==NULL, indi
3380: 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a  ces attached to.
3390: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  ** the table are
33a0: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74   deleted, but it
33b0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79   is assumed they
33c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
33d0: 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a  en.** unlinked..
33e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
33f0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3400: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3410: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3420: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3430: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20  .  FKey *pFKey, 
3440: 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69  *pNextFKey;..  i
3450: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
3460: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c  eturn;..  /* Del
3470: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
3480: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3490: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
34a0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
34b0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
34c0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
34d0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
34e0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
34f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
3500: 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  dex->iDb==pTable
3510: 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65  ->iDb || (pTable
3520: 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64  ->iDb==0 && pInd
3530: 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20  ex->iDb==1) );. 
3540: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
3550: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
3560: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
3570: 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b  te all foreign k
3580: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
3590: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
35a0: 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73   The keys.  ** s
35b0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
35c0: 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  dy been unlinked
35d0: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46   from the db->aF
35e0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a  Key hash table .
35f0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79    */.  for(pFKey
3600: 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20  =pTable->pFKey; 
3610: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65  pFKey; pFKey=pNe
3620: 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65  xtFKey){.    pNe
3630: 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e  xtFKey = pFKey->
3640: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61  pNextFrom;.    a
3650: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69  ssert( pTable->i
3660: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
3670: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3680: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
3690: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
36a0: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
36d0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
36e0: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
36f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
3700: 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ey);.  }..  /* D
3710: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
3720: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
3730: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
3740: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3750: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3760: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  eFree(pTable->zN
3770: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
3780: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  ee(pTable->zColA
3790: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
37a0: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
37b0: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
37c0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
37d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
37e0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
37f0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
3800: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
3810: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
3820: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
3830: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
3840: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
3850: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
3860: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3870: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3880: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3890: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
38a0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
38b0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
38c0: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
38d0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
38e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
38f0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
3900: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
3910: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
3920: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
3930: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
3940: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
3950: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
3960: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
3970: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e  me, strlen(zTabN
3980: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66  ame)+1, 0);.  if
3990: 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ( p ){.    for(p
39a0: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
39b0: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
39c0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
39d0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
39e0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
39f0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
3a00: 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61  HashFind(&pDb->a
3a10: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3a20: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
3a30: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
3a40: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
3a50: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
3a60: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
3a70: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
3a80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3a90: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3aa0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3ab0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
3ac0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
3ad0: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
3ae0: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
3af0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
3b00: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
3b10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3b20: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
3b30: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
3b40: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
3b50: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
3b60: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3b70: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
3b80: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
3b90: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
3ba0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
3bb0: 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61  .** token with a
3bc0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65  ny quotations re
3bd0: 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f  moved.  Space to
3be0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
3bf0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
3c00: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3c10: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
3c20: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
3c30: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
3c40: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3c50: 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61 6c   Tokens are real
3c60: 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  ly just pointers
3c70: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3c80: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
3c90: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
3ca0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3cb0: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
3cc0: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
3cd0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3ce0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3cf0: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3d00: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3d10: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3d20: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3d30: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3d40: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3d50: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3d60: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3d70: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3d80: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3d90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
3da0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
3db0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
3dc0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3dd0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3de0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3df0: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3e00: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3e10: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3e20: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3e30: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3e40: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3e50: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3e60: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3e70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3e80: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3e90: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3ea0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3eb0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3ec0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ee0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3ef0: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3f00: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3f10: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3f30: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3f40: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3f50: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3f60: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
3f70: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
3f80: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
3f90: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
3fa0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
3fb0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
3fc0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
3fd0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
3fe0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
3ff0: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4000: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e  xist..*/.int fin
4010: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
4020: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4030: 20 20 69 6e 74 20 69 3b 0a 20 20 44 62 20 2a 70    int i;.  Db *p
4040: 44 62 3b 0a 20 20 66 6f 72 28 70 44 62 3d 64 62  Db;.  for(pDb=db
4050: 2d 3e 61 44 62 2c 20 69 3d 30 3b 20 69 3c 64 62  ->aDb, i=0; i<db
4060: 2d 3e 6e 44 62 3b 20 69 2b 2b 2c 20 70 44 62 2b  ->nDb; i++, pDb+
4070: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  +){.    if( pNam
4080: 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62  e->n==strlen(pDb
4090: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
40a0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
40b0: 74 72 4e 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  trNICmp(pDb->zNa
40c0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
40d0: 61 6d 65 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20  ame->n) ){.     
40e0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
40f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
4100: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
4110: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
4120: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
4130: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
4140: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
4150: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
4160: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4170: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4180: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
4190: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
41a0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
41b0: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
41c0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
41d0: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
41e0: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
41f0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4200: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
4210: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
4220: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
4230: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
4240: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
4250: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
4260: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
4270: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
4280: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
4290: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
42a0: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
42b0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
42c0: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
42d0: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
42e0: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
42f0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4300: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
4310: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
4320: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
4330: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
4340: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
4350: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
4360: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4370: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4380: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
4390: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
43a0: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
43b0: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
43c0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
43d0: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
43e0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
43f0: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
4400: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
4410: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
4420: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
4430: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
4440: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
4450: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
4460: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4480: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
4490: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
44a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
44b0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e  e->db;..  if( pN
44c0: 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
44d0: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
44e0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
44f0: 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  y );.    *pUnqua
4500: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
4510: 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c  iDb = findDb(db,
4520: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
4530: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
4540: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4550: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
4560: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
4570: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
4580: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4590: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
45a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
45b0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
45c0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
45d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
45e0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
45f0: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
4600: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
4610: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
4620: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4630: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
4640: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
4650: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
4660: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
4670: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
4680: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
4690: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
46a0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
46b0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
46c0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
46d0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
46e0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
46f0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
4700: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
4710: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
4720: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
4730: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
4740: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
4750: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
4760: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
4770: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
4780: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
4790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
47a0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
47b0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
47c0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
47d0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
47e0: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
47f0: 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  StrNICmp(zName, 
4800: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b  "sqlite_", 7) ){
4810: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4820: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62  rMsg(pParse, "ob
4830: 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76  ject name reserv
4840: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
4850: 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  use: %s", zName)
4860: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
4870: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
4880: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4890: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  K;.}../*.** Begi
48a0: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
48b0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
48c0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
48d0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
48e0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
48f0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
4900: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
4910: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
4920: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
4930: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4940: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
4950: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
4960: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
4970: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
4980: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
4990: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
49a0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a  le name.  The.**
49b0: 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73   pStart token is
49c0: 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20   the CREATE and 
49d0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62  pName is the tab
49e0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73  le name.  The is
49f0: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
4a00: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
4a10: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
4a20: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
4a30: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
4a40: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
4a50: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
4a60: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
4a70: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
4a80: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
4a90: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
4aa0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
4ab0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
4ac0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
4ad0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
4ae0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
4af0: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
4b00: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
4b10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
4b20: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
4b30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4b40: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
4b50: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
4b60: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
4b70: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
4b80: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
4b90: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
4ba0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
4bb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
4bc0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4bd0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
4be0: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
4bf0: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
4c00: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
4c10: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
4c20: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
4c30: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
4c40: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
4c50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4c60: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
4c70: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
4c80: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
4c90: 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65  he "CREATE" toke
4ca0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
4cb0: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
4cc0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
4cd0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
4ce0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
4cf0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
4d00: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
4d10: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
4d20: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
4d30: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
4d40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4d50: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
4d60: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
4d70: 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew       /* True
4d80: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
4d90: 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  EW */.){.  Table
4da0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
4db0: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
4dc0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
4dd0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4de0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
4df0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4e00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4e10: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
4e20: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
4e30: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
4e40: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
4e50: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4e60: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
4e70: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
4e80: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
4e90: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
4ea0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
4eb0: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
4ec0: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
4ed0: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
4ee0: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
4ef0: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
4f00: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
4f10: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4f20: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
4f30: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
4f40: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4f50: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
4f60: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
4f70: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
4f80: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4f90: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4fa0: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
4fb0: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
4fc0: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
4fd0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
4fe0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4ff0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5000: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5010: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5020: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5030: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5040: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5050: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5060: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5070: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5080: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5090: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
50a0: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
50b0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
50c0: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
50d0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
50e0: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
50f0: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5100: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5110: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5120: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5130: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5140: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5150: 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 69   if( isTemp && i
5160: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5170: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5180: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
5190: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
51a0: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
51b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
51c0: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
51d0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
51e0: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
51f0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
5200: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
5210: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  n;.  }.  if( isT
5220: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
5230: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
5240: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
5250: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5260: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
5270: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5280: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
5290: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
52a0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
52b0: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
52c0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  Name) ){.    sql
52d0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
52e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
52f0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5300: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5310: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5320: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5330: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5340: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5350: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5360: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5370: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5380: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
5390: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
53a0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
53b0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
53c0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
53d0: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
53e0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
53f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
5400: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
5410: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
5420: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
5430: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5440: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5450: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
5460: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
5470: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5480: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
5490: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
54a0: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
54b0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
54c0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
54d0: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
54e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
54f0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5500: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
5510: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5520: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
5530: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
5540: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
5550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
5560: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
5570: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
5580: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
5590: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
55a0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
55b0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
55c0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
55d0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
55e0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
55f0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
5600: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5610: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5620: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5630: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5640: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5650: 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b  Parse) ) return;
5660: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
5670: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
5680: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
5690: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69  iDb].zName);.  i
56a0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
56b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
56c0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
56d0: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
56e0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
56f0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
5700: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5710: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
5720: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
5730: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
5740: 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28 20  !=0 && .      ( 
5750: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
5760: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
5770: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5780: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
5790: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
57a0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
57b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
57c0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
57d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
57e0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
57f0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
5800: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
5810: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  able==0 ){.    p
5820: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
5830: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
5840: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5850: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
5860: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
5870: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
5880: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
5890: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
58a0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
58b0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
58c0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
58d0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
58e0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20  ;.  pTable->iDb 
58f0: 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61  = iDb;.  if( pPa
5900: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
5910: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5920: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
5930: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
5940: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
5950: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
5960: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5970: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5980: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
5990: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
59a0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
59b0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
59c0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
59d0: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
59e0: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
59f0: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
5a00: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5a10: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
5a20: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
5a30: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5a40: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5a50: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5a60: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5a70: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5a80: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5a90: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5aa0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5ab0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5ac0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5ad0: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
5ae0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5af0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
5b00: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
5b10: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
5b20: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
5b30: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5b40: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5b50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5b60: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
5b70: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
5b80: 44 62 29 3b 0a 20 20 20 20 2f 2a 20 45 76 65 72  Db);.    /* Ever
5b90: 79 20 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62  y time a new tab
5ba0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 74 68  le is created th
5bb0: 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20  e file-format.  
5bc0: 20 20 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e    ** and encodin
5bd0: 67 20 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72  g meta-values ar
5be0: 65 20 73 65 74 20 69 6e 20 74 68 65 20 64 61 74  e set in the dat
5bf0: 61 62 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a  abase, in.    **
5c00: 20 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68   case this is th
5c10: 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72  e first table cr
5c20: 65 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eated..    */.  
5c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c40: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5c50: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
5c60: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
5c70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5c80: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5c90: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
5ca0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5cb0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e  _Integer, db->en
5cc0: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
5cd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5ce0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5cf0: 2c 20 34 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  , 4);..    sqlit
5d00: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
5d10: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  e(v, iDb);.    s
5d20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5d30: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
5d40: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5d50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5d60: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
5d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d80: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
5d90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5db0: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
5dc0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
5dd0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
5de0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
5df0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
5e00: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
5e10: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
5e20: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
5e30: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
5e40: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
5e50: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
5e60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5e70: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
5e80: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
5e90: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
5ea0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
5eb0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
5ec0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
5ed0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
5ee0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5ef0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
5f00: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5f10: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
5f20: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5f30: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
5f40: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
5f50: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5f60: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5f70: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
5f80: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5f90: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
5fa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
5fb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5fc0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
5fd0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5fe0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
5ff0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
6000: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6010: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
6020: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
6030: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
6040: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
6050: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6060: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
6070: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
6080: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
6090: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
60a0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
60b0: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
60c0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
60d0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
60e0: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
60f0: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
6100: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
6110: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6120: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6130: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6140: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6150: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
6160: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
6170: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
6180: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
6190: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
61a0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
61b0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
61c0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
61d0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
61e0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
61f0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6200: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6210: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6220: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6230: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6240: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
6250: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
6260: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
6270: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
6280: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
6290: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
62a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
62b0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
62c0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
62d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
62e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
62f0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6300: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6310: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6320: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6330: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6340: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6350: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6360: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6370: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6380: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
6390: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
63a0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
63b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
63c0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
63d0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
63e0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
63f0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6400: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6410: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6420: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6430: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6440: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
6450: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
6460: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
6470: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
6480: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6490: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
64a0: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
64b0: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
64c0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
64d0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
64e0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
64f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
6500: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
6510: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
6520: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
6530: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
6540: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
6550: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
6560: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
6570: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
6580: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
6590: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
65a0: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
65b0: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
65c0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
65d0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
65e0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
65f0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69  arse, Token *pFi
6600: 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73  rst, Token *pLas
6610: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
6620: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
6630: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t n;.  char *z, 
6640: 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  **pz;.  Column *
6650: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6660: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6670: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6680: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
6690: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
66a0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
66b0: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a  p->aCol[i];.  pz
66c0: 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b   = &pCol->zType;
66d0: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
66e0: 2b 20 28 70 4c 61 73 74 2d 3e 7a 20 2d 20 70 46  + (pLast->z - pF
66f0: 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  irst->z);.  asse
6700: 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d  rt( pCol->zType=
6710: 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c  =0 );.  z = pCol
6720: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
6730: 33 4d 50 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c  3MPrintf("%.*s",
6740: 20 6e 2c 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a   n, pFirst->z);.
6750: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6760: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
6770: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
6780: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
6790: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
67a0: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
67b0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
67c0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
67d0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
67e0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
67f0: 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a  yType(z, n);.}..
6800: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
6810: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
6820: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
6830: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
6840: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
6850: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
6860: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6870: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
6880: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
6890: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
68a0: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
68b0: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
68c0: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sign..**.** This
68d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
68e0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
68f0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
6900: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
6910: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
6920: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
6930: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
6940: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
6950: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6960: 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75   *pVal, int minu
6970: 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20  sFlag){.  Table 
6980: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
6990: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 28 70  har *z;.  if( (p
69a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
69b0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
69c0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
69d0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
69e0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
69f0: 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ( p->aCol[i].zDf
6a00: 6c 74 3d 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70  lt==0 );.  z = p
6a10: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 20  ->aCol[i].zDflt 
6a20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6a30: 28 22 25 73 25 54 22 2c 20 6d 69 6e 75 73 46 6c  ("%s%T", minusFl
6a40: 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 70  ag ? "-" : "", p
6a50: 56 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Val);.  sqlite3D
6a60: 65 71 75 6f 74 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a  equote(z);.}../*
6a70: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
6a80: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
6a90: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
6aa0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
6ab0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
6ac0: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
6ad0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
6ae0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
6af0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
6b00: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
6b10: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
6b20: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
6b30: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
6b40: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
6b50: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
6b60: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
6b70: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
6b80: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
6b90: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
6ba0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
6bb0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
6bc0: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
6bd0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
6be0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
6bf0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
6c00: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
6c10: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
6c20: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
6c30: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
6c40: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
6c50: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
6c60: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
6c70: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
6c80: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
6c90: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
6ca0: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
6cb0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
6cc0: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
6cd0: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
6ce0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
6cf0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
6d00: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
6d10: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
6d20: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6d30: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
6d40: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
6d50: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
6d60: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
6d70: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
6d80: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
6d90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
6da0: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
6db0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
6dc0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
6dd0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
6de0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
6df0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
6e00: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
6e10: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
6e20: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
6e30: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
6e40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
6e50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
6e60: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
6e70: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
6e80: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
6e90: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
6ea0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
6eb0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
6ec0: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
6ed0: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
6ee0: 20 69 6e 74 20 61 75 74 6f 49 6e 63 20 20 20 20   int autoInc    
6ef0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
6f00: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
6f10: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
6f20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
6f30: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
6f40: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
6f50: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
6f60: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
6f70: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  i;.  if( pTab==0
6f80: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
6f90: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
6fa0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
6fb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6fc0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6fd0: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
6fe0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
6ff0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
7000: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
7010: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
7020: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
7030: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
7040: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
7050: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
7060: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
7070: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  l - 1;.    pTab-
7080: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
7090: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  imKey = 1;.  }el
70a0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
70b0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
70c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
70d0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
70e0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
70f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
7100: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
7110: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
7120: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7130: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
7140: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7160: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
7170: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54  <pTab->nCol ) pT
7180: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
7190: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
71a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
71b0: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f  t->nExpr>1 ) iCo
71c0: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
71d0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
71e0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
71f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7200: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7210: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
7220: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
7230: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
7240: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
7250: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
7260: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
7270: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
7280: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
7290: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
72a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
72b0: 49 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Inc ){.    sqlit
72c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
72d0: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
72e0: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
72f0: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
7300: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
7310: 59 20 4b 45 59 22 29 3b 0a 20 20 7d 65 6c 73 65  Y KEY");.  }else
7320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
7330: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
7340: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
7350: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
7360: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
7370: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
7380: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
7390: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
73a0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
73b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
73c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
73d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
73e0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
73f0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
7400: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
7410: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
7420: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
7430: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
7440: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
7450: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
7460: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7470: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
7480: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
7490: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
74a0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
74b0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
74c0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
74d0: 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  ol-1;..  pColl =
74e0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
74f0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
7500: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70  ype, nType);.  p
7510: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
7520: 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49  = pColl;..  /* I
7530: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
7540: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
7550: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
7560: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
7570: 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e  .  ** then an in
7580: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
7590: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
75a0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
75b0: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  the.  ** collati
75c0: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
75d0: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
75e0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
75f0: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  e..  */.  for(pI
7600: 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20  dx = p->pIndex; 
7610: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
7620: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73  >pNext){.    ass
7630: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
7640: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  mn==1 );.    if(
7650: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
7660: 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65  0]==i ) pIdx->ke
7670: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
7680: 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pColl;.  }.}../
7690: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20  *.** Locate and 
76a0: 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20  return an entry 
76b0: 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c  from the db.aCol
76c0: 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e  lSeq hash table.
76d0: 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a   If the entry.**
76e0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e   specified by zN
76f0: 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73  ame and nName is
7700: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70   not found and p
7710: 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65  arameter 'create
7720: 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  ' is.** true, th
7730: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7740: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
7750: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
7760: 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72  .** Each pointer
7770: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
7780: 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20  qlite3.aCollSeq 
7790: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
77a0: 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20  ins an.** array 
77b0: 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71  of three CollSeq
77c0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
77d0: 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f   first is the co
77e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
77f0: 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66  .** prefferred f
7800: 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65  or UTF-8, the se
7810: 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61  cond UTF-16le, a
7820: 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46  nd the third UTF
7830: 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f  -16be..**.** Sto
7840: 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  red immediately 
7850: 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20  after the three 
7860: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7870: 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ces is a copy of
7880: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  .** the collatio
7890: 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e  n sequence name.
78a0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
78b0: 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f  is string is sto
78c0: 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63  red in.** each c
78d0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
78e0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
78f0: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
7900: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
7910: 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  y(.  sqlite3 *db
7920: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7930: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
7940: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
7950: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
7960: 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d  Coll;.  if( nNam
7970: 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74  e<0 ) nName = st
7980: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  rlen(zName);.  p
7990: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
79a0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
79b0: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
79c0: 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70  me);..  if( 0==p
79d0: 43 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29  Coll && create )
79e0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
79f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69  liteMalloc( 3*si
7a00: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e  zeof(*pColl) + n
7a10: 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20  Name + 1 );.    
7a20: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
7a30: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
7a40: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7a50: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7a60: 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[0].enc = SQLIT
7a70: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43  E_UTF8;.      pC
7a80: 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[1].zName = (
7a90: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
7aa0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
7ab0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7ac0: 31 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c  16LE;.      pCol
7ad0: 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[2].zName = (ch
7ae0: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
7af0: 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e       pColl[2].en
7b00: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
7b10: 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  BE;.      memcpy
7b20: 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c  (pColl[0].zName,
7b30: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
7b40: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a        pColl[0].z
7b50: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
7b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
7b70: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43  shInsert(&db->aC
7b80: 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d  ollSeq, pColl[0]
7b90: 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70  .zName, nName, p
7ba0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
7bb0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
7bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7bd0: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
7be0: 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   to a UTF-8 enco
7bf0: 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65  ded string nName
7c00: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20   bytes long..** 
7c10: 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53  Return the CollS
7c20: 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  eq* pointer for 
7c30: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7c40: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61  quence named zNa
7c50: 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  me.** for the en
7c60: 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f  coding 'enc' fro
7c70: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27  m the database '
7c80: 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  db'..**.** If th
7c90: 65 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65  e entry specifie
7ca0: 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  d is not found a
7cb0: 6e 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74  nd 'create' is t
7cc0: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
7cd0: 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e   a.** new entry.
7ce0: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
7cf0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c  rn NULL..*/.Coll
7d00: 53 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  Seq *sqlite3Find
7d10: 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74  CollSeq(.  sqlit
7d20: 65 33 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63  e3 *db,.  u8 enc
7d30: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7d40: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
7d50: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
7d60: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
7d70: 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53  Coll = findCollS
7d80: 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d  eqEntry(db, zNam
7d90: 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65  e, nName, create
7da0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
7db0: 49 54 45 5f 55 54 46 38 3d 3d 31 20 26 26 20 53  ITE_UTF8==1 && S
7dc0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32  QLITE_UTF16LE==2
7dd0: 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36   && SQLITE_UTF16
7de0: 42 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72  BE==3 );.  asser
7df0: 74 28 20 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55  t( enc>=SQLITE_U
7e00: 54 46 38 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49  TF8 && enc<=SQLI
7e10: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
7e20: 69 66 28 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  if( pColl ) pCol
7e30: 6c 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65  l += enc-1;.  re
7e40: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
7e50: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
7e60: 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65  'collation neede
7e70: 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72  d' callback to r
7e80: 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74 69  equest a collati
7e90: 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69  on sequence.** i
7ea0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
7eb0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ext encoding of 
7ec0: 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  name zName, leng
7ed0: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20  th nName..** If 
7ee0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7ef0: 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63  quence.*/.static
7f00: 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65   void callCollNe
7f10: 65 64 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  eded(sqlite3 *db
7f20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
7f30: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
7f40: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
7f50: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21  xCollNeeded || !
7f60: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
7f70: 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  6 );.  if( nName
7f80: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
7f90: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
7fa0: 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65  ( db->xCollNeede
7fb0: 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  d ){.    char *z
7fc0: 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74  External = sqlit
7fd0: 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20  eStrNDup(zName, 
7fe0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
7ff0: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
8000: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
8010: 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f  llNeeded(db->pCo
8020: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
8030: 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a   (int)db->enc, z
8040: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73  External);.    s
8050: 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65 72  qliteFree(zExter
8060: 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nal);.  }.  if( 
8070: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
8080: 36 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  6 ){.    char co
8090: 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a  nst *zExternal;.
80a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
80b0: 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  e *pTmp = sqlite
80c0: 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
80d0: 75 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ue(db);.    sqli
80e0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
80f0: 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  Tmp, -1, zName, 
8100: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
8110: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
8120: 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c   zExternal = sql
8130: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54  ite3ValueText(pT
8140: 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  mp, SQLITE_UTF16
8150: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
8160: 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65   !zExternal ) re
8170: 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43  turn;.    db->xC
8180: 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e  ollNeeded16(db->
8190: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
81a0: 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63  db, (int)db->enc
81b0: 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  , zExternal);.  
81c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
81d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
81e0: 64 20 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  d if the collati
81f0: 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73  on factory fails
8200: 20 74 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a   to deliver a.**
8210: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
8220: 69 6f 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20  ion in the best 
8230: 65 6e 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65  encoding but the
8240: 72 65 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20  re may be other 
8250: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74  versions.** of t
8260: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  his collation fu
8270: 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65  nction (for othe
8280: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  r text encodings
8290: 29 20 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65  ) available. Use
82a0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65   one.** of these
82b0: 20 69 6e 73 74 65 61 64 20 69 66 20 74 68 65 79   instead if they
82c0: 20 65 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20   exist. Avoid a 
82d0: 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36  UTF-8 <-> UTF-16
82e0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a   conversion if.*
82f0: 2a 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73  * possible..*/.s
8300: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43  tatic int synthC
8310: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
8320: 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  arse, CollSeq *p
8330: 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  Coll){.  CollSeq
8340: 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72   *pColl2;.  char
8350: 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   *z = pColl->zNa
8360: 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  me;.  int n = st
8370: 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74  rlen(z);.  sqlit
8380: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8390: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
83a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
83b0: 61 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54  aEnc[] = { SQLIT
83c0: 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54  E_UTF16BE, SQLIT
83d0: 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54  E_UTF16LE, SQLIT
83e0: 45 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28  E_UTF8 };.  for(
83f0: 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a  i=0; i<3; i++){.
8400: 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c      pColl2 = sql
8410: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
8420: 64 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20  db, aEnc[i], z, 
8430: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
8440: 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29  Coll2->xCmp!=0 )
8450: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
8460: 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69  Coll, pColl2, si
8470: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a  zeof(CollSeq));.
8480: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8490: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
84a0: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
84b0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nErr==0 ){.    s
84c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
84d0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
84e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
84f0: 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29  ce: %.*s", n, z)
8500: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
8510: 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nErr++;.  return
8520: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
8530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8540: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
8550: 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  n a collation se
8560: 71 75 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74  quence before it
8570: 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63   is used to.** c
8580: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
8590: 64 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65  defined. An unde
85a0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  fined collation 
85b0: 73 65 71 75 65 6e 63 65 20 65 78 69 73 74 73 20  sequence exists 
85c0: 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61  when.** a databa
85d0: 73 65 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61  se is loaded tha
85e0: 74 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  t contains refer
85f0: 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69  ences to collati
8600: 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20  on sequences.** 
8610: 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65  that have not be
8620: 65 6e 20 64 65 66 69 6e 65 64 20 62 79 20 73 71  en defined by sq
8630: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
8640: 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a  lation() etc..**
8650: 0a 2a 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c  .** If required,
8660: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
8670: 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69  lls the 'collati
8680: 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62  on needed' callb
8690: 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ack to.** reques
86a0: 74 20 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  t a definition o
86b0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  f the collating 
86c0: 73 65 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69  sequence. If thi
86d0: 73 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20  s doesn't work, 
86e0: 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e  .** an equivalen
86f0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
8700: 65 6e 63 65 20 74 68 61 74 20 75 73 65 73 20 61  ence that uses a
8710: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64   text encoding d
8720: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
8730: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
8740: 73 65 20 69 73 20 73 75 62 73 74 69 74 75 74 65  se is substitute
8750: 64 2c 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61  d, if one is ava
8760: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ilable..*/.int s
8770: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8780: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
8790: 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  , CollSeq *pColl
87a0: 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  ){.  if( pColl &
87b0: 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  & !pColl->xCmp )
87c0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c  {.    /* No coll
87d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
87e0: 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20  f this type for 
87f0: 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73  this encoding is
8800: 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20   registered..   
8810: 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c   ** Call the col
8820: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74  lation factory t
8830: 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20  o see if it can 
8840: 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f  supply us with o
8850: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ne..    */.    c
8860: 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50  allCollNeeded(pP
8870: 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d  arse->db, pColl-
8880: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
8890: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  Coll->zName));. 
88a0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78     if( !pColl->x
88b0: 43 6d 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c  Cmp && synthColl
88c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
88d0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
88e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
88f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8900: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8910: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
8920: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
8930: 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61  () for all colla
8940: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69  ting sequences i
8950: 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69  n an index,.** i
8960: 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66  n order to verif
8970: 79 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e  y that all the n
8980: 65 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69  ecessary collati
8990: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65  ng sequences are
89a0: 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69  .** loaded..*/.i
89b0: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49  nt sqlite3CheckI
89c0: 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73  ndexCollSeq(Pars
89d0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
89e0: 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70   *pIdx){.  if( p
89f0: 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Idx ){.    int i
8a00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8a10: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
8a20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8a30: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
8a40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78  Seq(pParse, pIdx
8a50: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
8a60: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  i]) ){.        r
8a70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
8a80: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
8a90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
8aa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8ab0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8ac0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
8ad0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8ae0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
8af0: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
8b00: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
8b10: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
8b20: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
8b30: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8b40: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
8b50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
8b60: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
8b70: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
8b80: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
8b90: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
8ba0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
8bb0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
8bc0: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
8bd0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
8be0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
8bf0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
8c00: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
8c10: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
8c20: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
8c30: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
8c40: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
8c50: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
8c60: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
8c70: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
8c80: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
8c90: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
8ca0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
8cb0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
8cc0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
8cd0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
8ce0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
8cf0: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
8d00: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
8d10: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
8d20: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
8d30: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
8d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8d50: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
8d60: 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73    u8 enc = pPars
8d70: 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38  e->db->enc;.  u8
8d80: 20 69 6e 69 74 62 75 73 79 20 3d 20 70 50 61 72   initbusy = pPar
8d90: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
8da0: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
8db0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8dc0: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
8dd0: 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  >db, enc, zName,
8de0: 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   nName, initbusy
8df0: 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30  );.  if( nName<0
8e00: 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65   ) nName = strle
8e10: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(zName);.  if( 
8e20: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
8e30: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
8e40: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20  xCmp) ){.    /* 
8e50: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
8e60: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
8e70: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
8e80: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
8e90: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8ea0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8eb0: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8ec0: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8ed0: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
8ee0: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
8ef0: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
8f00: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
8f10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8f20: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70  te3FindCollSeq(p
8f30: 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20  Parse->db, enc, 
8f40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29  zName, nName, 0)
8f50: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
8f60: 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  && !pColl->xCmp 
8f70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
8f80: 65 20 6d 61 79 20 62 65 20 61 20 76 65 72 73 69  e may be a versi
8f90: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  on of the collat
8fa0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
8fb0: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
8fc0: 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20   ** translation 
8fd0: 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67  between encoding
8fe0: 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69 74  s. Search for it
8ff0: 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53   with synthCollS
9000: 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eq()..      */. 
9010: 20 20 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f       if( synthCo
9020: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
9030: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
9040: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
9050: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
9060: 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73  * If nothing has
9070: 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69   been found, wri
9080: 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  te the error mes
9090: 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65  sage into pParse
90a0: 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62   */.  if( !initb
90b0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
90c0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
90d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
90e0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
90f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9100: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
9110: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
9120: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
9130: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  nName, zName);. 
9140: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
9150: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9160: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   pColl;.}..../*.
9170: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
9180: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
9190: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
91a0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
91b0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
91c0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f  ffinity type..*/
91d0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
91e0: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
91f0: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
9200: 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e   nType){.  int n
9210: 2c 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  , i;.  static co
9220: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
9230: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
9240: 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20  b;  /* Keywords 
9250: 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61  substring to sea
9260: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63  rch for */.    c
9270: 68 61 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20  har nSub;       
9280: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a    /* length of z
9290: 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  Sub */.    char 
92a0: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a  affinity;     /*
92b0: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74   Affinity to ret
92c0: 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65  urn if it matche
92d0: 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69  s */.  } substri
92e0: 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22  ngs[] = {.    {"
92f0: 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45  INT",  3, SQLITE
9300: 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20  _AFF_INTEGER},. 
9310: 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53     {"CHAR", 4, S
9320: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
9330: 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c  .    {"CLOB", 4,
9340: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9350: 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20  },.    {"TEXT", 
9360: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
9370: 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22  XT},.    {"BLOB"
9380: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
9390: 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  NONE},.  };..  i
93a0: 66 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( nType==0 ){. 
93b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
93c0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  _AFF_NONE;.  }. 
93d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
93e0: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73  of(substrings)/s
93f0: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
9400: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
9410: 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74 72 69  int c1 = substri
9420: 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a  ngs[i].zSub[0];.
9430: 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c      int c2 = tol
9440: 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e  ower(c1);.    in
9450: 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20  t limit = nType 
9460: 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  - substrings[i].
9470: 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nSub;.    const 
9480: 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72  char *z = substr
9490: 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20  ings[i].zSub;.  
94a0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69    for(n=0; n<=li
94b0: 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  mit; n++){.     
94c0: 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e   int c = zType[n
94d0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d  ];.      if( (c=
94e0: 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20  =c1 || c==c2).  
94f0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d             && 0=
9500: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
9510: 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73  (&zType[n], z, s
9520: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75  ubstrings[i].nSu
9530: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
9540: 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b  turn substrings[
9550: 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  i].affinity;.   
9560: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
9580: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f  FF_NUMERIC;.}../
9590: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
95a0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
95b0: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
95c0: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
95d0: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
95e0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
95f0: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
9600: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
9610: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
9620: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
9630: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
9640: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
9650: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
9660: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
9670: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
9680: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
9690: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
96a0: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
96b0: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
96c0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
96d0: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
96e0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
96f0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
9700: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
9710: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
9720: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
9730: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
9740: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
9750: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
9760: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
9770: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
9780: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
9790: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
97a0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
97b0: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
97c0: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
97d0: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
97e0: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
97f0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
9800: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
9810: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
9820: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
9830: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
9840: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
9850: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
9860: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
9870: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  geCookie(sqlite3
9880: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
9890: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
98a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
98b0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
98c0: 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
98d0: 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73  ookie+1, 0);.  s
98e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
98f0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
9900: 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a   iDb, 0);.}../*.
9910: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
9920: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
9930: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
9940: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
9950: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
9960: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
9970: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
9980: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
9990: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
99a0: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
99b0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
99c0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
99d0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
99e0: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
99f0: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
9a00: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
9a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
9a20: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
9a30: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
9a40: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
9a50: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
9a60: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
9a70: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
9a80: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
9a90: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
9aa0: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
9ab0: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
9ac0: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
9ad0: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
9ae0: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
9af0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
9b00: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
9b10: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
9b20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
9b30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9b40: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
9b50: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
9b60: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
9b70: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
9b80: 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72  i = *pIdx;.  for
9b90: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
9ba0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
9bb0: 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  isalnum(zIdent[j
9bc0: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
9bd0: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
9be0: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
9bf0: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c   zIdent[j]!=0 ||
9c00: 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b   isdigit(zIdent[
9c10: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
9c20: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9c30: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
9c40: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
9c50: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
9c60: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
9c70: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
9c80: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
9c90: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
9ca0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
9cb0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
9cc0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
9cd0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
9ce0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
9cf0: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
9d00: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
9d10: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
9d20: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9d30: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
9d40: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
9d50: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
9d60: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
9d70: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
9d80: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
9d90: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
9da0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
9db0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
9dc0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
9dd0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
9de0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
9df0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
9e00: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
9e10: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
9e20: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
9e30: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
9e40: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
9e50: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
9e60: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
9e70: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
9e80: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
9e90: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
9ea0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
9eb0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
9ec0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
9ed0: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20  n += (strlen(z) 
9ee0: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 1);.    }.  }.
9ef0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
9f00: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
9f10: 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20  if( n<50 ){.    
9f20: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
9f30: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
9f40: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
9f50: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
9f60: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
9f70: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
9f80: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
9f90: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
9fa0: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
9fb0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
9fc0: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
9fd0: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
9fe0: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
9ff0: 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f  tmt, p->iDb==1 ?
a000: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
a010: 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20  BLE " : "CREATE 
a020: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
a030: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
a040: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a050: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
a060: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
a070: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
a080: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a090: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a0a0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  l++){.    strcpy
a0b0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
a0c0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
a0d0: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
a0e0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
a0f0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
a100: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
a110: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Name);.    if( (
a120: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  z = pCol->zType)
a130: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  !=0 ){.      zSt
a140: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
a150: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74       strcpy(&zSt
a160: 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  mt[k], z);.     
a170: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
a180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72  .    }.  }.  str
a190: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a1a0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
a1b0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
a1c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a1d0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
a1e0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
a1f0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
a200: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a210: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
a220: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
a230: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
a240: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
a250: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
a260: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
a270: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
a280: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
a290: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
a2a0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
a2b0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
a2c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
a2d0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
a2e0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
a2f0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
a300: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
a310: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
a320: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
a330: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
a340: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
a350: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
a360: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a370: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
a380: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
a390: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
a3a0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
a3b0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a3c0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
a3d0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73  ently changes, s
a3e0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
a3f0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
a400: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
a410: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a420: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
a430: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
a440: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
a450: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
a460: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
a470: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
a480: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
a490: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
a4a0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
a4b0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
a4c0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
a4d0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
a4e0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
a4f0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
a500: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
a510: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
a520: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
a530: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
a540: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
a550: 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  e3EndTable(Parse
a560: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
a570: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
a580: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
a590: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
a5a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a5b0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
a5c0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
a5d0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
a5e0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
a5f0: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
a600: 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  n;.  p = pParse-
a610: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
a620: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
a630: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
a640: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
a650: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
a660: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
a670: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
a680: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
a690: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
a6a0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
a6b0: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
a6c0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
a6d0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
a6e0: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
a6f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
a700: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
a710: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
a720: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
a730: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
a740: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
a750: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
a760: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
a770: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
a780: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
a790: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
a7a0: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f  b routine.).  */
a7b0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
a7c0: 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74  busy ){.    p->t
a7d0: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
a7e0: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
a7f0: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
a800: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
a810: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
a820: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
a830: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
a840: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
a850: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
a860: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
a870: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
a880: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
a890: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
a8a0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
a8b0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
a8c0: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
a8d0: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
a8e0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
a8f0: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
a900: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
a910: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
a920: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
a930: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
a940: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
a950: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
a960: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
a970: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
a980: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
a990: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66   return;..    if
a9a0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
a9b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
a9c0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
a9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a9e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
a9f0: 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c  teTable, p->iDb,
aa00: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
aa10: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
aa20: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
aa30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
aa40: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
aa50: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
aa60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
aa70: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
aa80: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
aa90: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
aaa0: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
aab0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
aac0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
aad0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
aae0: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
aaf0: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
ab00: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
ab10: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
ab20: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
ab30: 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b  f the vdbe stack
ab40: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
ab50: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
ab60: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
ab70: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
ab80: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
ab90: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
aba0: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
abb0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
abc0: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
abd0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
abe0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
abf0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
ac00: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
ac10: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
ac20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ac30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
ac40: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
ac50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ac60: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
ac70: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
ac80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac90: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
aca0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
acb0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
acc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
acd0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
ace0: 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65  elect, SRT_Table
acf0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 1, 0, 0, 0, 0)
ad00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ad10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
ad20: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
ad30: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
ad40: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
ad50: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
ad60: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
ad70: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
ad80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
ad90: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
ada0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
adb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
adc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
add0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
ade0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
adf0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
ae00: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
ae10: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
ae20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
ae30: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
ae40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ae50: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
ae60: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  SelTab);.      }
ae70: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 73 71  .    }.  .    sq
ae80: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
ae90: 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29 3b  able(v, p->iDb);
aea0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
aeb0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
aec0: 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65  g8, 0, 0, p->pSe
aed0: 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a  lect==0?"table":
aee0: 22 76 69 65 77 22 2c 50 33 5f 53 54 41 54 49 43  "view",P3_STATIC
aef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
af00: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
af10: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e  ng8, 0, 0, p->zN
af20: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
af30: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
af40: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
af50: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   p->zName, 0);. 
af60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af70: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
af80: 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  3, 0);..    if( 
af90: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
afa0: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
afb0: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
afc0: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
afd0: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
afe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aff0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
b000: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b010: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b020: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
b030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
b040: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
b050: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
b060: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
b070: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
b080: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
b090: 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56 49 45  , 0, "CREATE VIE
b0a0: 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  W ", P3_STATIC);
b0b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b0d0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
b0e0: 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54  g8, 0, 0, "CREAT
b0f0: 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54  E TABLE ", P3_ST
b100: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
b110: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
b120: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20  d!=0 );.      n 
b130: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
b140: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
b150: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
b160: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b170: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
b180: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
b190: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b1a0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b1b0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b1c0: 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  en.z, n);.      
b1d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b1e0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 30  (v, OP_Concat, 0
b1f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
b200: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b210: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b220: 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20   5, 0, "tttit", 
b230: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
b240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b250: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
b260: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b270: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
b280: 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b  (db, v, p->iDb);
b290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b2a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b2b0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
b2c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b2d0: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
b2e0: 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  p->iDb, 0,.     
b2f0: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
b300: 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  f("tbl_name='%q'
b310: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
b320: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 20  DYNAMIC);.  }.. 
b330: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
b340: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
b350: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b360: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b370: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
b380: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
b390: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
b3a0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
b3b0: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
b3c0: 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62  ey; .    Db *pDb
b3d0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
b3e0: 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Db];.    pOld = 
b3f0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
b400: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
b410: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
b420: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
b430: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
b440: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b450: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
b460: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
b470: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
b480: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
b490: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
b4a0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79   }.    for(pFKey
b4b0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
b4c0: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
b4d0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
b4e0: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
b4f0: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
b500: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
b510: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
b520: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
b530: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
b540: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
b550: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
b560: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
b570: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
b580: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  FKey);.    }.   
b590: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b5a0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
b5b0: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
b5c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b5d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b5e0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
b5f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
b610: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
b620: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
b630: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
b640: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
b650: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
b660: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b670: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
b680: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
b690: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
b6a0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
b6b0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
b6c0: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
b6d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b6e0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
b6f0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b700: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b710: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
b720: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
b730: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b740: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b750: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
b760: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
b770: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
b780: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
b790: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
b7a0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
b7b0: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
b7c0: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
b7d0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
b7e0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
b7f0: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
b800: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
b810: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
b820: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
b830: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
b840: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
b850: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
b860: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
b870: 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  2, isTemp, 1);. 
b880: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
b890: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
b8a0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
b8b0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
b8c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
b8d0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
b8e0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
b8f0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
b900: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
b910: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
b920: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
b930: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
b940: 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22  , p->iDb, "view"
b950: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
b960: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
b970: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
b980: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
b990: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
b9a0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
b9b0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
b9c0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
b9d0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
b9e0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
b9f0: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
ba00: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
ba10: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
ba20: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
ba30: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
ba40: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
ba50: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
ba60: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
ba70: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
ba80: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
ba90: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
baa0: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
bab0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
bac0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
bad0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
bae0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
baf0: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
bb00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
bb10: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
bb20: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
bb30: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
bb40: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
bb50: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
bb60: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
bb70: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
bb80: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
bb90: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
bba0: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
bbb0: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
bbc0: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
bbd0: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
bbe0: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
bbf0: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
bc00: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
bc10: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
bc20: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
bc30: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
bc40: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
bc50: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
bc60: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
bc70: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
bc80: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
bc90: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
bca0: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
bcb0: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
bcc0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
bcd0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
bce0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
bcf0: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
bd00: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
bd10: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
bd20: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
bd30: 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29  Parse, &sEnd, 0)
bd40: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
bd50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
bd60: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
bd70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bd80: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
bd90: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
bda0: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
bdb0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
bdc0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
bdd0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
bde0: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
bdf0: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
be00: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
be10: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
be20: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
be30: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
be40: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
be50: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
be60: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
be70: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
be80: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
be90: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
bea0: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
beb0: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
bec0: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
bed0: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
bee0: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
bef0: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
bf00: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
bf10: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
bf20: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
bf30: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
bf40: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
bf50: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
bf60: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
bf70: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
bf80: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
bf90: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
bfa0: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
bfb0: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
bfc0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
bfd0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
bfe0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
bff0: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
c000: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
c010: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
c020: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
c030: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
c040: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
c050: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c060: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
c070: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
c080: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
c090: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
c0a0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
c0b0: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
c0c0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
c0d0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
c0e0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
c0f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
c100: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
c110: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
c120: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
c130: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
c140: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
c150: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
c160: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
c170: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c180: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
c190: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
c1a0: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
c1b0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
c1c0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   1;.  }..  /* If
c1d0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
c1e0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
c1f0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
c200: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
c210: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
c220: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
c230: 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20   /* If nCol==0, 
c240: 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74  then pTable must
c250: 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   be a VIEW */.  
c260: 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70  pSel = pTable->p
c270: 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f  Select;..  /* No
c280: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
c290: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
c2a0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
c2b0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
c2c0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
c2d0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
c2e0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
c2f0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
c300: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
c310: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
c320: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
c330: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
c340: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
c350: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
c360: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
c370: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
c380: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
c390: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
c3a0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c  3ExprListDup(pEL
c3b0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
c3c0: 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ->pEList==0 ){. 
c3d0: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
c3e0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65  = pEList;.    re
c3f0: 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 1;  /* Mall
c400: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
c410: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
c420: 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20  = -1;.  pSelTab 
c430: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
c440: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
c450: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
c460: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
c470: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c480: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c490: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
c4a0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
c4b0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
c4c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
c4d0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
c4e0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
c4f0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
c500: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
c510: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
c520: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
c530: 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  erty(pParse->db,
c540: 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42   pTable->iDb, DB
c550: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
c560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
c570: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
c580: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
c590: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
c5a0: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
c5b0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
c5c0: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
c5d0: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
c5e0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
c5f0: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
c600: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c610: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
c620: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c630: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
c640: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
c650: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
c660: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
c670: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
c680: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
c690: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
c6a0: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
c6b0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
c6c0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
c6d0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
c6e0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
c6f0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
c700: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
c710: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
c720: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
c730: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
c740: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c750: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
c760: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
c770: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
c780: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
c790: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
c7a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
c7b0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
c7c0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
c7d0: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
c7e0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
c7f0: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
c800: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c810: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
c820: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
c840: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
c850: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
c860: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
c870: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
c880: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
c890: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
c8a0: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
c8b0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
c8c0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
c8d0: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
c8e0: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
c8f0: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
c900: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c910: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
c930: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
c940: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
c950: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
c960: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20  lem *pElem;.  . 
c970: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
c980: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
c990: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d  >tblHash); pElem
c9a0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
c9b0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
c9c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c9d0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c9e0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
c9f0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
ca00: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
ca10: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
ca20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
ca30: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  }.  }.  for(pEle
ca40: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
ca50: 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  t(&pDb->idxHash)
ca60: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
ca70: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
ca80: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
ca90: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
caa0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
cab0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
cac0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
cad0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
cae0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
caf0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  n;.    }.  }.  a
cb00: 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64  ssert(0);.}.#end
cb10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
cb20: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
cb30: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
cb40: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
cb50: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
cb60: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
cb70: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
cb80: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
cb90: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
cba0: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
cbb0: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
cbc0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
cbd0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
cbe0: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
cbf0: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
cc00: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
cc10: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
cc20: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
cc30: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
cc40: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
cc50: 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
cc60: 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
cc70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cc80: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
cc90: 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 2f 2a    int base;.  /*
cca0: 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   If SQLITE_OMIT_
ccb0: 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e 6f  AUTOVACUUM is no
ccc0: 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  t defined, then 
ccd0: 4f 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65  OP_Destroy pushe
cce0: 73 0a 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65  s.  ** an intege
ccf0: 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  r onto the stack
cd00: 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
cd10: 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
cd20: 68 65 6e 20 69 74 20 69 73 0a 20 20 2a 2a 20 74  hen it is.  ** t
cd30: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
cd40: 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
cd50: 6f 76 65 64 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  oved to location
cd60: 20 69 54 61 62 6c 65 2e 20 54 68 65 20 0a 20 20   iTable. The .  
cd70: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 72 69  ** following wri
cd80: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
cd90: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
cda0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
cdb0: 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
cdc0: 74 68 69 73 2e 20 49 74 20 69 73 20 61 73 73 75  this. It is assu
cdd0: 6d 65 64 20 74 68 61 74 20 63 75 72 73 6f 72 20  med that cursor 
cde0: 6e 75 6d 62 65 72 20 30 20 69 73 20 61 20 77 72  number 0 is a wr
cdf0: 69 74 65 2d 63 75 72 73 6f 72 0a 20 20 2a 2a 20  ite-cursor.  ** 
ce00: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 73 71  opened on the sq
ce10: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ce20: 65 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  e..  */.  static
ce30: 20 2f 2a 63 6f 6e 73 74 2a 2f 20 56 64 62 65 4f   /*const*/ VdbeO
ce40: 70 4c 69 73 74 20 75 70 64 61 74 65 4d 61 73 74  pList updateMast
ce50: 65 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  er[] = {.    /* 
ce60: 49 66 20 74 68 65 20 4f 70 5f 44 65 73 74 72 6f  If the Op_Destro
ce70: 79 20 70 75 73 68 65 64 20 61 20 30 20 6f 6e 74  y pushed a 0 ont
ce80: 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 74 68 65  o the stack, the
ce90: 6e 20 73 6b 69 70 20 74 68 65 20 66 6f 6c 6c 6f  n skip the follo
cea0: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 6f 64 65  wing.    ** code
ceb0: 2e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  . sqlite_master 
cec0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 75 70  does not need up
ced0: 64 61 74 69 6e 67 20 69 6e 20 74 68 69 73 20 63  dating in this c
cee0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
cef0: 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20  { OP_Dup,       
cf00: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   0, 0,        0}
cf10: 2c 0a 20 20 20 20 7b 20 4f 50 5f 49 6e 74 65 67  ,.    { OP_Integ
cf20: 65 72 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  er,    0, 0,    
cf30: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7b 20 4f 50      0},.    { OP
cf40: 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
cf50: 41 44 44 52 28 31 37 29 2c 20 30 7d 2c 0a 0a 20  ADDR(17), 0},.. 
cf60: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
cf70: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
cf80: 65 72 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e  er row containin
cf90: 67 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  g root-page iTab
cfa0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 7b 20 4f 50 5f  le. */.    { OP_
cfb0: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
cfc0: 44 44 52 28 38 29 2c 20 30 7d 2c 20 0a 20 20 20  DDR(8), 0}, .   
cfd0: 20 7b 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20   { OP_Dup,      
cfe0: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d    0, 0,       0}
cff0: 2c 20 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 7b 20  , /* 4 */.    { 
d000: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
d010: 2c 20 33 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 3,       0}, /
d020: 2a 20 35 20 2a 2f 0a 20 20 20 20 7b 20 4f 50 5f  * 5 */.    { OP_
d030: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
d040: 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(9), 0},.    
d050: 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
d060: 20 30 2c 20 41 44 44 52 28 34 29 2c 20 30 7d 2c   0, ADDR(4), 0},
d070: 0a 20 20 20 20 7b 20 4f 50 5f 48 61 6c 74 2c 20  .    { OP_Halt, 
d080: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 4f 52        SQLITE_COR
d090: 52 55 50 54 2c 20 4f 45 5f 46 61 69 6c 2c 20 30  RUPT, OE_Fail, 0
d0a0: 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7b  }, /* 8 */.    {
d0b0: 20 4f 50 5f 52 65 63 6e 6f 2c 20 20 20 20 20 20   OP_Recno,      
d0c0: 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
d0d0: 2f 2a 20 39 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  /* 9 */..    /* 
d0e0: 43 75 72 73 6f 72 20 30 20 6e 6f 77 20 70 6f 69  Cursor 0 now poi
d0f0: 6e 74 73 20 61 74 20 74 68 65 20 72 6f 77 20 74  nts at the row t
d100: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 70 64 61  hat will be upda
d110: 74 65 64 2e 20 54 68 65 20 74 6f 70 20 6f 66 0a  ted. The top of.
d120: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b      ** the stack
d130: 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66   is the rowid of
d140: 20 74 68 61 74 20 72 6f 77 2e 20 54 68 65 20 6e   that row. The n
d150: 65 78 74 20 76 61 6c 75 65 20 6f 6e 20 74 68 65  ext value on the
d160: 20 73 74 61 63 6b 20 69 73 20 0a 20 20 20 20 2a   stack is .    *
d170: 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  * the new value 
d180: 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
d190: 65 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a  e field..    */.
d1a0: 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
d1b0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
d1c0: 20 30 7d 2c 20 2f 2a 20 31 30 20 2a 2f 0a 20 20   0}, /* 10 */.  
d1d0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
d1e0: 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30     0, 1,       0
d1f0: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  },.    { OP_Colu
d200: 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20  mn,     0, 2,   
d210: 20 20 20 20 30 7d 2c 0a 20 20 20 20 7b 20 4f 50      0},.    { OP
d220: 5f 49 6e 74 65 67 65 72 2c 20 20 20 20 34 2c 20  _Integer,    4, 
d230: 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
d240: 31 33 20 2a 2f 0a 20 20 20 20 7b 20 4f 50 5f 43  13 */.    { OP_C
d250: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 34 2c  olumn,     0, 4,
d260: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 7b         0},.    {
d270: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
d280: 35 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 0a  5, 0,       0},.
d290: 20 20 20 20 7b 20 4f 50 5f 50 75 74 49 6e 74 4b      { OP_PutIntK
d2a0: 65 79 2c 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ey,  0, 0,      
d2b0: 20 30 7d 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   0}  /* 16 */.  
d2c0: 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  };.#endif..  sql
d2d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d2e0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
d2f0: 62 6c 65 2c 20 69 44 62 29 3b 0a 20 20 2f 2a 20  ble, iDb);.  /* 
d300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d310: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
d320: 29 3b 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ); */.#ifndef SQ
d330: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
d340: 43 55 55 4d 0a 20 20 62 61 73 65 20 3d 20 73 71  CUUM.  base = sq
d350: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
d360: 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
d370: 75 70 64 61 74 65 4d 61 73 74 65 72 29 2c 20 75  updateMaster), u
d380: 70 64 61 74 65 4d 61 73 74 65 72 29 3b 0a 20 20  pdateMaster);.  
d390: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d3a0: 65 50 31 28 76 2c 20 62 61 73 65 2b 31 33 2c 20  eP1(v, base+13, 
d3b0: 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  iTable);.#endif.
d3c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
d3d0: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
d3e0: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
d3f0: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
d400: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
d410: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
d420: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
d430: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
d440: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
d450: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
d460: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
d470: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
d480: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
d490: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
d4a0: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
d4b0: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
d4c0: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
d4d0: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
d4e0: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
d4f0: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
d500: 79 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20  yTable(Vdbe *v, 
d510: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
d520: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
d530: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 64 65  _AUTOVACUUM.  de
d540: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 76 2c  stroyRootPage(v,
d550: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54 61   pTab->tnum, pTa
d560: 62 2d 3e 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  b->iDb);.  for(p
d570: 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
d580: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
d590: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
d5a0: 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 76  estroyRootPage(v
d5b0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49  , pIdx->tnum, pI
d5c0: 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65  dx->iDb);.  }.#e
d5d0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
d5e0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
d5f0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
d600: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
d610: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d620: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
d630: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
d640: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
d650: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
d660: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
d670: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
d680: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
d690: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
d6a0: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
d6b0: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
d6c0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
d6d0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
d6e0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
d6f0: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
d700: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
d710: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
d720: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
d730: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
d740: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
d750: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
d760: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
d770: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
d780: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
d790: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
d7a0: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
d7b0: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
d7c0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
d7d0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
d7e0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
d7f0: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
d800: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
d810: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
d820: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
d830: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
d840: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
d850: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
d860: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
d870: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
d880: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
d890: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
d8a0: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
d8b0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
d8c0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
d8d0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
d8e0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
d8f0: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
d900: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
d910: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
d920: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
d930: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
d940: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d950: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d960: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
d970: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
d980: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
d990: 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62   pIdx->iDb==pTab
d9a0: 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20 69  ->iDb );.      i
d9b0: 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
d9c0: 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
d9d0: 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
d9e0: 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
d9f0: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
da00: 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
da10: 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
da20: 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  est==0 ) return;
da30: 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
da40: 50 61 67 65 28 76 2c 20 69 4c 61 72 67 65 73 74  Page(v, iLargest
da50: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
da60: 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
da70: 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23 65 6e  Largest;.  }.#en
da80: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
da90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
daa0: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
dab0: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
dac0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
dad0: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
dae0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
daf0: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
db00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
db10: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
db20: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
db30: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
db40: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
db50: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
db60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
db70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
db80: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
db90: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
dba0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
dbb0: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  d ) goto exit_dr
dbc0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65  op_table;.  asse
dbd0: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
dbe0: 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  =1 );.  pTab = s
dbf0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
dc00: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  e(pParse, pName-
dc10: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
dc20: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
dc30: 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  se);..  if( pTab
dc40: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
dc50: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44  drop_table;.  iD
dc60: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
dc70: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
dc80: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
dc90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
dca0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
dcb0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
dcc0: 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
dcd0: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
dce0: 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e  EMA_TABLE(pTab->
dcf0: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
dd00: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
dd10: 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
dd20: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
dd30: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
dd40: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
dd50: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
dd60: 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
dd70: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
dd80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dd90: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
dda0: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
ddb0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
ddc0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
ddd0: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
dde0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
ddf0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
de00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
de10: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
de20: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
de30: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
de40: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
de50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
de60: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
de70: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
de80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
de90: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
dea0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
deb0: 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
dec0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
ded0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
dee0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
def0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
df00: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
df10: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
df20: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
df30: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
df40: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
df50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
df60: 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  if.  if( pTab->r
df70: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
df80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
df90: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
dfa0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
dfb0: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
dfc0: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
dfd0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
dfe0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
dff0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69  ;.  }.  if( isVi
e000: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
e010: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
e020: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e030: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
e040: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
e050: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
e060: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
e070: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
e080: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
e090: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
e0a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
e0b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e0c0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
e0d0: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
e0e0: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
e0f0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
e100: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
e110: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
e120: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
e130: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
e140: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
e150: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
e160: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
e170: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e180: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
e190: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
e1a0: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
e1b0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
e1c0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
e1d0: 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  Tab->iDb);..    
e1e0: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
e1f0: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
e200: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
e210: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
e220: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
e230: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
e240: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
e250: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
e260: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
e270: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
e280: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
e290: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
e2a0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
e2b0: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
e2c0: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
e2d0: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
e2e0: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c 7c  Db==pTab->iDb ||
e2f0: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
e300: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
e310: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
e320: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
e330: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 72  r, 1);.      pTr
e340: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
e350: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
e360: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
e370: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
e380: 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
e390: 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
e3a0: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   to the.    ** t
e3b0: 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
e3c0: 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
e3d0: 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
e3e0: 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
e3f0: 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  s.    ** every r
e400: 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
e410: 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
e420: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
e430: 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20  e one being.    
e440: 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
e450: 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
e460: 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61   seperately beca
e470: 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
e480: 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  n be.    ** crea
e490: 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
e4a0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
e4b0: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
e4c0: 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  in another.    *
e4d0: 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
e4e0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
e4f0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
e500: 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  , .        "DELE
e510: 54 45 20 46 52 4f 4d 20 25 51 2e 25 51 20 57 48  TE FROM %Q.%Q WH
e520: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
e530: 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
e540: 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 64 62  er'",.        db
e550: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
e560: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
e570: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 2c  ABLE(pTab->iDb),
e580: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e590: 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29     if( !isView )
e5a0: 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
e5b0: 61 62 6c 65 28 76 2c 20 70 54 61 62 29 3b 0a 20  able(v, pTab);. 
e5c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e5d0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72  VdbeOp3(v, OP_Dr
e5e0: 6f 70 54 61 62 6c 65 2c 20 70 54 61 62 2d 3e 69  opTable, pTab->i
e5f0: 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  Db, 0, pTab->zNa
e600: 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  me, 0);.  }.  sq
e610: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
e620: 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
e630: 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
e640: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
e650: 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
e660: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e670: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
e680: 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
e690: 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
e6a0: 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
e6b0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
e6c0: 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
e6d0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
e6e0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
e6f0: 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
e700: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
e710: 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
e720: 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
e730: 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
e740: 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
e750: 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
e760: 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
e770: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
e780: 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70   referred to.  p
e790: 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20  ToCol is a list 
e7a0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
e7b0: 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61   other.** pTo ta
e7c0: 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f 72  ble that the for
e7d0: 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20  eign key points 
e7e0: 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  to.  flags conta
e7f0: 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
e800: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
e810: 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
e820: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
e830: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
e840: 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
e850: 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
e860: 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
e870: 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
e880: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
e890: 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
e8a0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
e8b0: 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
e8c0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
e8d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e8e0: 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e  le field.  The n
e8f0: 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f  ew FKey.** is no
e900: 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62  t linked into db
e910: 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73 20  ->aFKey at this 
e920: 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65  point - that doe
e930: 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20  s not happen.** 
e940: 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64  until sqlite3End
e950: 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Table()..**.** T
e960: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  he foreign key i
e970: 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49  s set for IMMEDI
e980: 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ATE processing. 
e990: 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
e9a0: 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ll.** to sqlite3
e9b0: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
e9c0: 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  ) might change t
e9d0: 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e  his to DEFERRED.
e9e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e9f0: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
ea00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ea10: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
ea20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ea30: 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d   ExprList *pFrom
ea40: 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  Col,  /* Columns
ea50: 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74   in this table t
ea60: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68  hat point to oth
ea70: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f  er table */.  To
ea80: 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20  ken *pTo,       
ea90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
eaa0: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
eab0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f  .  ExprList *pTo
eac0: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
ead0: 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ns in the other 
eae0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  table */.  int f
eaf0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
eb00: 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
eb10: 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
eb20: 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  s. */.){.#ifndef
eb30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
eb40: 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
eb50: 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
eb60: 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
eb70: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
eb80: 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
eb90: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
eba0: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
ebb0: 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
ebc0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
ebd0: 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
ebe0: 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46  fk_end;.  if( pF
ebf0: 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
ec00: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e   int iCol = p->n
ec10: 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  Col-1;.    if( i
ec20: 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f  Col<0 ) goto fk_
ec30: 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  end;.    if( pTo
ec40: 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
ec50: 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
ec60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ec70: 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67  (pParse, "foreig
ec80: 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20  n key on %s".   
ec90: 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72        " should r
eca0: 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e  eference only on
ecb0: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  e column of tabl
ecc0: 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20  e %T",.         
ecd0: 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  p->aCol[iCol].zN
ece0: 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20  ame, pTo);.     
ecf0: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
ed00: 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31    }.    nCol = 1
ed10: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
ed20: 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
ed30: 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d  nExpr!=pFromCol-
ed40: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71  >nExpr ){.    sq
ed50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ed60: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e  arse,.        "n
ed70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ed80: 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
ed90: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
eda0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20  he number of ". 
edb0: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20         "columns 
edc0: 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  in the reference
edd0: 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67  d table");.    g
ede0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65  oto fk_end;.  }e
edf0: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
ee00: 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b  pFromCol->nExpr;
ee10: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73  .  }.  nByte = s
ee20: 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20  izeof(*pFKey) + 
ee30: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65  nCol*sizeof(pFKe
ee40: 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
ee50: 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
ee60: 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
ee70: 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
ee80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
ee90: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72      nByte += str
eea0: 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  len(pToCol->a[i]
eeb0: 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
eec0: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
eed0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
eee0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
eef0: 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b  Key==0 ) goto fk
ef00: 5f 65 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  _end;.  pFKey->p
ef10: 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65  From = p;.  pFKe
ef20: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70  y->pNextFrom = p
ef30: 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28  ->pFKey;.  z = (
ef40: 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b  char*)&pFKey[1];
ef50: 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d  .  pFKey->aCol =
ef60: 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70   (struct sColMap
ef70: 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65  *)z;.  z += size
ef80: 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61  of(struct sColMa
ef90: 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79  p)*nCol;.  pFKey
efa0: 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
efb0: 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
efc0: 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
efd0: 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20  >n] = 0;.  z += 
efe0: 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
eff0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a  y->pNextTo = 0;.
f000: 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20    pFKey->nCol = 
f010: 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f  nCol;.  if( pFro
f020: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mCol==0 ){.    p
f030: 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46  FKey->aCol[0].iF
f040: 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  rom = p->nCol-1;
f050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
f060: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
f070: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  ++){.      int j
f080: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
f090: 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29   j<p->nCol; j++)
f0a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
f0b0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e  lite3StrICmp(p->
f0c0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70  aCol[j].zName, p
f0d0: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
f0e0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
f0f0: 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c       pFKey->aCol
f100: 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20  [i].iFrom = j;. 
f110: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f130: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70  }.      if( j>=p
f140: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
f150: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f160: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
f170: 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f       "unknown co
f180: 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66  lumn \"%s\" in f
f190: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
f1a0: 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20  ition", .       
f1b0: 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69     pFromCol->a[i
f1c0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
f1d0: 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
f1e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f1f0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
f200: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f210: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f220: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
f230: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
f240: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
f250: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
f260: 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  = z;.      memcp
f270: 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  y(z, pToCol->a[i
f280: 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ].zName, n);.   
f290: 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20     z[n] = 0;.   
f2a0: 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20     z += n+1;.   
f2b0: 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e   }.  }.  pFKey->
f2c0: 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a  isDeferred = 0;.
f2d0: 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43    pFKey->deleteC
f2e0: 6f 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78  onf = flags & 0x
f2f0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  ff;.  pFKey->upd
f300: 61 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ateConf = (flags
f310: 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a   >> 8 ) & 0xff;.
f320: 20 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43    pFKey->insertC
f330: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
f340: 31 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20  16 ) & 0xff;..  
f350: 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
f360: 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
f370: 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
f380: 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
f390: 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
f3a0: 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
f3b0: 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72  _end:.  sqliteFr
f3c0: 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  ee(pFKey);.#endi
f3d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f3e0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
f3f0: 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
f400: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
f410: 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73  e(pFromCol);.  s
f420: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
f430: 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  lete(pToCol);.}.
f440: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f450: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
f460: 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
f470: 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
f480: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
f490: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
f4a0: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
f4b0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
f4c0: 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
f4d0: 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
f4e0: 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
f4f0: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
f500: 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
f510: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
f520: 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
f530: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
f540: 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
f550: 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
f560: 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
f570: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
f580: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
f590: 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
f5a0: 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
f5b0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f5c0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
f5d0: 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
f5e0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
f5f0: 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
f600: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
f610: 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
f620: 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
f630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b   ) return;.  pFK
f640: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
f650: 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e   isDeferred;.#en
f660: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dif.}../*.** Cre
f670: 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
f680: 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
f690: 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74 68 65  .  pIndex is the
f6a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
f6b0: 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c  ex .** and pTabl
f6c0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
f6d0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
f6e0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
f6f0: 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a  .  Both will .**
f700: 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70   be NULL for a p
f710: 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e  rimary key or an
f720: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63   index that is c
f730: 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66  reated to satisf
f740: 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f  y a.** UNIQUE co
f750: 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54  nstraint.  If pT
f760: 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20  able and pIndex 
f770: 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50  are NULL, use pP
f780: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a  arse->pNewTable.
f790: 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20  ** as the table 
f7a0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
f7b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f7c0: 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61  e is a table tha
f7d0: 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  t is.** currentl
f7e0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
f7f0: 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20  ted by a CREATE 
f800: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
f810: 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20  .**.** pList is 
f820: 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  a list of column
f830: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
f840: 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20    pList will be 
f850: 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20  NULL if this.** 
f860: 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  is a primary key
f870: 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74   or unique-const
f880: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73  raint on the mos
f890: 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20  t recent column 
f8a0: 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  added.** to the 
f8b0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
f8c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
f8d0: 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  on.  .*/.void sq
f8e0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
f8f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f900: 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f  e,   /* All info
f910: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
f920: 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
f930: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
f940: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
f950: 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
f960: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
f970: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
f980: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
f990: 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
f9a0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
f9b0: 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
f9c0: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
f9d0: 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
f9e0: 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
f9f0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
fa00: 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
fa10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
fa20: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
fa30: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
fa40: 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
fa50: 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
fa60: 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
fa70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
fa80: 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41  t,   /* The CREA
fa90: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
faa0: 67 69 6e 73 20 61 20 43 52 45 41 54 45 20 54 41  gins a CREATE TA
fab0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  BLE statement */
fac0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20  .  Token *pEnd  
fad0: 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74      /* The ")" t
fae0: 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43  hat closes the C
faf0: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
fb00: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61  ement */.){.  Ta
fb10: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f  ble *pTab = 0; /
fb20: 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
fb30: 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
fb40: 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a   *pIndex = 0; /*
fb50: 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
fb60: 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
fb70: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
fb80: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
fb90: 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a  en nullId;    /*
fba0: 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
fbb0: 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
fbc0: 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
fbd0: 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73  ix;    /* For as
fbe0: 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
fbf0: 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
fc00: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
fc10: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ;      /* True f
fc20: 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69  or a temporary i
fc30: 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
fc40: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fc50: 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20  db;..  int iDb; 
fc60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
fc70: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
fc80: 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
fc90: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
fca0: 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f  en *pName = 0; /
fcb0: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
fcc0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
fcd0: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
fce0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
fcf0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
fd00: 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f  oc_failed ) goto
fd10: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
fd20: 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  ex;..  /*.  ** F
fd30: 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
fd40: 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
fd50: 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
fd60: 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
fd70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
fd80: 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
fd90: 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
fda0: 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
fdb0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
fdc0: 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
fdd0: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
fde0: 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
fdf0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
fe00: 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
fe10: 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
fe20: 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
fe30: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
fe40: 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
fe50: 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
fe60: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
fe70: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
fe80: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
fe90: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
fea0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
feb0: 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
fec0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
fed0: 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
fee0: 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
fef0: 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  he the table.   
ff00: 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
ff10: 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
ff20: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
ff30: 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  1..    */.    pT
ff40: 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
ff50: 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
ff60: 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
ff70: 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
ff80: 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
ff90: 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62  Tab && pTab->iDb
ffa0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62  ==1 ){.      iDb
ffb0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
ffc0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49   if( sqlite3FixI
ffd0: 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
ffe0: 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
fff0: 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20   pName) &&.     
10000 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63     sqlite3FixSrc
10010 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
10020 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  Name).    ){.   
10030 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
10040 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
10050 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
10060 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
10070 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d  Parse, pTblName-
10080 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20  >a[0].zName, .  
10090 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e        pTblName->
100a0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
100b0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
100c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
100d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
100e0 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e  ert( iDb==pTab->
100f0 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iDb );.  }else{.
10100 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
10110 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  e==0 );.    pTab
10120 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   =  pParse->pNew
10130 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d  Table;.    iDb =
10140 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a   pTab->iDb;.  }.
10150 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
10160 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
10170 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10180 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70  e_index;.  if( p
10190 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
101a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
101b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
101c0 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
101d0 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62  e indexed", pTab
101e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
101f0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10200 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
10210 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
10220 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10230 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
10240 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  ews may not be i
10250 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
10260 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10270 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65  ndex;.  }.  isTe
10280 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d  mp = pTab->iDb==
10290 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  1;..  /*.  ** Fi
102a0 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
102b0 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
102c0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
102d0 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
102e0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
102f0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
10300 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
10310 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
10320 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
10330 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
10340 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
10350 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
10360 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
10370 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
10380 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
10390 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
103a0 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
103b0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
103c0 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
103d0 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
103e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
103f0 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
10400 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
10410 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
10420 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
10430 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
10440 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
10450 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
10460 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
10470 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
10480 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
10490 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
104a0 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
104b0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
104c0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
104d0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
104e0 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
104f0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10500 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
10510 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
10520 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10530 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
10540 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
10550 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
10560 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  x;.    if( SQLIT
10570 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
10580 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
10590 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
105a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
105b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
105c0 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
105d0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
105e0 20 20 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65     Index *pISame
105f0 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74  Name;    /* Anot
10600 68 65 72 20 69 6e 64 65 78 20 77 69 74 68 20 74  her index with t
10610 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  he same name */.
10620 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53        Table *pTS
10630 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
10640 20 74 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65   table with same
10650 20 6e 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64   name as the ind
10660 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
10670 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
10680 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
10690 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
106a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
106b0 20 20 20 20 20 69 66 28 20 28 70 49 53 61 6d 65       if( (pISame
106c0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Name = sqlite3Fi
106d0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
106e0 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e, db->aDb[iDb].
106f0 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20  zName))!=0 ){.  
10700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10710 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
10720 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
10730 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
10740 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
10750 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10770 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d  f( (pTSameName =
10780 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
10790 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  e(db, zName, 0))
107a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
107b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
107c0 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
107d0 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
107e0 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
107f0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
10800 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10810 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
10820 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e  }.  }else if( pN
10830 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ame==0 ){.    ch
10840 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20  ar zBuf[30];.   
10850 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
10860 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
10870 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
10880 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
10890 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
108a0 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
108b0 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f   sprintf(zBuf,"_
108c0 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d  %d",n);.    zNam
108d0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
108e0 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
108f0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  me, "sqlite_auto
10900 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a  index_", pTab->z
10910 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61  Name, zBuf, (cha
10920 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  r*)0);.    if( z
10930 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
10940 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10950 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
10960 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
10970 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
10980 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
10990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
109a0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
109b0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
109c0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
109d0 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  [pTab->iDb].zNam
109e0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
109f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
10a00 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
10a10 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
10a20 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
10a30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
10a40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
10a60 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
10a70 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54  DEX;.    if( isT
10a80 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45  emp ) i = SQLITE
10a90 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
10aa0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
10ab0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10ac0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
10ad0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
10ae0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
10af0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
10b10 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
10b20 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
10b30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
10b40 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
10b50 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
10b60 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
10b70 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
10b80 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
10b90 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
10ba0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
10bb0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
10bc0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
10bd0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
10be0 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
10bf0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54   = pTab->aCol[pT
10c00 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
10c10 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
10c20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e  = strlen(nullId.
10c30 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
10c40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
10c50 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c  ppend(0, 0, &nul
10c60 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  lId);.    if( pL
10c70 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
10c80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
10ca0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
10cb0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
10cc0 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20    */.  pIndex = 
10cd0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
10ce0 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74  zeof(Index) + st
10cf0 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20  rlen(zName) + 1 
10d00 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
10d10 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
10d20 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28  f(int) + sizeof(
10d30 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74  CollSeq*))*pList
10d40 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66 28  ->nExpr );.  if(
10d50 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74   pIndex==0 ) got
10d60 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
10d70 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  dex;.  pIndex->a
10d80 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29  iColumn = (int*)
10d90 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
10da0 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45  .aColl[pList->nE
10db0 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  xpr];.  pIndex->
10dc0 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
10dd0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
10de0 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
10df0 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d    strcpy(pIndex-
10e00 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
10e10 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
10e20 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
10e30 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69  x->nColumn = pLi
10e40 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
10e50 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f  dex->onError = o
10e60 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
10e70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e  ->autoIndex = pN
10e80 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78  ame==0;.  pIndex
10e90 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20  ->iDb = iDb;..  
10ea0 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
10eb0 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
10ec0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
10ed0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
10ee0 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
10ef0 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
10f00 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
10f10 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
10f20 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
10f30 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
10f40 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
10f50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
10f60 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
10f70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
10f80 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
10f90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10fa0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
10fb0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
10fc0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29  ->aCol[j].zName)
10fd0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
10fe0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
10ff0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
11000 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11010 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
11020 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
11030 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
11040 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
11050 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
11060 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
11070 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11080 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
11090 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
110a0 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70  ] = j;.    if( p
110b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
110c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
110d0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ( pList->a[i].pE
110e0 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
110f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
11100 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
11110 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
11120 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  ->pColl;.    }el
11130 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  se{.      pIndex
11140 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11150 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  i] = pTab->aCol[
11160 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  j].pColl;.    }.
11170 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
11180 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11190 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20  l[i] );.    if( 
111a0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
111b0 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
111c0 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
111d0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b  Parse, pIndex->k
111e0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29  eyInfo.aColl[i])
111f0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
11200 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11210 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
11220 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  .  pIndex->keyIn
11230 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73  fo.nField = pLis
11240 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28  t->nExpr;..  if(
11250 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
11260 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
11270 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
11280 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
11290 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74  to create an aut
112a0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20  omatic index as 
112b0 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20  a.    ** result 
112c0 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  of a PRIMARY KEY
112d0 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
112e0 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65  e on a column de
112f0 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20  finition, or.   
11300 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45   ** a PRIMARY KE
11310 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
11320 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  se following the
11330 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
11340 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e  ons..    ** i.e.
11350 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a   one of:.    **.
11360 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
11370 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20  BLE t(x PRIMARY 
11380 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20  KEY, y);.    ** 
11390 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
113a0 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79  , y, UNIQUE(x, y
113b0 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ));.    **.    *
113c0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68  * Either way, ch
113d0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
113e0 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
113f0 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65  has such an inde
11400 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c  x. If.    ** so,
11410 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72   don't bother cr
11420 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e  eating this one.
11430 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
11440 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74  es to.    ** aut
11450 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
11460 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72  ed indices. User
11470 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79  s can do as they
11480 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a   wish with.    *
11490 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63  * explicit indic
114a0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
114b0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
114c0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
114d0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
114e0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
114f0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
11500 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11510 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
11520 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
11530 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
11540 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
11550 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
11560 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
11570 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
11580 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78  >nColumn!=pIndex
11590 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74  ->nColumn ) cont
115a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
115b0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f  k=0; k<pIdx->nCo
115c0 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  lumn; k++){.    
115d0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
115e0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
115f0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
11600 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11610 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  if( pIdx->keyInf
11620 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64  o.aColl[k]!=pInd
11630 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
11640 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  l[k] ) break;.  
11650 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11660 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  k==pIdx->nColumn
11670 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11680 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70  pIdx->onError!=p
11690 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29  Index->onError )
116a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
116b0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  his constraint c
116c0 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20  reates the same 
116d0 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69  index as a previ
116e0 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ous.          **
116f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63   constraint spec
11700 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20  ified somewhere 
11710 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
11720 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  BLE statement.. 
11730 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65           ** Howe
11740 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c  ver the ON CONFL
11750 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20  ICT clauses are 
11760 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f  different. If bo
11770 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  th this .       
11780 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
11790 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75   and the previou
117a0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e  s equivalent con
117b0 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70  straint have exp
117c0 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20  licit.          
117d0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ** ON CONFLICT c
117e0 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61  lauses this is a
117f0 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69  n error. Otherwi
11800 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20  se, use the.    
11810 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69        ** explici
11820 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65  tly specified be
11830 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20  haviour for the 
11840 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
11850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
11860 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
11870 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
11880 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
11890 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
118a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
118b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
118c0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
118d0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
118e0 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
118f0 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
11900 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
11910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
11920 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
11930 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
11940 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
11950 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
11960 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
11970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11980 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
11990 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
119a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
119b0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
119c0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
119d0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
119e0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
119f0 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
11a00 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
11a10 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
11a20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
11a30 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
11a40 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
11a50 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
11a60 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
11a70 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
11aa0 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
11ab0 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
11ac0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
11ad0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11ae0 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
11af0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
11b00 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
11b10 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11b20 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11b30 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
11b40 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
11b50 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
11b60 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
11b70 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
11b80 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
11b90 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
11ba0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
11bb0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
11bc0 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
11bd0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
11be0 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
11bf0 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
11c00 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
11c10 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
11c20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
11c30 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
11c40 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
11c50 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
11c60 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
11c70 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
11c80 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
11c90 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
11ca0 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
11cb0 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
11cc0 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
11cd0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
11ce0 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
11cf0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
11d00 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
11d10 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
11d20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
11d30 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
11d40 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
11d50 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
11d60 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
11d70 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
11d80 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
11d90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
11da0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
11db0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
11dc0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
11dd0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
11de0 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
11df0 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
11e00 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
11e10 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
11e20 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
11e30 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
11e40 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
11e50 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
11e60 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
11e70 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
11e80 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
11e90 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
11ea0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
11eb0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
11ec0 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
11ed0 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 0a 20 20 20  lbl1, lbl2;..   
11ee0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
11ef0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
11f00 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
11f10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
11f20 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  ex;.    if( pTbl
11f30 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
11f40 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
11f50 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
11f60 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
11f70 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
11f80 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62  sterTable(v, iDb
11f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
11fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11fb0 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
11fc0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
11fd0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
11fe0 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 69 6e  ring8, 0, 0, "in
11ff0 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29  dex", P3_STATIC)
12000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12010 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
12020 67 38 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  g8, 0, 0, pIndex
12030 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
12040 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
12050 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
12060 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
12070 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12080 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12090 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
120a0 62 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  b, 0);.    if( p
120b0 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
120c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120d0 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
120e0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
120f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12100 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
12110 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12120 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
12130 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20  enWrite, 1, 0,. 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 6e 64      (char*)&pInd
12160 65 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  ex->keyInfo, P3_
12170 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a  KEYINFO);.    }.
12180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12190 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
121a0 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  g8, 0, 0);.    i
121b0 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45 6e  f( pStart && pEn
121c0 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6f  d ){.      if( o
121d0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
121e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
121f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
12200 2c 20 2d 31 2c 20 22 43 52 45 41 54 45 20 49 4e  , -1, "CREATE IN
12210 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43  DEX ", P3_STATIC
12220 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12240 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
12250 31 2c 20 22 43 52 45 41 54 45 20 55 4e 49 51 55  1, "CREATE UNIQU
12260 45 20 49 4e 44 45 58 20 22 2c 20 50 33 5f 53 54  E INDEX ", P3_ST
12270 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
12280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12290 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
122a0 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
122b0 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
122c0 3e 7a 29 20 2d 20 41 64 64 72 28 70 4e 61 6d 65  >z) - Addr(pName
122d0 2d 3e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  ->z) + 1;.      
122e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
122f0 65 50 33 28 76 2c 20 2d 31 2c 20 70 4e 61 6d 65  eP3(v, -1, pName
12300 2d 3e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  ->z, n);.      s
12310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12320 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 30 2c  v, OP_Concat, 0,
12330 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
12340 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
12350 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
12360 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50  5, 0, "tttit", P
12370 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
12380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12390 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
123a0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
123b0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
123c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
123d0 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
123e0 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b  , pTab->iDb, 0);
123f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12400 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
12410 65 6e 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d  enRead, 2, pTab-
12420 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  >tnum);.      /*
12430 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12440 20 22 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   "%s", pTab->zNa
12450 6d 65 29 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  me)); */.      s
12460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12470 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
12480 6d 6e 73 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43  mns, 2, pTab->nC
12490 6f 6c 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20  ol);.      lbl2 
124a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
124b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
124c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
124d0 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
124e0 32 2c 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20  2, lbl2);.      
124f0 6c 62 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64  lbl1 = sqlite3Vd
12500 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
12520 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12530 76 2c 20 70 49 6e 64 65 78 2c 20 32 29 3b 0a 20  v, pIndex, 2);. 
12540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12550 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 50 75 74  Op3(v, OP_IdxPut
12560 2c 20 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  , 1, pIndex->onE
12570 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20  rror!=OE_None,. 
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f       "indexed co
125a0 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
125b0 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43  ique", P3_STATIC
125c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
125d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
125e0 4e 65 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a  Next, 2, lbl1);.
125f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12600 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12610 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71   lbl2);.      sq
12620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12630 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30  , OP_Close, 2, 0
12640 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12650 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12660 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Close, 1, 0);.  
12670 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
12680 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69  eCookie(db, v, i
12690 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
126a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
126b0 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
126c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
126d0 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61 72 73 65  eOp3(v, OP_Parse
126e0 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a  Schema, iDb, 0,.
126f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12700 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25  MPrintf("name='%
12710 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  q'", pIndex->zNa
12720 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  me), P3_DYNAMIC)
12730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
12740 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
12750 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
12760 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
12770 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
12780 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
12790 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
127a0 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
127b0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
127c0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
127d0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
127e0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
127f0 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
12800 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a  on of UPDATE.  *
12810 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20  * and INSERT..  
12820 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
12830 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61  t.busy || pTblNa
12840 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
12850 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70   onError!=OE_Rep
12860 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49  lace || pTab->pI
12870 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20  ndex==0.        
12880 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
12890 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65  ->onError==OE_Re
128a0 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49  place){.      pI
128b0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
128c0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
128d0 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d    pTab->pIndex =
128e0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c   pIndex;.    }el
128f0 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
12900 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e  *pOther = pTab->
12910 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
12920 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65  ile( pOther->pNe
12930 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e  xt && pOther->pN
12940 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  ext->onError!=OE
12950 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20  _Replace ){.    
12960 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74      pOther = pOt
12970 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
12980 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
12990 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72  ->pNext = pOther
129a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70  ->pNext;.      p
129b0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
129c0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  Index;.    }.   
129d0 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
129e0 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
129f0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
12a00 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
12a10 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
12a20 78 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64  x ){.    freeInd
12a30 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
12a40 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
12a50 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
12a60 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
12a70 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29  Delete(pTblName)
12a80 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
12a90 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
12aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12ab0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
12ac0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
12ad0 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
12ae0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
12af0 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
12b00 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
12b10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
12b20 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
12b30 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
12b40 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
12b50 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
12b60 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
12b70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12b80 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
12b90 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
12ba0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
12bb0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
12bc0 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
12bd0 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
12be0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
12bf0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
12c00 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65   return;.  pInde
12c10 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
12c20 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
12c30 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
12c40 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
12c50 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
12c60 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
12c70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12c80 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
12c90 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
12ca0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63  );.    pParse->c
12cb0 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
12cc0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
12cd0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
12ce0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
12cf0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
12d00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
12d10 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
12d20 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
12d30 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
12d40 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
12d50 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
12d60 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
12d70 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
12d80 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
12d90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12da0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
12db0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
12dc0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
12dd0 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
12de0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
12df0 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
12e00 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
12e10 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
12e20 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
12e30 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
12e40 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64  CHEMA_TABLE(pInd
12e50 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66  ex->iDb);.    if
12e60 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12e70 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
12e80 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
12e90 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
12ea0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
12eb0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
12ec0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62   if( pIndex->iDb
12ed0 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45   ) code = SQLITE
12ee0 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  _DROP_TEMP_INDEX
12ef0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
12f00 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
12f10 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d  e, code, pIndex-
12f20 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
12f30 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  ame, zDb) ){.   
12f40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
12f50 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
12f60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12f70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12f80 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65   remove the inde
12f90 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d  x and from the m
12fa0 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
12fb0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
12fc0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
12fd0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74  f( v ){.    stat
12fe0 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c  ic const VdbeOpL
12ff0 69 73 74 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20  ist dropIndex[] 
13000 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52  = {.      { OP_R
13010 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44  ewind,     0, AD
13020 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20  DR(9), 0}, .    
13030 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
13040 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30     0, 0,       0
13050 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
13060 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
13070 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    1, 1,       0}
13080 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  ,.      { OP_Mem
13090 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20 20  Load,    1, 0,  
130a0 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f       0}, /* 3 */
130b0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  .      { OP_Colu
130c0 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 20  mn,     0, 1,   
130d0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
130e0 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
130f0 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20  , ADDR(8), 0},. 
13100 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20       { OP_Next, 
13110 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29        0, ADDR(3)
13120 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
13130 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20  _Goto,       0, 
13140 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(9), 0},.   
13150 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
13160 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
13170 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20  0}, /* 8 */.    
13180 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73 65 3b  };.    int base;
13190 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ..    sqlite3Beg
131a0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
131b0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49 6e 64  (pParse, 0, pInd
131c0 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71  ex->iDb);.    sq
131d0 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
131e0 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  able(v, pIndex->
131f0 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d  iDb);.    base =
13200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13210 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69  pList(v, ArraySi
13220 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c 20 64  ze(dropIndex), d
13230 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ropIndex);.    s
13240 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13250 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 49  P3(v, base+1, pI
13260 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
13270 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
13280 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
13290 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
132a0 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
132b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74  AddOp(v, OP_Dest
132c0 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  roy, pIndex->tnu
132d0 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  m, pIndex->iDb);
132e0 20 2a 2f 0a 20 20 20 20 64 65 73 74 72 6f 79 52   */.    destroyR
132f0 6f 6f 74 50 61 67 65 28 76 2c 20 70 49 6e 64 65  ootPage(v, pInde
13300 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d  x->tnum, pIndex-
13310 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
13320 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13330 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
13340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13350 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
13360 65 78 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c  ex, pIndex->iDb,
13370 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
13380 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
13390 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
133a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
133b0 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
133c0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
133d0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
133e0 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
133f0 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
13400 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
13410 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
13420 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
13430 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
13440 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
13450 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
13460 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
13470 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
13480 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
13490 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
134a0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
134b0 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
134c0 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
134d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
134e0 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
134f0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
13500 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
13510 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  Id>=pList->nAllo
13520 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  c ){.    struct 
13530 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  IdList_item *a;.
13540 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
13550 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
13560 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d  c*2 + 5;.    a =
13570 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
13580 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
13590 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c  nAlloc*sizeof(pL
135a0 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
135b0 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
135c0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
135d0 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
135e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
135f0 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
13600 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65  >a = a;.  }.  me
13610 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
13620 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
13630 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
13640 5d 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  ]));.  pList->a[
13650 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
13660 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
13670 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
13680 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  ;.  pList->nId++
13690 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
136a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
136b0 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
136c0 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
136d0 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
136e0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
136f0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
13700 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
13710 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
13720 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
13730 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
13740 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
13750 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
13760 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
13770 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
13780 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
13790 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
137a0 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
137b0 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
137c0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
137d0 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
137e0 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
137f0 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
13800 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
13810 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
13820 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
13830 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
13840 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
13850 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
13860 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
13870 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
13880 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
13890 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
138a0 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
138b0 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
138c0 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
138d0 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
138e0 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
138f0 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
13900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
13910 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
13920 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
13930 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
13940 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
13950 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
13960 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
13970 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
13980 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
13990 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
139a0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
139b0 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
139c0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
139d0 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
139e0 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
139f0 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
13a00 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
13a10 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
13a20 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
13a30 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
13a40 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
13a50 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
13a60 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
13a70 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
13a80 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
13a90 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
13aa0 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
13ab0 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53  ase){.  struct S
13ac0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
13ad0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
13ae0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
13af0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
13b00 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
13b10 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
13b20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13b30 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
13b40 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
13b50 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
13b60 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
13b70 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
13b80 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
13b90 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
13ba0 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
13bb0 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
13bc0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13bd0 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
13be0 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
13bf0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
13c00 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
13c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
13c20 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
13c30 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
13c40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
13c50 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
13c60 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
13c70 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
13c80 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
13c90 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
13ca0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
13cb0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
13cc0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
13cd0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
13ce0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
13cf0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
13d00 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
13d10 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
13d20 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
13d30 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
13d40 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
13d50 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
13d60 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
13d70 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
13d80 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
13d90 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
13da0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13db0 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70  (pDatabase);.  p
13dc0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
13dd0 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72  -1;.  pList->nSr
13de0 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
13df0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
13e00 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20  sign cursors to 
13e10 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
13e20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
13e30 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
13e40 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
13e50 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
13e60 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
13e70 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
13e80 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
13e90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
13ea0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
13eb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  <0 ){.      pLis
13ec0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  t->a[i].iCursor 
13ed0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13ef0 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
13f00 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
13f10 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
13f20 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
13f30 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
13f40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64  qlite3SrcListAdd
13f50 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
13f60 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
13f70 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
13f80 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
13f90 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  >0 ){.    pList-
13fa0 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
13fb0 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
13fc0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
13fd0 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  pToken);.  }.}..
13fe0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
13ff0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
14000 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
14010 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
14020 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
14030 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14040 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
14050 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
14060 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
14070 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
14080 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
14090 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
140a0 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
140b0 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
140c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
140d0 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
140e0 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
140f0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
14100 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
14110 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
14120 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
14130 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
14140 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
14150 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
14160 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
14170 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
14180 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
14190 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
141a0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
141b0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
141c0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
141d0 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
141e0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
141f0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
14200 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
14210 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
14220 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
14230 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
14240 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
14250 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
14260 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14270 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
14280 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
14290 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
142a0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
142b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
142c0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
142d0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
142e0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
142f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
14300 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
14310 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
14320 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
14330 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
14340 61 62 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61  ab && pItem->pTa
14350 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
14360 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
14370 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49  eleteTable(0, pI
14380 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
14390 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
143a0 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  ectDelete(pItem-
143b0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
143c0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
143d0 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pItem->pOn);.  
143e0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
143f0 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73  elete(pItem->pUs
14400 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
14410 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
14420 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
14430 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
14440 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
14450 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
14460 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
14470 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
14480 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
14490 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
144a0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
144b0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
144c0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
144d0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
144e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
144f0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14500 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14510 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14520 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14530 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14540 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
14550 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
14560 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
14570 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14580 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
14590 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
145a0 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
145b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
145c0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
145d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
145e0 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
145f0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
14600 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
14610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
14620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14630 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
14640 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
14650 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
14660 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
14670 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
14680 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
14690 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
146a0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
146b0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
146c0 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
146d0 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
146e0 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
146f0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14700 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14710 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14720 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
14730 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14740 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14750 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
14760 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
14770 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
14780 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14790 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
147a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
147b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
147c0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
147d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
147e0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
147f0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
14800 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
14810 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
14820 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
14830 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
14840 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
14850 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
14860 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
14870 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
14880 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
14890 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
148a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
148b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
148c0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
148d0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
148e0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
148f0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
14900 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
14910 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14920 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
14930 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
14940 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14950 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
14960 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
14970 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14980 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
14990 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
149a0 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
149b0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
149c0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
149d0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
149e0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
149f0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
14a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14a10 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
14a20 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
14a30 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
14a40 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
14a50 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
14a60 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
14a70 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
14a80 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
14a90 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
14aa0 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
14ab0 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
14ac0 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
14ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14ae0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14af0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14b00 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
14b10 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
14b20 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
14b30 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
14b40 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
14b50 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
14b60 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
14b70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14b80 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
14b90 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74  flags & !db->aut
14ba0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
14bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14bc0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
14bd0 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b  >aDb[1].pBt, 1);
14be0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14c00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14c10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
14c20 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
14c30 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
14c40 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
14c50 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
14c60 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ile");.        p
14c70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
14c80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
14c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
14cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14cc0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
14cd0 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
14ce0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
14cf0 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
14d00 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
14d10 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
14d20 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
14d30 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
14d40 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
14d50 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
14d60 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
14d70 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
14d80 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
14d90 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
14da0 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
14db0 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
14dc0 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
14dd0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
14de0 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
14df0 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
14e00 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
14e10 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
14e20 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
14e30 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
14e40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
14e50 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
14e60 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
14e70 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
14e80 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
14e90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
14ea0 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
14eb0 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
14ec0 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
14ed0 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
14ee0 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
14ef0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
14f00 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
14f10 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
14f20 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
14f30 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
14f40 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
14f50 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
14f60 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
14f70 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
14f80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
14f90 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
14fa0 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
14fb0 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
14fc0 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
14fd0 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
14fe0 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
14ff0 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
15000 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
15010 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
15020 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
15030 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
15040 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
15050 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
15060 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
15070 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
15080 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
15090 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
150a0 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
150b0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
150c0 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
150d0 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
150e0 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
150f0 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
15100 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
15110 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
15120 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
15130 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
15140 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
15150 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
15160 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
15170 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
15180 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15190 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
151a0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
151b0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
151c0 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
151d0 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
151e0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
151f0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
15200 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  rse->cookieGoto=
15210 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
15220 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
15230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15240 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
15250 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
15260 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
15270 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
15280 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15290 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
152a0 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
152b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
152c0 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20  <32 );.    mask 
152d0 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66  = 1<<iDb;.    if
152e0 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ( (pParse->cooki
152f0 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
15300 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
15310 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
15320 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72  mask;.      pPar
15330 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
15340 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
15350 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
15360 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  e;.      if( iDb
15370 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
15380 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
15390 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a  tabase(pParse);.
153a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
153b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
153c0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
153d0 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
153e0 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
153f0 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
15400 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
15410 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
15420 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
15430 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
15440 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
15450 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
15460 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
15470 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
15480 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
15490 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
154a0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
154b0 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
154c0 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
154d0 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
154e0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
154f0 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
15500 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
15510 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
15520 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
15530 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
15540 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
15550 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
15560 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
15570 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
15580 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
15590 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
155a0 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
155b0 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
155c0 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
155d0 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
155e0 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
155f0 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
15600 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
15610 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
15620 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
15630 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
15640 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
15650 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a   not be set..**.
15660 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65  ** Only database
15670 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d   iDb and the tem
15680 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
15690 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20  ade writable by 
156a0 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66  this call..** If
156b0 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68   iDb==0, then th
156c0 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20  e main and temp 
156d0 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61  databases are ma
156e0 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49  de writable.   I
156f0 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e  f.** iDb==1 then
15700 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64   only the temp d
15710 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20  atabase is made 
15720 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44  writable.  If iD
15730 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  b>1 then the.** 
15740 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69  specified auxili
15750 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64  ary database and
15760 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15770 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
15780 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
15790 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
157a0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
157b0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
157c0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
157d0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
157e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
157f0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
15800 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
15810 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
15820 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
15830 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77  Db);.  pParse->w
15840 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
15850 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61  Db;.  if( setSta
15860 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  tement ){.    sq
15870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15880 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
15890 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  iDb, 0);.  }.  i
158a0 66 28 20 69 44 62 21 3d 31 20 26 26 20 70 50 61  f( iDb!=1 && pPa
158b0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d 2e  rse->db->aDb[1].
158c0 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  pBt!=0 ){.    sq
158d0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
158e0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
158f0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 31   setStatement, 1
15900 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  );.  }.}../* .**
15910 20 52 65 74 75 72 6e 20 74 68 65 20 74 72 61 6e   Return the tran
15920 73 69 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61  sient sqlite3_va
15930 6c 75 65 20 6f 62 6a 65 63 74 20 75 73 65 64 20  lue object used 
15940 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e  for encoding con
15950 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69  versions.** duri
15960 6e 67 20 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69  ng SQL compilati
15970 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  on..*/.sqlite3_v
15980 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 47 65 74  alue *sqlite3Get
15990 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 73  TransientValue(s
159a0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
159b0 66 28 20 21 64 62 2d 3e 70 56 61 6c 75 65 20 29  f( !db->pValue )
159c0 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61 6c 75 65  {.    db->pValue
159d0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
159e0 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ew();.  }.  retu
159f0 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d  rn db->pValue;.}
15a00 0a                                               .