/ Hex Artifact Content
Login

Artifact e498f958ebb4678e103224edd3a5c2ebcc42d18f:


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 37 30 20 32 30 30 34 2f 31 31 2f 30 35 20 32  270 2004/11/05 2
0310: 32 3a 31 38 3a 34 39 20 64 72 68 20 45 78 70 20  2:18:49 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 37  : build.c,v 1.27
0340: 30 20 32 30 30 34 2f 31 31 2f 30 35 20 32 32 3a  0 2004/11/05 22:
0350: 31 38 3a 34 39 20 64 72 68 20 45 78 70 20 24 0a  18:49 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: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
5970: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
5980: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
5990: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
59a0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
59b0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
59c0: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
59d0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
59e0: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
59f0: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
5a00: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
5a10: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
5a20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5a30: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
5a40: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
5a50: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  me, "sqlite_sequ
5a60: 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
5a70: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
5a80: 5b 69 44 62 5d 2e 70 53 65 71 54 61 62 3d 3d 30  [iDb].pSeqTab==0
5a90: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b   );.    db->aDb[
5aa0: 69 44 62 5d 2e 70 53 65 71 54 61 62 20 3d 20 70  iDb].pSeqTab = p
5ab0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
5ac0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
5ad0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
5ae0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
5af0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
5b00: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
5b10: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
5b20: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
5b30: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
5b40: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
5b50: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
5b60: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
5b70: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
5b80: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
5b90: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
5ba0: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
5bb0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
5bc0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
5bd0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
5be0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
5bf0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
5c00: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
5c10: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
5c20: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
5c30: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
5c40: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
5c50: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
5c60: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
5c70: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
5c80: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
5c90: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
5ca0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
5cb0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
5cc0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5cd0: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5ce0: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 0, iDb);..  
5cf0: 20 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20    /* Every time 
5d00: 61 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63  a new table is c
5d10: 72 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d  reated the file-
5d20: 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e  format.    ** an
5d30: 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d  d encoding meta-
5d40: 76 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69  values are set i
5d50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
5d60: 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74  in.    ** case t
5d70: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
5d80: 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a   table created..
5d90: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5da0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5db0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66  P_Integer, db->f
5dc0: 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a  ile_format, 0);.
5dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5de0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5df0: 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20  okie, iDb, 1);. 
5e00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e10: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5e20: 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a  r, db->enc, 0);.
5e30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e40: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f  ddOp(v, OP_SetCo
5e50: 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a  okie, iDb, 4);..
5e60: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
5e70: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
5e80: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
5e90: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5ea0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
5eb0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
5ec0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
5ed0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
5ee0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
5ef0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
5f00: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
5f10: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
5f20: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
5f30: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
5f40: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
5f50: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
5f60: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
5f70: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
5f80: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
5f90: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
5fa0: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
5fb0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
5fc0: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
5fd0: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
5fe0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
5ff0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
6000: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
6010: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6020: 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20  OP_NewRecno, 0, 
6030: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6040: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
6050: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  up, 0, 0);.    s
6060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6070: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
6080: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60a0: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
60b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
60c0: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
60d0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
60e0: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
60f0: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
6100: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
6110: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
6120: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
6130: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
6140: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
6150: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
6160: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
6170: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
6180: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
6190: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
61a0: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
61b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
61c0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
61d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
61e0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
61f0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
6200: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
6210: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
6220: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
6230: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
6240: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
6250: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6260: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
6270: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61  ameFromToken(pNa
6280: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
6290: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
62a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
62b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
62c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
62d0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
62e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
62f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6300: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
6310: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
6320: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
6330: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
6340: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6350: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
6360: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
6370: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
6380: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
6390: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61  iteRealloc( p->a
63a0: 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29  Col, (p->nCol+8)
63b0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
63c0: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
63d0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
63e0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
63f0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
6400: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
6410: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
6420: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
6430: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
6440: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
6450: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
6460: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
6470: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
6480: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
6490: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
64a0: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
64b0: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
64c0: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
64d0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
64e0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
64f0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
6500: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
6510: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
6520: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
6530: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
6540: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
6550: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
6560: 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  tColl;.  p->nCol
6570: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
6580: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
6590: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
65a0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
65b0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
65c0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
65d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
65e0: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
65f0: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
6600: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
6610: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
6620: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
6630: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
6640: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
6650: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
6660: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
6670: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
6680: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
6690: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
66a0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
66b0: 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70   i;.  if( (p = p
66c0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
66d0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
66e0: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
66f0: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e    if( i>=0 ) p->
6700: 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20  aCol[i].notNull 
6710: 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  = onError;.}../*
6720: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6730: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
6740: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
6750: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
6760: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
6770: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6780: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
6790: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
67a0: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
67b0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
67c0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
67d0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
67e0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
67f0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
6800: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
6810: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
6820: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
6830: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
6840: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
6850: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
6860: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
6870: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
6880: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
6890: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
68a0: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
68b0: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
68c0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
68d0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
68e0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74  e, Token *pFirst
68f0: 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b  , Token *pLast){
6900: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
6910: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
6920: 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70  ;.  char *z, **p
6930: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
6940: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
6950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6960: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6970: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
6980: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
6990: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
69a0: 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20  aCol[i];.  pz = 
69b0: 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20  &pCol->zType;.  
69c0: 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 28  n = pLast->n + (
69d0: 70 4c 61 73 74 2d 3e 7a 20 2d 20 70 46 69 72 73  pLast->z - pFirs
69e0: 74 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28  t->z);.  assert(
69f0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
6a00: 29 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a  );.  z = pCol->z
6a10: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Type = sqlite3MP
6a20: 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 2c  rintf("%.*s", n,
6a30: 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 69   pFirst->z);.  i
6a40: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
6a50: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
6a60: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
6a70: 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  nt c = z[i];.   
6a80: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
6a90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6aa0: 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  z[j++] = c;.  }.
6ab0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43    z[j] = 0;.  pC
6ac0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
6ad0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
6ae0: 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  pe(z, n);.}../*.
6af0: 2a 2a 20 54 68 65 20 67 69 76 65 6e 20 74 6f 6b  ** The given tok
6b00: 65 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  en is the defaul
6b10: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
6b20: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
6b30: 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d to.** the tabl
6b40: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
6b50: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
6b60: 20 49 66 20 22 6d 69 6e 75 73 46 6c 61 67 22 20   If "minusFlag" 
6b70: 69 73 20 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d  is true, it.** m
6b80: 65 61 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  eans the value t
6b90: 6f 6b 65 6e 20 77 61 73 20 70 72 65 63 65 64 65  oken was precede
6ba0: 64 20 62 79 20 61 20 6d 69 6e 75 73 20 73 69 67  d by a minus sig
6bb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
6bc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6bd0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
6be0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
6bf0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
6c00: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6c10: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
6c20: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
6c30: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
6c40: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
6c50: 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c  Val, int minusFl
6c60: 61 67 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  ag){.  Table *p;
6c70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
6c80: 20 2a 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20   *z;.  if( (p = 
6c90: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6ca0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
6cb0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
6cc0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
6cd0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
6ce0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3d  ->aCol[i].zDflt=
6cf0: 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70 2d 3e 61  =0 );.  z = p->a
6d00: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 20 3d 20 73  Col[i].zDflt = s
6d10: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
6d20: 73 25 54 22 2c 20 6d 69 6e 75 73 46 6c 61 67 20  s%T", minusFlag 
6d30: 3f 20 22 2d 22 20 3a 20 22 22 2c 20 70 56 61 6c  ? "-" : "", pVal
6d40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  );.  sqlite3Dequ
6d50: 6f 74 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ote(z);.}../*.**
6d60: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
6d70: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
6d80: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
6d90: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
6da0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
6db0: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
6dc0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
6dd0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
6de0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
6df0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
6e00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
6e10: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
6e20: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
6e30: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
6e40: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
6e50: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
6e60: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
6e70: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
6e80: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
6e90: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
6ea0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
6eb0: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
6ec0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
6ed0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
6ee0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
6ef0: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
6f00: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
6f10: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
6f20: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
6f30: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64  mn as the row id
6f40: 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a  .  (Exception:.*
6f50: 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20  * For backwards 
6f60: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
6f70: 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73  th older databas
6f80: 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  es, do not do th
6f90: 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  is.** if the fil
6fa0: 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  e format version
6fb0: 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
6fc0: 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68  than 1.)  Set th
6fd0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
6fe0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
6ff0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
7000: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
7010: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
7020: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
7030: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
7040: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
7050: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
7060: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
7070: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
7080: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
7090: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
70a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
70b0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
70c0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
70d0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
70e0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
70f0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
7100: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
7110: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
7120: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
7130: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
7140: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
7150: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
7160: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
7170: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
7180: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
7190: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
71a0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
71b0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
71c0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
71d0: 74 20 61 75 74 6f 49 6e 63 20 20 20 20 20 20 20  t autoInc       
71e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
71f0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
7200: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7210: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
7220: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
7230: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
7240: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
7250: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
7260: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
7270: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
7280: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
7290: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b  b->hasPrimKey ){
72a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
72b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
72c0: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
72d0: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
72e0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
72f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
7300: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
7310: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
7320: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
7330: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69  y = 1;.  if( pLi
7340: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
7350: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
7360: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
7370: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
7380: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
7390: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
73a0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
73b0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
73c0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
73d0: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
73e0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
73f0: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
7400: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
7410: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7420: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
7430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7450: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
7460: 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d  ab->nCol ) pTab-
7470: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
7480: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  imKey = 1;.    }
7490: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
74a0: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
74b0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
74c0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
74d0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
74e0: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
74f0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
7500: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
7510: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
7520: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
7530: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
7540: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
7550: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
7560: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
7570: 20 20 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e      pTab->autoIn
7580: 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d  c = autoInc;.  }
7590: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
75a0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
75b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
75c0: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
75d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
75e0: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
75f0: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
7600: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
7610: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
7620: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
7630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
7640: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
7650: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
7660: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
7670: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
7680: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
7690: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
76a0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
76b0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
76c0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
76d0: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
76e0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
76f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7700: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
7710: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
7720: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
7730: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
7740: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
7750: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
7760: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
7770: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
7780: 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49   *p;.  Index *pI
7790: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
77a0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Coll;.  int i;..
77b0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
77c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
77d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
77e0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70   p->nCol-1;..  p
77f0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
7800: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
7810: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
7820: 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  );.  p->aCol[i].
7830: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a  pColl = pColl;..
7840: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
7850: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
7860: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
7870: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
7880: 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e  ype>",.  ** then
7890: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
78a0: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
78b0: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
78c0: 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  efore the.  ** c
78d0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
78e0: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
78f0: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
7900: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
7910: 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49  for(pIdx = p->pI
7920: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
7930: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
7940: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
7950: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
7960: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
7970: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49  olumn[0]==i ) pI
7980: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
7990: 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[0] = pColl;.  
79a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
79b0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
79c0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64  entry from the d
79d0: 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20  b.aCollSeq hash 
79e0: 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65 6e  table. If the en
79f0: 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  try.** specified
7a00: 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e   by zName and nN
7a10: 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ame is not found
7a20: 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 27   and parameter '
7a30: 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74 72  create' is.** tr
7a40: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
7a50: 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74 68  a new entry. Oth
7a60: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
7a70: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70  LL..**.** Each p
7a80: 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69 6e  ointer stored in
7a90: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43 6f   the sqlite3.aCo
7aa0: 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65  llSeq hash table
7ab0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20   contains an.** 
7ac0: 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20 43  array of three C
7ad0: 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72 65  ollSeq structure
7ae0: 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20  s. The first is 
7af0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7b00: 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65  quence.** preffe
7b10: 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  rred for UTF-8, 
7b20: 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d 31  the second UTF-1
7b30: 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68 69  6le, and the thi
7b40: 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a  rd UTF-16be..**.
7b50: 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64 69  ** Stored immedi
7b60: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
7b70: 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  three collation 
7b80: 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20 63  sequences is a c
7b90: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  opy of.** the co
7ba0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7bb0: 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72   name. A pointer
7bc0: 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20   to this string 
7bd0: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
7be0: 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  each collation s
7bf0: 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75 72  equence structur
7c00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
7c10: 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53  lSeq * findCollS
7c20: 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74  eqEntry(.  sqlit
7c30: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
7c40: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
7c50: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
7c60: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
7c70: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66  Seq *pColl;.  if
7c80: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
7c90: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
7ca0: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
7cb0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
7cc0: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
7cd0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66  e, nName);..  if
7ce0: 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72  ( 0==pColl && cr
7cf0: 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  eate ){.    pCol
7d00: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
7d10: 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  ( 3*sizeof(*pCol
7d20: 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  l) + nName + 1 )
7d30: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
7d40: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  ){.      pColl[0
7d50: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
7d60: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
7d70: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d    pColl[0].enc =
7d80: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
7d90: 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61      pColl[1].zNa
7da0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  me = (char*)&pCo
7db0: 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f  ll[3];.      pCo
7dc0: 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49  ll[1].enc = SQLI
7dd0: 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20  TE_UTF16LE;.    
7de0: 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65    pColl[2].zName
7df0: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
7e00: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
7e10: 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [2].enc = SQLITE
7e20: 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20 20  _UTF16BE;.      
7e30: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e  memcpy(pColl[0].
7e40: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
7e50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
7e60: 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  l[0].zName[nName
7e70: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 0;.      sql
7e80: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
7e90: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43  db->aCollSeq, pC
7ea0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e  oll[0].zName, nN
7eb0: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  ame, pColl);.   
7ec0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7ed0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
7ee0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
7ef0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d  points to a UTF-
7f00: 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
7f10: 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e   nName bytes lon
7f20: 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  g..** Return the
7f30: 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65   CollSeq* pointe
7f40: 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  r for the collat
7f50: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
7f60: 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20  ed zName.** for 
7f70: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e  the encoding 'en
7f80: 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  c' from the data
7f90: 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a  base 'db'..**.**
7fa0: 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70   If the entry sp
7fb0: 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66  ecified is not f
7fc0: 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65  ound and 'create
7fd0: 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ' is true, then 
7fe0: 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20  create a.** new 
7ff0: 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73  entry.  Otherwis
8000: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
8010: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
8020: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20  e3FindCollSeq(. 
8030: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8040: 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20  u8 enc,.  const 
8050: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
8060: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
8070: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
8080: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e  Seq *pColl = fin
8090: 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62  dCollSeqEntry(db
80a0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
80b0: 63 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  create);.  asser
80c0: 74 28 20 53 51 4c 49 54 45 5f 55 54 46 38 3d 3d  t( SQLITE_UTF8==
80d0: 31 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31  1 && SQLITE_UTF1
80e0: 36 4c 45 3d 3d 32 20 26 26 20 53 51 4c 49 54 45  6LE==2 && SQLITE
80f0: 5f 55 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a 20  _UTF16BE==3 );. 
8100: 20 61 73 73 65 72 74 28 20 65 6e 63 3e 3d 53 51   assert( enc>=SQ
8110: 4c 49 54 45 5f 55 54 46 38 20 26 26 20 65 6e 63  LITE_UTF8 && enc
8120: 3c 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  <=SQLITE_UTF16BE
8130: 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20   );.  if( pColl 
8140: 29 20 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31  ) pColl += enc-1
8150: 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ;.  return pColl
8160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
8170: 65 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  e the 'collation
8180: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
8190: 6b 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 63  k to request a c
81a0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
81b0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
81c0: 62 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69  base text encodi
81d0: 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65  ng of name zName
81e0: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
81f0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  ** If the collat
8200: 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a  ion sequence.*/.
8210: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c  static void call
8220: 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74  CollNeeded(sqlit
8230: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
8240: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
8250: 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Name){.  assert(
8260: 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65   !db->xCollNeede
8270: 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e  d || !db->xCollN
8280: 65 65 64 65 64 31 36 20 29 3b 0a 20 20 69 66 28  eeded16 );.  if(
8290: 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65   nName<0 ) nName
82a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
82b0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c  ;.  if( db->xCol
82c0: 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20 20 20 63  lNeeded ){.    c
82d0: 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d  har *zExternal =
82e0: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a   sqliteStrNDup(z
82f0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
8300: 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c    if( !zExternal
8310: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64   ) return;.    d
8320: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64  b->xCollNeeded(d
8330: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
8340: 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e  g, db, (int)db->
8350: 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b  enc, zExternal);
8360: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
8370: 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a  zExternal);.  }.
8380: 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e    if( db->xCollN
8390: 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63  eeded16 ){.    c
83a0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65  har const *zExte
83b0: 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  rnal;.    sqlite
83c0: 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20  3_value *pTmp = 
83d0: 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69  sqlite3GetTransi
83e0: 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20  entValue(db);.  
83f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
8400: 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a  tStr(pTmp, -1, z
8410: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
8420: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
8430: 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c  );.    zExternal
8440: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
8450: 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45  ext(pTmp, SQLITE
8460: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
8470: 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61     if( !zExterna
8480: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
8490: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
84a0: 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65  6(db->pCollNeede
84b0: 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64  dArg, db, (int)d
84c0: 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61  b->enc, zExterna
84d0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
84e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
84f0: 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63   called if the c
8500: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8510: 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65   fails to delive
8520: 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  r a.** collation
8530: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
8540: 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62   best encoding b
8550: 75 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  ut there may be 
8560: 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a  other versions.*
8570: 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74  * of this collat
8580: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f  ion function (fo
8590: 72 20 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  r other text enc
85a0: 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c  odings) availabl
85b0: 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66  e. Use one.** of
85c0: 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 20 69   these instead i
85d0: 66 20 74 68 65 79 20 65 78 69 73 74 2e 20 41 76  f they exist. Av
85e0: 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20  oid a UTF-8 <-> 
85f0: 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f  UTF-16 conversio
8600: 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  n if.** possible
8610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8620: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72  synthCollSeq(Par
8630: 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
8640: 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43  Seq *pColl){.  C
8650: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a  ollSeq *pColl2;.
8660: 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c    char *z = pCol
8670: 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  l->zName;.  int 
8680: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
8690: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
86a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
86b0: 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   i;.  static con
86c0: 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20 7b  st u8 aEnc[] = {
86d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
86e0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
86f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b 0a   SQLITE_UTF8 };.
8700: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20    for(i=0; i<3; 
8710: 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 32  i++){.    pColl2
8720: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
8730: 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63 5b 69  llSeq(db, aEnc[i
8740: 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20  ], z, n, 0);.   
8750: 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d   if( pColl2->xCm
8760: 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  p!=0 ){.      me
8770: 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c  mcpy(pColl, pCol
8780: 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  l2, sizeof(CollS
8790: 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  eq));.      retu
87a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
87b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
87c0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
87d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
87e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
87f0: 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
8800: 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c  sequence: %.*s",
8810: 20 6e 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 70 50   n, z);.  }.  pP
8820: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8840: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ROR;.}../*.** Th
8850: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8860: 6c 6c 65 64 20 6f 6e 20 61 20 63 6f 6c 6c 61 74  lled on a collat
8870: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 62 65 66  ion sequence bef
8880: 6f 72 65 20 69 74 20 69 73 20 75 73 65 64 20 74  ore it is used t
8890: 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20  o.** check that 
88a0: 69 74 20 69 73 20 64 65 66 69 6e 65 64 2e 20 41  it is defined. A
88b0: 6e 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6c 6c  n undefined coll
88c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 65  ation sequence e
88d0: 78 69 73 74 73 20 77 68 65 6e 0a 2a 2a 20 61 20  xists when.** a 
88e0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 61 64  database is load
88f0: 65 64 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ed that contains
8900: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
8910: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8920: 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
8930: 6e 6f 74 20 62 65 65 6e 20 64 65 66 69 6e 65 64  not been defined
8940: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 72 65 61   by sqlite3_crea
8950: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 20 65  te_collation() e
8960: 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 71  tc..**.** If req
8970: 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
8980: 69 6e 65 20 63 61 6c 6c 73 20 74 68 65 20 27 63  ine calls the 'c
8990: 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 27  ollation needed'
89a0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20   callback to.** 
89b0: 72 65 71 75 65 73 74 20 61 20 64 65 66 69 6e 69  request a defini
89c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c  tion of the coll
89d0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ating sequence. 
89e0: 49 66 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20  If this doesn't 
89f0: 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e 20 65 71 75  work, .** an equ
8a00: 69 76 61 6c 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  ivalent collatin
8a10: 67 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  g sequence that 
8a20: 75 73 65 73 20 61 20 74 65 78 74 20 65 6e 63 6f  uses a text enco
8a30: 64 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  ding different.*
8a40: 2a 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  * from the main 
8a50: 64 61 74 61 62 61 73 65 20 69 73 20 73 75 62 73  database is subs
8a60: 74 69 74 75 74 65 64 2c 20 69 66 20 6f 6e 65 20  tituted, if one 
8a70: 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  is available..*/
8a80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
8a90: 6b 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  kCollSeq(Parse *
8aa0: 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20  pParse, CollSeq 
8ab0: 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 70  *pColl){.  if( p
8ac0: 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e  Coll && !pColl->
8ad0: 78 43 6d 70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  xCmp ){.    /* N
8ae0: 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  o collation sequ
8af0: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70  ence of this typ
8b00: 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f 64  e for this encod
8b10: 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72 65  ing is registere
8b20: 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20 74  d..    ** Call t
8b30: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
8b40: 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20 69  tory to see if i
8b50: 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73 20  t can supply us 
8b60: 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  with one..    */
8b70: 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65  .    callCollNee
8b80: 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ded(pParse->db, 
8b90: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74  pColl->zName, st
8ba0: 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  rlen(pColl->zNam
8bb0: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  e));.    if( !pC
8bc0: 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e  oll->xCmp && syn
8bd0: 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  thCollSeq(pParse
8be0: 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , pColl) ){.    
8bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
8c10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8c20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
8c30: 6c 6c 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  ll sqlite3CheckC
8c40: 6f 6c 6c 53 65 71 28 29 20 66 6f 72 20 61 6c 6c  ollSeq() for all
8c50: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8c60: 6e 63 65 73 20 69 6e 20 61 6e 20 69 6e 64 65 78  nces in an index
8c70: 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ,.** in order to
8c80: 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   verify that all
8c90: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63   the necessary c
8ca0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8cb0: 65 73 20 61 72 65 0a 2a 2a 20 6c 6f 61 64 65 64  es are.** loaded
8cc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8cd0: 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53 65  CheckIndexCollSe
8ce0: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
8cf0: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
8d00: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
8d10: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
8d20: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
8d30: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
8d40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65    if( sqlite3Che
8d50: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
8d60: 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  , pIdx->keyInfo.
8d70: 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20  aColl[i]) ){.   
8d80: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8d90: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
8da0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
8db0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
8dd0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8de0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
8df0: 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61  uence for databa
8e00: 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a  se native text.*
8e10: 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74  * encoding ident
8e20: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72  ified by the str
8e30: 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ing zName, lengt
8e40: 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  h nName..**.** I
8e50: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
8e60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8e70: 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ce is not availa
8e80: 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69  ble, or not avai
8e90: 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20  lable.** in the 
8ea0: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
8eb0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f  encoding, the co
8ec0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
8ed0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a  is invoked to.**
8ee0: 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20   request it. If 
8ef0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8f00: 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73  ctory does not s
8f10: 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71  upply such a seq
8f20: 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68  uence,.** and th
8f30: 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76  e sequence is av
8f40: 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  ailable in anoth
8f50: 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  er text encoding
8f60: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a  , then that is.*
8f70: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  * returned inste
8f80: 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ad..**.** If no 
8f90: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
8fa0: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
8fb0: 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72  ions sequence ar
8fc0: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a  e available, or.
8fd0: 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  ** another error
8fe0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
8ff0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
9000: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
9010: 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70  ritten into.** p
9020: 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  Parse..*/.CollSe
9030: 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  q *sqlite3Locate
9040: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
9050: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
9060: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e  r *zName, int nN
9070: 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20 3d  ame){.  u8 enc =
9080: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
9090: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
90a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e  = pParse->db->in
90b0: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
90c0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
90d0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70  te3FindCollSeq(p
90e0: 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20  Parse->db, enc, 
90f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e  zName, nName, in
9100: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 6e  itbusy);.  if( n
9110: 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d  Name<0 ) nName =
9120: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
9130: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
9140: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
9150: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
9160: 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69     /* No collati
9170: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  on sequence of t
9180: 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69  his type for thi
9190: 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65  s encoding is re
91a0: 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a  gistered..    **
91b0: 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74   Call the collat
91c0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73  ion factory to s
91d0: 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70  ee if it can sup
91e0: 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e  ply us with one.
91f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c  .    */.    call
9200: 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73  CollNeeded(pPars
9210: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  e->db, zName, nN
9220: 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  ame);.    pColl 
9230: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
9240: 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c  lSeq(pParse->db,
9250: 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61   enc, zName, nNa
9260: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
9270: 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d  pColl && !pColl-
9280: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f  >xCmp ){.      /
9290: 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 61  * There may be a
92a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
92b0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
92c0: 63 65 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ce that requires
92d0: 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c  .      ** transl
92e0: 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e  ation between en
92f0: 63 6f 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20  codings. Search 
9300: 66 6f 72 20 69 74 20 77 69 74 68 20 73 79 6e 74  for it with synt
9310: 68 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20  hCollSeq()..    
9320: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
9330: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72  ynthCollSeq(pPar
9340: 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, pColl) ){.  
9350: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9370: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69  }..  /* If nothi
9380: 6e 67 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e  ng has been foun
9390: 64 2c 20 77 72 69 74 65 20 74 68 65 20 65 72 72  d, write the err
93a0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
93b0: 70 50 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20  pParse */.  if( 
93c0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
93d0: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
93e0: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28  xCmp) ){.    if(
93f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
9400: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9410: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9420: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
9430: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
9440: 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  .*s", nName, zNa
9450: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
9460: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Coll = 0;.  }.  
9470: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
9480: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  .../*.** Scan th
9490: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
94a0: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
94b0: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
94c0: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
94d0: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
94e0: 70 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  pe..*/.char sqli
94f0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9510: 65 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20  e, int nType){. 
9520: 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 61   int n, i;.  sta
9530: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
9540: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
9550: 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79  r *zSub;  /* Key
9560: 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e 67 20  words substring 
9570: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
9580: 0a 20 20 20 20 63 68 61 72 20 6e 53 75 62 3b 20  .    char nSub; 
9590: 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74          /* lengt
95a0: 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20  h of zSub */.   
95b0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
95c0: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
95d0: 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69 74 20  to return if it 
95e0: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73  matches */.  } s
95f0: 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a  ubstrings[] = {.
9600: 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20      {"INT",  3, 
9610: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9620: 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22  ER},.    {"CHAR"
9630: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
9640: 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f  TEXT},.    {"CLO
9650: 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46  B", 4, SQLITE_AF
9660: 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54  F_TEXT},.    {"T
9670: 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  EXT", 4, SQLITE_
9680: 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b  AFF_TEXT},.    {
9690: 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54  "BLOB", 4, SQLIT
96a0: 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d  E_AFF_NONE},.  }
96b0: 3b 0a 0a 20 20 69 66 28 20 6e 54 79 70 65 3d 3d  ;..  if( nType==
96c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
96d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
96e0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
96f0: 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69  i<sizeof(substri
9700: 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73  ngs)/sizeof(subs
9710: 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29  trings[0]); i++)
9720: 7b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73  {.    int c1 = s
9730: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75  ubstrings[i].zSu
9740: 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32  b[0];.    int c2
9750: 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a   = tolower(c1);.
9760: 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
9770: 6e 54 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e  nType - substrin
9780: 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20  gs[i].nSub;.    
9790: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
97a0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53  substrings[i].zS
97b0: 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ub;.    for(n=0;
97c0: 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b   n<=limit; n++){
97d0: 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  .      int c = z
97e0: 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69  Type[n];.      i
97f0: 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d  f( (c==c1 || c==
9800: 63 32 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  c2).            
9810: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
9820: 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d  rNICmp(&zType[n]
9830: 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b  , z, substrings[
9840: 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20  i].nSub) ){.    
9850: 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 73 74      return subst
9860: 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74  rings[i].affinit
9870: 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  y;.      }.    }
9880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9890: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
98a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
98b0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
98c0: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
98d0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
98e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
98f0: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
9900: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
9910: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
9920: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
9930: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
9940: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
9950: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
9960: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
9970: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
9980: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
9990: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
99a0: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
99b0: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
99c0: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
99d0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
99e0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
99f0: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
9a00: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9a10: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
9a20: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
9a30: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
9a40: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
9a50: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
9a60: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
9a70: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
9a80: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
9a90: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
9aa0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
9ab0: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
9ac0: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
9ad0: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
9ae0: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
9af0: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
9b00: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
9b10: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
9b20: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
9b30: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
9b40: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
9b50: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
9b60: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
9b70: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
9b80: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 73  e3ChangeCookie(s
9b90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
9ba0: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
9bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9bc0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9bd0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63   db->aDb[iDb].sc
9be0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30  hema_cookie+1, 0
9bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9c00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43  AddOp(v, OP_SetC
9c10: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a  ookie, iDb, 0);.
9c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
9c30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9c40: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
9c50: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
9c60: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
9c70: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
9c80: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
9c90: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
9ca0: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
9cb0: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
9cc0: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
9cd0: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
9ce0: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
9cf0: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
9d00: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
9d10: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
9d20: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
9d30: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
9d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
9d50: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
9d60: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
9d70: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
9d80: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
9d90: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
9da0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
9db0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
9dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9dd0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
9de0: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
9df0: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
9e00: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
9e10: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
9e20: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
9e30: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
9e40: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
9e50: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
9e60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
9e70: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
9e80: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
9e90: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
9ea0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
9eb0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
9ec0: 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49   if( !isalnum(zI
9ed0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
9ee0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
9ef0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
9f00: 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d  ote =  zIdent[j]
9f10: 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a  !=0 || isdigit(z
9f20: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
9f40: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
9f50: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
9f60: 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51  _ID;.  if( needQ
9f70: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
9f80: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
9f90: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
9fa0: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
9fb0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
9fc0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
9fd0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
9fe0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
9ff0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
a000: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
a010: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
a020: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
a030: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
a040: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
a050: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
a060: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
a070: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
a080: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
a090: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
a0a0: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
a0b0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
a0c0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
a0d0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
a0e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
a0f0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
a100: 74 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20  tmt(Table *p){. 
a110: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20   int i, k, n;.  
a120: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63  char *zStmt;.  c
a130: 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70  har *zSep, *zSep
a140: 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20  2, *zEnd, *z;.  
a150: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
a160: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
a170: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
a180: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
a190: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
a1a0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
a1b0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
a1c0: 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70    z = pCol->zTyp
a1d0: 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  e;.    if( z ){.
a1e0: 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c        n += (strl
a1f0: 65 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  en(z) + 1);.    
a200: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
a210: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
a220: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
a230: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
a240: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
a250: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
a260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
a270: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
a280: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
a290: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
a2a0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
a2b0: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
a2c0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
a2d0: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
a2e0: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
a2f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
a300: 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44  cpy(zStmt, p->iD
a310: 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54  b==1 ? "CREATE T
a320: 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43  EMP TABLE " : "C
a330: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
a340: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
a350: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
a360: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
a370: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
a380: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
a390: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
a3a0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
a3b0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a3c0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
a3d0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
a3e0: 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b  = strlen(&zStmt[
a3f0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
a400: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
a410: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
a420: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a430: 20 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e   if( (z = pCol->
a440: 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20  zType)!=0 ){.   
a450: 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20     zStmt[k++] = 
a460: 27 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70  ' ';.      strcp
a470: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b  y(&zStmt[k], z);
a480: 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  .      k += strl
a490: 65 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  en(z);.    }.  }
a4a0: 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74  .  strcpy(&zStmt
a4b0: 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  [k], zEnd);.  re
a4c0: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
a4d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a4e0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
a4f0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
a500: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
a510: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
a520: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a530: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
a540: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
a550: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
a560: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
a570: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
a580: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
a590: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
a5a0: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
a5b0: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
a5c0: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
a5d0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
a5e0: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
a5f0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
a600: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
a610: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
a620: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
a630: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
a640: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
a650: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
a660: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
a670: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
a680: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
a690: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
a6a0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
a6b0: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
a6c0: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
a6d0: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
a6e0: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
a6f0: 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ges, so the entr
a700: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
a710: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
a720: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
a730: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
a740: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
a750: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
a760: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
a770: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
a780: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
a790: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
a7a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
a7b0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
a7c0: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
a7d0: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
a7e0: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
a7f0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
a800: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
a810: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
a820: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
a830: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
a840: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
a850: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
a860: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
a870: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a880: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c  Token *pEnd, Sel
a890: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
a8a0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c   Table *p;.  sql
a8b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a8c0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
a8d0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
a8e0: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
a8f0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
a900: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
a910: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70   return;.  p = p
a920: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a930: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
a940: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
a950: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
a960: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
a970: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
a980: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
a990: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
a9a0: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
a9b0: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
a9c0: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
a9d0: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
a9e0: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
a9f0: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
aa00: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
aa10: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
aa20: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
aa30: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
aa40: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
aa50: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
aa60: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
aa70: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
aa80: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
aa90: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
aaa0: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
aab0: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
aac0: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ).  */.  if( db-
aad0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
aae0: 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e    p->tnum = db->
aaf0: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
ab00: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
ab10: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
ab20: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
ab30: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
ab40: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
ab50: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
ab60: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
ab70: 61 73 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ase.  The record
ab80: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
ab90: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65   the new table e
aba0: 6e 74 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65  ntry should alre
abb0: 61 64 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74  ady be on the st
abc0: 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ack..  **.  ** I
abd0: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
abe0: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
abf0: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
ac00: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
ac10: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
ac20: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
ac30: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
ac40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
ac50: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
ac60: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
ac70: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
ac80: 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
ac90: 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
aca0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
acb0: 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
acc0: 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
acd0: 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
ace0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
acf0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
ad00: 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
ad10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
ad20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
ad30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
ad40: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
ad50: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  n;..    /* Creat
ad60: 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
ad70: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
ad80: 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e 74   and push it ont
ad90: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20  o the stack..   
ada0: 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20 6e   ** A view has n
adb0: 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20 6a  o rootpage, so j
adc0: 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f 20  ust push a zero 
add0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 66  onto the stack f
ade0: 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73 2e  or.    ** views.
adf0: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79    Initialize zTy
ae00: 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  pe at the same t
ae10: 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ime..    */.    
ae20: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
ae30: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
ae40: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
ae50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ae60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
ae70: 65 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44  eateTable, p->iD
ae80: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 54 79  b, 0);.      zTy
ae90: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
aea0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
aeb0: 42 4c 45 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BLE";.    }else{
aec0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
aed0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
aee0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aef0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
af00: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
af10: 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79  view";.      zTy
af20: 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 20 20  pe2 = "VIEW";.  
af30: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
af40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
af50: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
af60: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
af70: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
af80: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
af90: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
afa0: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
afb0: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
afc0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
afd0: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
afe0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
aff0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
b000: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
b010: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
b020: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
b030: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
b040: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
b050: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
b060: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
b070: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
b080: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
b090: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
b0a0: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
b0b0: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
b0c0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
b0d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
b0e0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61  lect ){.      Ta
b0f0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
b100: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b110: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
b120: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b140: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
b150: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
b160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b170: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
b180: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
b190: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
b1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
b1b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
b1c0: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
b1d0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
b1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
b200: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
b210: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
b220: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
b230: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
b240: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
b250: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
b260: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
b270: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
b280: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
b290: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
b2a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
b2b0: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
b2c0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
b2d0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
b2e0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
b2f0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
b300: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
b310: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
b320: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
b330: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
b340: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
b350: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
b360: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
b370: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
b380: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
b390: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
b3a0: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
b3b0: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
b3c0: 6d 74 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  mt(p);.    }else
b3d0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  {.      n = Addr
b3e0: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
b3f0: 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  (pParse->sNameTo
b400: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
b410: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
b420: 33 4d 50 72 69 6e 74 66 28 22 43 52 45 41 54 45  3MPrintf("CREATE
b430: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
b440: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
b450: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
b460: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f   }..    /* A slo
b470: 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64  t for the record
b480: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b490: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  n allocated in t
b4a0: 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  he .    ** SQLIT
b4b0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
b4c0: 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f   We just need to
b4d0: 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f   update that slo
b4e0: 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a  t with all.    *
b4f0: 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  * the informatio
b500: 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65  n we've collecte
b510: 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 66 6f  d.  The rowid fo
b520: 72 20 74 68 65 20 70 72 65 61 6c 6c 6f 63 61 74  r the preallocat
b530: 65 64 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69  ed.    ** slot i
b540: 73 20 74 68 65 20 32 6e 64 20 69 74 65 6d 20 6f  s the 2nd item o
b550: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 54 68  n the stack.  Th
b560: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
b570: 63 6b 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ck is the.    **
b580: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
b590: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 6f 72  he new table (or
b5a0: 20 61 20 30 20 69 66 20 74 68 69 73 20 69 73 20   a 0 if this is 
b5b0: 61 20 76 69 65 77 29 2e 0a 20 20 20 20 2a 2f 0a  a view)..    */.
b5c0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
b5d0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
b5e0: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
b5f0: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
b600: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
b610: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
b620: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 30 2c  %Q, rootpage=#0,
b630: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
b640: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 31   "WHERE rowid=#1
b650: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
b660: 5b 70 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  [p->iDb].zName, 
b670: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 2d 3e  SCHEMA_TABLE(p->
b680: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
b690: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
b6a0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
b6b0: 65 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  e,.      zStmt. 
b6c0: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
b6d0: 46 72 65 65 28 7a 53 74 6d 74 29 3b 0a 0a 20 20  Free(zStmt);..  
b6e0: 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65    /* Reparse eve
b6f0: 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74  rything to updat
b700: 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64  e our internal d
b710: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
b720: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  /.    sqlite3Cha
b730: 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c  ngeCookie(db, v,
b740: 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71   p->iDb);.    sq
b750: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b760: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
b770: 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  p->iDb, 0,.     
b780: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
b790: 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  f("tbl_name='%q'
b7a0: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
b7b0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 20  DYNAMIC);.  }.. 
b7c0: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
b7d0: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
b7e0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b7f0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b800: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
b810: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
b820: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
b830: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
b840: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
b850: 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62  ey; .    Db *pDb
b860: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
b870: 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Db];.    pOld = 
b880: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
b890: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
b8a0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
b8b0: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
b8c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
b8d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b8e0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
b8f0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
b900: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
b910: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
b920: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
b930: 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79   }.    for(pFKey
b940: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
b950: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
b960: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
b970: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
b980: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
b990: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
b9a0: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
b9b0: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
b9c0: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
b9d0: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
b9e0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
b9f0: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
ba00: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
ba10: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  FKey);.    }.   
ba20: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ba30: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
ba40: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
ba50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
ba60: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
ba70: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
ba80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ba90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
baa0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
bab0: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
bac0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
bad0: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
bae0: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
baf0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
bb00: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
bb10: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
bb20: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
bb30: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
bb40: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
bb50: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
bb60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
bb70: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
bb80: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
bb90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
bba0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
bbb0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
bbc0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
bbd0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
bbe0: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
bbf0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
bc00: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
bc10: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
bc20: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
bc30: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
bc40: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
bc50: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
bc60: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
bc70: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
bc80: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
bc90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
bca0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
bcb0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
bcc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
bcd0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
bce0: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
bcf0: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
bd00: 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  2, isTemp, 1);. 
bd10: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
bd20: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
bd30: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
bd40: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
bd50: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
bd60: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
bd70: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
bd80: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
bd90: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
bda0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
bdb0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
bdc0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
bdd0: 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22  , p->iDb, "view"
bde0: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
bdf0: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
be00: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
be10: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
be20: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
be30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
be40: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
be50: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
be60: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
be70: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
be80: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
be90: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
bea0: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
beb0: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
bec0: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
bed0: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
bee0: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
bef0: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
bf00: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
bf10: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
bf20: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
bf30: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
bf40: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
bf50: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
bf60: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
bf70: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
bf80: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
bf90: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
bfa0: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
bfb0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
bfc0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
bfd0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
bfe0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
bff0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
c000: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
c010: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
c020: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
c030: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
c040: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
c050: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
c060: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
c070: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
c080: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
c090: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
c0a0: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
c0b0: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
c0c0: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
c0d0: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
c0e0: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
c0f0: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
c100: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
c110: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
c120: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
c130: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
c140: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
c150: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
c160: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
c170: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
c180: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
c190: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
c1a0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
c1b0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
c1c0: 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29  Parse, &sEnd, 0)
c1d0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
c1e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c1f0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
c200: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c210: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
c220: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
c230: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
c240: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
c250: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
c260: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
c270: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
c280: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
c290: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
c2a0: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
c2b0: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
c2c0: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
c2d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c2e0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
c2f0: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
c300: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
c310: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
c320: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
c330: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
c340: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
c350: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
c360: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
c370: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
c380: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
c390: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
c3a0: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
c3b0: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
c3c0: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
c3d0: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
c3e0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
c3f0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
c400: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
c410: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
c420: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
c430: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
c440: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
c450: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
c460: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
c470: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
c480: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
c490: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
c4a0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
c4b0: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
c4c0: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
c4d0: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
c4e0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c4f0: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
c500: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
c510: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
c520: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
c530: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
c540: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
c550: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
c560: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
c570: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
c580: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
c590: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
c5a0: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
c5b0: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
c5c0: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
c5d0: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
c5e0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
c5f0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
c600: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c610: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
c620: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
c630: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
c640: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
c650: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   1;.  }..  /* If
c660: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
c670: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
c680: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
c690: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
c6a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
c6b0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
c6c0: 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20   /* If nCol==0, 
c6d0: 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74  then pTable must
c6e0: 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   be a VIEW */.  
c6f0: 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70  pSel = pTable->p
c700: 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f  Select;..  /* No
c710: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
c720: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
c730: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
c740: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
c750: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
c760: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
c770: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
c780: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
c790: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
c7a0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
c7b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
c7c0: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
c7d0: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
c7e0: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
c7f0: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
c800: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
c810: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
c820: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
c830: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c  3ExprListDup(pEL
c840: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
c850: 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ->pEList==0 ){. 
c860: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
c870: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65  = pEList;.    re
c880: 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 1;  /* Mall
c890: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
c8a0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
c8b0: 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20  = -1;.  pSelTab 
c8c0: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
c8d0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
c8e0: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
c8f0: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
c900: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c910: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c920: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
c930: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
c940: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
c950: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
c960: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
c970: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
c980: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
c990: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
c9a0: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
c9b0: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
c9c0: 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  erty(pParse->db,
c9d0: 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42   pTable->iDb, DB
c9e0: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
c9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
ca00: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
ca10: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
ca20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
ca30: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
ca40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ca50: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
ca60: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
ca70: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
ca80: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
ca90: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
caa0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
cab0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cac0: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
cad0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
cae0: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
caf0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
cb00: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
cb10: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
cb20: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
cb30: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
cb40: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
cb50: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
cb60: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
cb70: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
cb80: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
cb90: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
cba0: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
cbb0: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
cbc0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
cbd0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
cbe0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
cbf0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
cc00: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
cc10: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
cc20: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
cc30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
cc40: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
cc50: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
cc60: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
cc70: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
cc80: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
cc90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cca0: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
ccb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
ccc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
ccd0: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
cce0: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
ccf0: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
cd00: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
cd10: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
cd20: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
cd30: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
cd40: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
cd50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
cd60: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
cd70: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
cd80: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
cd90: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
cda0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
cdb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
cdc0: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
cdd0: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
cde0: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
cdf0: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20  lem *pElem;.  . 
ce00: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
ce10: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
ce20: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d  >tblHash); pElem
ce30: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
ce40: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
ce50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
ce60: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
ce70: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
ce80: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
ce90: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
cea0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
ceb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
cec0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  }.  }.  for(pEle
ced0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
cee0: 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  t(&pDb->idxHash)
cef0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
cf00: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
cf10: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
cf20: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
cf30: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
cf40: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
cf50: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
cf60: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
cf70: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
cf80: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  n;.    }.  }.  a
cf90: 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64  ssert(0);.}.#end
cfa0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
cfb0: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
cfc0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
cfd0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
cfe0: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
cff0: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
d000: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
d010: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d020: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
d030: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
d040: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
d050: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
d060: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
d070: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
d080: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
d090: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
d0a0: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
d0b0: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
d0c0: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
d0d0: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
d0e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
d0f0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
d100: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
d110: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d120: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
d130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d140: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
d150: 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64  ble, iDb);.#ifnd
d160: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d170: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
d180: 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73  P_Destroy pushes
d190: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f   an integer onto
d1a0: 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74   the stack. If t
d1b0: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
d1c0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
d1d0: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
d1e0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
d1f0: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
d200: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
d210: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
d220: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
d230: 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  is the sqlite_ma
d240: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
d250: 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
d260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
d270: 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  #0" in the SQL i
d280: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
d290: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
d2a0: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
d2b0: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
d2c0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
d2d0: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
d2e0: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
d2f0: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
d300: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
d310: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
d320: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
d330: 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72  d WHERE #0 AND r
d340: 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20  ootpage=#0",.   
d350: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
d360: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
d370: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
d380: 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66   iTable);.#endif
d390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
d3a0: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
d3b0: 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
d3c0: 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
d3d0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
d3e0: 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
d3f0: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
d400: 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
d410: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d420: 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
d430: 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
d440: 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
d450: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
d460: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
d470: 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
d480: 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
d490: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
d4a0: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
d4b0: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
d4c0: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
d4d0: 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
d4e0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d4f0: 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
d500: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d510: 55 4d 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  UM.  destroyRoot
d520: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
d530: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  b->tnum, pTab->i
d540: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
d550: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d560: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d570: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
d580: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
d590: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  e, pIdx->tnum, p
d5a0: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23  Idx->iDb);.  }.#
d5b0: 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
d5c0: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
d5d0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
d5e0: 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
d5f0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d600: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
d610: 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
d620: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
d630: 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
d640: 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
d650: 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
d660: 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
d670: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
d680: 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
d690: 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
d6a0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
d6b0: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
d6c0: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
d6d0: 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
d6e0: 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
d6f0: 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
d700: 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
d710: 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
d720: 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
d730: 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
d740: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
d750: 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
d760: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
d770: 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
d780: 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
d790: 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
d7a0: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
d7b0: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
d7c0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
d7d0: 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
d7e0: 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
d7f0: 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
d800: 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
d810: 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
d820: 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
d830: 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
d840: 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
d850: 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
d860: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
d870: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
d880: 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
d890: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
d8a0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
d8b0: 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
d8c0: 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
d8d0: 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
d8e0: 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
d8f0: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
d900: 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
d910: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
d920: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d930: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d940: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
d950: 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
d960: 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
d970: 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61  ( pIdx->iDb==pTa
d980: 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20  b->iDb );.      
d990: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
d9a0: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
d9b0: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
d9c0: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
d9d0: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
d9e0: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
d9f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
da00: 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  gest==0 ) return
da10: 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
da20: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
da30: 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44  argest, pTab->iD
da40: 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79  b);.    iDestroy
da50: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
da60: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
da70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
da80: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
da90: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
daa0: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
dab0: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
dac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
dad0: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
dae0: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
daf0: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
db00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
db10: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
db20: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
db30: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
db40: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
db50: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
db60: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
db70: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
db80: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
db90: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
dba0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
dbb0: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
dbc0: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
dbd0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
dbe0: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
dbf0: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
dc00: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
dc10: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
dc20: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
dc30: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
dc40: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
dc50: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
dc60: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
dc70: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
dc80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
dc90: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
dca0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
dcb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
dcc0: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
dcd0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
dce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
dcf0: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
dd00: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
dd10: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
dd20: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
dd30: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
dd40: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
dd50: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
dd60: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
dd70: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
dd80: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
dd90: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
dda0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
ddb0: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
ddc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
ddd0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
dde0: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
ddf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de00: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
de10: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
de20: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
de30: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
de40: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
de50: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
de60: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
de70: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
de80: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
de90: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
dea0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
deb0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
dec0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
ded0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
dee0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
def0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
df00: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
df10: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
df20: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
df30: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
df40: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
df50: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
df60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
df70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
df80: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
df90: 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
dfa0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50  ->zName);.    pP
dfb0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
dfc0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
dfd0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
dfe0: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
dff0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
e000: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e010: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
e020: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
e030: 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
e040: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
e050: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
e060: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
e070: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
e080: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
e090: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e0a0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
e0b0: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
e0c0: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
e0d0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
e0e0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
e0f0: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
e100: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e110: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
e120: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
e130: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
e140: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
e150: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e160: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
e170: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
e180: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73  *pTrigger;.    s
e190: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
e1a0: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
e1b0: 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  , 0, pTab->iDb);
e1c0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
e1d0: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
e1e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
e1f0: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
e200: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
e210: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
e220: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
e230: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
e240: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
e250: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
e260: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
e270: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
e280: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
e290: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
e2a0: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
e2b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
e2c0: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e  ger->iDb==pTab->
e2d0: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
e2e0: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
e2f0: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
e300: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
e310: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
e320: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
e330: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
e340: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
e350: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
e360: 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
e370: 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
e380: 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
e390: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
e3a0: 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
e3b0: 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
e3c0: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
e3d0: 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
e3e0: 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
e3f0: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
e400: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
e410: 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
e420: 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
e430: 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
e440: 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
e450: 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
e460: 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
e470: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
e480: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
e490: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
e4a0: 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
e4b0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
e4c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
e4d0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
e4e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
e4f0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
e500: 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%s WHERE tbl_na
e510: 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
e520: 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
e530: 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 54 61 62      db->aDb[pTab
e540: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  ->iDb].zName, SC
e550: 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d  HEMA_TABLE(pTab-
e560: 3e 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  >iDb), pTab->zNa
e570: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  me);.    if( !is
e580: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65  View ){.      de
e590: 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
e5a0: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
e5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
e5c0: 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p3(v, OP_DropTab
e5d0: 6c 65 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  le, pTab->iDb, 0
e5e0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
e5f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  );.  }.  sqliteV
e600: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
e610: 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
e620: 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
e630: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e640: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e660: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e670: 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
e680: 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
e690: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
e6a0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
e6b0: 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
e6c0: 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
e6d0: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
e6e0: 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
e6f0: 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
e700: 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
e710: 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
e720: 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
e730: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e740: 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
e750: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
e760: 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
e770: 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
e780: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
e790: 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
e7a0: 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
e7b0: 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
e7c0: 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
e7d0: 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
e7e0: 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
e7f0: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
e800: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
e810: 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
e820: 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
e830: 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
e840: 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
e850: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
e860: 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
e870: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
e880: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
e890: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
e8a0: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
e8b0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
e8c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
e8d0: 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
e8e0: 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
e8f0: 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
e900: 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
e910: 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
e920: 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
e930: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e940: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
e950: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
e960: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
e970: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
e980: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
e990: 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
e9a0: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
e9b0: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
e9c0: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
e9d0: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
e9e0: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
e9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ea00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ea10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
ea20: 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
ea30: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
ea40: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
ea50: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
ea60: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
ea70: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
ea80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
ea90: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
eaa0: 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
eab0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
eac0: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
ead0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
eae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
eaf0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
eb00: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
eb10: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
eb20: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
eb30: 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
eb40: 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  y = 0;.  Table *
eb50: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
eb60: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
eb70: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
eb80: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
eb90: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
eba0: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
ebb0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
ebc0: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
ebd0: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
ebe0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
ebf0: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
ec00: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
ec10: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
ec20: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
ec30: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
ec40: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
ec50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ec60: 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
ec70: 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
ec80: 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
ec90: 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
eca0: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
ecb0: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
ecc0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
ecd0: 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
ece0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
ecf0: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
ed00: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
ed10: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
ed20: 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
ed30: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
ed40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ed50: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
ed60: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
ed70: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
ed80: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
ed90: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
eda0: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
edb0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
edc0: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
edd0: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
ede0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
edf0: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
ee00: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
ee10: 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
ee20: 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
ee30: 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
ee40: 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
ee50: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
ee60: 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
ee70: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
ee80: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
ee90: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
eea0: 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
eeb0: 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
eec0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
eed0: 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
eee0: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
eef0: 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
ef00: 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
ef10: 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
ef20: 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
ef30: 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
ef40: 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
ef50: 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
ef60: 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
ef70: 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
ef80: 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
ef90: 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
efa0: 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
efb0: 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
efc0: 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
efd0: 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
efe0: 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
eff0: 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
f000: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
f010: 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
f020: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
f030: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
f040: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
f050: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
f060: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
f070: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
f080: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
f090: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f0a0: 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
f0b0: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
f0c0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
f0d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f0e0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
f0f0: 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
f100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f110: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f120: 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
f130: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
f140: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f150: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
f160: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
f170: 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
f180: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
f190: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
f1a0: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
f1b0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
f1c0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
f1d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
f1e0: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
f1f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
f200: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
f210: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43   n = strlen(pToC
f220: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
f230: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
f240: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
f250: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
f260: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
f270: 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
f280: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
f290: 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
f2a0: 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
f2b0: 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
f2c0: 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d  ey->deleteConf =
f2d0: 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20   flags & 0xff;. 
f2e0: 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f   pFKey->updateCo
f2f0: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38  nf = (flags >> 8
f300: 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b   ) & 0xff;.  pFK
f310: 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d  ey->insertConf =
f320: 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20   (flags >> 16 ) 
f330: 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69  & 0xff;..  /* Li
f340: 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
f350: 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
f360: 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
f370: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
f380: 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
f390: 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
f3a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46  .  sqliteFree(pF
f3b0: 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
f3c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f3d0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f3e0: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
f3f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  prListDelete(pFr
f400: 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
f410: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
f420: 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
f430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
f440: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
f450: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
f460: 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
f470: 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
f480: 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
f490: 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
f4a0: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
f4b0: 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
f4c0: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
f4d0: 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
f4e0: 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
f4f0: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
f500: 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
f510: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
f520: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
f530: 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
f540: 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
f550: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
f560: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
f570: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
f580: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
f590: 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
f5a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f5b0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
f5c0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
f5d0: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
f5e0: 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
f5f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
f600: 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
f610: 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
f620: 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
f630: 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
f640: 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
f650: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f660: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
f670: 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
f680: 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
f690: 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
f6a0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
f6b0: 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
f6c0: 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
f6d0: 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
f6e0: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
f6f0: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
f700: 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
f710: 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
f720: 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
f730: 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
f740: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
f750: 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
f760: 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 63  d.  The memory c
f770: 65 6c 6c 20 73 70 65 63 69 66 69 65 64 20 62 79  ell specified by
f780: 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e   memRootPage con
f790: 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  tains the.** roo
f7a0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
f7b0: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20   the index.  If 
f7c0: 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e  memRootPage is n
f7d0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a  egative, then.**
f7e0: 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
f7f0: 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75  dy exists and mu
f800: 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  st be cleared be
f810: 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c  fore being refil
f820: 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72  led and.** the r
f830: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f840: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  of the index is 
f850: 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65  taken from pInde
f860: 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74  x->tnum..*/.stat
f870: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52  ic void sqlite3R
f880: 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65  efillIndex(Parse
f890: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
f8a0: 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d  *pIndex, int mem
f8b0: 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62  RootPage){.  Tab
f8c0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
f8d0: 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54  x->pTable;  /* T
f8e0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
f8f0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
f900: 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d  t iTab = pParse-
f910: 3e 6e 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  >nTab;       /* 
f920: 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
f930: 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20  d for pTab */.  
f940: 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73  int iIdx = pPars
f950: 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f  e->nTab+1;     /
f960: 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
f970: 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a  sed for pIndex *
f980: 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f9b0: 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
f9c0: 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20    int tnum;     
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
f9f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65   index */.  Vdbe
fa00: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
fa10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
fa20: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
fa30: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
fa40: 63 68 69 6e 65 20 2a 2f 0a 0a 20 20 76 20 3d 20  chine */..  v = 
fa50: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
fa60: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
fa70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
fa80: 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
fa90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
faa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
fab0: 4d 65 6d 4c 6f 61 64 2c 20 6d 65 6d 52 6f 6f 74  MemLoad, memRoot
fac0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 74 6e  Page, 0);.    tn
fad0: 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  um = 0;.  }else{
fae0: 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
faf0: 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71  ex->tnum;.    sq
fb00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
fb10: 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
fb20: 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
fb30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
fb40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
fb50: 65 67 65 72 2c 20 70 49 6e 64 65 78 2d 3e 69 44  eger, pIndex->iD
fb60: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
fb70: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
fb80: 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
fb90: 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  num,.           
fba0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
fbb0: 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
fbc0: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
fbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fbe0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
fbf0: 20 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a   pTab->iDb, 0);.
fc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc10: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
fc20: 64 2c 20 69 54 61 62 2c 20 70 54 61 62 2d 3e 74  d, iTab, pTab->t
fc30: 6e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  num);.  sqlite3V
fc40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
fc50: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 54  etNumColumns, iT
fc60: 61 62 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b  ab, pTab->nCol);
fc70: 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
fc80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
fc90: 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20  P_Rewind, iTab, 
fca0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  0);.  sqlite3Gen
fcb0: 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c  erateIndexKey(v,
fcc0: 20 70 49 6e 64 65 78 2c 20 69 54 61 62 29 3b 0a   pIndex, iTab);.
fcd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
fce0: 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 69  (v, OP_IdxPut, i
fcf0: 49 64 78 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  Idx, pIndex->onE
fd00: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20  rror!=OE_None,. 
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f       "indexed co
fd30: 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
fd40: 69 71 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43  ique", P3_STATIC
fd50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
fd60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
fd70: 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
fd80: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
fd90: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 31  hangeP2(v, addr1
fda0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
fdb0: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
fdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fdd0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
fde0: 61 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ab, 0);.  sqlite
fdf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
fe00: 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
fe10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
fe20: 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
fe30: 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
fe40: 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e   pIndex is the n
fe50: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
fe60: 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20   .** and pTable 
fe70: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
fe80: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
fe90: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
fea0: 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
feb0: 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
fec0: 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
fed0: 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
fee0: 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
fef0: 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
ff00: 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
ff10: 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
ff20: 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
ff30: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
ff40: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
ff50: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
ff60: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
ff70: 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
ff80: 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
ff90: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
ffa0: 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
ffb0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
ffc0: 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
ffd0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
ffe0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
fff0: 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
10000 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
10010 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
10020 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
10030 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
10040 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
10050 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
10060 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
10070 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10080 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
10090 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
100a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
100b0 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
100c0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
100d0 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
100e0 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
100f0 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
10100 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
10110 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
10120 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
10130 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
10140 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
10150 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
10160 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f  st *pTblName,  /
10170 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
10180 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
10190 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
101a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
101b0 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
101c0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
101d0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
101e0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a   onError,     /*
101f0 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
10200 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
10210 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
10220 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
10230 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
10240 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
10250 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
10260 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
10270 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
10280 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
10290 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
102a0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
102b0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
102c0 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20  e *pTab = 0; /* 
102d0 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
102e0 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
102f0 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54  pIndex = 0; /* T
10300 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
10310 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
10320 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
10330 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
10340 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
10350 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
10360 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
10370 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
10380 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
10390 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
103a0 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
103b0 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20  /.  int isTemp; 
103c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
103d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
103e0 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ex */.  sqlite3 
103f0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10400 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ;..  int iDb;   
10410 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
10420 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
10430 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
10440 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
10450 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *pName = 0; /* 
10460 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
10470 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
10480 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
10490 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
104a0 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
104b0 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
104c0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
104d0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
104e0 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
104f0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
10500 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
10510 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
10520 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
10530 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
10540 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
10550 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
10560 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
10570 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
10580 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
10590 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
105a0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
105b0 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
105c0 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
105d0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
105e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
105f0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
10600 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
10610 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
10620 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10630 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
10640 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
10650 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10660 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a  e_index;..    /*
10670 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
10680 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
10690 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
106a0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
106b0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
106c0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
106d0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
106e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62  .    */.    pTab
106f0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
10700 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
10710 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69  pTblName);.    i
10720 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
10730 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
10740 62 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d  b && pTab->iDb==
10750 31 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d  1 ){.      iDb =
10760 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
10770 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
10780 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
10790 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
107a0 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
107b0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
107c0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
107d0 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
107e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
107f0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
10800 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
10810 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
10820 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61  rse, pTblName->a
10830 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [0].zName, .    
10840 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b      pTblName->a[
10850 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
10860 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
10870 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10880 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
10890 74 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  t( iDb==pTab->iD
108a0 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b );.  }else{.  
108b0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
108c0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
108d0 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
108e0 62 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70  ble;.    iDb = p
108f0 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20  Tab->iDb;.  }.. 
10900 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
10910 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
10920 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
10930 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
10940 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
10950 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10960 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
10970 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
10980 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
10990 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
109a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
109b0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  ex;.  }.  if( pT
109c0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
109d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
109e0 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
109f0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
10a00 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
10a10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10a20 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70  ex;.  }.  isTemp
10a30 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b   = pTab->iDb==1;
10a40 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
10a50 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10a60 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
10a70 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
10a80 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
10a90 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
10aa0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
10ab0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
10ac0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
10ad0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
10ae0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
10af0 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
10b00 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
10b10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
10b20 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
10b30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
10b40 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
10b50 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
10b60 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
10b70 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
10b80 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
10b90 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
10ba0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
10bb0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
10bc0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
10bd0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
10be0 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
10bf0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
10c00 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
10c10 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
10c20 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
10c30 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
10c40 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
10c50 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
10c60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
10c70 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
10c80 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
10c90 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
10ca0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10cb0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
10cc0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
10cd0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10ce0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e  ndex;.    if( zN
10cf0 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ame==0 ) goto ex
10d00 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10d10 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10d20 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
10d30 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
10d40 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
10d50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
10d60 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
10d70 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
10d80 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
10d90 20 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61   Index *pISameNa
10da0 6d 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65  me;    /* Anothe
10db0 72 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  r index with the
10dc0 20 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   same name */.  
10dd0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d      Table *pTSam
10de0 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74  eName;    /* A t
10df0 61 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e  able with same n
10e00 61 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78  ame as the index
10e10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51   */.      if( SQ
10e20 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
10e30 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
10e40 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  e) ) goto exit_c
10e50 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10e60 20 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61     if( (pISameNa
10e70 6d 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  me = sqlite3Find
10e80 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
10e90 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
10ea0 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ame))!=0 ){.    
10eb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10ec0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
10ed0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
10ee0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
10ef0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
10f00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10f20 20 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pTSameName = s
10f30 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
10f40 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
10f50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10f60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10f70 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
10f80 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
10f90 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
10fa0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
10fb0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d    }else if( pNam
10fe0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  e==0 ){.    char
10ff0 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69   zBuf[30];.    i
11000 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
11010 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
11020 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
11030 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
11040 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
11050 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73  xt, n++){}.    s
11060 70 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64  printf(zBuf,"_%d
11070 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  ",n);.    zName 
11080 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
11090 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
110a0 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
110b0 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  dex_", pTab->zNa
110c0 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a  me, zBuf, (char*
110d0 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  )0);.    if( zNa
110e0 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
110f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11100 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
11110 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
11120 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
11130 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
11140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11150 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
11160 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11170 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
11180 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
11190 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
111a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
111b0 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
111c0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
111d0 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
111e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
111f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
11200 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
11210 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
11220 58 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d  X;.    if( isTem
11230 70 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  p ) i = SQLITE_C
11240 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
11250 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
11260 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
11270 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
11280 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
11290 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
112a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
112b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
112c0 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
112d0 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
112e0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
112f0 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
11300 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
11310 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
11320 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
11330 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
11340 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
11350 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
11360 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
11370 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
11380 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
11390 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d  {.    nullId.z =
113a0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
113b0 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b  ->nCol-1].zName;
113c0 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20  .    nullId.n = 
113d0 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29  strlen(nullId.z)
113e0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
113f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
11400 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49  end(0, 0, &nullI
11410 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
11420 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
11430 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11440 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
11450 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
11460 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
11470 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  */.  pIndex = sq
11480 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
11490 6f 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c  of(Index) + strl
114a0 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a  en(zName) + 1 +.
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
114d0 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f  int) + sizeof(Co
114e0 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e  llSeq*))*pList->
114f0 6e 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70  nExpr );.  if( p
11500 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20  Index==0 ) goto 
11510 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11520 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  x;.  pIndex->aiC
11530 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
11540 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
11550 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  Coll[pList->nExp
11560 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e  r];.  pIndex->zN
11570 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49  ame = (char*)&pI
11580 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  ndex->aiColumn[p
11590 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
115a0 73 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  strcpy(pIndex->z
115b0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
115c0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
115d0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
115e0 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
115f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
11600 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45  x->onError = onE
11610 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
11620 61 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d  autoIndex = pNam
11630 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e==0;.  pIndex->
11640 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a  iDb = iDb;..  /*
11650 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
11660 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
11670 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
11680 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
11690 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
116a0 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
116b0 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
116c0 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
116d0 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
116e0 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
116f0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  found..  */.  fo
11700 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
11710 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11720 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
11730 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
11740 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
11750 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
11760 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
11770 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[j].zName)==
11780 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
11790 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
117a0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
117b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
117c0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
117d0 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
117e0 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
117f0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
11800 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
11810 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
11820 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
11830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
11840 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
11850 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
11860 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29  st->a[i].pExpr )
11870 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11880 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
11890 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  r->pColl );.    
118a0 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
118b0 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69  o.aColl[i] = pLi
118c0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
118d0 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  pColl;.    }else
118e0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
118f0 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
11900 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
11910 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  .pColl;.    }.  
11920 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
11930 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11940 69 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64  i] );.    if( !d
11950 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
11960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11970 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
11980 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79  rse, pIndex->key
11990 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a  Info.aColl[i]) .
119a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
119b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
119c0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  dex;.    }.  }. 
119d0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
119e0 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d  .nField = pList-
119f0 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
11a00 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
11a10 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
11a20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
11a30 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
11a40 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
11a50 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
11a60 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
11a70 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
11a80 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
11a90 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
11aa0 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
11ab0 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
11ac0 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
11ad0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
11ae0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
11af0 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
11b00 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
11b10 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
11b20 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
11b30 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
11b40 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
11b50 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
11b60 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
11b70 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
11b80 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
11b90 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
11ba0 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
11bb0 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
11bc0 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
11bd0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
11be0 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
11bf0 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
11c00 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
11c10 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
11c20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
11c30 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
11c40 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
11c50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
11c60 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
11c70 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
11c80 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
11c90 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11ca0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
11cb0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f   assert( pIdx->o
11cc0 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
11cd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11ce0 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78   pIdx->autoIndex
11cf0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11d00 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
11d10 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20  r!=OE_None );.. 
11d20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
11d30 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e  Column!=pIndex->
11d40 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e  nColumn ) contin
11d50 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ue;.      for(k=
11d60 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; k<pIdx->nColu
11d70 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; k++){.      
11d80 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
11d90 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
11da0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
11db0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
11dc0 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  ( pIdx->keyInfo.
11dd0 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78  aColl[k]!=pIndex
11de0 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
11df0 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
11e00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
11e10 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
11e20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
11e30 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
11e40 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
11e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
11e60 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
11e70 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
11e80 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
11e90 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
11ea0 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
11eb0 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
11ec0 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
11ed0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
11ee0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
11ef0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
11f00 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
11f10 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
11f20 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
11f30 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
11f40 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
11f50 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
11f60 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
11f70 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
11f80 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
11f90 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
11fa0 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
11fb0 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
11fc0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
11fd0 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
11fe0 76 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e  viour for the in
11ff0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
12000 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
12010 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
12020 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
12030 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
12040 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
12050 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12060 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12070 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
12080 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
12090 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
120a0 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
120b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
120c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
120d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
120e0 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
120f0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
12100 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
12110 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
12120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12130 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
12140 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12150 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12160 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
12170 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
12180 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
12190 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
121a0 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
121b0 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
121c0 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
121d0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
121e0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
121f0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
12200 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
12210 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
12220 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  .idxHash, .     
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
12250 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
12260 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
12270 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
12280 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
12290 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
122a0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
122b0 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
122c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
122d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
122e0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
122f0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
12300 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
12310 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
12320 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
12330 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
12340 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
12350 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
12360 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
12370 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
12380 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
12390 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
123a0 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
123b0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
123c0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
123d0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
123e0 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
123f0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
12400 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
12410 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
12420 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
12430 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
12440 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
12450 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
12460 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
12470 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
12480 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
12490 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
124a0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
124b0 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
124c0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
124d0 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
124e0 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
124f0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
12500 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
12510 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
12520 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
12530 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
12540 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
12550 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
12560 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
12570 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
12580 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
12590 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
125a0 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
125b0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
125c0 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
125d0 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
125e0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
125f0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
12600 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
12610 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
12620 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
12630 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
12640 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e   else if( db->in
12650 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
12660 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
12670 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
12680 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73  int iMem = pPars
12690 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20  e->nMem++;..    
126a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
126b0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
126c0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
126d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
126e0 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  x;..    /* Creat
126f0 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
12700 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
12710 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
12720 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
12730 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
12740 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
12750 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
12760 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
12770 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12780 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12790 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
127a0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  0);..    /* Gath
127b0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
127c0 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
127d0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
127e0 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
127f0 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
12800 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
12810 20 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20   pStart && pEnd 
12820 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  ){.      /* A na
12830 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
12840 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
12850 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
12860 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
12870 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
12880 66 28 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  f("CREATE%s INDE
12890 58 20 25 2e 2a 71 22 2c 0a 20 20 20 20 20 20 20  X %.*q",.       
128a0 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
128b0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
128c0 45 22 2c 0a 20 20 20 20 20 20 20 20 41 64 64 72  E",.        Addr
128d0 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
128e0 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 2c 0a  (pName->z) + 1,.
128f0 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
12900 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12910 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
12920 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
12930 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
12940 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
12950 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
12960 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
12970 4d 50 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20  MPrintf("");.   
12980 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
12990 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
129a0 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
129b0 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
129c0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
129d0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
129e0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
129f0 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
12a00 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
12a10 30 2c 27 25 73 27 29 3b 22 2c 0a 20 20 20 20 20  0,'%s');",.     
12a20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
12a30 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
12a40 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
12a50 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
12a60 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
12a70 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 53  Name,.        zS
12a80 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
12a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12aa0 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
12ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12ac0 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a  (zStmt);..    /*
12ad0 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
12ae0 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
12af0 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
12b00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12b10 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
12b20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
12b30 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
12b40 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
12b50 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
12b60 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
12b70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12b80 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
12b90 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
12ba0 30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  0,.         sqli
12bb0 74 65 33 4d 50 72 69 6e 74 66 28 22 6e 61 6d 65  te3MPrintf("name
12bc0 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e  ='%q'", pIndex->
12bd0 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
12be0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  IC);.    }.  }..
12bf0 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67    /* When adding
12c00 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65   an index to the
12c10 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73   list of indices
12c20 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61   for a table, ma
12c30 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c  ke.  ** sure all
12c40 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64   indices labeled
12c50 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65   OE_Replace come
12c60 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65   after all those
12c70 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45   labeled.  ** OE
12c80 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69  _Ignore.  This i
12c90 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20  s necessary for 
12ca0 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
12cb0 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45 0a  ation of UPDATE.
12cc0 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54 2e    ** and INSERT.
12cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12ce0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
12cf0 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
12d00 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
12d10 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
12d20 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
12d30 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
12d40 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
12d50 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
12d60 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
12d70 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
12d80 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
12d90 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
12da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
12db0 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
12dc0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
12dd0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
12de0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
12df0 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
12e00 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
12e10 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
12e20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
12e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
12e40 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
12e50 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
12e60 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
12e70 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
12e80 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
12e90 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
12ea0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
12eb0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
12ec0 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
12ed0 6e 64 65 78 20 29 7b 0a 20 20 20 20 66 72 65 65  ndex ){.    free
12ee0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20  Index(pIndex);. 
12ef0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
12f00 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
12f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
12f20 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
12f30 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
12f40 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
12f50 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
12f60 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
12f70 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
12f80 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
12f90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
12fa0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
12fb0 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
12fc0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
12fd0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
12fe0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
12ff0 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
13000 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
13010 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
13020 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13030 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
13040 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
13050 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
13060 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
13070 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
13080 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
13090 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
130a0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
130b0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49  ) ) return;.  pI
130c0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
130d0 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d  ndIndex(db, pNam
130e0 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
130f0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13100 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e  base);.  if( pIn
13110 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex==0 ){.    sq
13120 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13130 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
13140 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
13150 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 72 73 65  , 0);.    pParse
13160 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
13170 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
13180 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
13190 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
131a0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
131b0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
131c0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
131d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
131e0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
131f0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
13200 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
13210 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
13220 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13230 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  rop_index;.  }.#
13240 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13250 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13260 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13270 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13280 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
13290 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
132a0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
132b0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
132c0 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69  b->aDb[pIndex->i
132d0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
132e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
132f0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70  = SCHEMA_TABLE(p
13300 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
13310 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13320 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13330 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
13340 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
13350 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13360 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
13370 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
13380 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
13390 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
133a0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
133b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
133c0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
133d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
133e0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
133f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13400 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
13410 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
13420 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13430 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
13440 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
13450 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
13460 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
13470 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13480 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
13490 6e 74 20 69 44 62 20 3d 20 70 49 6e 64 65 78 2d  nt iDb = pIndex-
134a0 3e 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  >iDb;.    sqlite
134b0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
134c0 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
134d0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
134e0 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20  HERE name=%Q",. 
134f0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
13500 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
13510 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
13520 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
13530 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
13540 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
13550 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
13560 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
13570 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
13580 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
13590 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
135a0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
135b0 2c 20 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78  , iDb, 0, pIndex
135c0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
135d0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
135e0 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
135f0 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29  istDelete(pName)
13600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13610 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
13620 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
13630 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
13640 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
13650 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
13660 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
13670 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
13680 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
13690 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
136a0 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
136b0 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  nd(IdList *pList
136c0 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
136d0 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
136e0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
136f0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
13700 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
13710 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
13720 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
13730 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
13740 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c   0;.  }.  if( pL
13750 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d  ist->nId>=pList-
13760 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73  >nAlloc ){.    s
13770 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
13780 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d  m *a;.    pList-
13790 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d  >nAlloc = pList-
137a0 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  >nAlloc*2 + 5;. 
137b0 20 20 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61     a = sqliteRea
137c0 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
137d0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
137e0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
137f0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30   );.    if( a==0
13800 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13810 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  3IdListDelete(pL
13820 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
13830 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
13840 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20  pList->a = a;.  
13850 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73  }.  memset(&pLis
13860 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d  t->a[pList->nId]
13870 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73  , 0, sizeof(pLis
13880 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69  t->a[0]));.  pLi
13890 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64  st->a[pList->nId
138a0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
138b0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
138c0 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d  Token);.  pList-
138d0 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  >nId++;.  return
138e0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
138f0 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
13900 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
13910 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
13920 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
13930 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
13940 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
13950 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
13960 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
13970 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
13980 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53  L..**.** A new S
13990 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
139a0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
139b0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
139c0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
139d0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
139e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
139f0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
13a00 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
13a10 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
13a20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
13a30 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
13a40 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
13a50 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
13a60 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
13a70 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
13a80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13a90 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
13aa0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
13ab0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
13ac0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
13ad0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
13ae0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
13af0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
13b00 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
13b10 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
13b20 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
13b30 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
13b40 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
13b50 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
13b60 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
13b70 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
13b80 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
13b90 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
13ba0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
13bb0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
13bc0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
13bd0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
13be0 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
13bf0 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
13c00 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
13c10 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
13c20 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
13c30 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
13c40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
13c50 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
13c60 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a  ppend(A,B,C);.**
13c70 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
13c80 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
13c90 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
13ca0 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c  se name..*/.SrcL
13cb0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
13cc0 69 73 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73  istAppend(SrcLis
13cd0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
13ce0 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a  *pTable, Token *
13cf0 70 44 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74  pDatabase){.  st
13d00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
13d10 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
13d20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
13d30 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
13d40 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63  lloc( sizeof(Src
13d50 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
13d60 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13d70 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
13d80 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d  >nAlloc = 1;.  }
13d90 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53  .  if( pList->nS
13da0 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  rc>=pList->nAllo
13db0 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
13dc0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73   *pNew;.    pLis
13dd0 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a  t->nAlloc *= 2;.
13de0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
13df0 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a  eRealloc(pList,.
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
13e10 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20  izeof(*pList) + 
13e20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31  (pList->nAlloc-1
13e30 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  )*sizeof(pList->
13e40 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
13e50 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
13e60 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
13e70 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
13e80 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
13e90 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
13ea0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74   pNew;.  }.  pIt
13eb0 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
13ec0 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d  List->nSrc];.  m
13ed0 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
13ee0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
13ef0 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74  0]));.  if( pDat
13f00 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
13f10 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
13f20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
13f30 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
13f40 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
13f50 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
13f60 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
13f70 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
13f80 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
13f90 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
13fa0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
13fb0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
13fc0 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70  ken(pTable);.  p
13fd0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
13fe0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
13ff0 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65  mToken(pDatabase
14000 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72  );.  pItem->iCur
14010 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73  sor = -1;.  pLis
14020 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74  t->nSrc++;.  ret
14030 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
14040 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f  .** Assign curso
14050 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
14060 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
14070 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
14080 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
14090 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
140a0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
140b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
140c0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
140d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Src; i++){.    i
140e0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  f( pList->a[i].i
140f0 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20  Cursor<0 ){.    
14100 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43    pList->a[i].iC
14110 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
14120 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nTab++;.    }.  
14130 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
14140 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c  n alias to the l
14150 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f  ast identifier o
14160 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e  n the given iden
14170 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a  tifier list..*/.
14180 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
14190 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c  istAddAlias(SrcL
141a0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
141b0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
141c0 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74  ( pList && pList
141d0 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
141e0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
141f0 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d  nSrc-1].zAlias =
14200 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
14210 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20  Token(pToken);. 
14220 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
14230 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
14240 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
14250 69 73 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74  istDelete(IdList
14260 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
14270 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
14280 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
14290 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
142a0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
142b0 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d  qliteFree(pList-
142c0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
142d0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
142e0 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
142f0 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
14300 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14310 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
14320 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
14330 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
14340 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
14350 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
14360 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
14370 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
14380 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
14390 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
143a0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
143b0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
143c0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
143d0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
143e0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
143f0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
14400 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
14410 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
14420 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
14430 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
14440 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69  entire SrcList i
14450 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73  ncluding all its
14460 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a   substructure..*
14470 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
14480 63 4c 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c  cListDelete(SrcL
14490 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
144a0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
144b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
144c0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
144d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
144e0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
144f0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
14500 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
14510 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
14520 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74  Free(pItem->zDat
14530 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
14540 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
14550 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
14560 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69  Free(pItem->zAli
14570 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  as);.    if( pIt
14580 65 6d 2d 3e 70 54 61 62 20 26 26 20 70 49 74 65  em->pTab && pIte
14590 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  m->pTab->isTrans
145a0 69 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ient ){.      sq
145b0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
145c0 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  (0, pItem->pTab)
145d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
145e0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
145f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
14600 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14610 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f  Delete(pItem->pO
14620 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
14630 64 4c 69 73 74 44 65 6c 65 74 65 28 70 49 74 65  dListDelete(pIte
14640 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
14650 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
14660 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
14670 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
14680 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
14690 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
146a0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
146b0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
146c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
146d0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
146e0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
146f0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
14700 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
14710 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
14720 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
14730 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14740 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14750 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14760 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14770 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14780 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
14790 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72  EGIN", 0, 0) ) r
147a0 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
147b0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
147c0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
147d0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
147e0 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
147f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
14800 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14810 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14820 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54  dbeAddOp(v, OP_T
14830 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
14840 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
14850 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  VE)+1);.    }.  
14860 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
14870 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
14880 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
14890 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
148a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
148b0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
148c0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
148d0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
148e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
148f0 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
14900 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
14910 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
14920 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
14930 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
14940 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
14950 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
14960 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
14970 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
14980 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14990 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
149a0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
149b0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
149c0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
149d0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
149e0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
149f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14a00 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
14a10 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
14a20 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
14a30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
14a40 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
14a50 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
14a60 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
14a70 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14a80 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
14a90 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14aa0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14ab0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14ac0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14ad0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14ae0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14af0 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14b00 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14b10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14b20 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
14b30 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
14b40 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
14b50 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
14b60 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14b70 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
14b80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14b90 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
14ba0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
14bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14bc0 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
14bd0 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
14be0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
14bf0 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
14c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
14c10 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
14c20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
14c30 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
14c40 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
14c50 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  c int sqlite3Ope
14c60 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
14c70 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14c80 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14c90 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
14ca0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
14cb0 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
14cc0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
14cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14ce0 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
14cf0 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26   0, MAX_PAGES, &
14d00 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b  db->aDb[1].pBt);
14d10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14d30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14d40 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
14d50 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
14d60 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
14d70 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
14d80 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
14d90 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
14da0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
14db0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
14dc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
14dd0 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64  ( db->flags & !d
14de0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
14df0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14e00 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
14e10 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  ns(db->aDb[1].pB
14e20 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
14e30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14e40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14e50 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14e60 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74  , "unable to get
14e70 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e   a write lock on
14e80 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68   ".          "th
14e90 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
14ea0 62 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20  base file");.   
14eb0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
14ec0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
14ed0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
14ee0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14ef0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
14f00 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
14f10 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
14f20 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
14f30 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
14f40 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
14f50 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
14f60 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
14f70 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
14f80 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
14f90 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
14fa0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
14fb0 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
14fc0 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
14fd0 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
14fe0 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
14ff0 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
15000 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
15010 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
15020 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
15030 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
15040 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
15050 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
15060 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
15070 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
15080 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
15090 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
150a0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
150b0 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
150c0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
150d0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
150e0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
150f0 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
15100 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
15110 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
15120 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
15130 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
15140 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
15150 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
15160 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
15170 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
15180 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
15190 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
151a0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
151b0 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
151c0 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
151d0 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
151e0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
151f0 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
15200 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
15210 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
15220 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
15230 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
15240 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
15250 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
15260 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
15270 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
15280 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
15290 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
152a0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
152b0 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
152c0 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
152d0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
152e0 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
152f0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
15300 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
15310 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
15320 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
15330 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
15340 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
15350 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
15360 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
15370 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
15380 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
15390 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
153a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
153b0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
153c0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
153d0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
153e0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
153f0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
15400 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
15410 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
15420 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
15430 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15440 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
15450 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
15460 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
15470 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
15480 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
15490 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20  , 0, 0)+1;.  }. 
154a0 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
154b0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
154c0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
154d0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44  sert( db->aDb[iD
154e0 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
154f0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
15500 74 28 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20  t( iDb<32 );.   
15510 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a   mask = 1<<iDb;.
15520 20 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d      if( (pParse-
15530 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
15540 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
15550 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
15560 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
15570 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
15580 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
15590 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
155a0 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69  _cookie;.      i
155b0 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
155c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
155d0 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 50 61  TempDatabase(pPa
155e0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
155f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15600 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
15610 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
15620 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
15630 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
15640 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
15650 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
15660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
15670 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
15680 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
15690 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
156a0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
156b0 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
156c0 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
156d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
156e0 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
156f0 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
15700 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
15710 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
15720 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
15730 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
15740 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
15750 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
15760 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
15770 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
15780 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
15790 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
157a0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
157b0 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
157c0 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
157d0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
157e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
157f0 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
15800 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
15810 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
15820 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
15830 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
15840 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
15850 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
15860 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
15870 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
15880 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
15890 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
158a0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
158b0 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
158c0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
158d0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
158e0 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
158f0 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
15900 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
15910 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
15920 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
15930 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
15940 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
15950 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
15960 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
15970 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
15980 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
15990 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
159a0 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
159b0 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
159c0 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
159d0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
159e0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
159f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15a00 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
15a10 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
15a20 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
15a30 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15a40 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
15a50 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
15a60 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
15a70 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
15a80 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
15a90 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
15aa0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20  setStatement && 
15ab0 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
15ac0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15ad0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15ae0 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20  Statement, iDb, 
15af0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  0);.  }.  if( iD
15b00 62 21 3d 31 20 26 26 20 70 50 61 72 73 65 2d 3e  b!=1 && pParse->
15b10 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d  db->aDb[1].pBt!=
15b20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15b30 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15b40 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53  ion(pParse, setS
15b50 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20  tatement, 1);.  
15b60 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  }.}../* .** Retu
15b70 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  rn the transient
15b80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
15b90 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65  bject used for e
15ba0 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69  ncoding conversi
15bb0 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51  ons.** during SQ
15bc0 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  L compilation..*
15bd0 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
15be0 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73  *sqlite3GetTrans
15bf0 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65  ientValue(sqlite
15c00 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64  3 *db){.  if( !d
15c10 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20  b->pValue ){.   
15c20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71   db->pValue = sq
15c30 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
15c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
15c50 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a              ->pValue;.}.