/ Hex Artifact Content
Login

Artifact f204aebf587f4543102dc6ea7c9283cb5949d7f0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 20 20    ROLLBACK.**   
02d0: 20 20 50 52 41 47 4d 41 0a 2a 2a 0a 3c 3c 3c 3c    PRAGMA.**.<<<<
02e0: 3c 3c 3c 20 62 75 69 6c 64 2e 63 0a 2a 2a 20 24  <<< build.c.** $
02f0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
0300: 32 36 38 20 32 30 30 34 2f 31 31 2f 30 35 20 31  268 2004/11/05 1
0310: 37 3a 31 37 3a 35 30 20 64 72 68 20 45 78 70 20  7:17:50 drh Exp 
0320: 24 0a 3d 3d 3d 3d 3d 3d 3d 0a 2a 2a 20 24 49 64  $.=======.** $Id
0330: 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e 32 36  : build.c,v 1.26
0340: 38 20 32 30 30 34 2f 31 31 2f 30 35 20 31 37 3a  8 2004/11/05 17:
0350: 31 37 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a  17:50 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 20 20 20  se, 0, iDb);.   
5cf0: 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61   /* Every time a
5d00: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63 72   new table is cr
5d10: 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66  eated the file-f
5d20: 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64  ormat.    ** and
5d30: 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76   encoding meta-v
5d40: 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69 6e  alues are set in
5d50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
5d60: 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68  n.    ** case th
5d70: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
5d80: 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a 20  table created.. 
5d90: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5da0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5db0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69  _Integer, db->fi
5dc0: 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  le_format, 0);. 
5dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5de0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
5df0: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
5e00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5e10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5e20: 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20  , db->enc, 0);. 
5e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e40: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
5e50: 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20  kie, iDb, 4);.. 
5e60: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
5e70: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
5e80: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
5e90: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5ea0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
5eb0: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
5ec0: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
5ed0: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
5ee0: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
5ef0: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
5f00: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
5f10: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
5f20: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
5f30: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2f 0a  Table()..    */.
5f40: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
5f50: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
5f60: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
5f70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5f80: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
5f90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5fa0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
5fb0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5fc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5fd0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
5fe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5ff0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
6000: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
6010: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
6020: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
6030: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
6040: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
6050: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
6060: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
6070: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
6080: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
6090: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
60a0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
60b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
60c0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
60d0: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
60e0: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
60f0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
6100: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6110: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
6120: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
6130: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
6140: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
6150: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
6160: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
6170: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
6180: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
6190: 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  l;.  if( (p = pP
61a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
61b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
61c0: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
61d0: 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b  romToken(pName);
61e0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
61f0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
6200: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
6210: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
6220: 33 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61  3StrICmp(z, p->a
6230: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[i].zName)==0
6240: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6260: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
6270: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
6280: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
6290: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65  ree(z);.      re
62a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
62b0: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
62c0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
62d0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
62e0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    aNew = sqliteR
62f0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c  ealloc( p->aCol,
6300: 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a   (p->nCol+8)*siz
6310: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
6320: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
6330: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
6340: 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a  p->aCol = aNew;.
6350: 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d    }.  pCol = &p-
6360: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a  >aCol[p->nCol];.
6370: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30    memset(pCol, 0
6380: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  , sizeof(p->aCol
6390: 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  [0]));.  pCol->z
63a0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a  Name = z;. .  /*
63b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
63c0: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
63d0: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65  columns have the
63e0: 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74   default affinit
63f0: 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49  y.  ** 'NONE'. I
6400: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70  f there is a typ
6410: 65 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  e specified, the
6420: 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  n sqlite3AddColu
6430: 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20  mnType() will.  
6440: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78  ** be called nex
6450: 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61  t to set pCol->a
6460: 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c  ffinity correctl
6470: 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e  y..  */.  pCol->
6480: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
6490: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43  E_AFF_NONE;.  pC
64a0: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72  ol->pColl = pPar
64b0: 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
64c0: 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  l;.  p->nCol++;.
64d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
64e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
64f0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
6500: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
6510: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
6520: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6530: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
6540: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
6550: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
6560: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
6570: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
6580: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
6590: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
65a0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
65b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
65c0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
65d0: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
65e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
65f0: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
6600: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
6610: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
6620: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
6630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
6640: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66   p->nCol-1;.  if
6650: 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c  ( i>=0 ) p->aCol
6660: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  [i].notNull = on
6670: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
6680: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6690: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
66a0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
66b0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
66c0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
66d0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
66e0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
66f0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
6700: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
6710: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
6720: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
6730: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
6740: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
6750: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
6760: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
6770: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
6780: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
6790: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
67a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
67b0: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
67c0: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
67d0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
67e0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
67f0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
6800: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
6810: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
6820: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
6830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6840: 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f  oken *pFirst, To
6850: 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54  ken *pLast){.  T
6860: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6870: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , j;.  int n;.  
6880: 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20  char *z, **pz;. 
6890: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
68a0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
68b0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
68c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
68d0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
68e0: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
68f0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
6900: 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f  [i];.  pz = &pCo
6910: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20  l->zType;.  n = 
6920: 70 4c 61 73 74 2d 3e 6e 20 2b 20 28 70 4c 61 73  pLast->n + (pLas
6930: 74 2d 3e 7a 20 2d 20 70 46 69 72 73 74 2d 3e 7a  t->z - pFirst->z
6940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
6950: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20  l->zType==0 );. 
6960: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
6970: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
6980: 66 28 22 25 2e 2a 73 22 2c 20 6e 2c 20 70 46 69  f("%.*s", n, pFi
6990: 72 73 74 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 7a  rst->z);.  if( z
69a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
69b0: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b  for(i=j=0; z[i];
69c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63   i++){.    int c
69d0: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28   = z[i];.    if(
69e0: 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f   isspace(c) ) co
69f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b  ntinue;.    z[j+
6a00: 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b  +] = c;.  }.  z[
6a10: 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e  j] = 0;.  pCol->
6a20: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
6a30: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
6a40: 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , n);.}../*.** T
6a50: 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69  he given token i
6a60: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
6a70: 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74  lue for the last
6a80: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
6a90: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75  .** the table cu
6aa0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
6ab0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20  nstruction.  If 
6ac0: 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74  "minusFlag" is t
6ad0: 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  rue, it.** means
6ae0: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e   the value token
6af0: 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79   was preceded by
6b00: 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a   a minus sign..*
6b10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6b20: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
6b30: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
6b40: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
6b50: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
6b60: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6b70: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
6b80: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
6b90: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
6ba0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c  se, Token *pVal,
6bb0: 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b   int minusFlag){
6bc0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
6bd0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
6be0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
6bf0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
6c00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
6c10: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
6c20: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
6c30: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
6c40: 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3d 3d 30 20 29  ol[i].zDflt==0 )
6c50: 3b 0a 20 20 7a 20 3d 20 70 2d 3e 61 43 6f 6c 5b  ;.  z = p->aCol[
6c60: 69 5d 2e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74  i].zDflt = sqlit
6c70: 65 33 4d 50 72 69 6e 74 66 28 22 25 73 25 54 22  e3MPrintf("%s%T"
6c80: 2c 20 6d 69 6e 75 73 46 6c 61 67 20 3f 20 22 2d  , minusFlag ? "-
6c90: 22 20 3a 20 22 22 2c 20 70 56 61 6c 29 3b 0a 20  " : "", pVal);. 
6ca0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
6cb0: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
6cc0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
6cd0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
6ce0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
6cf0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
6d00: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
6d10: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
6d20: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
6d30: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
6d40: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
6d50: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
6d60: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
6d70: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
6d80: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
6d90: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
6da0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
6db0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
6dc0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
6dd0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
6de0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
6df0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
6e00: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
6e10: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
6e20: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
6e30: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
6e40: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
6e50: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
6e60: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
6e70: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
6e80: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
6e90: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
6ea0: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
6eb0: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
6ec0: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
6ed0: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
6ee0: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
6ef0: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
6f00: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
6f10: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
6f20: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
6f30: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
6f40: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
6f50: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6f60: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
6f70: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
6f80: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6f90: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
6fa0: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
6fb0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
6fc0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
6fd0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
6fe0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
6ff0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
7000: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
7010: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
7020: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
7030: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
7040: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
7050: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
7060: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
7070: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
7080: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7090: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
70a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
70b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
70c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
70d0: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
70e0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
70f0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
7100: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
7110: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
7120: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
7130: 74 6f 49 6e 63 20 20 20 20 20 20 20 2f 2a 20 54  toInc       /* T
7140: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
7150: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
7160: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29   is present */.)
7170: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
7180: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
7190: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
71a0: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
71b0: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66  ol = -1, i;.  if
71c0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
71d0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
71e0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 68  t;.  if( pTab->h
71f0: 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20  asPrimKey ){.   
7200: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7210: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
7220: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
7230: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
7240: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
7250: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
7260: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
7270: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
7280: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d 20  b->hasPrimKey = 
7290: 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  1;.  if( pList==
72a0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
72b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
72c0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
72d0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
72e0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
72f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
7300: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
7310: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
7320: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
7330: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
7340: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
7350: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
7360: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
7370: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
7380: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
73a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
73b0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
73c0: 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f  nCol ) pTab->aCo
73d0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
73e0: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
73f0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
7400: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
7410: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
7420: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
7430: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
7440: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7450: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
7460: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
7470: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
7480: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
7490: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ==0 ){.    pTab-
74a0: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
74b0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
74c0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20   = onError;.    
74d0: 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20 3d 20  pTab->autoInc = 
74e0: 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c 73 65  autoInc;.  }else
74f0: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
7500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7510: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
7520: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
7530: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
7540: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
7550: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
7560: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
7570: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
7580: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
7590: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  se{.    sqlite3C
75a0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
75b0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
75c0: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30  t, onError, 0, 0
75d0: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
75e0: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
75f0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
7600: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7610: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
7620: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
7630: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
7640: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
7650: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
7660: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
7670: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
7680: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
7690: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
76a0: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
76b0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
76c0: 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79   *zType, int nTy
76d0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
76e0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
76f0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7700: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
7710: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
7720: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
7730: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
7740: 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c  nCol-1;..  pColl
7750: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
7760: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7770: 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20  zType, nType);. 
7780: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c   p->aCol[i].pCol
7790: 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a  l = pColl;..  /*
77a0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
77b0: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
77c0: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
77d0: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
77e0: 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  ",.  ** then an 
77f0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
7800: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
7810: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
7820: 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61  e the.  ** colla
7830: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
7840: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
7850: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
7860: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ase..  */.  for(
7870: 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78  pIdx = p->pIndex
7880: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
7890: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61  x->pNext){.    a
78a0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
78b0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69  lumn==1 );.    i
78c0: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
78d0: 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e  n[0]==i ) pIdx->
78e0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
78f0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a   = pColl;.  }.}.
7900: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e  ./*.** Locate an
7910: 64 20 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72  d return an entr
7920: 79 20 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43  y from the db.aC
7930: 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c  ollSeq hash tabl
7940: 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a  e. If the entry.
7950: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
7960: 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20  zName and nName 
7970: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64  is not found and
7980: 20 70 61 72 61 6d 65 74 65 72 20 27 63 72 65 61   parameter 'crea
7990: 74 65 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  te' is.** true, 
79a0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
79b0: 77 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  w entry. Otherwi
79c0: 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  se return NULL..
79d0: 2a 2a 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74  **.** Each point
79e0: 65 72 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  er stored in the
79f0: 20 73 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65   sqlite3.aCollSe
7a00: 71 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e  q hash table con
7a10: 74 61 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61  tains an.** arra
7a20: 79 20 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53  y of three CollS
7a30: 65 71 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  eq structures. T
7a40: 68 65 20 66 69 72 73 74 20 69 73 20 74 68 65 20  he first is the 
7a50: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7a60: 63 65 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64  ce.** prefferred
7a70: 20 66 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20   for UTF-8, the 
7a80: 73 65 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c  second UTF-16le,
7a90: 20 61 6e 64 20 74 68 65 20 74 68 69 72 64 20 55   and the third U
7aa0: 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53  TF-16be..**.** S
7ab0: 74 6f 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  tored immediatel
7ac0: 79 20 61 66 74 65 72 20 74 68 65 20 74 68 72 65  y after the thre
7ad0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
7ae0: 65 6e 63 65 73 20 69 73 20 61 20 63 6f 70 79 20  ences is a copy 
7af0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  of.** the collat
7b00: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
7b10: 65 2e 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  e. A pointer to 
7b20: 74 68 69 73 20 73 74 72 69 6e 67 20 69 73 20 73  this string is s
7b30: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68  tored in.** each
7b40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7b50: 6e 63 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nce structure..*
7b60: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
7b70: 20 2a 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e   * findCollSeqEn
7b80: 74 72 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  try(.  sqlite3 *
7b90: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
7ba0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
7bb0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61  Name,.  int crea
7bc0: 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  te.){.  CollSeq 
7bd0: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e  *pColl;.  if( nN
7be0: 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20  ame<0 ) nName = 
7bf0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
7c00: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
7c10: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
7c20: 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e  ollSeq, zName, n
7c30: 4e 61 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d  Name);..  if( 0=
7c40: 3d 70 43 6f 6c 6c 20 26 26 20 63 72 65 61 74 65  =pColl && create
7c50: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
7c60: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a  sqliteMalloc( 3*
7c70: 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b  sizeof(*pColl) +
7c80: 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20   nName + 1 );.  
7c90: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
7ca0: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e       pColl[0].zN
7cb0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43  ame = (char*)&pC
7cc0: 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43  oll[3];.      pC
7cd0: 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c  oll[0].enc = SQL
7ce0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
7cf0: 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  pColl[1].zName =
7d00: 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33   (char*)&pColl[3
7d10: 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31  ];.      pColl[1
7d20: 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ].enc = SQLITE_U
7d30: 54 46 31 36 4c 45 3b 0a 20 20 20 20 20 20 70 43  TF16LE;.      pC
7d40: 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[2].zName = (
7d50: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
7d60: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e  .      pColl[2].
7d70: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7d80: 31 36 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63  16BE;.      memc
7d90: 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d  py(pColl[0].zNam
7da0: 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  e, zName, nName)
7db0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d  ;.      pColl[0]
7dc0: 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20  .zName[nName] = 
7dd0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
7de0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
7df0: 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b  aCollSeq, pColl[
7e00: 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  0].zName, nName,
7e10: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   pColl);.    }. 
7e20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
7e30: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  l;.}../*.** Para
7e40: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
7e50: 74 73 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e  ts to a UTF-8 en
7e60: 63 6f 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61  coded string nNa
7e70: 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a  me bytes long..*
7e80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c  * Return the Col
7e90: 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f  lSeq* pointer fo
7ea0: 72 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  r the collation 
7eb0: 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a  sequence named z
7ec0: 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20  Name.** for the 
7ed0: 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66  encoding 'enc' f
7ee0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
7ef0: 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   'db'..**.** If 
7f00: 74 68 65 20 65 6e 74 72 79 20 73 70 65 63 69 66  the entry specif
7f10: 69 65 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ied is not found
7f20: 20 61 6e 64 20 27 63 72 65 61 74 65 27 20 69 73   and 'create' is
7f30: 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61   true, then crea
7f40: 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72  te a.** new entr
7f50: 79 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72 65  y.  Otherwise re
7f60: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f  turn NULL..*/.Co
7f70: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 46 69  llSeq *sqlite3Fi
7f80: 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c  ndCollSeq(.  sql
7f90: 69 74 65 33 20 2a 64 62 2c 0a 20 20 75 38 20 65  ite3 *db,.  u8 e
7fa0: 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nc,.  const char
7fb0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
7fc0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61  Name,.  int crea
7fd0: 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  te.){.  CollSeq 
7fe0: 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c  *pColl = findCol
7ff0: 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e  lSeqEntry(db, zN
8000: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61  ame, nName, crea
8010: 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  te);.  assert( S
8020: 51 4c 49 54 45 5f 55 54 46 38 3d 3d 31 20 26 26  QLITE_UTF8==1 &&
8030: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3d   SQLITE_UTF16LE=
8040: 3d 32 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46  =2 && SQLITE_UTF
8050: 31 36 42 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73  16BE==3 );.  ass
8060: 65 72 74 28 20 65 6e 63 3e 3d 53 51 4c 49 54 45  ert( enc>=SQLITE
8070: 5f 55 54 46 38 20 26 26 20 65 6e 63 3c 3d 53 51  _UTF8 && enc<=SQ
8080: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
8090: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 70 43    if( pColl ) pC
80a0: 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20 20  oll += enc-1;.  
80b0: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
80c0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
80d0: 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  e 'collation nee
80e0: 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ded' callback to
80f0: 20 72 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61   request a colla
8100: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a  tion sequence.**
8110: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
8120: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f   text encoding o
8130: 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65  f name zName, le
8140: 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49  ngth nName..** I
8150: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
8160: 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74  sequence.*/.stat
8170: 69 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c  ic void callColl
8180: 4e 65 65 64 65 64 28 73 71 6c 69 74 65 33 20 2a  Needed(sqlite3 *
8190: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
81a0: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
81b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  ){.  assert( !db
81c0: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c  ->xCollNeeded ||
81d0: 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65   !db->xCollNeede
81e0: 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61  d16 );.  if( nNa
81f0: 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73  me<0 ) nName = s
8200: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
8210: 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  if( db->xCollNee
8220: 64 65 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ded ){.    char 
8230: 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c  *zExternal = sql
8240: 69 74 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65  iteStrNDup(zName
8250: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
8260: 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72  ( !zExternal ) r
8270: 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78  eturn;.    db->x
8280: 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70  CollNeeded(db->p
8290: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64  CollNeededArg, d
82a0: 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c  b, (int)db->enc,
82b0: 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20   zExternal);.   
82c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74   sqliteFree(zExt
82d0: 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  ernal);.  }.  if
82e0: 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65  ( db->xCollNeede
82f0: 64 31 36 20 29 7b 0a 20 20 20 20 63 68 61 72 20  d16 ){.    char 
8300: 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c  const *zExternal
8310: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
8320: 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69  lue *pTmp = sqli
8330: 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56  te3GetTransientV
8340: 61 6c 75 65 28 64 62 29 3b 0a 20 20 20 20 73 71  alue(db);.    sq
8350: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
8360: 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65  (pTmp, -1, zName
8370: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
8380: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
8390: 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73     zExternal = s
83a0: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
83b0: 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46  pTmp, SQLITE_UTF
83c0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69  16NATIVE);.    i
83d0: 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20  f( !zExternal ) 
83e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e  return;.    db->
83f0: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62  xCollNeeded16(db
8400: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
8410: 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65  , db, (int)db->e
8420: 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a  nc, zExternal);.
8430: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
8440: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8450: 6c 65 64 20 69 66 20 74 68 65 20 63 6f 6c 6c 61  led if the colla
8460: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69  tion factory fai
8470: 6c 73 20 74 6f 20 64 65 6c 69 76 65 72 20 61 0a  ls to deliver a.
8480: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  ** collation fun
8490: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 65 73  ction in the bes
84a0: 74 20 65 6e 63 6f 64 69 6e 67 20 62 75 74 20 74  t encoding but t
84b0: 68 65 72 65 20 6d 61 79 20 62 65 20 6f 74 68 65  here may be othe
84c0: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
84d0: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
84e0: 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74  function (for ot
84f0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
8500: 67 73 29 20 61 76 61 69 6c 61 62 6c 65 2e 20 55  gs) available. U
8510: 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65  se one.** of the
8520: 73 65 20 69 6e 73 74 65 61 64 20 69 66 20 74 68  se instead if th
8530: 65 79 20 65 78 69 73 74 2e 20 41 76 6f 69 64 20  ey exist. Avoid 
8540: 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d  a UTF-8 <-> UTF-
8550: 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66  16 conversion if
8560: 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f  .** possible..*/
8570: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 74  .static int synt
8580: 68 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  hCollSeq(Parse *
8590: 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20  pParse, CollSeq 
85a0: 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53  *pColl){.  CollS
85b0: 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63 68  eq *pColl2;.  ch
85c0: 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a  ar *z = pColl->z
85d0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Name;.  int n = 
85e0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 71 6c  strlen(z);.  sql
85f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8600: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
8610: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
8620: 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c  8 aEnc[] = { SQL
8630: 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c  ITE_UTF16BE, SQL
8640: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c  ITE_UTF16LE, SQL
8650: 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f  ITE_UTF8 };.  fo
8660: 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29  r(i=0; i<3; i++)
8670: 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73  {.    pColl2 = s
8680: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
8690: 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a  q(db, aEnc[i], z
86a0: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , n, 0);.    if(
86b0: 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30   pColl2->xCmp!=0
86c0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
86d0: 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20  (pColl, pColl2, 
86e0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29  sizeof(CollSeq))
86f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8700: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
8710: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
8720: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
8730: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8740: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
8750: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
8760: 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20  ence: %.*s", n, 
8770: 7a 29 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  z);.  }.  pParse
8780: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75  ->nErr++;.  retu
8790: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
87a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
87b0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
87c0: 20 6f 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20   on a collation 
87d0: 73 65 71 75 65 6e 63 65 20 62 65 66 6f 72 65 20  sequence before 
87e0: 69 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  it is used to.**
87f0: 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
8800: 73 20 64 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e  s defined. An un
8810: 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f  defined collatio
8820: 6e 20 73 65 71 75 65 6e 63 65 20 65 78 69 73 74  n sequence exist
8830: 73 20 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61  s when.** a data
8840: 62 61 73 65 20 69 73 20 6c 6f 61 64 65 64 20 74  base is loaded t
8850: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 72 65 66  hat contains ref
8860: 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61  erences to colla
8870: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a  tion sequences.*
8880: 2a 20 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20  * that have not 
8890: 62 65 65 6e 20 64 65 66 69 6e 65 64 20 62 79 20  been defined by 
88a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
88b0: 6f 6c 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a  ollation() etc..
88c0: 2a 2a 0a 2a 2a 20 49 66 20 72 65 71 75 69 72 65  **.** If require
88d0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
88e0: 63 61 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61  calls the 'colla
88f0: 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c  tion needed' cal
8900: 6c 62 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75  lback to.** requ
8910: 65 73 74 20 61 20 64 65 66 69 6e 69 74 69 6f 6e  est a definition
8920: 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   of the collatin
8930: 67 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 74  g sequence. If t
8940: 68 69 73 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b  his doesn't work
8950: 2c 20 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c  , .** an equival
8960: 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ent collating se
8970: 71 75 65 6e 63 65 20 74 68 61 74 20 75 73 65 73  quence that uses
8980: 20 61 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67   a text encoding
8990: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
89a0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  om the main data
89b0: 62 61 73 65 20 69 73 20 73 75 62 73 74 69 74 75  base is substitu
89c0: 74 65 64 2c 20 69 66 20 6f 6e 65 20 69 73 20 61  ted, if one is a
89d0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  vailable..*/.int
89e0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
89f0: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
8a00: 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  se, CollSeq *pCo
8a10: 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  ll){.  if( pColl
8a20: 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   && !pColl->xCmp
8a30: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f   ){.    /* No co
8a40: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
8a50: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f   of this type fo
8a60: 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20  r this encoding 
8a70: 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20  is registered.. 
8a80: 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63     ** Call the c
8a90: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8aa0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
8ab0: 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68  n supply us with
8ac0: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
8ad0: 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28   callCollNeeded(
8ae0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c  pParse->db, pCol
8af0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  l->zName, strlen
8b00: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b  (pColl->zName));
8b10: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 2d  .    if( !pColl-
8b20: 3e 78 43 6d 70 20 26 26 20 73 79 6e 74 68 43 6f  >xCmp && synthCo
8b30: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
8b40: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
8b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8b60: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  R;.    }.  }.  r
8b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
8b90: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8ba0: 65 71 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c  eq() for all col
8bb0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
8bc0: 20 69 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a   in an index,.**
8bd0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72   in order to ver
8be0: 69 66 79 20 74 68 61 74 20 61 6c 6c 20 74 68 65  ify that all the
8bf0: 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6c 6c 61   necessary colla
8c00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61  ting sequences a
8c10: 72 65 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f  re.** loaded..*/
8c20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
8c30: 6b 49 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61  kIndexCollSeq(Pa
8c40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
8c50: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
8c60: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
8c70: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
8c80: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
8c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8ca0: 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f  ( sqlite3CheckCo
8cb0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
8cc0: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
8cd0: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
8ce0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
8cf0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
8d00: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8d10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8d20: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
8d30: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
8d40: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
8d50: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
8d60: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
8d70: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
8d80: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
8d90: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
8da0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
8db0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
8dc0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
8dd0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
8de0: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
8df0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
8e00: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
8e10: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
8e20: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
8e30: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
8e40: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
8e50: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
8e60: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
8e70: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
8e80: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
8e90: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
8ea0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
8eb0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
8ec0: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
8ed0: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
8ee0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
8ef0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
8f00: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
8f10: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
8f20: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
8f30: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
8f40: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
8f50: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
8f60: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
8f70: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
8f80: 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  e..*/.CollSeq *s
8f90: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
8fa0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
8fb0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
8fc0: 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29  Name, int nName)
8fd0: 7b 0a 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61  {.  u8 enc = pPa
8fe0: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20  rse->db->enc;.  
8ff0: 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 70 50  u8 initbusy = pP
9000: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
9010: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
9020: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
9030: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
9040: 65 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  e->db, enc, zNam
9050: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
9060: 73 79 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  sy);.  if( nName
9070: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
9080: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
9090: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
90a0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
90b0: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f  ->xCmp) ){.    /
90c0: 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * No collation s
90d0: 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20  equence of this 
90e0: 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e  type for this en
90f0: 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73 74  coding is regist
9100: 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c  ered..    ** Cal
9110: 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  l the collation 
9120: 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69  factory to see i
9130: 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20  f it can supply 
9140: 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20  us with one..   
9150: 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c   */.    callColl
9160: 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64  Needed(pParse->d
9170: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  b, zName, nName)
9180: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
9190: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
91a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63  (pParse->db, enc
91b0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
91c0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
91d0: 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l && !pColl->xCm
91e0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
91f0: 65 72 65 20 6d 61 79 20 62 65 20 61 20 76 65 72  ere may be a ver
9200: 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c  sion of the coll
9210: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
9220: 68 61 74 20 72 65 71 75 69 72 65 73 0a 20 20 20  hat requires.   
9230: 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f     ** translatio
9240: 6e 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69  n between encodi
9250: 6e 67 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20  ngs. Search for 
9260: 69 74 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c  it with synthCol
9270: 6c 53 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f  lSeq()..      */
9280: 0a 20 20 20 20 20 20 69 66 28 20 73 79 6e 74 68  .      if( synth
9290: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
92a0: 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
92b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
92c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
92d0: 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68   /* If nothing h
92e0: 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77  as been found, w
92f0: 72 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d  rite the error m
9300: 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72  essage into pPar
9310: 73 65 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69  se */.  if( !ini
9320: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
9330: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
9340: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
9350: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
9360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9370: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
9380: 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e  o such collation
9390: 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22   sequence: %.*s"
93a0: 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  , nName, zName);
93b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c  .    }.    pColl
93c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
93d0: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f  rn pColl;.}..../
93e0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
93f0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
9400: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
9410: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
9420: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
9430: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
9440: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
9450: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
9460: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69  t char *zType, i
9470: 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74  nt nType){.  int
9480: 20 6e 2c 20 69 3b 0a 20 20 73 74 61 74 69 63 20   n, i;.  static 
9490: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
94a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
94b0: 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64  Sub;  /* Keyword
94c0: 73 20 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73  s substring to s
94d0: 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20  earch for */.   
94e0: 20 63 68 61 72 20 6e 53 75 62 3b 20 20 20 20 20   char nSub;     
94f0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
9500: 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61   zSub */.    cha
9510: 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20  r affinity;     
9520: 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72  /* Affinity to r
9530: 65 74 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63  eturn if it matc
9540: 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74  hes */.  } subst
9550: 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  rings[] = {.    
9560: 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49  {"INT",  3, SQLI
9570: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c  TE_AFF_INTEGER},
9580: 0a 20 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c  .    {"CHAR", 4,
9590: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
95a0: 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20  },.    {"CLOB", 
95b0: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
95c0: 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22  XT},.    {"TEXT"
95d0: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
95e0: 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f  TEXT},.    {"BLO
95f0: 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46  B", 4, SQLITE_AF
9600: 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20  F_NONE},.  };.. 
9610: 20 69 66 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b   if( nType==0 ){
9620: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9630: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d  TE_AFF_NONE;.  }
9640: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
9650: 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29  zeof(substrings)
9660: 2f 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e  /sizeof(substrin
9670: 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  gs[0]); i++){.  
9680: 20 20 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74    int c1 = subst
9690: 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d  rings[i].zSub[0]
96a0: 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74  ;.    int c2 = t
96b0: 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20  olower(c1);.    
96c0: 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70  int limit = nTyp
96d0: 65 20 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69  e - substrings[i
96e0: 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73  ].nSub;.    cons
96f0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73  t char *z = subs
9700: 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a  trings[i].zSub;.
9710: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d      for(n=0; n<=
9720: 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20  limit; n++){.   
9730: 20 20 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65     int c = zType
9740: 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  [n];.      if( (
9750: 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a  c==c1 || c==c2).
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
9770: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
9780: 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c  mp(&zType[n], z,
9790: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e   substrings[i].n
97a0: 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sub) ){.        
97b0: 72 65 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67  return substring
97c0: 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20  s[i].affinity;. 
97d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
97e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
97f0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a  _AFF_NUMERIC;.}.
9800: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9810: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
9820: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
9830: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
9840: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
9850: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
9860: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
9870: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
9880: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9890: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
98a0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
98b0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
98c0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
98d0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
98e0: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
98f0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
9900: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
9910: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
9920: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
9930: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
9940: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
9950: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
9960: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
9970: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
9980: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
9990: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
99a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
99b0: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
99c0: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
99d0: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
99e0: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
99f0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
9a00: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
9a10: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
9a20: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
9a30: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
9a40: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
9a50: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
9a60: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
9a70: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
9a80: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
9a90: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
9aa0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
9ab0: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
9ac0: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
9ad0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
9ae0: 61 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74  angeCookie(sqlit
9af0: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c  e3 *db, Vdbe *v,
9b00: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c   int iDb){.  sql
9b10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9b20: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d   OP_Integer, db-
9b30: 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
9b40: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20  _cookie+1, 0);. 
9b50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9b60: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
9b70: 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f  e, iDb, 0);.}../
9b80: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
9b90: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
9ba0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
9bb0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
9bc0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
9bd0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
9be0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
9bf0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
9c00: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
9c10: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
9c20: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
9c30: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
9c40: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
9c50: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
9c60: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
9c70: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
9c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9c90: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
9ca0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
9cb0: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
9cc0: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
9cd0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
9ce0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
9cf0: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
9d00: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69  /*.** Write an i
9d10: 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74  dentifier onto t
9d20: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
9d30: 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64  ven string.  Add
9d40: 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63  .** quote charac
9d50: 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a  ters as needed..
9d60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
9d70: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
9d80: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
9d90: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
9da0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9db0: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
9dc0: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
9dd0: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
9de0: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
9df0: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
9e00: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
9e10: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
9e20: 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74   !isalnum(zIdent
9e30: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
9e40: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
9e50: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
9e60: 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20  =  zIdent[j]!=0 
9e70: 7c 7c 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e  || isdigit(zIden
9e80: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
9e90: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
9ea0: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
9eb0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b  dent, j)!=TK_ID;
9ec0: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9ed0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
9ee0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
9ef0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
9f00: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
9f10: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
9f20: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
9f30: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
9f40: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
9f50: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
9f60: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
9f70: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
9f80: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
9f90: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9fa0: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
9fb0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
9fc0: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
9fd0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
9fe0: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
9ff0: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
a000: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
a010: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
a020: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
a030: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
a040: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
a050: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
a060: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
a070: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
a080: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
a090: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
a0a0: 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75  zEnd, *z;.  Colu
a0b0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
a0c0: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
a0d0: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
a0e0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
a0f0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
a100: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
a110: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  ->zName);.    z 
a120: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
a130: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
a140: 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a    n += (strlen(z
a150: 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ) + 1);.    }.  
a160: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
a170: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
a180: 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20    if( n<50 ){.  
a190: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
a1a0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
a1b0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
a1c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
a1d0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
a1e0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
a1f0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
a200: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
a210: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
a220: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
a230: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
a240: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
a250: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
a260: 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31  zStmt, p->iDb==1
a270: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
a280: 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54  TABLE " : "CREAT
a290: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
a2a0: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
a2b0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
a2c0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
a2d0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
a2e0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
a2f0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
a300: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
a310: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63  Col++){.    strc
a320: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  py(&zStmt[k], zS
a330: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74  ep);.    k += st
a340: 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  rlen(&zStmt[k]);
a350: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
a360: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
a370: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
a380: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
a390: 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70   (z = pCol->zTyp
a3a0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  e)!=0 ){.      z
a3b0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
a3c0: 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a  .      strcpy(&z
a3d0: 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20  Stmt[k], z);.   
a3e0: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a     k += strlen(z
a3f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a400: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
a410: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
a420: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
a430: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a440: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
a450: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
a460: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
a470: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
a480: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
a490: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
a4a0: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
a4b0: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
a4c0: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
a4d0: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
a4e0: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
a4f0: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
a500: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
a510: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
a520: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
a530: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
a540: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
a550: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
a560: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
a570: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
a580: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
a590: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
a5a0: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
a5b0: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
a5c0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
a5d0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a5e0: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
a5f0: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
a600: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
a610: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
a620: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a630: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
a640: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c  ecently changes,
a650: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
a660: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
a670: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
a680: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
a690: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
a6a0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
a6b0: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
a6c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
a6d0: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
a6e0: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
a6f0: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
a700: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
a710: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
a720: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
a730: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
a740: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
a750: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
a760: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
a770: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
a780: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
a790: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
a7a0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
a7b0: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
a7c0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72  ite3EndTable(Par
a7d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
a7e0: 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20  n *pEnd, Select 
a7f0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
a800: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
a810: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
a820: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
a830: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
a840: 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  ) || pParse->nEr
a850: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
a860: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
a870: 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  urn;.  p = pPars
a880: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a890: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
a8a0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
a8b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
a8c0: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f  !pSelect );..  /
a8d0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
a8e0: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
a8f0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
a900: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
a910: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
a920: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
a930: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
a940: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
a950: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
a960: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
a970: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
a980: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
a990: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
a9a0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
a9b0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
a9c0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
a9d0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
a9e0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
a9f0: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
aa00: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
aa10: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
aa20: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
aa30: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
aa40: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
aa50: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
aa60: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
aa70: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
aa80: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
aa90: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
aaa0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
aab0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
aac0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
aad0: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
aae0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
aaf0: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
ab00: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
ab10: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
ab20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
ab30: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
ab40: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
ab50: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
ab60: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
ab70: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
ab80: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
ab90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
aba0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
abb0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
abc0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
abd0: 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  v;.    char *zTy
abe0: 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22  pe;    /* "view"
abf0: 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20   or "table" */. 
ac00: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b     char *zType2;
ac10: 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20     /* "VIEW" or 
ac20: 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63  "TABLE" */.    c
ac30: 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f  har *zStmt;    /
ac40: 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52  * Text of the CR
ac50: 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52  EATE TABLE or CR
ac60: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
ac70: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20  ent */..    v = 
ac80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ac90: 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
aca0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  v==0 ) return;..
acb0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
acc0: 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
acd0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61 6e 64  he new table and
ace0: 20 70 75 73 68 20 69 74 20 6f 6e 74 6f 20 74 68   push it onto th
acf0: 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  e stack..    ** 
ad00: 41 20 76 69 65 77 20 68 61 73 20 6e 6f 20 72 6f  A view has no ro
ad10: 6f 74 70 61 67 65 2c 20 73 6f 20 6a 75 73 74 20  otpage, so just 
ad20: 70 75 73 68 20 61 20 7a 65 72 6f 20 6f 6e 74 6f  push a zero onto
ad30: 20 74 68 65 20 73 74 61 63 6b 20 66 6f 72 0a 20   the stack for. 
ad40: 20 20 20 2a 2a 20 76 69 65 77 73 2e 20 20 49 6e     ** views.  In
ad50: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 61  itialize zType a
ad60: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
ad70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ad80: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
ad90: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
ada0: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
adb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
adc0: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
add0: 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30  Table, p->iDb, 0
ade0: 29 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  );.      zType =
adf0: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
ae00: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
ae10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ae20: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
ae30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ae40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ae50: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
ae60: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
ae70: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
ae80: 3d 20 22 56 49 45 57 22 3b 0a 20 20 20 20 7d 0a  = "VIEW";.    }.
ae90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
aea0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
aeb0: 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  e, 0, 0);..    /
aec0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
aed0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
aee0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
aef0: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
af00: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
af10: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
af20: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
af30: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
af40: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
af50: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e   new table is on
af60: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
af70: 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20  vdbe stack..    
af80: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
af90: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
afa0: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
afb0: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
afc0: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
afd0: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
afe0: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
aff0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
b000: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
b010: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
b020: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  ew table..    */
b030: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
b040: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
b050: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20  *pSelTab;.      
b060: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b070: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
b080: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b090: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b0a0: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
b0b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b0c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b0d0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
b0e0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
b0f0: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
b100: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
b110: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
b120: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
b130: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
b140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b150: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
b160: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
b170: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
b180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
b190: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
b1a0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
b1b0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
b1c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
b1d0: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
b1e0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
b1f0: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
b200: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
b210: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
b220: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
b230: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
b240: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
b250: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
b260: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
b270: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
b280: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
b290: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
b2a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b2b0: 0a 0a 23 69 66 20 30 20 20 0a 20 20 20 20 73 71  ..#if 0  .    sq
b2c0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
b2d0: 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29 3b  able(v, p->iDb);
b2e0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
b2f0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
b300: 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65  g8, 0, 0, p->pSe
b310: 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a  lect==0?"table":
b320: 22 76 69 65 77 22 2c 50 33 5f 53 54 41 54 49 43  "view",P3_STATIC
b330: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b340: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
b350: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e  ng8, 0, 0, p->zN
b360: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
b370: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
b380: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
b390: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   p->zName, 0);. 
b3a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b3b0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
b3c0: 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  3, 0);..    if( 
b3d0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
b3e0: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
b3f0: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
b400: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
b410: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
b420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b430: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
b440: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b450: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b460: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
b470: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
b480: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
b490: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
b4a0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
b4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
b4c0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
b4d0: 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56 49 45  , 0, "CREATE VIE
b4e0: 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  W ", P3_STATIC);
b4f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b510: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
b520: 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54  g8, 0, 0, "CREAT
b530: 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54  E TABLE ", P3_ST
b540: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
b550: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
b560: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20  d!=0 );.      n 
b570: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
b580: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
b590: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
b5a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b5b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
b5c0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
b5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5e0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b5f0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b600: 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  en.z, n);.      
b610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b620: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 30  (v, OP_Concat, 0
b630: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
b640: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b650: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b660: 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20   5, 0, "tttit", 
b670: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
b680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b690: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
b6a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b6b0: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
b6c0: 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b  (db, v, p->iDb);
b6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b6e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b6f0: 65 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  e, 0, 0);.#endif
b700: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
b710: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
b720: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
b730: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b740: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
b750: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
b760: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
b770: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b780: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
b790: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
b7a0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
b7b0: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53  z) + 1;.      zS
b7c0: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
b7d0: 69 6e 74 66 28 22 43 52 45 41 54 45 20 25 73 20  intf("CREATE %s 
b7e0: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
b7f0: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
b800: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 7d 0a 0a  oken.z);.    }..
b810: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
b820: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
b830: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b840: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
b850: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
b860: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
b870: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
b880: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
b890: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
b8a0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
b8b0: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20  've collected.  
b8c0: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
b8d0: 65 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20  e preallocated. 
b8e0: 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68     ** slot is th
b8f0: 65 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68  e 2nd item on th
b900: 65 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f  e stack.  The to
b910: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69  p of the stack i
b920: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  s the.    ** roo
b930: 74 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e  t page for the n
b940: 65 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30  ew table (or a 0
b950: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69   if this is a vi
b960: 65 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ew)..    */.    
b970: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
b980: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
b990: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
b9a0: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
b9b0: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
b9c0: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
b9d0: 72 6f 6f 74 70 61 67 65 3d 23 30 2c 20 73 71 6c  rootpage=#0, sql
b9e0: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
b9f0: 45 52 45 20 72 6f 77 69 64 3d 23 31 22 2c 0a 20  ERE rowid=#1",. 
ba00: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 2d 3e       db->aDb[p->
ba10: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
ba20: 4d 41 5f 54 41 42 4c 45 28 70 2d 3e 69 44 62 29  MA_TABLE(p->iDb)
ba30: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
ba40: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
ba50: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
ba60: 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
ba70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ba80: 28 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a  (zStmt);..    /*
ba90: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
baa0: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
bab0: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
bac0: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
bad0: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
bae0: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e  ookie(db, v, p->
baf0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
bb00: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50  3VdbeOp3(v, OP_P
bb10: 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69  arseSchema, p->i
bb20: 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73  Db, 0,.        s
bb30: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74  qlite3MPrintf("t
bb40: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
bb50: 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41  >zName), P3_DYNA
bb60: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  MIC);.  }..  /* 
bb70: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
bb80: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
bb90: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
bba0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
bbb0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
bbc0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
bbd0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
bbe0: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
bbf0: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20     FKey *pFKey; 
bc00: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
bc10: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b  db->aDb[p->iDb];
bc20: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
bc30: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
bc40: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  Db->tblHash, p->
bc50: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
bc60: 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20  >zName)+1, p);. 
bc70: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
bc80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
bc90: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
bca0: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
bcb0: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
bcc0: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
bcd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
bce0: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e     for(pFKey=p->
bcf0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
bd00: 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74  Key=pFKey->pNext
bd10: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
bd20: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
bd30: 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  Key->zTo) + 1;. 
bd40: 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78       pFKey->pNex
bd50: 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73  tTo = sqlite3Has
bd60: 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65  hFind(&pDb->aFKe
bd70: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
bd80: 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  To);.      sqlit
bd90: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
bda0: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d  b->aFKey, pFKey-
bdb0: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79  >zTo, nTo, pFKey
bdc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
bdd0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
bde0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62   0;.    db->nTab
bdf0: 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  le++;.    db->fl
be00: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
be10: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
be20: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
be30: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
be40: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
be50: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
be60: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
be70: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
be80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
be90: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
bea0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
beb0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
bec0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
bed0: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
bee0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
bef0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
bf00: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
bf10: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
bf20: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
bf30: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
bf40: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
bf50: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
bf60: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
bf70: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
bf80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
bf90: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
bfa0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
bfb0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
bfc0: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
bfd0: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
bfe0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
bff0: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
c000: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
c010: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
c020: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
c030: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
c040: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f  ed char *z;.  To
c050: 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69  ken sEnd;.  DbFi
c060: 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65  xer sFix;.  Toke
c070: 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c  n *pName;..  sql
c080: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
c090: 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70  Parse, pBegin, p
c0a0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
c0b0: 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d  sTemp, 1);.  p =
c0c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
c0d0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
c0e0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
c0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
c100: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c110: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c120: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f    }.  sqlite3Two
c130: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
c140: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
c150: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
c160: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
c170: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d  sFix, pParse, p-
c180: 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e  >iDb, "view", pN
c190: 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69  ame).    && sqli
c1a0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
c1b0: 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29  ix, pSelect).  )
c1c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
c1d0: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
c1e0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
c1f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
c200: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
c210: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
c220: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
c230: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
c240: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
c250: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
c260: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
c270: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
c280: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
c290: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
c2a0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
c2b0: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
c2c0: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
c2d0: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
c2e0: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
c2f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
c300: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
c310: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
c320: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
c330: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  p(pSelect);.  sq
c340: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
c350: 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66  e(pSelect);.  if
c360: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
c370: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
c380: 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
c390: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
c3a0: 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , p);.  }..  /* 
c3b0: 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f  Locate the end o
c3c0: 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45  f the CREATE VIE
c3d0: 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61  W statement.  Ma
c3e0: 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f  ke sEnd point to
c3f0: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20  .  ** the end.. 
c400: 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61   */.  sEnd = pPa
c410: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b  rse->sLastToken;
c420: 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
c430: 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  !=0 && sEnd.z[0]
c440: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
c450: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
c460: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
c470: 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20  .  n = sEnd.z - 
c480: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d  pBegin->z;.  z =
c490: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
c4a0: 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a   char*)pBegin->z
c4b0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
c4c0: 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c  & (z[n-1]==';' |
c4d0: 7c 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  | isspace(z[n-1]
c4e0: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  )) ){ n--; }.  s
c4f0: 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
c500: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
c510: 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
c520: 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
c530: 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
c540: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
c550: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
c560: 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
c570: 65 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20  e, &sEnd, 0);.  
c580: 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66  return;.}.#endif
c590: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c5a0: 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  VIEW */..#ifndef
c5b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
c5c0: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  W./*.** The Tabl
c5d0: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
c5e0: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
c5f0: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
c600: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
c610: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
c620: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
c630: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
c640: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
c650: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
c660: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
c670: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
c680: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
c690: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
c6a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
c6b0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
c6c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c6d0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
c6e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c6f0: 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  st;.  Select *pS
c700: 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65  el;.  Table *pSe
c710: 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72  lTab;.  int nErr
c720: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
c730: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a   pTable );..  /*
c740: 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
c750: 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
c760: 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
c770: 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
c780: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
c790: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
c7a0: 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
c7b0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
c7c0: 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
c7d0: 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
c7e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
c7f0: 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
c800: 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
c810: 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
c820: 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
c830: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
c840: 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
c850: 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
c860: 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
c870: 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
c880: 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
c890: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
c8a0: 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
c8b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
c8c0: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
c8d0: 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
c8e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
c8f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
c900: 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20  lly, this error 
c910: 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f  is caught previo
c920: 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20  usly and so the 
c930: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20  following test. 
c940: 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   ** should alway
c950: 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  s fail.  But we 
c960: 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e  will leave it in
c970: 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62   place just to b
c980: 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69  e safe..  */.  i
c990: 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
c9a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c9b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c9c0: 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
c9d0: 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
c9e0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
c9f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
ca00: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
ca10: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
ca20: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
ca30: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
ca40: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a  ble names..  */.
ca50: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
ca60: 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20  ->pSelect ); /* 
ca70: 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  If nCol==0, then
ca80: 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20   pTable must be 
ca90: 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c  a VIEW */.  pSel
caa0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65   = pTable->pSele
cab0: 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  ct;..  /* Note t
cac0: 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
cad0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
cae0: 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
caf0: 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
cb00: 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
cb10: 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20  this list.  But 
cb20: 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  we will need to 
cb30: 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74  restore the list
cb40: 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74  .  ** back to it
cb50: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
cb60: 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61  guration afterwa
cb70: 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20  rds, so we save 
cb80: 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74  a copy of.  ** t
cb90: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70  he original in p
cba0: 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45  EList..  */.  pE
cbb0: 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c  List = pSel->pEL
cbc0: 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  ist;.  pSel->pEL
cbd0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
cbe0: 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29  rListDup(pEList)
cbf0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45  ;.  if( pSel->pE
cc00: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
cc10: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
cc20: 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e  List;.    return
cc30: 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   1;  /* Malloc f
cc40: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
cc50: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
cc60: 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71  ;.  pSelTab = sq
cc70: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
cc80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30  Select(pParse, 0
cc90: 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70  , pSel);.  if( p
cca0: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73  SelTab ){.    as
ccb0: 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
ccc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ol==0 );.    pTa
ccd0: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
cce0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70  Tab->nCol;.    p
ccf0: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
cd00: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
cd10: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
cd20: 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d   0;.    pSelTab-
cd30: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73  >aCol = 0;.    s
cd40: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
cd50: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
cd60: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
cd70: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
cd80: 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72  ble->iDb, DB_Unr
cd90: 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65  esetViews);.  }e
cda0: 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d  lse{.    pTable-
cdb0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e  >nCol = 0;.    n
cdc0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  Err++;.  }.  sql
cdd0: 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64  ite3SelectUnbind
cde0: 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (pSel);.  sqlite
cdf0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
ce00: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSel->pEList);. 
ce10: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
ce20: 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  pEList;.  return
ce30: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
ce40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ce50: 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65  _VIEW */..#ifnde
ce60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ce70: 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
ce80: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ce90: 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
cea0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
ceb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cec0: 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
ced0: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
cee0: 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
cef0: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21  Elem *i;.  if( !
cf00: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
cf10: 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
cf20: 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
cf30: 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
cf40: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
cf50: 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29  Db[idx].tblHash)
cf60: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
cf70: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
cf80: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
cf90: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
cfa0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
cfb0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
cfc0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
cfd0: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
cfe0: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
cff0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
d000: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
d010: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
d020: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
d030: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
d040: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
d050: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
d060: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d070: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
d080: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
d090: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
d0a0: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
d0b0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
d0c0: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
d0d0: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
d0e0: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
d0f0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d100: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
d110: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
d120: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
d130: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2f 0a 23 69  ** to iTo..*/.#i
d140: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d150: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
d160: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
d170: 65 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20  eMoved(Db *pDb, 
d180: 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
d190: 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  To){.  HashElem 
d1a0: 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20 20 66 6f 72  *pElem;.  .  for
d1b0: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
d1c0: 68 46 69 72 73 74 28 26 70 44 62 2d 3e 74 62 6c  hFirst(&pDb->tbl
d1d0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
d1e0: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
d1f0: 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
d200: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
d210: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
d220: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
d230: 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
d240: 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
d250: 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  um = iTo;.      
d260: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
d270: 7d 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  }.  for(pElem=sq
d280: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
d290: 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 45  Db->idxHash); pE
d2a0: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
d2b0: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
d2c0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
d2d0: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
d2e0: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
d2f0: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
d300: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
d310: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
d320: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
d330: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
d340: 74 28 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  t(0);.}.#endif..
d350: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
d360: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
d370: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
d380: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
d390: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
d3a0: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
d3b0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
d3c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d3d0: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
d3e0: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
d3f0: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
d400: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
d410: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
d420: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
d430: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
d440: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
d450: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
d460: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
d470: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
d480: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
d490: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d4a0: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
d4b0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
d4c0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d4d0: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
d4e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d4f0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
d500: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
d510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d520: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
d530: 73 74 72 6f 79 20 70 75 73 68 65 73 20 61 6e 20  stroy pushes an 
d540: 69 6e 74 65 67 65 72 20 6f 6e 74 6f 20 74 68 65  integer onto the
d550: 20 73 74 61 63 6b 2e 20 49 66 20 74 68 69 73 20   stack. If this 
d560: 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
d570: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
d580: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
d590: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
d5a0: 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
d5b0: 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
d5c0: 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
d5d0: 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 73 20 74  g code modifis t
d5e0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d5f0: 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
d600: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
d610: 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 30 22 20  *.  ** The "#0" 
d620: 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  in the SQL is a 
d630: 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74  special constant
d640: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74   that means what
d650: 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ever value.  ** 
d660: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
d670: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65   the stack.  See
d680: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
d690: 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  Expr()..  */.  s
d6a0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
d6b0: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
d6c0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
d6d0: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
d6e0: 45 52 45 20 23 30 20 41 4e 44 20 72 6f 6f 74 70  ERE #0 AND rootp
d6f0: 61 67 65 3d 23 30 22 2c 0a 20 20 20 20 20 70 50  age=#0",.     pP
d700: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
d710: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
d720: 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
d730: 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ble);.#endif.}..
d740: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
d750: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
d760: 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
d770: 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
d780: 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
d790: 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
d7a0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d7b0: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
d7c0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
d7d0: 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
d7e0: 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
d7f0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
d800: 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
d810: 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
d820: 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
d830: 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
d840: 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
d850: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
d860: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
d870: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
d880: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d890: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
d8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
d8b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d8c0: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
d8d0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
d8e0: 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  num, pTab->iDb);
d8f0: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
d900: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
d910: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
d920: 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
d930: 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
d940: 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d  Idx->tnum, pIdx-
d950: 3e 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >iDb);.  }.#else
d960: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
d970: 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
d980: 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
d990: 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
d9a0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
d9b0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
d9c0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
d9d0: 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
d9e0: 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
d9f0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
da00: 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
da10: 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
da20: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
da30: 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
da40: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
da50: 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
da60: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
da70: 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
da80: 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
da90: 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
daa0: 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
dab0: 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
dac0: 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
dad0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
dae0: 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
daf0: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
db00: 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
db10: 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
db20: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
db30: 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
db40: 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
db50: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
db60: 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
db70: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
db80: 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
db90: 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
dba0: 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
dbb0: 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
dbc0: 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
dbd0: 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
dbe0: 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
dbf0: 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
dc00: 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
dc10: 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
dc20: 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
dc30: 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
dc40: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
dc50: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
dc60: 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
dc70: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
dc80: 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
dc90: 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
dca0: 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
dcb0: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
dcc0: 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
dcd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
dce0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
dcf0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
dd00: 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
dd10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
dd20: 64 78 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69  dx->iDb==pTab->i
dd30: 44 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Db );.      if( 
dd40: 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
dd50: 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
dd60: 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
dd70: 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
dd80: 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
dd90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dda0: 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
ddb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
ddc0: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
ddd0: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
dde0: 73 74 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  st, pTab->iDb);.
ddf0: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
de00: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 7d 0a 23   iLargest;.  }.#
de10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
de20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
de30: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
de40: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
de50: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
de60: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
de70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
de80: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
de90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
dea0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
deb0: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
dec0: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
ded0: 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  iew){.  Table *p
dee0: 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
def0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
df00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
df10: 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
df20: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
df30: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
df40: 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
df50: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73  drop_table;.  as
df60: 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
df70: 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d  c==1 );.  pTab =
df80: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
df90: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
dfa0: 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70  e->a[0].zName, p
dfb0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
dfc0: 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54  base);..  if( pT
dfd0: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
dfe0: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
dff0: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
e000: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
e010: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
e020: 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
e030: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
e040: 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
e050: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
e060: 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
e070: 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62  CHEMA_TABLE(pTab
e080: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  ->iDb);.    cons
e090: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
e0a0: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
e0b0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
e0c0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
e0d0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
e0e0: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
e0f0: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
e100: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e110: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
e120: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
e130: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
e140: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
e150: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
e160: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
e170: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
e180: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
e190: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
e1a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
e1b0: 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
e1c0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
e1d0: 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
e1e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e1f0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
e200: 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
e210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e220: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
e230: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
e240: 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
e250: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
e260: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
e270: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
e280: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
e290: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
e2a0: 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
e2b0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
e2c0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
e2d0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e2e0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
e2f0: 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d  ndif.  if( pTab-
e300: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
e310: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e320: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
e330: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
e340: 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
e350: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ame);.    pParse
e360: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
e370: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
e380: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  le;.  }.  if( is
e390: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
e3a0: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
e3b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e3c0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
e3d0: 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
e3e0: 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
e3f0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
e400: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
e410: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
e420: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
e430: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
e440: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e450: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
e460: 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
e470: 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
e480: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
e490: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
e4a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
e4b0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
e4c0: 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
e4d0: 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
e4e0: 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
e4f0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
e500: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e510: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
e520: 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
e530: 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  igger;.    sqlit
e540: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
e550: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
e560: 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20   pTab->iDb);..  
e570: 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
e580: 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
e590: 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
e5a0: 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
e5b0: 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67  Code.    ** is g
e5c0: 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
e5d0: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
e5e0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
e5f0: 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  d/or.    ** sqli
e600: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
e610: 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  f required..    
e620: 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  */.    pTrigger 
e630: 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72  = pTab->pTrigger
e640: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72  ;.    while( pTr
e650: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61  igger ){.      a
e660: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
e670: 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20  >iDb==pTab->iDb 
e680: 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62  || pTrigger->iDb
e690: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
e6a0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
e6b0: 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
e6c0: 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ger, 1);.      p
e6d0: 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
e6e0: 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
e6f0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
e700: 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
e710: 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
e720: 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
e730: 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
e740: 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
e750: 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
e760: 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
e770: 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
e780: 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
e790: 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
e7a0: 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
e7b0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
e7c0: 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
e7d0: 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
e7e0: 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
e7f0: 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
e800: 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
e810: 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
e820: 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
e830: 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
e840: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
e850: 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
e860: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
e870: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
e880: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
e890: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
e8a0: 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
e8b0: 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
e8c0: 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
e8d0: 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
e8e0: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
e8f0: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
e900: 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62  _TABLE(pTab->iDb
e910: 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ), pTab->zName);
e920: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
e930: 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   ){.      destro
e940: 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
e950: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
e960: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
e970: 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
e980: 70 54 61 62 2d 3e 69 44 62 2c 20 30 2c 20 70 54  pTab->iDb, 0, pT
e990: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
e9a0: 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52   }.  sqliteViewR
e9b0: 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
e9c0: 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  ;..exit_drop_tab
e9d0: 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  le:.  sqlite3Src
e9e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d 65  ListDelete(pName
e9f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ea00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ea10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
ea20: 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
ea30: 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
ea40: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
ea50: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
ea60: 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
ea70: 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
ea80: 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
ea90: 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
eaa0: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
eab0: 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
eac0: 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
ead0: 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
eae0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
eaf0: 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
eb00: 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
eb10: 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
eb20: 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
eb30: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
eb40: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
eb50: 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
eb60: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
eb70: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
eb80: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
eb90: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
eba0: 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
ebb0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
ebc0: 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
ebd0: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
ebe0: 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
ebf0: 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
ec00: 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
ec10: 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
ec20: 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
ec30: 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
ec40: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
ec50: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ec60: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
ec70: 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
ec80: 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
ec90: 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
eca0: 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
ecb0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
ecc0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
ecd0: 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
ece0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
ecf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
ed00: 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
ed10: 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
ed20: 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
ed30: 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
ed40: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
ed50: 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
ed60: 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
ed70: 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
ed80: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
ed90: 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
eda0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
edb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
edc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
edd0: 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
ede0: 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
edf0: 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
ee00: 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
ee10: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
ee20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ee30: 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
ee40: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
ee50: 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
ee60: 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
ee70: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
ee80: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
ee90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
eea0: 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
eeb0: 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
eec0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eed0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
eee0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
eef0: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  0;.  Table *p = 
ef00: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ef10: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
ef20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
ef30: 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
ef40: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
ef50: 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
ef60: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
ef70: 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
ef80: 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
ef90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
efa0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
efb0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67    if( iCol<0 ) g
efc0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
efd0: 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
efe0: 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29  oCol->nExpr!=1 )
eff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f000: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
f010: 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20  "foreign key on 
f020: 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73  %s".         " s
f030: 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20  hould reference 
f040: 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20  only one column 
f050: 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20  of table %T",.  
f060: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69         p->aCol[i
f070: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29  Col].zName, pTo)
f080: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ;.      goto fk_
f090: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  end;.    }.    n
f0a0: 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Col = 1;.  }else
f0b0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
f0c0: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46  ToCol->nExpr!=pF
f0d0: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b  romCol->nExpr ){
f0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
f0f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
f100: 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20       "number of 
f110: 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69  columns in forei
f120: 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  gn key does not 
f130: 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72  match the number
f140: 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63   of ".        "c
f150: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
f160: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29  ferenced table")
f170: 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
f180: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
f190: 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d  nCol = pFromCol-
f1a0: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42  >nExpr;.  }.  nB
f1b0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46  yte = sizeof(*pF
f1c0: 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65  Key) + nCol*size
f1d0: 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
f1e0: 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
f1f0: 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
f200: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f210: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
f220: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
f230: 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f   += strlen(pToCo
f240: 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
f250: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
f260: 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d 61  pFKey = sqliteMa
f270: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
f280: 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 20   if( pFKey==0 ) 
f290: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70  goto fk_end;.  p
f2a0: 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b  FKey->pFrom = p;
f2b0: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  .  pFKey->pNextF
f2c0: 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a  rom = p->pFKey;.
f2d0: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46    z = (char*)&pF
f2e0: 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d  Key[1];.  pFKey-
f2f0: 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74 20  >aCol = (struct 
f300: 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20  sColMap*)z;.  z 
f310: 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  += sizeof(struct
f320: 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a   sColMap)*nCol;.
f330: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
f340: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
f350: 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
f360: 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
f370: 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
f380: 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54  .  pFKey->pNextT
f390: 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  o = 0;.  pFKey->
f3a0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69  nCol = nCol;.  i
f3b0: 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
f3c0: 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f  {.    pFKey->aCo
f3d0: 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e  l[0].iFrom = p->
f3e0: 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  nCol-1;.  }else{
f3f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f400: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f410: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
f420: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f  or(j=0; j<p->nCo
f430: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
f440: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f450: 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  Cmp(p->aCol[j].z
f460: 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Name, pFromCol->
f470: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
f480: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65  {.          pFKe
f490: 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d  y->aCol[i].iFrom
f4a0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
f4b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f4d0: 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b  f( j>=p->nCol ){
f4e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f4f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f500: 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b   .          "unk
f510: 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73  nown column \"%s
f520: 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  \" in foreign ke
f530: 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a  y definition", .
f540: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43            pFromC
f550: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
f560: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  .        goto fk
f570: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
f580: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
f590: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
f5a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
f5b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
f5c0: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
f5d0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
f5e0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
f5f0: 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
f600: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43    memcpy(z, pToC
f610: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  ol->a[i].zName, 
f620: 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d  n);.      z[n] =
f630: 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e   0;.      z += n
f640: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
f650: 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
f660: 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e  d = 0;.  pFKey->
f670: 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61  deleteConf = fla
f680: 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b  gs & 0xff;.  pFK
f690: 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d  ey->updateConf =
f6a0: 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26   (flags >> 8 ) &
f6b0: 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e   0xff;.  pFKey->
f6c0: 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c  insertConf = (fl
f6d0: 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30 78  ags >> 16 ) & 0x
f6e0: 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74  ff;..  /* Link t
f6f0: 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74  he foreign key t
f700: 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74  o the table as t
f710: 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20  he last step..  
f720: 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20  */.  p->pFKey = 
f730: 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d  pFKey;.  pFKey =
f740: 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73   0;..fk_end:.  s
f750: 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79 29  qliteFree(pFKey)
f760: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
f770: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f780: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
f790: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
f7a0: 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f  stDelete(pFromCo
f7b0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
f7c0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43  rListDelete(pToC
f7d0: 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
f7e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f7f0: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
f800: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
f810: 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
f820: 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
f830: 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
f840: 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
f850: 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
f860: 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
f870: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
f880: 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
f890: 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
f8a0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
f8b0: 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
f8c0: 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
f8d0: 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
f8e0: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
f8f0: 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
f900: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
f910: 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
f920: 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
f930: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
f940: 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
f950: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
f960: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
f970: 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
f980: 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
f990: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
f9a0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
f9b0: 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
f9c0: 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
f9d0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
f9e0: 65 72 72 65 64 20 3d 20 69 73 44 65 66 65 72 72  erred = isDeferr
f9f0: 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
fa00: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
fa10: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
fa20: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
fa30: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
fa40: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
fa50: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
fa60: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
fa70: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
fa80: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
fa90: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
faa0: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
fab0: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
fac0: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
fad0: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
fae0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
faf0: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
fb00: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
fb10: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
fb20: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
fb30: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
fb40: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
fb50: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
fb60: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
fb70: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
fb80: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
fb90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
fba0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
fbb0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
fbc0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
fbd0: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
fbe0: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
fbf0: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
fc00: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
fc10: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
fc20: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
fc30: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
fc40: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
fc50: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
fc60: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
fc70: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
fc80: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
fc90: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
fca0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
fcb0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
fcc0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
fcd0: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
fce0: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
fcf0: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
fd00: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
fd10: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
fd20: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
fd30: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
fd40: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
fd50: 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62 6c 65  lName,  /* Table
fd60: 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
fd70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fd80: 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
fd90: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
fda0: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
fdb0: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
fdc0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
fdd0: 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f  r,     /* OE_Abo
fde0: 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
fdf0: 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
fe00: 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
fe10: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
fe20: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
fe30: 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
fe40: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
fe50: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
fe60: 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68  *pEnd      /* Th
fe70: 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
fe80: 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
fe90: 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
fea0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
feb0: 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65 20 74   = 0; /* Table t
fec0: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
fed0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
fee0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65  = 0; /* The inde
fef0: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
ff00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
ff10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
ff20: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
ff30: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
ff40: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
ff50: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
ff60: 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
ff70: 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
ff80: 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
ff90: 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
ffa0: 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a   isTemp;      /*
ffb0: 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70   True for a temp
ffc0: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
ffd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ffe0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e  Parse->db;..  in
fff0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
10000 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
10010 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
10020 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
10030 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10040 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69   = 0; /* Unquali
10050 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
10060 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
10070 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73   */..  if( pPars
10080 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
10090 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
100a0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
100b0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a  ate_index;..  /*
100c0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
100d0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
100e0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
100f0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
10100 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
10110 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
10120 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
10130 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
10140 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
10150 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
10160 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
10170 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
10180 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
10190 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
101a0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
101b0 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
101c0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
101d0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
101e0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
101f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
10200 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
10210 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
10220 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
10230 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
10240 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10250 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
10260 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
10270 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
10280 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61  ck if the the ta
10290 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
102a0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
102b0 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
102c0 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f  ase to 1..    */
102d0 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69  .    pTab = sqli
102e0 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
102f0 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
10300 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  e);.    if( pNam
10310 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d  e2 && pName2->n=
10320 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
10330 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20  ab->iDb==1 ){.  
10340 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
10350 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
10360 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
10370 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
10380 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
10390 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
103a0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
103b0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
103c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
103d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
103e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
103f0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
10400 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
10410 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61  blName->a[0].zNa
10420 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62  me, .        pTb
10430 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
10440 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20  abase);.    if( 
10450 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
10460 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10470 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
10480 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20  =pTab->iDb );.  
10490 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
104a0 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
104b0 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73     pTab =  pPars
104c0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
104d0 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
104e0 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  b;.  }..  if( pT
104f0 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  ab==0 || pParse-
10500 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69  >nErr ) goto exi
10510 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10520 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64    if( pTab->read
10530 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  Only ){.    sqli
10540 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10550 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
10560 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
10570 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
10580 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
10590 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
105a0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
105b0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
105c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
105d0 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
105e0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
105f0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
10600 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
10610 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62  .  isTemp = pTab
10620 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a  ->iDb==1;..  /*.
10630 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
10640 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
10650 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
10660 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
10670 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
10680 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
10690 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
106a0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
106b0 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
106c0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
106d0 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
106e0 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
106f0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
10700 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
10710 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
10720 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
10730 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
10740 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
10750 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
10760 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
10770 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
10780 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
10790 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
107a0 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
107b0 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
107c0 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
107d0 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
107e0 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
107f0 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
10800 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
10810 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
10820 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
10830 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
10840 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
10850 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
10860 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
10870 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
10880 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
10890 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
108a0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
108b0 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
108c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
108d0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
108e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
108f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
10900 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
10910 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
10920 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
10930 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
10940 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10950 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
10960 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
10970 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
10980 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pISameName;    
10990 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65 78  /* Another index
109a0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
109b0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ame */.      Tab
109c0 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20  le *pTSameName; 
109d0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77 69     /* A table wi
109e0 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  th same name as 
109f0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
10a00 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
10a10 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
10a20 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
10a30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10a40 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20  ndex;.      if( 
10a50 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pISameName = sq
10a60 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
10a70 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  b, zName, db->aD
10a80 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21 3d  b[iDb].zName))!=
10a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10aa0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10ab0 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
10ac0 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
10ad0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
10ae0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10af0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
10b00 20 20 20 20 20 20 69 66 28 20 28 70 54 53 61 6d        if( (pTSam
10b10 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
10b20 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
10b30 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20  me, 0))!=0 ){.  
10b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10b50 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
10b60 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
10b70 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
10b80 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
10b90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
10ba0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
10bb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
10bc0 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29 7b   if( pName==0 ){
10bd0 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 33  .    char zBuf[3
10be0 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  0];.    int n;. 
10bf0 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b     Index *pLoop;
10c00 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
10c10 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31  Tab->pIndex, n=1
10c20 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
10c30 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b  Loop->pNext, n++
10c40 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ){}.    sprintf(
10c50 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a 20  zBuf,"_%d",n);. 
10c60 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
10c70 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
10c80 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ng(&zName, "sqli
10c90 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20  te_autoindex_", 
10ca0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42 75  pTab->zName, zBu
10cb0 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
10cc0 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
10cd0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10ce0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
10cf0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74  /* Check for aut
10d00 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72  horization to cr
10d10 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20  eate an index.. 
10d20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
10d30 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
10d40 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f  ATION.  {.    co
10d50 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
10d60 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
10d70 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
10d80 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
10d90 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
10da0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
10db0 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
10dc0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
10dd0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10de0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
10df0 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
10e00 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
10e10 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 20 3d  if( isTemp ) i =
10e20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
10e30 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
10e40 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
10e50 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
10e60 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
10e70 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
10e80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
10e90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
10ea0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
10eb0 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
10ec0 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
10ed0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
10ee0 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
10ef0 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
10f00 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
10f10 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
10f20 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
10f30 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
10f40 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
10f50 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
10f60 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
10f70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
10f80 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e  ullId.z = pTab->
10f90 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
10fa0 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
10fb0 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e 28  llId.n = strlen(
10fc0 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
10fd0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
10fe0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
10ff0 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20  0, &nullId);.   
11000 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
11010 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11020 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
11030 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
11040 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
11050 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70 49  ture. .  */.  pI
11060 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ndex = sqliteMal
11070 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64 65  loc( sizeof(Inde
11080 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  x) + strlen(zNam
11090 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20   (sizeof(int) + 
110c0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
110d0 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  )*pList->nExpr )
110e0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
110f0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
11100 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70 49  eate_index;.  pI
11110 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
11120 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d 3e   (int*)&pIndex->
11130 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70 4c  keyInfo.aColl[pL
11140 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 70  ist->nExpr];.  p
11150 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
11160 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 61  char*)&pIndex->a
11170 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e 6e  iColumn[pList->n
11180 45 78 70 72 5d 3b 0a 20 20 73 74 72 63 70 79 28  Expr];.  strcpy(
11190 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
111a0 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Name);.  pIndex-
111b0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
111c0 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
111d0 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
111e0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
111f0 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  ror = onError;. 
11200 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
11210 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20  ex = pName==0;. 
11220 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20 69   pIndex->iDb = i
11230 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74  Db;..  /* Scan t
11240 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
11250 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
11260 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
11270 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64  ed and.  ** load
11280 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69   the column indi
11290 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64  ces into the Ind
112a0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  ex structure.  R
112b0 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20  eport an error. 
112c0 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d   ** if any colum
112d0 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  n is not found..
112e0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
112f0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
11300 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  i++){.    for(j=
11310 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
11320 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
11330 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11340 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
11350 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  e, pTab->aCol[j]
11360 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
11370 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11380 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
11390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
113b0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
113c0 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
113d0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
113e0 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d 3e  ->zName, pList->
113f0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
11400 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
11410 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
11420 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
11430 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
11440 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
11450 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ].pExpr ){.     
11460 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
11470 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
11480 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  l );.      pInde
11490 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
114a0 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  [i] = pList->a[i
114b0 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  ].pExpr->pColl;.
114c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
114d0 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
114e0 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61 62  .aColl[i] = pTab
114f0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
11500 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
11510 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  t( pIndex->keyIn
11520 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a 20  fo.aColl[i] );. 
11530 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
11540 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20 20 20  .busy && .      
11550 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f    sqlite3CheckCo
11560 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
11570 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
11580 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b 0a  oll[i]) .    ){.
11590 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
115a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
115b0 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78    }.  }.  pIndex
115c0 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  ->keyInfo.nField
115d0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
115e0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
115f0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
11600 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
11610 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
11620 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
11630 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
11640 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
11650 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
11660 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
11670 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
11680 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
11690 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
116a0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
116b0 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
116c0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
116d0 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
116e0 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
116f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
11700 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
11710 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
11720 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
11730 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
11740 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
11750 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
11760 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
11770 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
11780 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
11790 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
117a0 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
117b0 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
117c0 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
117d0 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
117e0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
117f0 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
11800 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
11810 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
11820 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
11830 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
11840 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
11850 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
11860 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
11870 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11880 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
11890 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
118a0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
118b0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
118c0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
118d0 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20  autoIndex );.   
118e0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
118f0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
11900 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  one );..      if
11910 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21  ( pIdx->nColumn!
11920 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
11930 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
11940 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
11950 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
11960 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11970 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
11980 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
11990 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
119a0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
119b0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
119c0 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  ]!=pIndex->keyIn
119d0 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62 72  fo.aColl[k] ) br
119e0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
119f0 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
11a00 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
11a10 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
11a20 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
11a30 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
11a40 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
11a50 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
11a60 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
11a70 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
11a80 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
11a90 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
11aa0 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
11ab0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
11ac0 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
11ad0 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
11ae0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
11af0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
11b00 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
11b10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
11b20 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
11b30 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
11b40 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
11b50 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
11b60 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
11b70 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
11b80 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
11b90 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
11ba0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
11bb0 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
11bc0 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66  fied behaviour f
11bd0 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
11be0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11bf0 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
11c00 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
11c10 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
11c20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
11c30 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
11c40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11c50 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
11c70 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
11c80 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
11c90 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
11ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11cb0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
11cc0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
11cd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
11ce0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
11cf0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
11d00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11d20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
11d30 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
11d40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11d50 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
11d60 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
11d70 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
11d80 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
11d90 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
11da0 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
11db0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
11dc0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
11dd0 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20  Index *p;.    p 
11de0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
11df0 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e  ert(&db->aDb[pIn
11e00 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73  dex->iDb].idxHas
11e10 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
11e30 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  dex->zName, strl
11e40 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  en(pIndex->zName
11e50 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  )+1, pIndex);.  
11e60 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
11e70 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
11e80 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
11e90 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
11ea0 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  d */.      goto 
11eb0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
11ec0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
11ed0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
11ee0 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
11ef0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
11f00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
11f10 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
11f20 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
11f30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
11f40 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
11f50 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
11f60 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
11f70 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
11f80 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
11f90 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
11fa0 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
11fb0 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
11fc0 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
11fd0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
11fe0 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
11ff0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
12000 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
12010 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
12020 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
12030 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
12040 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
12050 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
12060 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
12070 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
12080 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
12090 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
120a0 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
120b0 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
120c0 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
120d0 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
120e0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
120f0 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
12100 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
12110 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
12120 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
12130 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
12140 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
12150 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
12160 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
12170 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
12180 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
12190 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
121a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
121b0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
121c0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
121d0 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
121e0 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
121f0 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
12200 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
12210 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
12220 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
12230 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
12240 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
12250 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
12260 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c     int lbl1, lbl
12270 32 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  2;..    v = sqli
12280 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12290 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
122a0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
122b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
122c0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
122d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
122e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
122f0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
12300 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
12310 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
12320 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a  (v, iDb);.    }.
12330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12340 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65  ddOp(v, OP_NewRe
12350 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cno, 0, 0);.    
12360 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
12370 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
12380 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33 5f   0, "index", P3_
12390 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
123a0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
123b0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
123c0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
123d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
123e0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
123f0 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54 61 62  ing8, 0, 0, pTab
12400 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
12410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12420 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  p(v, OP_CreateIn
12430 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  dex, iDb, 0);.  
12440 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
12450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
12460 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
12470 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
12480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12490 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
124a0 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20   iDb, 0);.      
124b0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
124c0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
124d0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
124e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
124f0 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
12500 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
12510 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12520 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12530 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
12540 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
12550 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
12560 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
12570 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
12580 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12590 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52  ngeP3(v, -1, "CR
125a0 45 41 54 45 20 49 4e 44 45 58 20 22 2c 20 50 33  EATE INDEX ", P3
125b0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
125c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
125d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
125e0 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41 54  P3(v, -1, "CREAT
125f0 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 22  E UNIQUE INDEX "
12600 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
12610 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
12620 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12630 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
12640 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  );.      n = Add
12650 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
12660 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 3b  r(pName->z) + 1;
12670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12680 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
12690 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a  , pName->z, n);.
126a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
126b0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
126c0 63 61 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  cat, 0, 0);.    
126d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
126e0 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
126f0 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74  ecord, 5, 0, "tt
12700 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29  tit", P3_STATIC)
12710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12720 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
12730 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
12740 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
12750 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12760 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12770 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
12780 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
12790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
127a0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32  , OP_OpenRead, 2
127b0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
127c0 20 20 20 20 20 2f 2a 20 56 64 62 65 43 6f 6d 6d       /* VdbeComm
127d0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
127e0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f 0a  ab->zName)); */.
127f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12800 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
12810 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20 70  NumColumns, 2, p
12820 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  Tab->nCol);.    
12830 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 33    lbl2 = sqlite3
12840 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
12850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12860 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
12870 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b  ewind, 2, lbl2);
12880 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
12890 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
128a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
128b0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
128c0 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
128d0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
128e0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
128f0 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
12900 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
12910 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  None,.          
12920 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64              "ind
12930 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
12940 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
12950 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
12960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12970 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
12980 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
12990 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
129a0 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20  abel(v, lbl2);. 
129b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
129c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
129d0 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 2, 0);.      
129e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
12a00 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12a10 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
12a20 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  b, v, iDb);.    
12a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a40 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12a50 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
12a60 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
12a70 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
12a80 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Db, 0,.         
12a90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
12aa0 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64  name='%q'", pInd
12ab0 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44  ex->zName), P3_D
12ac0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
12ad0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
12ae0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
12af0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
12b00 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
12b10 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
12b20 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
12b30 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
12b40 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
12b50 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
12b60 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
12b70 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
12b80 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
12b90 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
12ba0 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
12bb0 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
12bc0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
12bd0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a   pTblName==0 ){.
12be0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21      if( onError!
12bf0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
12c00 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
12c10 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d          || pTab-
12c20 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  >pIndex->onError
12c30 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20  ==OE_Replace){. 
12c40 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
12c50 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  xt = pTab->pInde
12c60 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70  x;.      pTab->p
12c70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
12c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c90 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
12ca0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
12cb0 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68       while( pOth
12cc0 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74  er->pNext && pOt
12cd0 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72  her->pNext->onEr
12ce0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
12cf0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65  ){.        pOthe
12d00 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  r = pOther->pNex
12d10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
12d20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
12d30 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
12d40 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e        pOther->pN
12d50 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  ext = pIndex;.  
12d60 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d    }.    pIndex =
12d70 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c   0;.  }..  /* Cl
12d80 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78  ean up before ex
12d90 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72  iting */.exit_cr
12da0 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66  eate_index:.  if
12db0 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
12dc0 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78  freeIndex(pIndex
12dd0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12de0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
12df0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
12e00 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 54  SrcListDelete(pT
12e10 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
12e20 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
12e30 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
12e40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
12e50 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
12e60 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
12e70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
12e80 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
12e90 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
12ea0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
12eb0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
12ec0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
12ed0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b 0a  rcList *pName){.
12ee0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
12ef0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
12f00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12f10 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
12f20 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
12f30 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
12f40 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
12f50 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
12f60 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
12f70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
12f80 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
12f90 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  arse) ) return;.
12fa0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
12fb0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
12fc0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
12fd0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
12fe0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
12ff0 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
13000 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13010 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
13020 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
13030 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
13040 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
13050 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
13060 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
13070 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
13080 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
13090 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
130a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
130b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
130c0 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
130d0 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
130e0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
130f0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13100 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
13110 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
13120 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
13130 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
13140 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
13150 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13160 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
13170 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
13180 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
13190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
131a0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65   = db->aDb[pInde
131b0 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  x->iDb].zName;. 
131c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
131d0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
131e0 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  LE(pIndex->iDb);
131f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13200 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13210 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
13220 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
13230 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13240 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
13250 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 64    }.    if( pInd
13260 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20 3d  ex->iDb ) code =
13270 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
13280 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
13290 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
132a0 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
132b0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
132c0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
132d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
132e0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
132f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13300 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
13310 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
13320 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
13330 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
13340 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
13350 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13360 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
13370 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
13380 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49  VdbeOpList dropI
13390 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
133a0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
133b0 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
133c0 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
133d0 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20  ring8,    0, 0, 
133e0 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
133f0 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
13400 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
13410 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
13420 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
13430 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
13440 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
13450 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
13460 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
13470 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
13480 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
13490 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
134a0 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
134b0 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
134c0 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
134d0 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
134e0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
134f0 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
13500 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
13510 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
13520 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c  t base;..    sql
13530 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13540 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
13550 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  0, pIndex->iDb);
13560 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
13570 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
13580 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
13590 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56   base = sqlite3V
135a0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
135b0 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
135c0 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
135d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
135e0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
135f0 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
13600 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
13610 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
13620 64 62 2c 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69  db, v, pIndex->i
13630 44 62 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  Db);.    /* sqli
13640 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13650 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e 64  OP_Destroy, pInd
13660 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78  ex->tnum, pIndex
13670 2d 3e 69 44 62 29 3b 20 2a 2f 0a 20 20 20 20 64  ->iDb); */.    d
13680 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
13690 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
136a0 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
136b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
136c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
136d0 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ose, 0, 0);.    
136e0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
136f0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
13700 70 49 6e 64 65 78 2d 3e 69 44 62 2c 20 30 2c 20  pIndex->iDb, 0, 
13710 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
13720 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
13730 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
13740 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
13750 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
13760 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
13770 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
13780 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
13790 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
137a0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
137b0 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
137c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
137d0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
137e0 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
137f0 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
13800 73 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20  stAppend(IdList 
13810 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
13820 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c  Token){.  if( pL
13830 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
13840 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
13850 6f 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  oc( sizeof(IdLis
13860 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
13870 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
13880 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
13890 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
138a0 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d  if( pList->nId>=
138b0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  pList->nAlloc ){
138c0 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
138d0 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20  st_item *a;.    
138e0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
138f0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
13900 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 5;.    a = sql
13910 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
13920 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
13930 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
13940 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
13950 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( a==0 ){.      
13960 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
13970 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
13980 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
13990 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d  }.    pList->a =
139a0 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74   a;.  }.  memset
139b0 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
139c0 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->nId], 0, sizeo
139d0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
139e0 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  .  pList->a[pLis
139f0 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20  t->nId].zName = 
13a00 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
13a10 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20  oken(pToken);.  
13a20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20  pList->nId++;.  
13a30 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
13a40 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
13a50 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
13a60 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
13a70 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
13a80 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
13a90 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
13aa0 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
13ab0 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
13ac0 20 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20   even if pToken 
13ad0 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
13ae0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 73 20   new SrcList is 
13af0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
13b00 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
13b10 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ils..**.** If pD
13b20 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
13b30 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
13b40 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
13b50 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
13b60 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
13b70 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
13b80 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
13b90 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
13ba0 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
13bb0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
13bc0 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
13bd0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
13be0 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
13bf0 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
13c00 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
13c10 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
13c20 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
13c30 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
13c40 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
13c50 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
13c60 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
13c70 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
13c80 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
13c90 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
13ca0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
13cb0 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
13cc0 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
13cd0 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
13ce0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
13cf0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
13d00 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
13d10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
13d20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
13d30 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  pend(A,B,0);.**.
13d40 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
13d50 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
13d60 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
13d70 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
13d80 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
13d90 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
13da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
13db0 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
13dc0 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
13dd0 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
13de0 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
13df0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
13e00 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
13e10 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
13e20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
13e30 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54  Token *pTable, T
13e40 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29  oken *pDatabase)
13e50 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
13e60 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
13e70 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13e80 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
13e90 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
13ea0 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
13eb0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
13ec0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
13ed0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
13ee0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  1;.  }.  if( pLi
13ef0 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d  st->nSrc>=pList-
13f00 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
13f10 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
13f20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
13f30 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d  *= 2;.    pNew =
13f40 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
13f50 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
13f60 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69       sizeof(*pLi
13f70 73 74 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41  st) + (pList->nA
13f80 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70  lloc-1)*sizeof(p
13f90 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  List->a[0]) );. 
13fa0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
13fb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
13fc0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
13fd0 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
13fe0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
13ff0 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
14000 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
14010 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
14020 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ];.  memset(pIte
14030 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  m, 0, sizeof(pLi
14040 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66  st->a[0]));.  if
14050 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
14060 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
14070 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
14080 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
14090 44 61 74 61 62 61 73 65 20 26 26 20 70 54 61 62  Database && pTab
140a0 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  le ){.    Token 
140b0 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
140c0 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
140d0 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
140e0 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
140f0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
14100 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
14110 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
14120 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  );.  pItem->zDat
14130 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
14140 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61  ameFromToken(pDa
14150 74 61 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d  tabase);.  pItem
14160 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ->iCursor = -1;.
14170 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b    pList->nSrc++;
14180 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
14190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
141a0 20 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20   cursors to all 
141b0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
141c0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
141d0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
141e0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
141f0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
14200 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
14210 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
14220 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
14230 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
14240 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29  a[i].iCursor<0 )
14250 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  {.      pList->a
14260 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50  [i].iCursor = pP
14270 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14280 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14290 20 41 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f   Add an alias to
142a0 20 74 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69   the last identi
142b0 66 69 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65  fier on the give
142c0 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73  n identifier lis
142d0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
142e0 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
142f0 73 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  s(SrcList *pList
14300 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
14310 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 26 26  {.  if( pList &&
14320 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29   pList->nSrc>0 )
14330 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70  {.    pList->a[p
14340 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41  List->nSrc-1].zA
14350 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
14360 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
14370 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
14380 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
14390 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
143a0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
143b0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
143c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
143d0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
143e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
143f0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
14400 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
14410 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
14420 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
14430 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a  Free(pList->a);.
14440 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
14450 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
14460 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
14470 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
14480 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
14490 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
144a0 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
144b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
144c0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
144d0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
144e0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
144f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
14500 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
14510 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
14520 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
14530 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
14540 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
14550 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
14560 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
14570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
14580 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  1;.}../*.** Dele
14590 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
145a0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
145b0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
145c0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
145d0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
145e0 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  e(SrcList *pList
145f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14600 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
14610 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
14620 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
14630 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
14640 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
14650 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
14660 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14670 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
14680 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
14690 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
146a0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
146b0 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
146c0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
146d0 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 26  f( pItem->pTab &
146e0 26 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69  & pItem->pTab->i
146f0 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
14700 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
14710 65 54 61 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d  eTable(0, pItem-
14720 3e 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >pTab);.    }.  
14730 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14740 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65  elete(pItem->pSe
14750 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
14760 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
14770 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71  em->pOn);.    sq
14780 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
14790 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  e(pItem->pUsing)
147a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
147b0 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
147c0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
147d0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
147e0 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
147f0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
14800 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
14810 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14820 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
14830 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  t i;..  if( pPar
14840 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
14850 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
14860 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
14870 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14880 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
14890 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
148a0 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
148b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
148c0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
148d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
148e0 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
148f0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
14900 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14910 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
14920 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
14930 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
14940 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
14950 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
14970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14980 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
14990 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
149a0 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
149b0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
149c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
149d0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
149e0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
149f0 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
14a00 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
14a10 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
14a20 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
14a30 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14a40 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
14a50 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
14a60 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
14a70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
14a80 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
14a90 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
14aa0 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
14ab0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
14ac0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
14ad0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
14ae0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
14af0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d  RANSACTION, "COM
14b00 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20 72 65  MIT", 0, 0) ) re
14b10 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  turn;..  v = sql
14b20 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14b30 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
14b40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14b50 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43  ddOp(v, OP_AutoC
14b60 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
14b70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
14b80 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
14b90 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
14ba0 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
14bb0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
14bc0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
14bd0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
14be0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
14bf0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
14c00 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
14c10 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
14c20 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
14c30 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
14c40 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
14c50 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
14c60 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
14c70 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14c80 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
14c90 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
14ca0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
14cb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14cc0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14cd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14ce0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
14cf0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
14d00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
14d10 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
14d20 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
14d30 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
14d40 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
14d50 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
14d60 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
14d70 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
14d80 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
14d90 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
14da0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
14db0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
14dc0 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ase(Parse *pPars
14dd0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
14de0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14df0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
14e00 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72  .pBt==0 && !pPar
14e10 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
14e20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
14e30 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
14e40 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41  db, 0, 0, MAX_PA
14e50 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d  GES, &db->aDb[1]
14e60 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72  .pBt);.    if( r
14e70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14e90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
14ea0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
14eb0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
14ec0 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
14ed0 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
14ee0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
14ef0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
14f00 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
14f10 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
14f20 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67      if( db->flag
14f30 73 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  s & !db->autoCom
14f40 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  mit ){.      rc 
14f50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
14f60 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62  ginTrans(db->aDb
14f70 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20  [1].pBt, 1);.   
14f80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14fa0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14fb0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
14fc0 74 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c  to get a write l
14fd0 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20  ock on ".       
14fe0 20 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72     "the temporar
14ff0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  y database file"
15000 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
15010 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
15020 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
15030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15040 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15050 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
15060 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
15070 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
15080 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
15090 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
150a0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
150b0 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
150c0 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
150d0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
150e0 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
150f0 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
15100 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
15110 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
15120 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
15130 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
15140 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
15150 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
15160 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
15170 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
15180 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
15190 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
151a0 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
151b0 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
151c0 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
151d0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
151e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
151f0 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
15200 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
15210 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
15220 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
15230 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
15240 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
15250 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
15260 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
15270 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
15280 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
15290 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
152a0 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
152b0 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
152c0 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
152d0 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
152e0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
152f0 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
15300 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
15310 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
15320 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
15330 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
15340 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
15350 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
15360 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
15370 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
15380 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
15390 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
153a0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
153b0 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
153c0 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
153d0 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
153e0 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
153f0 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
15400 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
15410 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
15420 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
15430 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
15440 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
15450 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
15460 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
15470 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
15480 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
15490 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
154a0 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
154b0 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
154c0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
154d0 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
154e0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
154f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15500 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
15510 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
15520 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15530 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
15540 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
15550 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
15560 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
15570 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
15580 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
15590 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
155a0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
155b0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
155c0 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
155d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
155e0 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b  P_Goto, 0, 0)+1;
155f0 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d  .  }.  if( iDb>=
15600 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
15610 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
15620 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
15630 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
15640 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
15650 20 61 73 73 65 72 74 28 20 69 44 62 3c 33 32 20   assert( iDb<32 
15660 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c  );.    mask = 1<
15670 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
15680 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
15690 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
156a0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
156b0 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  okieMask |= mask
156c0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
156d0 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
156e0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
156f0 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
15700 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20       if( iDb==1 
15710 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
15720 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
15730 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  se(pParse);.    
15740 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
15750 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15760 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
15770 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
15780 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
15790 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
157a0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
157b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
157c0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
157d0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
157e0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
157f0 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
15800 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
15810 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
15820 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
15830 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
15840 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
15850 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
15860 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
15870 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
15880 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
15890 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
158a0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
158b0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
158c0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
158d0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
158e0 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
158f0 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
15900 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
15910 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
15920 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
15930 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
15940 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
15950 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
15960 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
15970 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
15980 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
15990 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
159a0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
159b0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
159c0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
159d0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
159e0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
159f0 20 62 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f   be set..**.** O
15a00 6e 6c 79 20 64 61 74 61 62 61 73 65 20 69 44 62  nly database iDb
15a10 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
15a20 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
15a30 77 72 69 74 61 62 6c 65 20 62 79 20 74 68 69 73  writable by this
15a40 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62   call..** If iDb
15a50 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ==0, then the ma
15a60 69 6e 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61  in and temp data
15a70 62 61 73 65 73 20 61 72 65 20 6d 61 64 65 20 77  bases are made w
15a80 72 69 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a  ritable.   If.**
15a90 20 69 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c   iDb==1 then onl
15aa0 79 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  y the temp datab
15ab0 61 73 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  ase is made writ
15ac0 61 62 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20  able.  If iDb>1 
15ad0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63  then the.** spec
15ae0 69 66 69 65 64 20 61 75 78 69 6c 69 61 72 79 20  ified auxiliary 
15af0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
15b00 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
15b10 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
15b20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15b30 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
15b40 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
15b50 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65  se, int setState
15b60 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a  ment, int iDb){.
15b70 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
15b80 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15b90 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
15ba0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
15bb0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
15bc0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
15bd0 0a 20 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65  .  pParse->write
15be0 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a  Mask |= 1<<iDb;.
15bf0 20 20 69 66 28 20 73 65 74 53 74 61 74 65 6d 65    if( setStateme
15c00 6e 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  nt && pParse->ne
15c10 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
15c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
15c30 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c  v, OP_Statement,
15c40 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20   iDb, 0);.  }.  
15c50 69 66 28 20 69 44 62 21 3d 31 20 26 26 20 70 50  if( iDb!=1 && pP
15c60 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
15c70 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20 20 20 73  .pBt!=0 ){.    s
15c80 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
15c90 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
15ca0 2c 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  , setStatement, 
15cb0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  1);.  }.}../* .*
15cc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 72 61  * Return the tra
15cd0 6e 73 69 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  nsient sqlite3_v
15ce0 61 6c 75 65 20 6f 62 6a 65 63 74 20 75 73 65 64  alue object used
15cf0 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 63 6f   for encoding co
15d00 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 64 75 72  nversions.** dur
15d10 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69 6c 61 74  ing SQL compilat
15d20 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ion..*/.sqlite3_
15d30 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 47 65  value *sqlite3Ge
15d40 74 54 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28  tTransientValue(
15d50 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
15d60 69 66 28 20 21 64 62 2d 3e 70 56 61 6c 75 65 20  if( !db->pValue 
15d70 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 61 6c 75  ){.    db->pValu
15d80 65 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  e = sqlite3Value
15d90 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  New();.  }.  ret
15da0 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75 65 3b 0a  urn db->pValue;.
15db0 7d 0a                                            }.