/ Hex Artifact Content
Login

Artifact dc8b9ab836f2323d9b313c2d703b00b2e9441382:


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 37 20 32 30 30 34 2f 31 31 2f 30 35 20 30  267 2004/11/05 0
0310: 39 3a 31 39 3a 32 38 20 64 61 6e 69 65 6c 6b 31  9:19:28 danielk1
0320: 39 37 37 20 45 78 70 20 24 0a 3d 3d 3d 3d 3d 3d  977 Exp $.======
0330: 3d 0a 2a 2a 20 24 49 64 3a 20 62 75 69 6c 64 2e  =.** $Id: build.
0340: 63 2c 76 20 31 2e 32 36 37 20 32 30 30 34 2f 31  c,v 1.267 2004/1
0350: 31 2f 30 35 20 30 39 3a 31 39 3a 32 38 20 64 61  1/05 09:19:28 da
0360: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
0370: 3e 3e 3e 3e 3e 3e 3e 20 31 2e 32 36 32 0a 2a 2f  >>>>>>> 1.262.*/
0380: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0390: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
03a0: 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a   <ctype.h>../*.*
03b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
03c0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
03d0: 6e 65 77 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  new SQL statemen
03e0: 74 20 69 73 20 62 65 67 69 6e 6e 69 6e 67 20 74  t is beginning t
03f0: 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65 64 2e 20  o.** be parsed. 
0400: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
0410: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
0420: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 65 65  the database nee
0430: 64 73 0a 2a 2a 20 74 6f 20 62 65 20 72 65 61 64  ds.** to be read
0440: 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45   from the SQLITE
0450: 5f 4d 41 53 54 45 52 20 61 6e 64 20 53 51 4c 49  _MASTER and SQLI
0460: 54 45 5f 54 45 4d 50 5f 4d 41 53 54 45 52 20 74  TE_TEMP_MASTER t
0470: 61 62 6c 65 73 2e 0a 2a 2a 20 49 66 20 69 74 20  ables..** If it 
0480: 64 6f 65 73 2c 20 74 68 65 6e 20 72 65 61 64 20  does, then read 
0490: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
04a0: 74 65 33 42 65 67 69 6e 50 61 72 73 65 28 50 61  te3BeginParse(Pa
04b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
04c0: 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b 0a 20   explainFlag){. 
04d0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04e0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04f0: 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d    pParse->nVar =
0500: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
0510: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0520: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0530: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0540: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0550: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0560: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0570: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0580: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0590: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
05a0: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
05b0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
05c0: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
05d0: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
05e0: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
05f0: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0600: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0610: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0620: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0630: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0640: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0650: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0660: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0670: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0680: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0690: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
06a0: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
06b0: 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v;..  if( sqlite
06c0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
06d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
06e0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
06f0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42   return;..  /* B
0700: 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69  egin by generati
0710: 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74  ng some terminat
0720: 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20  ion code at the 
0730: 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  end of the.  ** 
0740: 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a  vdbe program.  *
0750: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
0760: 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  >db;.  v = sqlit
0770: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
0780: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
0790: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
07a0: 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 30  Op(v, OP_Halt, 0
07b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
07c0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
07d0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
07e0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
07f0: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
0800: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
0810: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
0820: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
0830: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
0840: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
0850: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
0860: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
0870: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
0880: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
0890: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
08a0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
08b0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
08c0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
08d0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
08e0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
08f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
0900: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
0910: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
0920: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  mask;.      int 
0930: 69 44 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  iDb;.      sqlit
0940: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
0950: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0960: 47 6f 74 6f 2d 31 2c 20 73 71 6c 69 74 65 33 56  Goto-1, sqlite3V
0970: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
0980: 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44  ));.      for(iD
0990: 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62  b=0, mask=1; iDb
09a0: 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c  <db->nDb; mask<<
09b0: 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  =1, iDb++){.    
09c0: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
09d0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
09e0: 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  sk)==0 ) continu
09f0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
0a00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
0a10: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
0a20: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
0a30: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
0a40: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
0a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
0a60: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
0a70: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
0a80: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
0a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
0aa0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0ab0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
0ac0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
0ad0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  o);.    }..    /
0ae0: 2a 20 41 64 64 20 61 20 4e 6f 2d 6f 70 20 74 68  * Add a No-op th
0af0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
0b00: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
0b10: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 53 51   the compiled SQ
0b20: 4c 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  L.    ** stateme
0b30: 6e 74 20 61 73 20 69 74 73 20 50 33 20 61 72 67  nt as its P3 arg
0b40: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 64 6f 65  ument.  This doe
0b50: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  s not change the
0b60: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 0a 20   functionality. 
0b70: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f     ** of the pro
0b80: 67 72 61 6d 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  gram. .    **.  
0b90: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
0ba0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
0bb0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 66  qlite3_trace() f
0bc0: 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 20 20  unctionality..  
0bd0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
0be0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f  VdbeOp3(v, OP_No
0bf0: 6f 70 2c 20 30 2c 20 30 2c 20 70 50 61 72 73 65  op, 0, 0, pParse
0c00: 2d 3e 7a 53 71 6c 2c 20 70 50 61 72 73 65 2d 3e  ->zSql, pParse->
0c10: 7a 54 61 69 6c 2d 70 50 61 72 73 65 2d 3e 7a 53  zTail-pParse->zS
0c20: 71 6c 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ql);.  }...  /* 
0c30: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
0c40: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
0c50: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
0c60: 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d  if( v && pParse-
0c70: 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
0c80: 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28 64  FILE *trace = (d
0c90: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
0ca0: 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30 20  E_VdbeTrace)!=0 
0cb0: 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20 20  ? stdout : 0;.  
0cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
0cd0: 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 20 20  ce(v, trace);.  
0ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
0cf0: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
0d00: 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e  ->nVar, pParse->
0d10: 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20 20  nMem+3,.        
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33 2c   pParse->nTab+3,
0d40: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0d50: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0d60: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0d70: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0d80: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0d90: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0da0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0db0: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0dc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0dd0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0de0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0df0: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0e00: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0e10: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0e20: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0e30: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0e40: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0e50: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0e60: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0e70: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
0e80: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
0e90: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
0ea0: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
0eb0: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
0ec0: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
0ed0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
0ee0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
0ef0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
0f00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
0f10: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
0f20: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
0f30: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
0f40: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
0f50: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
0f60: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
0f70: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
0f80: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
0f90: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
0fa0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
0fb0: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
0fc0: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
0fd0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
0fe0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
0ff0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1000: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1010: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1020: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1030: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1040: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1050: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1060: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1070: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1080: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1090: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
10a0: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
10b0: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
10c0: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
10d0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
10e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
10f0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1100: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1110: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1120: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1130: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1140: 20 20 69 6e 74 20 72 63 3b 0a 23 20 64 65 66 69    int rc;.# defi
1150: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1160: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1170: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1180: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1190: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
11a0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
11b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
11c0: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
11d0: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
11e0: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
11f0: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
1200: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1210: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1220: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1230: 33 56 4d 50 72 69 6e 74 66 28 7a 46 6f 72 6d 61  3VMPrintf(zForma
1240: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1250: 28 61 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  (ap);.  pParse->
1260: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1270: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1280: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1290: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
12a0: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
12b0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 72 63 20 3d  SAVE_SZ);.  rc =
12c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
12d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
12e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  0);.  sqliteFree
12f0: 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79  (zSql);.  memcpy
1300: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1310: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
1320: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
1330: 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ted--;.}../*.** 
1340: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
1350: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
1360: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
1370: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
1380: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
1390: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
13a0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
13b0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
13c0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
13d0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
13e0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
13f0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
1400: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
1410: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
1420: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
1430: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
1440: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
1450: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
1460: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
1470: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
1480: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
1490: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
14a0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
14b0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
14c0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
14d0: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
14e0: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
14f0: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
1500: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
1510: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
1520: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
1530: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
1540: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
1550: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
1560: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1570: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
1580: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
1590: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
15a0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
15b0: 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  t( zName!=0 );. 
15c0: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
15d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
15e0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
15f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1600: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1610: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
1620: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
1630: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
1640: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
1650: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
1660: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
1670: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1680: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
1690: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
16a0: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
16b0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
16c0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c 48 61  db->aDb[j].tblHa
16d0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
16e0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
16f0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
1700: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1710: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1720: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1730: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1740: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1750: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1760: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1770: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1780: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1790: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
17a0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
17c0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
17d0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
17e0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
17f0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
1800: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
1810: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
1820: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1830: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1840: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
1850: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
1860: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
1870: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
1880: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1890: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
18a0: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
18b0: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
18c0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
18d0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 50 61 72 73  LocateTable(Pars
18e0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
18f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1900: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
1910: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
1920: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1930: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1940: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1950: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1960: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1970: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1980: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1990: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
19a0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
19b0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
19c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19d0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
19e0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
19f0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
1a00: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
1a10: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
1a20: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
1a30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a40: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a50: 20 74 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20   table: %s.%s", 
1a60: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
1a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1a80: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
1a90: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
1aa0: 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1ab0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ac0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
1ad0: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e  \"%s\" is not in
1ae0: 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1af0: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  ",.         zNam
1b00: 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20  e, zDbase);.    
1b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1b20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b30: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
1b40: 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ble: %s", zName)
1b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1b60: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1b70: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1b80: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
1b90: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1ba0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1bb0: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
1bc0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
1bd0: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
1be0: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
1bf0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
1c00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c10: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1c20: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
1c30: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1c40: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1c50: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1c60: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1c70: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
1c80: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
1c90: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
1ca0: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
1cb0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
1cc0: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
1cd0: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
1ce0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
1cf0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
1d00: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
1d10: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
1d20: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
1d30: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
1d40: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
1d50: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
1d60: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
1d70: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
1d80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1d90: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1da0: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
1db0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
1dc0: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1dd0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
1de0: 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64 62 2d  tialized) || db-
1df0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
1e00: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1e10: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
1e20: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
1e30: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
1e40: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
1e50: 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44  IN */.    if( zD
1e60: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
1e70: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
1e80: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
1e90: 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73  tinue;.    p = s
1ea0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
1eb0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78 48 61  db->aDb[j].idxHa
1ec0: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65  sh, zName, strle
1ed0: 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  n(zName)+1);.   
1ee0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
1ef0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
1f10: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
1f20: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
1f30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
1f40: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
1f50: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d  .  sqliteFree(p-
1f60: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
1f70: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  iteFree(p);.}../
1f80: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
1f90: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
1fa0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
1fb0: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
1fc0: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
1fd0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
1fe0: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1ff0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
2000: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
2010: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
2020: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
2030: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
2040: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
2050: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2060: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2070: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2080: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2090: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
20a0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
20b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
20c0: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
20d0: 2a 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74  *pOld;..  assert
20e0: 28 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e  ( db!=0 && p->zN
20f0: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64  ame!=0 );.  pOld
2100: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
2110: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
2120: 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70  >iDb].idxHash, p
2130: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61     strlen(p->zNa
2160: 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28  me)+1, 0);.  if(
2170: 20 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64   pOld!=0 && pOld
2180: 21 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=p ){.    sqlit
2190: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
21a0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64  ->aDb[p->iDb].id
21b0: 78 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61  xHash, pOld->zNa
21c0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
21d0: 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28           strlen(
21e0: 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20  pOld->zName)+1, 
21f0: 70 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 66 72 65  pOld);.  }.  fre
2200: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2210: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
2220: 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20  iven index from 
2230: 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
2240: 72 65 6d 6f 76 65 0a 2a 2a 20 74 68 65 20 69 6e  remove.** the in
2250: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
2260: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
2270: 64 20 66 72 65 65 20 69 74 73 20 6d 65 6d 6f 72  d free its memor
2280: 79 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e  y.** structures.
2290: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22a0: 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49  UnlinkAndDeleteI
22b0: 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  ndex(sqlite3 *db
22c0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74  , int iDb, const
22d0: 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29   char *zIdxName)
22e0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
22f0: 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  x;.  int len;.. 
2300: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 49   len = strlen(zI
2310: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
2320: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
2330: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
2340: 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 7a 49 64  Db].idxHash, zId
2350: 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20 30 29  xName, len+1, 0)
2360: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2370: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2380: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2390: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
23a0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
23b0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
23c0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
23d0: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
23e0: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
23f0: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2400: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2410: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2420: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2430: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2440: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2450: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2460: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2470: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2480: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2490: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
24a0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
24b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
24c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
24d0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
24e0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
24f0: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2500: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
2510: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
2520: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2530: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
2540: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
2550: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2560: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
2570: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
2580: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
2590: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
25a0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
25b0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
25c0: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
25d0: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
25e0: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
25f0: 0a 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68  .** If iDb<=0 th
2600: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
2610: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
2620: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
2630: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
2640: 49 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72  If iDb>=2 then r
2650: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
2660: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
2670: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
2680: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
2690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
26a0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
26b0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
26c0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68  int iDb){.  Hash
26d0: 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
26e0: 61 73 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73  ash temp1;.  Has
26f0: 68 20 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69  h temp2;.  int i
2700: 2c 20 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  , j;..  assert( 
2710: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
2720: 2d 3e 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66  ->nDb );.  db->f
2730: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2740: 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66  Initialized;.  f
2750: 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e  or(i=iDb; i<db->
2760: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
2770: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2780: 62 5b 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20  b[i];.    temp1 
2790: 3d 20 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a  = pDb->tblHash;.
27a0: 20 20 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d      temp2 = pDb-
27b0: 3e 74 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73  >trigHash;.    s
27c0: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
27d0: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53  pDb->trigHash, S
27e0: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
27f0: 47 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  G, 0);.    sqlit
2800: 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  e3HashClear(&pDb
2810: 2d 3e 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71  ->aFKey);.    sq
2820: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
2830: 70 44 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20  pDb->idxHash);. 
2840: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
2850: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
2860: 6d 70 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp2); pElem; pEl
2870: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
2880: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
2890: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72   sqlite3DeleteTr
28a0: 69 67 67 65 72 28 28 54 72 69 67 67 65 72 2a 29  igger((Trigger*)
28b0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
28c0: 45 6c 65 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Elem));.    }.  
28d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
28e0: 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20  ar(&temp2);.    
28f0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
2900: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53  &pDb->tblHash, S
2910: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2920: 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70  G, 0);.    for(p
2930: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
2940: 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45  irst(&temp1); pE
2950: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
2960: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
2970: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
2980: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
2990: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
29a0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
29b0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
29c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29d0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74 65  te3HashClear(&te
29e0: 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61  mp1);.    DbClea
29f0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  rProperty(db, i,
2a00: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2a10: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30  );.    if( iDb>0
2a20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20   ) return;.  }. 
2a30: 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20   assert( iDb==0 
2a40: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2a50: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
2a60: 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49  Changes;..  /* I
2a70: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  f one or more of
2a80: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2a90: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
2aa0: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20  s been closed,. 
2ab0: 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20   ** then remove 
2ac0: 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75  then from the au
2ad0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2ae0: 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20   list.  We take 
2af0: 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75  the.  ** opportu
2b00: 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20  nity to do this 
2b10: 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61  here since we ha
2b20: 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  ve just deleted 
2b30: 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  all of the.  ** 
2b40: 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c  schema hash tabl
2b50: 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  es and therefore
2b60: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2b70: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
2b80: 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20  .  ** to any of 
2b90: 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20  those tables..  
2ba0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2bb0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2bc0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
2bd0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
2be0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
2bf0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t==0 ){.      if
2c00: 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70  ( pDb->pAux && p
2c10: 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70  Db->xFreeAux ) p
2c20: 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62  Db->xFreeAux(pDb
2c30: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70  ->pAux);.      p
2c40: 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  Db->pAux = 0;.  
2c50: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
2c60: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
2c70: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2c80: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2c90: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2ca0: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2cb0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
2cc0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
2cd0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
2ce0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
2cf0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
2d00: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
2d10: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
2d20: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
2d30: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
2d40: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
2d50: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
2d60: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
2d70: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
2d80: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
2d90: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
2da0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
2db0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
2dc0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
2dd0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
2de0: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
2df0: 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44  qliteFree(db->aD
2e00: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
2e10: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
2e20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2e30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2e40: 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20  lled whenever a 
2e50: 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
2e60: 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 0a    If there were.
2e70: 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ** schema change
2e80: 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61  s during the tra
2e90: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77  nsaction, then w
2ea0: 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20  e have to reset 
2eb0: 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  the.** internal 
2ec0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
2ed0: 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d  reload them from
2ee0: 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   disk..*/.void s
2ef0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e  qlite3RollbackIn
2f00: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
2f10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
2f20: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
2f30: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2f40: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
2f50: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
2f60: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
2f70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f90: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
2fa0: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
2fb0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
2fc0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2fd0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
2fe0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2ff0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3000: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
3010: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
3020: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72 20  from a table or 
3030: 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  view..*/.static 
3040: 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65 74  void sqliteReset
3050: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
3060: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
3070: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
3080: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
3090: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f  Table!=0 );.  fo
30a0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
30b0: 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  le->aCol; i<pTab
30c0: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
30d0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  Col++){.    sqli
30e0: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61  teFree(pCol->zNa
30f0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
3100: 72 65 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  ree(pCol->zDflt)
3110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3120: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20  (pCol->zType);. 
3130: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
3140: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
3150: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
3160: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  0;.  pTable->nCo
3170: 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l = 0;.}../*.** 
3180: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
3190: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
31a0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
31b0: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
31c0: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
31d0: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
31e0: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
31f0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
3200: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
3210: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
3220: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
3230: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
3240: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
3250: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
3260: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f   hash table.  No
3270: 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65  r does it remove
3280: 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  .** foreign keys
3290: 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
32a0: 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  .aFKey hash tabl
32b0: 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20  e.  But it does 
32c0: 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72  destroy.** memor
32d0: 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  y structures of 
32e0: 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  the indices and 
32f0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73  foreign keys ass
3300: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a  ociated with .**
3310: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
3320: 2a 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * Indices associ
3330: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
3340: 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64  ble are unlinked
3350: 20 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a   from the "db".*
3360: 2a 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  * data structure
3370: 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49   if db!=NULL.  I
3380: 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69  f db==NULL, indi
3390: 63 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a  ces attached to.
33a0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65  ** the table are
33b0: 20 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74   deleted, but it
33c0: 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79   is assumed they
33d0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
33e0: 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a  en.** unlinked..
33f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3400: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3410: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3420: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3430: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3440: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20  .  FKey *pFKey, 
3450: 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69  *pNextFKey;..  i
3460: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
3470: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c  eturn;..  /* Del
3480: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
3490: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
34a0: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
34b0: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
34c0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
34d0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
34e0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
34f0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
3510: 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  dex->iDb==pTable
3520: 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65  ->iDb || (pTable
3530: 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64  ->iDb==0 && pInd
3540: 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20  ex->iDb==1) );. 
3550: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
3560: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
3570: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
3580: 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b  te all foreign k
3590: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
35a0: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
35b0: 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73   The keys.  ** s
35c0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
35d0: 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  dy been unlinked
35e0: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46   from the db->aF
35f0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a  Key hash table .
3600: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79    */.  for(pFKey
3610: 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20  =pTable->pFKey; 
3620: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65  pFKey; pFKey=pNe
3630: 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65  xtFKey){.    pNe
3640: 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e  xtFKey = pFKey->
3650: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61  pNextFrom;.    a
3660: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69  ssert( pTable->i
3670: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
3680: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3690: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
36a0: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
36b0: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
36e0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
36f0: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
3700: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
3710: 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ey);.  }..  /* D
3720: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
3730: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
3740: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
3750: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3760: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3770: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e  eFree(pTable->zN
3780: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
3790: 65 65 28 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  ee(pTable->zColA
37a0: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
37b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
37c0: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
37d0: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
37e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
37f0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
3800: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
3810: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
3820: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
3830: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
3840: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
3850: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
3860: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
3870: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3880: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
3890: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
38a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
38b0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
38c0: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a  ;.  FKey *pF1, *
38d0: 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  pF2;.  Db *pDb;.
38e0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
38f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
3900: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
3910: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
3920: 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61   zTabName && zTa
3930: 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44  bName[0] );.  pD
3940: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
3950: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
3960: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
3970: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
3980: 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 54 61 62 4e  me, strlen(zTabN
3990: 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66  ame)+1, 0);.  if
39a0: 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ( p ){.    for(p
39b0: 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31  F1=p->pFKey; pF1
39c0: 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74  ; pF1=pF1->pNext
39d0: 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74  From){.      int
39e0: 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46   nTo = strlen(pF
39f0: 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  1->zTo) + 1;.   
3a00: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
3a10: 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61  HashFind(&pDb->a
3a20: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
3a30: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nTo);.      if( 
3a40: 70 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20  pF2==pF1 ){.    
3a50: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
3a60: 6e 73 65 72 74 28 26 70 44 62 2d 3e 61 46 4b 65  nsert(&pDb->aFKe
3a70: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
3a80: 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 29 3b  , pF1->pNextTo);
3a90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3aa0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32        while( pF2
3ab0: 20 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f   && pF2->pNextTo
3ac0: 21 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32  !=pF1 ){ pF2=pF2
3ad0: 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20  ->pNextTo; }.   
3ae0: 20 20 20 20 20 69 66 28 20 70 46 32 20 29 7b 0a       if( pF2 ){.
3af0: 20 20 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70            pF2->p
3b00: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
3b10: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 20 20 7d  extTo;.        }
3b20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3b30: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
3b40: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
3b50: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
3b60: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
3b70: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3b80: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
3b90: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
3ba0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
3bb0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
3bc0: 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61  .** token with a
3bd0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65  ny quotations re
3be0: 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f  moved.  Space to
3bf0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
3c00: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
3c10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3c20: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
3c30: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
3c40: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
3c50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3c60: 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61 6c   Tokens are real
3c70: 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  ly just pointers
3c80: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3c90: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
3ca0: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
3cb0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
3cc0: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
3cd0: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
3ce0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3cf0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3d00: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3d10: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3d20: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3d30: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3d40: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3d50: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3d60: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3d70: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3d80: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3d90: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3da0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
3db0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
3dc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
3dd0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
3de0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
3df0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3e00: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3e10: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3e20: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3e30: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3e40: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3e50: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3e60: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3e70: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3e80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3e90: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
3ea0: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
3eb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ec0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
3ed0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
3ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ef0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3f00: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3f10: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3f20: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3f40: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3f50: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3f60: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3f70: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
3f80: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
3f90: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
3fa0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
3fb0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
3fc0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
3fd0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
3fe0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
3ff0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4000: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4010: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e  xist..*/.int fin
4020: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
4030: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4040: 20 20 69 6e 74 20 69 3b 0a 20 20 44 62 20 2a 70    int i;.  Db *p
4050: 44 62 3b 0a 20 20 66 6f 72 28 70 44 62 3d 64 62  Db;.  for(pDb=db
4060: 2d 3e 61 44 62 2c 20 69 3d 30 3b 20 69 3c 64 62  ->aDb, i=0; i<db
4070: 2d 3e 6e 44 62 3b 20 69 2b 2b 2c 20 70 44 62 2b  ->nDb; i++, pDb+
4080: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  +){.    if( pNam
4090: 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 70 44 62  e->n==strlen(pDb
40a0: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
40b0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
40c0: 74 72 4e 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  trNICmp(pDb->zNa
40d0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
40e0: 61 6d 65 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20  ame->n) ){.     
40f0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
4100: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
4110: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
4120: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
4130: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
4140: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
4150: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
4160: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
4170: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4180: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4190: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
41a0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
41b0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
41c0: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
41d0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
41e0: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
41f0: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4200: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4210: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
4220: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
4230: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
4240: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
4250: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
4260: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
4270: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
4280: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
4290: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
42a0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
42b0: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
42c0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
42d0: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
42e0: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
42f0: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
4300: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
4310: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
4320: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
4330: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
4340: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
4350: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
4360: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
4370: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4380: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4390: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
43a0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
43b0: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
43c0: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
43d0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
43e0: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
43f0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
4400: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
4410: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
4420: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
4430: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
4440: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
4450: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
4460: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
4470: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
4480: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4490: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
44a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
44b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
44c0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e  e->db;..  if( pN
44d0: 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
44e0: 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  n>0 ){.    asser
44f0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
4500: 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61  y );.    *pUnqua
4510: 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20  l = pName2;.    
4520: 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64 62 2c  iDb = findDb(db,
4530: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
4540: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
4550: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4560: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
4570: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
4580: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
4590: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
45a0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
45b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
45c0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
45d0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
45e0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
45f0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
4600: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
4610: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
4620: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
4630: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4640: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
4650: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
4660: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
4670: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
4680: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
4690: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
46a0: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
46b0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
46c0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
46d0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
46e0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
46f0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
4700: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
4710: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
4720: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
4730: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
4740: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
4750: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
4760: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
4770: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
4780: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
4790: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
47a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
47b0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
47c0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
47d0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
47e0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
47f0: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
4800: 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  StrNICmp(zName, 
4810: 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b  "sqlite_", 7) ){
4820: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4830: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62  rMsg(pParse, "ob
4840: 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76  ject name reserv
4850: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
4860: 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  use: %s", zName)
4870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
4880: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
4890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
48a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  K;.}../*.** Begi
48b0: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
48c0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
48d0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
48e0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
48f0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
4900: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
4910: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
4920: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
4930: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
4940: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
4950: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
4960: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
4970: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
4980: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
4990: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
49a0: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
49b0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a 2a 2a  le name.  The.**
49c0: 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20 69 73   pStart token is
49d0: 20 74 68 65 20 43 52 45 41 54 45 20 61 6e 64 20   the CREATE and 
49e0: 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74 61 62  pName is the tab
49f0: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 73  le name.  The is
4a00: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
4a10: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
4a20: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
4a30: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
4a40: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
4a50: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
4a60: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
4a70: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
4a80: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
4a90: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
4aa0: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
4ab0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
4ac0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
4ad0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
4ae0: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
4af0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
4b00: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
4b10: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
4b20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
4b30: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
4b40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
4b50: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
4b60: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
4b70: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
4b80: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
4b90: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
4ba0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
4bb0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
4bc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
4bd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
4be0: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
4bf0: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
4c00: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
4c10: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
4c20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
4c30: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
4c40: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
4c50: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
4c60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4c70: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
4c80: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
4c90: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
4ca0: 68 65 20 22 43 52 45 41 54 45 22 20 74 6f 6b 65  he "CREATE" toke
4cb0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
4cc0: 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74  ame1,   /* First
4cd0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
4ce0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
4cf0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  r view */.  Toke
4d00: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20  n *pName2,   /* 
4d10: 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74  Second part of t
4d20: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
4d30: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
4d40: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
4d50: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4d60: 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62  is is a TEMP tab
4d70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  le */.  int isVi
4d80: 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ew       /* True
4d90: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49   if this is a VI
4da0: 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  EW */.){.  Table
4db0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e 64 65   *pTable;.  Inde
4dc0: 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61 72 20  x *pIdx;.  char 
4dd0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
4de0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
4df0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
4e00: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
4e10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
4e20: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
4e30: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
4e40: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
4e50: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
4e60: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
4e70: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
4e80: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
4e90: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
4ea0: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
4eb0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
4ec0: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
4ed0: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
4ee0: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
4ef0: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
4f00: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
4f10: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
4f20: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4f30: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
4f40: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
4f50: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
4f60: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
4f70: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
4f80: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
4f90: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
4fa0: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
4fb0: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
4fc0: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
4fd0: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
4fe0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
4ff0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5000: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5010: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
5020: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
5030: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
5040: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5050: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5060: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
5070: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
5080: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5090: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
50a0: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
50b0: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
50c0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
50d0: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
50e0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
50f0: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
5100: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
5110: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
5120: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
5130: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
5140: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
5150: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
5160: 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 69   if( isTemp && i
5170: 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Db>1 ){.    /* I
5180: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
5190: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
51a0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
51b0: 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71  lified */.    sq
51c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
51d0: 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79  arse, "temporary
51e0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74   table name must
51f0: 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22   be unqualified"
5200: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
5210: 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Err++;.    retur
5220: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  n;.  }.  if( isT
5230: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
5240: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
5250: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
5260: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5270: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
5280: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
5290: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
52a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
52b0: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
52c0: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
52d0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  Name) ){.    sql
52e0: 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  iteFree(zName);.
52f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5300: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5310: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5320: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5330: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5340: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5350: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5360: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5370: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5380: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5390: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
53a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
53b0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
53c0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
53d0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
53e0: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
53f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
5400: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
5410: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
5420: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
5430: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
5440: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5450: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5460: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
5470: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
5480: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5490: 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  ATE_VIEW;.      
54a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
54b0: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
54c0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
54d0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
54e0: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
54f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
5500: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
5510: 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ATE_TABLE;.     
5520: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5530: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
5540: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
5550: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
5560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
5570: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
5580: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
5590: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
55a0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
55b0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
55c0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
55d0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
55e0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
55f0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
5600: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
5610: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
5620: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
5630: 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
5640: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
5650: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
5660: 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b  Parse) ) return;
5670: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
5680: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
5690: 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b   zName, db->aDb[
56a0: 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69  iDb].zName);.  i
56b0: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
56c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
56d0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
56e0: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
56f0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
5700: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
5710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5720: 20 7d 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d   }.  if( (pIdx =
5730: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
5740: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29  x(db, zName, 0))
5750: 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 28 20  !=0 && .      ( 
5760: 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69  iDb==0 || !db->i
5770: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
5780: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5790: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
57a0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
57b0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
57c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
57d0: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
57e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
57f0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d  pTable = sqliteM
5800: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
5810: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
5820: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  able==0 ){.    p
5830: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
5840: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50  TE_NOMEM;.    pP
5850: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5860: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
5870: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
5880: 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a  .  }.  pTable->z
5890: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
58a0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
58b0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ;.  pTable->aCol
58c0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
58d0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
58e0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30  able->pIndex = 0
58f0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20  ;.  pTable->iDb 
5900: 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61  = iDb;.  if( pPa
5910: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
5920: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
5930: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
5940: 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50  pNewTable);.  pP
5950: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
5960: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
5970: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
5980: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
5990: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
59a0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
59b0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
59c0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
59d0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
59e0: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
59f0: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
5a00: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
5a10: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
5a20: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
5a30: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
5a40: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
5a50: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
5a60: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
5a70: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
5a80: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
5a90: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
5aa0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
5ab0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
5ac0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
5ad0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
5ae0: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
5af0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5b00: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
5b10: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
5b20: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
5b30: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
5b40: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
5b50: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
5b60: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5b70: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
5b80: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
5b90: 44 62 29 3b 0a 20 20 20 20 2f 2a 20 45 76 65 72  Db);.    /* Ever
5ba0: 79 20 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62  y time a new tab
5bb0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 20 74 68  le is created th
5bc0: 65 20 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20  e file-format.  
5bd0: 20 20 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e    ** and encodin
5be0: 67 20 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72  g meta-values ar
5bf0: 65 20 73 65 74 20 69 6e 20 74 68 65 20 64 61 74  e set in the dat
5c00: 61 62 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a  abase, in.    **
5c10: 20 63 61 73 65 20 74 68 69 73 20 69 73 20 74 68   case this is th
5c20: 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 63 72  e first table cr
5c30: 65 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eated..    */.  
5c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c50: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5c60: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
5c70: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
5c80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5c90: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5ca0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
5cb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5cc0: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e  _Integer, db->en
5cd0: 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
5ce0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5cf0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5d00: 2c 20 34 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  , 4);..    sqlit
5d10: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
5d20: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  e(v, iDb);.    s
5d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5d40: 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
5d50: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5d60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5d70: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
5d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d90: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
5da0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5db0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5dc0: 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
5dd0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
5de0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
5df0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
5e00: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
5e10: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
5e20: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
5e30: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
5e40: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
5e50: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
5e60: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
5e70: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
5e80: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
5e90: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
5ea0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
5eb0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
5ec0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
5ed0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
5ee0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
5ef0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5f00: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
5f10: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
5f20: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
5f30: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5f40: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
5f50: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
5f60: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
5f70: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
5f80: 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
5f90: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5fa0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
5fb0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
5fc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
5fd0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
5fe0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
5ff0: 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  z, p->aCol[i].zN
6000: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
6010: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6020: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
6030: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
6040: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
6050: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
6060: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6070: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
6080: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
6090: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
60a0: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
60b0: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70  sqliteRealloc( p
60c0: 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c  ->aCol, (p->nCol
60d0: 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43  +8)*sizeof(p->aC
60e0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  ol[0]));.    if(
60f0: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
6100: 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d  n;.    p->aCol =
6110: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
6120: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
6130: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
6140: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
6150: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
6160: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
6170: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
6180: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
6190: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
61a0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
61b0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
61c0: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
61d0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
61e0: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
61f0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
6200: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
6210: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
6220: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
6230: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
6240: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
6250: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
6260: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c  E;.  pCol->pColl
6270: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
6280: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e  DfltColl;.  p->n
6290: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
62a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
62b0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
62c0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
62d0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
62e0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
62f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6300: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
6310: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
6320: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
6330: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
6340: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
6350: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
6360: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
6370: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
6380: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6390: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
63a0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
63b0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
63c0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
63d0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20  int i;.  if( (p 
63e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
63f0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
6400: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
6410: 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  1;.  if( i>=0 ) 
6420: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75  p->aCol[i].notNu
6430: 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a  ll = onError;.}.
6440: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6450: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
6460: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
6470: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
6480: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
6490: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
64a0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
64b0: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
64c0: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
64d0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
64e0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
64f0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
6500: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
6510: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
6520: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
6530: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
6540: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
6550: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
6560: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
6570: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
6580: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
6590: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
65a0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
65b0: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
65c0: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
65d0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
65e0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
65f0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
6600: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69  arse, Token *pFi
6610: 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73  rst, Token *pLas
6620: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
6630: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
6640: 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  t n;.  char *z, 
6650: 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  **pz;.  Column *
6660: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
6670: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6680: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
6690: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
66a0: 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  ;.  if( i<0 ) re
66b0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
66c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a  p->aCol[i];.  pz
66d0: 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b   = &pCol->zType;
66e0: 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20  .  n = pLast->n 
66f0: 2b 20 28 70 4c 61 73 74 2d 3e 7a 20 2d 20 70 46  + (pLast->z - pF
6700: 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 61 73 73 65  irst->z);.  asse
6710: 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d  rt( pCol->zType=
6720: 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70 43 6f 6c  =0 );.  z = pCol
6730: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
6740: 33 4d 50 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c  3MPrintf("%.*s",
6750: 20 6e 2c 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a   n, pFirst->z);.
6760: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
6770: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  urn;.  for(i=j=0
6780: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
6790: 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b 0a    int c = z[i];.
67a0: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
67b0: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
67c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
67d0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
67e0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
67f0: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
6800: 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a 0a  yType(z, n);.}..
6810: 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e 20  /*.** The given 
6820: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65 66  token is the def
6830: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
6840: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
6850: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  dded to.** the t
6860: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
6870: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6880: 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c 61  n.  If "minusFla
6890: 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a 2a  g" is true, it.*
68a0: 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c 75  * means the valu
68b0: 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65 63  e token was prec
68c0: 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73 20  eded by a minus 
68d0: 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sign..**.** This
68e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
68f0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
6900: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
6910: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
6920: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
6930: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
6940: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
6950: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
6960: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
6970: 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e 75   *pVal, int minu
6980: 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65 20  sFlag){.  Table 
6990: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
69a0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 28 70  har *z;.  if( (p
69b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
69c0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
69d0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
69e0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
69f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
6a00: 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66  ( p->aCol[i].zDf
6a10: 6c 74 3d 3d 30 20 29 3b 0a 20 20 7a 20 3d 20 70  lt==0 );.  z = p
6a20: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 20  ->aCol[i].zDflt 
6a30: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
6a40: 28 22 25 73 25 54 22 2c 20 6d 69 6e 75 73 46 6c  ("%s%T", minusFl
6a50: 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 70  ag ? "-" : "", p
6a60: 56 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Val);.  sqlite3D
6a70: 65 71 75 6f 74 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a  equote(z);.}../*
6a80: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
6a90: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
6aa0: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
6ab0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
6ac0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
6ad0: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
6ae0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
6af0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
6b00: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
6b10: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
6b20: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
6b30: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
6b40: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
6b50: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
6b60: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
6b70: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
6b80: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
6b90: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
6ba0: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
6bb0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
6bc0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
6bd0: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
6be0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
6bf0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
6c00: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
6c10: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
6c20: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
6c30: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
6c40: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
6c50: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
6c60: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
6c70: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
6c80: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
6c90: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
6ca0: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
6cb0: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
6cc0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
6cd0: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
6ce0: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
6cf0: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
6d00: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
6d10: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
6d20: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
6d30: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6d40: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
6d50: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
6d60: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
6d70: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
6d80: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
6d90: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
6da0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
6db0: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
6dc0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
6dd0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
6de0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
6df0: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
6e00: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
6e10: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
6e20: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
6e30: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
6e40: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
6e50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
6e60: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
6e70: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
6e80: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
6e90: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
6ea0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
6eb0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
6ec0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
6ed0: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
6ee0: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
6ef0: 20 69 6e 74 20 61 75 74 6f 49 6e 63 20 20 20 20   int autoInc    
6f00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
6f10: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
6f20: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
6f30: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
6f40: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
6f50: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
6f60: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
6f70: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
6f80: 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  i;.  if( pTab==0
6f90: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
6fa0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
6fb0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
6fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6fd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6fe0: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
6ff0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
7000: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
7010: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
7020: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
7030: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
7040: 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69  }.  pTab->hasPri
7050: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  mKey = 1;.  if( 
7060: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
7070: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
7080: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  l - 1;.    pTab-
7090: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
70a0: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  imKey = 1;.  }el
70b0: 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
70c0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
70d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
70e0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
70f0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
7100: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
7110: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
7120: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
7130: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7140: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
7150: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7160: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7170: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
7180: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54  <pTab->nCol ) pT
7190: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
71a0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
71b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
71c0: 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f  t->nExpr>1 ) iCo
71d0: 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  l = -1;.  }.  if
71e0: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
71f0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  l<pTab->nCol ){.
7200: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7210: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7220: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54  pe;.  }.  if( zT
7230: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
7240: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
7250: 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20  TEGER")==0 ){.  
7260: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
7270: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
7280: 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f  keyConf = onErro
7290: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 75 74  r;.    pTab->aut
72a0: 6f 49 6e 63 20 3d 20 61 75 74 6f 49 6e 63 3b 0a  oInc = autoInc;.
72b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
72c0: 49 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Inc ){.    sqlit
72d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
72e0: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
72f0: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
7300: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
7310: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
7320: 59 20 4b 45 59 22 29 3b 0a 20 20 7d 65 6c 73 65  Y KEY");.  }else
7330: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
7340: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
7350: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
7360: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
7370: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
7380: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
7390: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
73a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
73b0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
73c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
73d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
73e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
73f0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
7400: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
7410: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
7420: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
7430: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
7440: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
7450: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
7460: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
7470: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7480: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
7490: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
74a0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
74b0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
74c0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
74d0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
74e0: 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  ol-1;..  pColl =
74f0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
7500: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
7510: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70  ype, nType);.  p
7520: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
7530: 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49  = pColl;..  /* I
7540: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
7550: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
7560: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
7570: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
7580: 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e  .  ** then an in
7590: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
75a0: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
75b0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
75c0: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  the.  ** collati
75d0: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
75e0: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
75f0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
7600: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  e..  */.  for(pI
7610: 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20  dx = p->pIndex; 
7620: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
7630: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73  >pNext){.    ass
7640: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
7650: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  mn==1 );.    if(
7660: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
7670: 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65  0]==i ) pIdx->ke
7680: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
7690: 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pColl;.  }.}../
76a0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20  *.** Locate and 
76b0: 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20  return an entry 
76c0: 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c  from the db.aCol
76d0: 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e  lSeq hash table.
76e0: 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a   If the entry.**
76f0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e   specified by zN
7700: 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73  ame and nName is
7710: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70   not found and p
7720: 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65  arameter 'create
7730: 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  ' is.** true, th
7740: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
7750: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
7760: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
7770: 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72  .** Each pointer
7780: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
7790: 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20  qlite3.aCollSeq 
77a0: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
77b0: 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20  ins an.** array 
77c0: 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71  of three CollSeq
77d0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
77e0: 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f   first is the co
77f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7800: 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66  .** prefferred f
7810: 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65  or UTF-8, the se
7820: 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61  cond UTF-16le, a
7830: 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46  nd the third UTF
7840: 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f  -16be..**.** Sto
7850: 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  red immediately 
7860: 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20  after the three 
7870: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7880: 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ces is a copy of
7890: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  .** the collatio
78a0: 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e  n sequence name.
78b0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
78c0: 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f  is string is sto
78d0: 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63  red in.** each c
78e0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
78f0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
7900: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
7910: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
7920: 79 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  y(.  sqlite3 *db
7930: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7940: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
7950: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
7960: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
7970: 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d  Coll;.  if( nNam
7980: 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74  e<0 ) nName = st
7990: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  rlen(zName);.  p
79a0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
79b0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
79c0: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
79d0: 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70  me);..  if( 0==p
79e0: 43 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29  Coll && create )
79f0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
7a00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69  liteMalloc( 3*si
7a10: 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e  zeof(*pColl) + n
7a20: 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20  Name + 1 );.    
7a30: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
7a40: 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d     pColl[0].zNam
7a50: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7a60: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7a70: 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[0].enc = SQLIT
7a80: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43  E_UTF8;.      pC
7a90: 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[1].zName = (
7aa0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
7ab0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e  .      pColl[1].
7ac0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
7ad0: 31 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c  16LE;.      pCol
7ae0: 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68  l[2].zName = (ch
7af0: 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20  ar*)&pColl[3];. 
7b00: 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e       pColl[2].en
7b10: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
7b20: 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  BE;.      memcpy
7b30: 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c  (pColl[0].zName,
7b40: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
7b50: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a        pColl[0].z
7b60: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
7b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
7b80: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43  shInsert(&db->aC
7b90: 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d  ollSeq, pColl[0]
7ba0: 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70  .zName, nName, p
7bb0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
7bc0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
7bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
7be0: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
7bf0: 20 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   to a UTF-8 enco
7c00: 64 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65  ded string nName
7c10: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20   bytes long..** 
7c20: 52 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53  Return the CollS
7c30: 65 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20  eq* pointer for 
7c40: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7c50: 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61  quence named zNa
7c60: 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  me.** for the en
7c70: 63 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f  coding 'enc' fro
7c80: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27  m the database '
7c90: 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  db'..**.** If th
7ca0: 65 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65  e entry specifie
7cb0: 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  d is not found a
7cc0: 6e 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74  nd 'create' is t
7cd0: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
7ce0: 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e   a.** new entry.
7cf0: 20 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75    Otherwise retu
7d00: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c  rn NULL..*/.Coll
7d10: 53 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  Seq *sqlite3Find
7d20: 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74  CollSeq(.  sqlit
7d30: 65 33 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63  e3 *db,.  u8 enc
7d40: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7d50: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61  zName,.  int nNa
7d60: 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65  me,.  int create
7d70: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
7d80: 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53  Coll = findCollS
7d90: 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d  eqEntry(db, zNam
7da0: 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65  e, nName, create
7db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
7dc0: 49 54 45 5f 55 54 46 38 3d 3d 31 20 26 26 20 53  ITE_UTF8==1 && S
7dd0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3d 3d 32  QLITE_UTF16LE==2
7de0: 20 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36   && SQLITE_UTF16
7df0: 42 45 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72  BE==3 );.  asser
7e00: 74 28 20 65 6e 63 3e 3d 53 51 4c 49 54 45 5f 55  t( enc>=SQLITE_U
7e10: 54 46 38 20 26 26 20 65 6e 63 3c 3d 53 51 4c 49  TF8 && enc<=SQLI
7e20: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
7e30: 69 66 28 20 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  if( pColl ) pCol
7e40: 6c 20 2b 3d 20 65 6e 63 2d 31 3b 0a 20 20 72 65  l += enc-1;.  re
7e50: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
7e60: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
7e70: 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65  'collation neede
7e80: 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 72  d' callback to r
7e90: 65 71 75 65 73 74 20 61 20 63 6f 6c 6c 61 74 69  equest a collati
7ea0: 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 69  on sequence.** i
7eb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
7ec0: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ext encoding of 
7ed0: 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  name zName, leng
7ee0: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 20 49 66 20  th nName..** If 
7ef0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7f00: 71 75 65 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63  quence.*/.static
7f10: 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e 65   void callCollNe
7f20: 65 64 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  eded(sqlite3 *db
7f30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
7f40: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
7f50: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
7f60: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21  xCollNeeded || !
7f70: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
7f80: 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  6 );.  if( nName
7f90: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
7fa0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
7fb0: 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65  ( db->xCollNeede
7fc0: 64 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  d ){.    char *z
7fd0: 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74  External = sqlit
7fe0: 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d 65 2c 20  eStrNDup(zName, 
7ff0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
8000: 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65 74  !zExternal ) ret
8010: 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f  urn;.    db->xCo
8020: 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e 70 43 6f  llNeeded(db->pCo
8030: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c  llNeededArg, db,
8040: 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a   (int)db->enc, z
8050: 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20 20 20 73  External);.    s
8060: 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65 72  qliteFree(zExter
8070: 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nal);.  }.  if( 
8080: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
8090: 36 20 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f  6 ){.    char co
80a0: 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61 6c 3b 0a  nst *zExternal;.
80b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
80c0: 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  e *pTmp = sqlite
80d0: 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
80e0: 75 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ue(db);.    sqli
80f0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
8100: 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d 65 2c 20  Tmp, -1, zName, 
8110: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
8120: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
8130: 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71 6c   zExternal = sql
8140: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 54  ite3ValueText(pT
8150: 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  mp, SQLITE_UTF16
8160: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
8170: 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20 72 65   !zExternal ) re
8180: 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e 78 43  turn;.    db->xC
8190: 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64 62 2d 3e  ollNeeded16(db->
81a0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
81b0: 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63  db, (int)db->enc
81c0: 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  , zExternal);.  
81d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
81e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
81f0: 64 20 69 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  d if the collati
8200: 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69 6c 73  on factory fails
8210: 20 74 6f 20 64 65 6c 69 76 65 72 20 61 0a 2a 2a   to deliver a.**
8220: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74   collation funct
8230: 69 6f 6e 20 69 6e 20 74 68 65 20 62 65 73 74 20  ion in the best 
8240: 65 6e 63 6f 64 69 6e 67 20 62 75 74 20 74 68 65  encoding but the
8250: 72 65 20 6d 61 79 20 62 65 20 6f 74 68 65 72 20  re may be other 
8260: 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 74  versions.** of t
8270: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  his collation fu
8280: 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f 74 68 65  nction (for othe
8290: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  r text encodings
82a0: 29 20 61 76 61 69 6c 61 62 6c 65 2e 20 55 73 65  ) available. Use
82b0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 73 65   one.** of these
82c0: 20 69 6e 73 74 65 61 64 20 69 66 20 74 68 65 79   instead if they
82d0: 20 65 78 69 73 74 2e 20 41 76 6f 69 64 20 61 20   exist. Avoid a 
82e0: 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46 2d 31 36  UTF-8 <-> UTF-16
82f0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66 0a 2a   conversion if.*
8300: 2a 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73  * possible..*/.s
8310: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 74 68 43  tatic int synthC
8320: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
8330: 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71 20 2a 70  arse, CollSeq *p
8340: 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  Coll){.  CollSeq
8350: 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63 68 61 72   *pColl2;.  char
8360: 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   *z = pColl->zNa
8370: 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  me;.  int n = st
8380: 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 71 6c 69 74  rlen(z);.  sqlit
8390: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
83a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
83b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
83c0: 61 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c 49 54  aEnc[] = { SQLIT
83d0: 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54  E_UTF16BE, SQLIT
83e0: 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54  E_UTF16LE, SQLIT
83f0: 45 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f 72 28  E_UTF8 };.  for(
8400: 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a  i=0; i<3; i++){.
8410: 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c      pColl2 = sql
8420: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
8430: 64 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a 2c 20  db, aEnc[i], z, 
8440: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  n, 0);.    if( p
8450: 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30 20 29  Coll2->xCmp!=0 )
8460: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
8470: 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20 73 69  Coll, pColl2, si
8480: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29 3b 0a  zeof(CollSeq));.
8490: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
84a0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
84b0: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
84c0: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nErr==0 ){.    s
84d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
84e0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
84f0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8500: 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 2c 20 7a 29  ce: %.*s", n, z)
8510: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
8520: 6e 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  nErr++;.  return
8530: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
8540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8550: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
8560: 6e 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  n a collation se
8570: 71 75 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74  quence before it
8580: 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63   is used to.** c
8590: 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20  heck that it is 
85a0: 64 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65  defined. An unde
85b0: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  fined collation 
85c0: 73 65 71 75 65 6e 63 65 20 65 78 69 73 74 73 20  sequence exists 
85d0: 77 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61  when.** a databa
85e0: 73 65 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61  se is loaded tha
85f0: 74 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72  t contains refer
8600: 65 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69  ences to collati
8610: 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20  on sequences.** 
8620: 74 68 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65  that have not be
8630: 65 6e 20 64 65 66 69 6e 65 64 20 62 79 20 73 71  en defined by sq
8640: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
8650: 6c 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a  lation() etc..**
8660: 0a 2a 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c  .** If required,
8670: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
8680: 6c 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69  lls the 'collati
8690: 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62  on needed' callb
86a0: 61 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ack to.** reques
86b0: 74 20 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  t a definition o
86c0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  f the collating 
86d0: 73 65 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69  sequence. If thi
86e0: 73 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20  s doesn't work, 
86f0: 0a 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e  .** an equivalen
8700: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
8710: 65 6e 63 65 20 74 68 61 74 20 75 73 65 73 20 61  ence that uses a
8720: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64   text encoding d
8730: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
8740: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
8750: 73 65 20 69 73 20 73 75 62 73 74 69 74 75 74 65  se is substitute
8760: 64 2c 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61  d, if one is ava
8770: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ilable..*/.int s
8780: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8790: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
87a0: 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  , CollSeq *pColl
87b0: 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  ){.  if( pColl &
87c0: 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  & !pColl->xCmp )
87d0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c  {.    /* No coll
87e0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
87f0: 66 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20  f this type for 
8800: 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73  this encoding is
8810: 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20   registered..   
8820: 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c   ** Call the col
8830: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74  lation factory t
8840: 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20  o see if it can 
8850: 73 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f  supply us with o
8860: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ne..    */.    c
8870: 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50  allCollNeeded(pP
8880: 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d  arse->db, pColl-
8890: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
88a0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  Coll->zName));. 
88b0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78     if( !pColl->x
88c0: 43 6d 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c  Cmp && synthColl
88d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c  Seq(pParse, pCol
88e0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  l) ){.      retu
88f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
8900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8910: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8920: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
8930: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
8940: 28 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61  () for all colla
8950: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69  ting sequences i
8960: 6e 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69  n an index,.** i
8970: 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66  n order to verif
8980: 79 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e  y that all the n
8990: 65 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69  ecessary collati
89a0: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65  ng sequences are
89b0: 0a 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69  .** loaded..*/.i
89c0: 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49  nt sqlite3CheckI
89d0: 6e 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73  ndexCollSeq(Pars
89e0: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
89f0: 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70   *pIdx){.  if( p
8a00: 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Idx ){.    int i
8a10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8a20: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
8a30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8a40: 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c  sqlite3CheckColl
8a50: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78  Seq(pParse, pIdx
8a60: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
8a70: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  i]) ){.        r
8a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
8a90: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
8aa0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
8ab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8ac0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8ad0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
8ae0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8af0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
8b00: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
8b10: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
8b20: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
8b30: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
8b40: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8b50: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
8b60: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
8b70: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
8b80: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
8b90: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
8ba0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
8bb0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
8bc0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
8bd0: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
8be0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
8bf0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
8c00: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
8c10: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
8c20: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
8c30: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
8c40: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
8c50: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
8c60: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
8c70: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
8c80: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
8c90: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
8ca0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
8cb0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
8cc0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
8cd0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
8ce0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
8cf0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
8d00: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
8d10: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
8d20: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
8d30: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
8d40: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
8d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8d60: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
8d70: 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73    u8 enc = pPars
8d80: 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38  e->db->enc;.  u8
8d90: 20 69 6e 69 74 62 75 73 79 20 3d 20 70 50 61 72   initbusy = pPar
8da0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
8db0: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
8dc0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
8dd0: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
8de0: 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  >db, enc, zName,
8df0: 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   nName, initbusy
8e00: 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30  );.  if( nName<0
8e10: 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65   ) nName = strle
8e20: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(zName);.  if( 
8e30: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
8e40: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
8e50: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20  xCmp) ){.    /* 
8e60: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
8e70: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
8e80: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
8e90: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
8ea0: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8eb0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8ec0: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8ed0: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8ee0: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
8ef0: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
8f00: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
8f10: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
8f20: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
8f30: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70  te3FindCollSeq(p
8f40: 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20  Parse->db, enc, 
8f50: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29  zName, nName, 0)
8f60: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
8f70: 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  && !pColl->xCmp 
8f80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
8f90: 65 20 6d 61 79 20 62 65 20 61 20 76 65 72 73 69  e may be a versi
8fa0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  on of the collat
8fb0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
8fc0: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
8fd0: 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20   ** translation 
8fe0: 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67  between encoding
8ff0: 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69 74  s. Search for it
9000: 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53   with synthCollS
9010: 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eq()..      */. 
9020: 20 20 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f       if( synthCo
9030: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
9040: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
9050: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
9060: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
9070: 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73  * If nothing has
9080: 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69   been found, wri
9090: 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  te the error mes
90a0: 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65  sage into pParse
90b0: 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62   */.  if( !initb
90c0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
90d0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
90e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
90f0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
9100: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9110: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
9120: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
9130: 65 71 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20  equence: %.*s", 
9140: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  nName, zName);. 
9150: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d     }.    pColl =
9160: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9170: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   pColl;.}..../*.
9180: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
9190: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
91a0: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
91b0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
91c0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
91d0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f  ffinity type..*/
91e0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
91f0: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
9200: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
9210: 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e   nType){.  int n
9220: 2c 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  , i;.  static co
9230: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
9240: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
9250: 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20  b;  /* Keywords 
9260: 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61  substring to sea
9270: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63  rch for */.    c
9280: 68 61 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20  har nSub;       
9290: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a    /* length of z
92a0: 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  Sub */.    char 
92b0: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a  affinity;     /*
92c0: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74   Affinity to ret
92d0: 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65  urn if it matche
92e0: 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69  s */.  } substri
92f0: 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22  ngs[] = {.    {"
9300: 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45  INT",  3, SQLITE
9310: 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20  _AFF_INTEGER},. 
9320: 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53     {"CHAR", 4, S
9330: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
9340: 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c  .    {"CLOB", 4,
9350: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9360: 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20  },.    {"TEXT", 
9370: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
9380: 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22  XT},.    {"BLOB"
9390: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
93a0: 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  NONE},.  };..  i
93b0: 66 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( nType==0 ){. 
93c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
93d0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  _AFF_NONE;.  }. 
93e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
93f0: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73  of(substrings)/s
9400: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
9410: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
9420: 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74 72 69  int c1 = substri
9430: 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a  ngs[i].zSub[0];.
9440: 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c      int c2 = tol
9450: 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e  ower(c1);.    in
9460: 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20  t limit = nType 
9470: 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  - substrings[i].
9480: 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nSub;.    const 
9490: 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72  char *z = substr
94a0: 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20  ings[i].zSub;.  
94b0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69    for(n=0; n<=li
94c0: 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  mit; n++){.     
94d0: 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e   int c = zType[n
94e0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d  ];.      if( (c=
94f0: 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20  =c1 || c==c2).  
9500: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d             && 0=
9510: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
9520: 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73  (&zType[n], z, s
9530: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75  ubstrings[i].nSu
9540: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
9550: 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b  turn substrings[
9560: 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  i].affinity;.   
9570: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
9590: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f  FF_NUMERIC;.}../
95a0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
95b0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
95c0: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
95d0: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
95e0: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
95f0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
9600: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
9610: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
9620: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
9630: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
9640: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
9650: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
9660: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
9670: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
9680: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
9690: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
96a0: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
96b0: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
96c0: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
96d0: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
96e0: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
96f0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
9700: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
9710: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
9720: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
9730: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
9740: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
9750: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
9760: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
9770: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
9780: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
9790: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
97a0: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
97b0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
97c0: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
97d0: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
97e0: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
97f0: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
9800: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
9810: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
9820: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
9830: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
9840: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
9850: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
9860: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
9870: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
9880: 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33  geCookie(sqlite3
9890: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
98a0: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
98b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
98c0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
98d0: 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
98e0: 6f 6f 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73  ookie+1, 0);.  s
98f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9900: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
9910: 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a   iDb, 0);.}../*.
9920: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
9930: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
9940: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
9950: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
9960: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
9970: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
9980: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
9990: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
99a0: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
99b0: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
99c0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
99d0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
99e0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
99f0: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
9a00: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
9a10: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
9a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
9a30: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
9a40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
9a50: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
9a60: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
9a70: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
9a80: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
9a90: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
9aa0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65  .** Write an ide
9ab0: 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65  ntifier onto the
9ac0: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65   end of the give
9ad0: 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a  n string.  Add.*
9ae0: 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  * quote characte
9af0: 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f  rs as needed..*/
9b00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65  .static void ide
9b10: 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69  ntPut(char *z, i
9b20: 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a  nt *pIdx, char *
9b30: 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20  zSignedIdent){. 
9b40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9b50: 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e  zIdent = (unsign
9b60: 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64  ed char*)zSigned
9b70: 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20  Ident;.  int i, 
9b80: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
9b90: 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72  i = *pIdx;.  for
9ba0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
9bb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
9bc0: 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  isalnum(zIdent[j
9bd0: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
9be0: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
9bf0: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
9c00: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c   zIdent[j]!=0 ||
9c10: 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b   isdigit(zIdent[
9c20: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
9c30: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9c40: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
9c50: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
9c60: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
9c70: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
9c80: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
9c90: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
9ca0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
9cb0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
9cc0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
9cd0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
9ce0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
9cf0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
9d00: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
9d10: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
9d20: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
9d30: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9d40: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
9d50: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
9d60: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
9d70: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
9d80: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
9d90: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
9da0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
9db0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
9dc0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
9dd0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
9de0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
9df0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
9e00: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
9e10: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
9e20: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
9e30: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
9e40: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
9e50: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
9e60: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
9e70: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
9e80: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
9e90: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
9ea0: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
9eb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
9ec0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
9ed0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
9ee0: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20  n += (strlen(z) 
9ef0: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 1);.    }.  }.
9f00: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
9f10: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
9f20: 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20  if( n<50 ){.    
9f30: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
9f40: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
9f50: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
9f60: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
9f70: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
9f80: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
9f90: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
9fa0: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
9fb0: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
9fc0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
9fd0: 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20  Raw( n );.  if( 
9fe0: 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72  zStmt==0 ) retur
9ff0: 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53  n 0;.  strcpy(zS
a000: 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f  tmt, p->iDb==1 ?
a010: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41   "CREATE TEMP TA
a020: 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20  BLE " : "CREATE 
a030: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
a040: 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20  strlen(zStmt);. 
a050: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
a060: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
a070: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
a080: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
a090: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
a0a0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
a0b0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  l++){.    strcpy
a0c0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
a0d0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
a0e0: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
a0f0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
a100: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
a110: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
a120: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28  Name);.    if( (
a130: 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29  z = pCol->zType)
a140: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  !=0 ){.      zSt
a150: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  mt[k++] = ' ';. 
a160: 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74       strcpy(&zSt
a170: 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  mt[k], z);.     
a180: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
a190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72  .    }.  }.  str
a1a0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
a1b0: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
a1c0: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Stmt;.}../*.** T
a1d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a1e0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
a1f0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
a200: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
a210: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a220: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
a230: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
a240: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
a250: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
a260: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
a270: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
a280: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
a290: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
a2a0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
a2b0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
a2c0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
a2d0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
a2e0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
a2f0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
a300: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
a310: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
a320: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
a330: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
a340: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
a350: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
a360: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
a370: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a380: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
a390: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
a3a0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
a3b0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
a3c0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
a3d0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
a3e0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73  ently changes, s
a3f0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
a400: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
a410: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
a420: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
a430: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
a440: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
a450: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
a460: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
a470: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
a480: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
a490: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
a4a0: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
a4b0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
a4c0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
a4d0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
a4e0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
a4f0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
a500: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
a510: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
a520: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
a530: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
a540: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
a550: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
a560: 65 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65  e3EndTable(Parse
a570: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
a580: 2a 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70  *pEnd, Select *p
a590: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
a5a0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
a5b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a5c0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
a5d0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
a5e0: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
a5f0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
a600: 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
a610: 6e 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  n;.  p = pParse-
a620: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
a630: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
a640: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
a650: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
a660: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20  Select );..  /* 
a670: 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  If the db->init.
a680: 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61  busy is 1 it mea
a690: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
a6a0: 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68  g the SQL off th
a6b0: 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d  e.  ** "sqlite_m
a6c0: 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74  aster" or "sqlit
a6d0: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74  e_temp_master" t
a6e0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b  able on the disk
a6f0: 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74  ..  ** So do not
a700: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69   write to the di
a710: 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  sk again.  Extra
a720: 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ct the root page
a730: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72   number.  ** for
a740: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
a750: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  the db->init.new
a760: 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68  Tnum field.  (Th
a770: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  e page number.  
a780: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ** should have b
a790: 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79  een put there by
a7a0: 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43   the sqliteOpenC
a7b0: 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f  b routine.).  */
a7c0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
a7d0: 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74  busy ){.    p->t
a7e0: 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
a7f0: 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  ewTnum;.  }..  /
a800: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
a810: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
a820: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
a830: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
a840: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
a850: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
a860: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
a870: 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  The record numbe
a880: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  r.  ** for the n
a890: 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73  ew table entry s
a8a0: 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
a8b0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
a8c0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
a8d0: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
a8e0: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
a8f0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
a900: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
a910: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
a920: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
a930: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
a940: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
a950: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
a960: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
a970: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
a980: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
a990: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
a9a0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66   return;..    if
a9b0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
a9c0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
a9d0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
a9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a9f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
aa00: 74 65 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c  teTable, p->iDb,
aa10: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
aa20: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
aa30: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
aa40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
aa50: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a  Integer, 0, 0);.
aa60: 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74      }..    sqlit
aa70: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
aa80: 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
aa90: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
aaa0: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
aab0: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
aac0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
aad0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
aae0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
aaf0: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
ab00: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
ab10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
ab20: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
ab30: 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f   is on the top o
ab40: 66 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b  f the vdbe stack
ab50: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
ab60: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
ab70: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
ab80: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
ab90: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
aba0: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
abb0: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
abc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
abd0: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
abe0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
abf0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
ac00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
ac10: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
ac20: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
ac30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ac40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
ac50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
ac60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ac70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
ac80: 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  ->iDb, 0);.     
ac90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aca0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  p(v, OP_OpenWrit
acb0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
acc0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
acd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
ace0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
acf0: 65 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65  elect, SRT_Table
ad00: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 1, 0, 0, 0, 0)
ad10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ad20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
ad30: 6c 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  lose, 1, 0);.   
ad40: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
ad50: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
ad60: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
ad70: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
ad80: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
ad90: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
ada0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
adb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
adc0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
add0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
ade0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
adf0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
ae00: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
ae10: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
ae20: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
ae30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
ae40: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
ae50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ae60: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
ae70: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  SelTab);.      }
ae80: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 73 71  .    }.  .    sq
ae90: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
aea0: 61 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29 3b  able(v, p->iDb);
aeb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
aec0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
aed0: 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65  g8, 0, 0, p->pSe
aee0: 6c 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a  lect==0?"table":
aef0: 22 76 69 65 77 22 2c 50 33 5f 53 54 41 54 49 43  "view",P3_STATIC
af00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
af10: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
af20: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e  ng8, 0, 0, p->zN
af30: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
af40: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
af50: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
af60: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   p->zName, 0);. 
af70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
af80: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
af90: 33 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20  3, 0);..    if( 
afa0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
afb0: 20 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74   char *z = creat
afc0: 65 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20  eTableStmt(p);. 
afd0: 20 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72       n = z ? str
afe0: 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20  len(z) : 0;.    
aff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b000: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
b010: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b020: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b030: 50 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  P3(v, -1, z, n);
b040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
b050: 65 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(z);.    }else{
b060: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53  .      if( p->pS
b070: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
b080: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
b090: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
b0a0: 2c 20 30 2c 20 22 43 52 45 41 54 45 20 56 49 45  , 0, "CREATE VIE
b0b0: 57 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  W ", P3_STATIC);
b0c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b0d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b0e0: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
b0f0: 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54  g8, 0, 0, "CREAT
b100: 45 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54  E TABLE ", P3_ST
b110: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ATIC);.      }. 
b120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e       assert( pEn
b130: 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20  d!=0 );.      n 
b140: 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
b150: 2d 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73  - Addr(pParse->s
b160: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
b170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
b190: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
b1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b1b0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
b1c0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
b1d0: 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  en.z, n);.      
b1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b1f0: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 30  (v, OP_Concat, 0
b200: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
b210: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
b220: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
b230: 20 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20   5, 0, "tttit", 
b240: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
b250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b260: 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79  (v, OP_PutIntKey
b270: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b280: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
b290: 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b  (db, v, p->iDb);
b2a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b2b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
b2c0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
b2d0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b2e0: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
b2f0: 70 2d 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  p->iDb, 0,.     
b300: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
b310: 66 28 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  f("tbl_name='%q'
b320: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  ",p->zName), P3_
b330: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 20  DYNAMIC);.  }.. 
b340: 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c   /* Add the tabl
b350: 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e to the in-memo
b360: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
b370: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
b380: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
b390: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
b3a0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
b3b0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
b3c0: 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b  d;.    FKey *pFK
b3d0: 65 79 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62  ey; .    Db *pDb
b3e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69   = &db->aDb[p->i
b3f0: 44 62 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  Db];.    pOld = 
b400: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
b410: 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c  t(&pDb->tblHash,
b420: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   p->zName, strle
b430: 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  n(p->zName)+1, p
b440: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
b450: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b460: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
b470: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
b480: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
b490: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
b4a0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
b4b0: 20 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79   }.    for(pFKey
b4c0: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
b4d0: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
b4e0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
b4f0: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
b500: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20  n(pFKey->zTo) + 
b510: 31 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  1;.      pFKey->
b520: 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65  pNextTo = sqlite
b530: 33 48 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e  3HashFind(&pDb->
b540: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
b550: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73  o, nTo);.      s
b560: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
b570: 28 26 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46  (&pDb->aFKey, pF
b580: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
b590: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  FKey);.    }.   
b5a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b5b0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
b5c0: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
b5d0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
b5e0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
b5f0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
b600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b610: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
b620: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
b630: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
b640: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
b650: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
b660: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
b670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b680: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
b690: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
b6a0: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
b6b0: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
b6c0: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
b6d0: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
b6e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b6f0: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
b700: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b710: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b720: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
b730: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
b740: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b750: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b760: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
b770: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
b780: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
b790: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
b7a0: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
b7b0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
b7c0: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
b7d0: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
b7e0: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
b7f0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
b800: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
b810: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
b820: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
b830: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
b840: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20  Token *pName;.. 
b850: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
b860: 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69  le(pParse, pBegi
b870: 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  n, pName1, pName
b880: 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20  2, isTemp, 1);. 
b890: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
b8a0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
b8b0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
b8c0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
b8d0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
b8e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
b8f0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
b900: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
b910: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
b920: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
b930: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
b940: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
b950: 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22  , p->iDb, "view"
b960: 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20  , pName).    && 
b970: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
b980: 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29  (&sFix, pSelect)
b990: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
b9a0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53  3SelectDelete(pS
b9b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
b9c0: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
b9d0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
b9e0: 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
b9f0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
ba00: 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
ba10: 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
ba20: 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
ba30: 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
ba40: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
ba50: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
ba60: 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
ba70: 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
ba80: 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
ba90: 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
baa0: 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
bab0: 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
bac0: 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
bad0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
bae0: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
baf0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
bb00: 63 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a  ctDup(pSelect);.
bb10: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
bb20: 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a  elete(pSelect);.
bb30: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
bb40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
bb50: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
bb60: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
bb70: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
bb80: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
bb90: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
bba0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
bbb0: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
bbc0: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
bbd0: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
bbe0: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
bbf0: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
bc00: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
bc10: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
bc20: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
bc30: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
bc40: 3d 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e  = 0;.  n = sEnd.
bc50: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z - pBegin->z;. 
bc60: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69   z = (const unsi
bc70: 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67 69  gned char*)pBegi
bc80: 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n->z;.  while( n
bc90: 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27  >0 && (z[n-1]=='
bca0: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 5b  ;' || isspace(z[
bcb0: 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d  n-1])) ){ n--; }
bcc0: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
bcd0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
bce0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
bcf0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
bd00: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
bd10: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
bd20: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
bd30: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
bd40: 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30 29  Parse, &sEnd, 0)
bd50: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
bd60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
bd70: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
bd80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bd90: 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _VIEW./*.** The 
bda0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
bdb0: 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79  pTable is really
bdc0: 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69   a VIEW.  Fill i
bdd0: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a  n the names of.*
bde0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * the columns of
bdf0: 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65   the view in the
be00: 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72   pTable structur
be10: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
be20: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f  umber.** of erro
be30: 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  rs.  If an error
be40: 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61   is seen leave a
be50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
be60: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
be70: 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
be80: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
be90: 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ames(Parse *pPar
bea0: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  se, Table *pTabl
beb0: 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  e){.  ExprList *
bec0: 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74  pEList;.  Select
bed0: 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20   *pSel;.  Table 
bee0: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20  *pSelTab;.  int 
bef0: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nErr = 0;..  ass
bf00: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
bf10: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
bf20: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
bf30: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
bf40: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
bf50: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
bf60: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
bf70: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
bf80: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
bf90: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
bfa0: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
bfb0: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
bfc0: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
bfd0: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
bfe0: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
bff0: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
c000: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
c010: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
c020: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
c030: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
c040: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
c050: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
c060: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
c070: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
c080: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
c090: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
c0a0: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
c0b0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
c0c0: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
c0d0: 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72  ctually, this er
c0e0: 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70 72  ror is caught pr
c0f0: 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20  eviously and so 
c100: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
c110: 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61  st.  ** should a
c120: 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74  lways fail.  But
c130: 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69   we will leave i
c140: 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20  t in place just 
c150: 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f  to be safe..  */
c160: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
c170: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
c180: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c190: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
c1a0: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
c1b0: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
c1c0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
c1d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   1;.  }..  /* If
c1e0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
c1f0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
c200: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
c210: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
c220: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
c230: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
c240: 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20   /* If nCol==0, 
c250: 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74  then pTable must
c260: 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   be a VIEW */.  
c270: 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70  pSel = pTable->p
c280: 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f  Select;..  /* No
c290: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
c2a0: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
c2b0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
c2c0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
c2d0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
c2e0: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20   in this list.  
c2f0: 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  But we will need
c300: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
c310: 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74  list.  ** back t
c320: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
c330: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74  onfiguration aft
c340: 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73  erwards, so we s
c350: 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20  ave a copy of.  
c360: 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** the original 
c370: 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a  in pEList..  */.
c380: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d    pEList = pSel-
c390: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d  >pEList;.  pSel-
c3a0: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
c3b0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c  3ExprListDup(pEL
c3c0: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ist);.  if( pSel
c3d0: 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  ->pEList==0 ){. 
c3e0: 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20     pSel->pEList 
c3f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65  = pEList;.    re
c400: 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c  turn 1;  /* Mall
c410: 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  oc failed */.  }
c420: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
c430: 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20  = -1;.  pSelTab 
c440: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
c450: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
c460: 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69  e, 0, pSel);.  i
c470: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
c480: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
c490: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c4a0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
c4b0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
c4c0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
c4d0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
c4e0: 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43  .    pSelTab->nC
c4f0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  ol = 0;.    pSel
c500: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
c510: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
c520: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
c530: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
c540: 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c  erty(pParse->db,
c550: 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42   pTable->iDb, DB
c560: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
c570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
c580: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  ble->nCol = 0;. 
c590: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20     nErr++;.  }. 
c5a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e   sqlite3SelectUn
c5b0: 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71  bind(pSel);.  sq
c5c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
c5d0: 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ete(pSel->pEList
c5e0: 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  );.  pSel->pELis
c5f0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65  t = pEList;.  re
c600: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
c610: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c620: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
c630: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c640: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
c650: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
c660: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
c670: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
c680: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
c690: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
c6a0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
c6b0: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
c6c0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
c6d0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
c6e0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
c6f0: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
c700: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
c710: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
c720: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
c730: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
c740: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
c750: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c760: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
c770: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
c780: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
c790: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
c7a0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
c7b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
c7c0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
c7d0: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
c7e0: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
c7f0: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
c800: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
c810: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c820: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
c830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c840: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
c850: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
c860: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
c870: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
c880: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
c890: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
c8a0: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
c8b0: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
c8c0: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
c8d0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
c8e0: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
c8f0: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
c900: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
c910: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c920: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
c930: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
c940: 74 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70  tPageMoved(Db *p
c950: 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
c960: 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
c970: 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 0a 20  lem *pElem;.  . 
c980: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
c990: 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
c9a0: 3e 74 62 6c 48 61 73 68 29 3b 20 70 45 6c 65 6d  >tblHash); pElem
c9b0: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
c9c0: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
c9d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c9e0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
c9f0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
ca00: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
ca10: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
ca20: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
ca30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
ca40: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6c 65  }.  }.  for(pEle
ca50: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
ca60: 74 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68 29  t(&pDb->idxHash)
ca70: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
ca80: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
ca90: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
caa0: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
cab0: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
cac0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
cad0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
cae0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
caf0: 69 54 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  iTo;.      retur
cb00: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  n;.    }.  }.  a
cb10: 73 73 65 72 74 28 30 29 3b 0a 7d 0a 23 65 6e 64  ssert(0);.}.#end
cb20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
cb30: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
cb40: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
cb50: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
cb60: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
cb70: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
cb80: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
cb90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
cba0: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
cbb0: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
cbc0: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
cbd0: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
cbe0: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
cbf0: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
cc00: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
cc10: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
cc20: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
cc30: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
cc40: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
cc50: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
cc60: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
cc70: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
cc80: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
cc90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
cca0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  e(pParse);.  sql
ccb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ccc0: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
ccd0: 62 6c 65 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64  ble, iDb);.#ifnd
cce0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ccf0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
cd00: 50 5f 44 65 73 74 72 6f 79 20 70 75 73 68 65 73  P_Destroy pushes
cd10: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 6e 74 6f   an integer onto
cd20: 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 74   the stack. If t
cd30: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
cd40: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
cd50: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
cd60: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
cd70: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
cd80: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
cd90: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
cda0: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
cdb0: 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  is the sqlite_ma
cdc0: 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
cdd0: 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
cde0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
cdf0: 23 30 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  #0" in the SQL i
ce00: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
ce10: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
ce20: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
ce30: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
ce40: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
ce50: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
ce60: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
ce70: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
ce80: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
ce90: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
cea0: 51 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  Q SET rootpage=%
ceb0: 64 20 57 48 45 52 45 20 23 30 20 41 4e 44 20 72  d WHERE #0 AND r
cec0: 6f 6f 74 70 61 67 65 3d 23 30 22 2c 0a 20 20 20  ootpage=#0",.   
ced0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
cee0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
cef0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
cf00: 20 69 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66   iTable);.#endif
cf10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
cf20: 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
cf30: 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
cf40: 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
cf50: 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
cf60: 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
cf70: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
cf80: 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
cf90: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
cfa0: 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
cfb0: 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
cfc0: 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
cfd0: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
cfe0: 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
cff0: 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
d000: 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
d010: 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
d020: 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
d030: 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
d040: 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
d050: 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
d060: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d070: 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
d080: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d090: 55 4d 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  UM.  destroyRoot
d0a0: 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
d0b0: 62 2d 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69  b->tnum, pTab->i
d0c0: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
d0d0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d0e0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d0f0: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
d100: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
d110: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70  e, pIdx->tnum, p
d120: 49 64 78 2d 3e 69 44 62 29 3b 0a 20 20 7d 0a 23  Idx->iDb);.  }.#
d130: 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
d140: 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
d150: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
d160: 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
d170: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
d180: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
d190: 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
d1a0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
d1b0: 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
d1c0: 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
d1d0: 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
d1e0: 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
d1f0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
d200: 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
d210: 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
d220: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
d230: 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
d240: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
d250: 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
d260: 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
d270: 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
d280: 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
d290: 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
d2a0: 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
d2b0: 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
d2c0: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
d2d0: 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
d2e0: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
d2f0: 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
d300: 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
d310: 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
d320: 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
d330: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
d340: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
d350: 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
d360: 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
d370: 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
d380: 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
d390: 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
d3a0: 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
d3b0: 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
d3c0: 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
d3d0: 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
d3e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
d3f0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
d400: 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
d410: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
d420: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
d430: 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
d440: 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
d450: 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
d460: 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
d470: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
d480: 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
d490: 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
d4a0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
d4b0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
d4c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
d4d0: 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
d4e0: 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
d4f0: 28 20 70 49 64 78 2d 3e 69 44 62 3d 3d 70 54 61  ( pIdx->iDb==pTa
d500: 62 2d 3e 69 44 62 20 29 3b 0a 20 20 20 20 20 20  b->iDb );.      
d510: 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
d520: 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
d530: 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
d540: 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
d550: 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
d560: 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
d570: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
d580: 67 65 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  gest==0 ) return
d590: 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
d5a0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
d5b0: 61 72 67 65 73 74 2c 20 70 54 61 62 2d 3e 69 44  argest, pTab->iD
d5c0: 62 29 3b 0a 20 20 20 20 69 44 65 73 74 72 6f 79  b);.    iDestroy
d5d0: 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
d5e0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
d5f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d600: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
d610: 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
d620: 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
d630: 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
d640: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d650: 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
d660: 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
d670: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
d680: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
d690: 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
d6a0: 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c   isView){.  Tabl
d6b0: 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
d6c0: 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
d6d0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d6e0: 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
d6f0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
d700: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
d710: 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  _failed ) goto e
d720: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
d730: 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
d740: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54  >nSrc==1 );.  pT
d750: 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
d760: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
d770: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
d780: 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
d790: 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
d7a0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
d7b0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
d7c0: 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e  ;.  iDb = pTab->
d7d0: 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  iDb;.  assert( i
d7e0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
d7f0: 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20  >nDb );.#ifndef 
d800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
d810: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
d820: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
d830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
d840: 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
d850: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
d860: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
d870: 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e  = db->aDb[pTab->
d880: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
d890: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
d8a0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
d8b0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
d8c0: 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
d8d0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
d8e0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
d8f0: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
d900: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
d910: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
d920: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
d930: 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
d940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
d950: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
d960: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
d970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d980: 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20   if( iDb==1 ){. 
d990: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
d9a0: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
d9b0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
d9c0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
d9d0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
d9e0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
d9f0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
da00: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
da10: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
da20: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
da30: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
da40: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
da50: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
da60: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
da70: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
da80: 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
da90: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
daa0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
dab0: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
dac0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
dad0: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  Tab->readOnly ){
dae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
daf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
db00: 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62  ble %s may not b
db10: 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62  e dropped", pTab
db20: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50  ->zName);.    pP
db30: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
db40: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
db50: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
db60: 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
db70: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
db80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
db90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
dba0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
dbb0: 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
dbc0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
dbd0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
dbe0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
dbf0: 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
dc00: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
dc10: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dc20: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
dc30: 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
dc40: 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
dc50: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
dc60: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
dc70: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
dc80: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
dc90: 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
dca0: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
dcb0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
dcc0: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
dcd0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
dce0: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
dcf0: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20   ){.    Trigger 
dd00: 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73  *pTrigger;.    s
dd10: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
dd20: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
dd30: 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  , 0, pTab->iDb);
dd40: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
dd50: 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
dd60: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
dd70: 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
dd80: 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20  ed. Code.    ** 
dd90: 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
dda0: 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
ddb0: 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
ddc0: 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20  r and/or.    ** 
ddd0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
dde0: 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
ddf0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67      */.    pTrig
de00: 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69  ger = pTab->pTri
de10: 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  gger;.    while(
de20: 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
de30: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
de40: 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e  ger->iDb==pTab->
de50: 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d  iDb || pTrigger-
de60: 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20  >iDb==1 );.     
de70: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
de80: 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
de90: 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20  Trigger, 1);.   
dea0: 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54     pTrigger = pT
deb0: 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  rigger->pNext;. 
dec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f     }..    /* Dro
ded0: 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53  p all SQLITE_MAS
dee0: 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  TER table and in
def0: 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74  dex entries that
df00: 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20   refer to the.  
df10: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20    ** table. The 
df20: 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f  program name loo
df30: 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d  ps through the m
df40: 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
df50: 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65  deletes.    ** e
df60: 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
df70: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
df80: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
df90: 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
dfa0: 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64  g.    ** dropped
dfb0: 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
dfc0: 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c  andled seperatel
dfd0: 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
dfe0: 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a  ger can be.    *
dff0: 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  * created in the
e000: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74   temp database t
e010: 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
e020: 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  table in another
e030: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
e040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
e050: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
e060: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
e070: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
e080: 2e 25 51 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  .%Q WHERE tbl_na
e090: 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d  me=%Q and type!=
e0a0: 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20  'trigger'",.    
e0b0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 54 61 62      db->aDb[pTab
e0c0: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  ->iDb].zName, SC
e0d0: 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d  HEMA_TABLE(pTab-
e0e0: 3e 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  >iDb), pTab->zNa
e0f0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  me);.    if( !is
e100: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 64 65  View ){.      de
e110: 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
e120: 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
e130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
e140: 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p3(v, OP_DropTab
e150: 6c 65 2c 20 70 54 61 62 2d 3e 69 44 62 2c 20 30  le, pTab->iDb, 0
e160: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
e170: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56  );.  }.  sqliteV
e180: 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
e190: 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70  iDb);..exit_drop
e1a0: 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
e1b0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
e1c0: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
e1d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e1e0: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e1f0: 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b   a new foreign k
e200: 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a  ey on the table.
e210: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
e220: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
e230: 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72    pFromCol deter
e240: 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75  mines which colu
e250: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75  mns.** in the cu
e260: 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e  rrent table poin
e270: 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e  t to the foreign
e280: 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43   key.  If pFromC
e290: 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f  ol==0 then.** co
e2a0: 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f  nnect the key to
e2b0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e2c0: 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20   inserted.  pTo 
e2d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a  is the name of.*
e2e0: 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  * the table refe
e2f0: 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c  rred to.  pToCol
e300: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61   is a list of ta
e310: 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65  bles in the othe
e320: 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74  r.** pTo table t
e330: 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
e340: 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  key points to.  
e350: 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
e360: 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
e370: 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
e380: 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
e390: 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
e3a0: 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
e3b0: 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
e3c0: 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
e3d0: 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
e3e0: 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
e3f0: 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
e400: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
e410: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
e420: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
e430: 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
e440: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
e450: 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46 4b  eld.  The new FK
e460: 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e  ey.** is not lin
e470: 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b  ked into db->aFK
e480: 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ey at this point
e490: 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74   - that does not
e4a0: 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c   happen.** until
e4b0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e4c0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ()..**.** The fo
e4d0: 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
e4e0: 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
e4f0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
e500: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
e510: 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
e520: 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
e530: 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
e540: 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
e550: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
e560: 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
e570: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e580: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e590: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
e5a0: 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
e5b0: 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
e5c0: 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
e5d0: 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
e5e0: 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
e5f0: 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
e600: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
e610: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
e620: 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
e630: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
e640: 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
e650: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
e660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
e670: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
e680: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
e690: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
e6a0: 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
e6b0: 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
e6c0: 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  y = 0;.  Table *
e6d0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
e6e0: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
e6f0: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
e700: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
e710: 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
e720: 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
e730: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
e740: 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  Err ) goto fk_en
e750: 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
e760: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
e770: 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
e780: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  ;.    if( iCol<0
e790: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
e7a0: 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26      if( pToCol &
e7b0: 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
e7c0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
e7d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
e7e0: 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79  se, "foreign key
e7f0: 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20   on %s".        
e800: 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65   " should refere
e810: 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c  nce only one col
e820: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22  umn of table %T"
e830: 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43  ,.         p->aC
e840: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20  ol[iCol].zName, 
e850: 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pTo);.      goto
e860: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20   fk_end;.    }. 
e870: 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d     nCol = 1;.  }
e880: 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20  else if( pToCol 
e890: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
e8a0: 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  !=pFromCol->nExp
e8b0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
e8c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
e8d0: 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72  .        "number
e8e0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66   of columns in f
e8f0: 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20  oreign key does 
e900: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75  not match the nu
e910: 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20  mber of ".      
e920: 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68    "columns in th
e930: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
e940: 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  le");.    goto f
e950: 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k_end;.  }else{.
e960: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d      nCol = pFrom
e970: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a  Col->nExpr;.  }.
e980: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
e990: 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a  (*pFKey) + nCol*
e9a0: 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43  sizeof(pFKey->aC
e9b0: 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20  ol[0]) + pTo->n 
e9c0: 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f  + 1;.  if( pToCo
e9d0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
e9e0: 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70  ; i<pToCol->nExp
e9f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  r; i++){.      n
ea00: 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70  Byte += strlen(p
ea10: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
ea20: 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
ea30: 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
ea40: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
ea50: 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
ea60: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
ea70: 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20  .  pFKey->pFrom 
ea80: 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  = p;.  pFKey->pN
ea90: 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b  extFrom = p->pFK
eaa0: 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a  ey;.  z = (char*
eab0: 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46  )&pFKey[1];.  pF
eac0: 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72  Key->aCol = (str
ead0: 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a  uct sColMap*)z;.
eae0: 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74    z += sizeof(st
eaf0: 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43  ruct sColMap)*nC
eb00: 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  ol;.  pFKey->zTo
eb10: 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
eb20: 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
eb30: 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
eb40: 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e   0;.  z += pTo->
eb50: 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e  n+1;.  pFKey->pN
eb60: 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b  extTo = 0;.  pFK
eb70: 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ey->nCol = nCol;
eb80: 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
eb90: 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 ){.    pFKey-
eba0: 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d  >aCol[0].iFrom =
ebb0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65   p->nCol-1;.  }e
ebc0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
ebd0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
ebe0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
ebf0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
ec00: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
ec10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
ec20: 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b  StrICmp(p->aCol[
ec30: 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43  j].zName, pFromC
ec40: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ol->a[i].zName)=
ec50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ec60: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  pFKey->aCol[i].i
ec70: 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  From = j;.      
ec80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ec90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
eca0: 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f     if( j>=p->nCo
ecb0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
ecc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ecd0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
ece0: 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20  "unknown column 
ecf0: 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67  \"%s\" in foreig
ed00: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
ed10: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  ", .          pF
ed20: 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
ed30: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
ed40: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20  o fk_end;.      
ed50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
ed60: 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
ed70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
ed80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
ed90: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43   n = strlen(pToC
eda0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
edb0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
edc0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
edd0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
ede0: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
edf0: 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
ee00: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
ee10: 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
ee20: 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
ee30: 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
ee40: 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d  ey->deleteConf =
ee50: 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a 20   flags & 0xff;. 
ee60: 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f   pFKey->updateCo
ee70: 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38  nf = (flags >> 8
ee80: 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46 4b   ) & 0xff;.  pFK
ee90: 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d  ey->insertConf =
eea0: 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20   (flags >> 16 ) 
eeb0: 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69  & 0xff;..  /* Li
eec0: 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  nk the foreign k
eed0: 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ey to the table 
eee0: 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70  as the last step
eef0: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65  ..  */.  p->pFKe
ef00: 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b  y = pFKey;.  pFK
ef10: 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a  ey = 0;..fk_end:
ef20: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46  .  sqliteFree(pF
ef30: 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
ef40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ef50: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
ef60: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
ef70: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72  prListDelete(pFr
ef80: 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
ef90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
efa0: 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
efb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
efc0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
efd0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
efe0: 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
eff0: 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
f000: 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
f010: 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
f020: 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
f030: 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
f040: 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
f050: 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
f060: 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
f070: 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
f080: 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
f090: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
f0a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
f0b0: 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
f0c0: 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
f0d0: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
f0e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
f0f0: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
f100: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
f110: 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
f120: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f130: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
f140: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
f150: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
f160: 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
f170: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
f180: 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
f190: 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
f1a0: 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  turn;.  pFKey->i
f1b0: 73 44 65 66 65 72 72 65 64 20 3d 20 69 73 44 65  sDeferred = isDe
f1c0: 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
f1d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
f1e0: 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
f1f0: 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 49  n SQL table.  pI
f200: 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61 6d 65  ndex is the name
f210: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
f220: 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69 73 20  * and pTable is 
f230: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f240: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
f250: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
f260: 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
f270: 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
f280: 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
f290: 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
f2a0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
f2b0: 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
f2c0: 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
f2d0: 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
f2e0: 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
f2f0: 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
f300: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
f310: 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
f320: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
f330: 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
f340: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
f350: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
f360: 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
f370: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
f380: 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
f390: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
f3a0: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
f3b0: 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
f3c0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
f3d0: 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
f3e0: 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
f3f0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
f400: 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
f410: 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
f420: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
f430: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
f440: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f450: 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
f460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f470: 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
f480: 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
f490: 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
f4a0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
f4b0: 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
f4c0: 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
f4d0: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
f4e0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
f4f0: 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
f500: 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
f510: 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
f520: 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54  *pTblName,  /* T
f530: 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
f540: 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
f550: 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
f560: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
f570: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
f580: 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
f590: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
f5a0: 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45  Error,     /* OE
f5b0: 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
f5c0: 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
f5d0: 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
f5e0: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
f5f0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
f600: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
f610: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
f620: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
f630: 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20 20 2f  ken *pEnd      /
f640: 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
f650: 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
f660: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
f670: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
f680: 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62  pTab = 0; /* Tab
f690: 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
f6a0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
f6b0: 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  dex = 0; /* The 
f6c0: 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
f6d0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
f6e0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
f6f0: 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
f700: 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65  llId;    /* Fake
f710: 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
f720: 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
f730: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
f740: 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
f750: 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
f760: 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
f770: 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20 20 20   int isTemp;    
f780: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
f790: 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65 78 20  temporary index 
f7a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
f7b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
f7c0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
f7d0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
f7e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
f7f0: 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
f800: 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
f810: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71  Name = 0; /* Unq
f820: 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
f830: 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
f840: 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  eate */..  if( p
f850: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
f860: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
f870: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
f880: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
f890: 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
f8a0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
f8b0: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
f8c0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
f8d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
f8e0: 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
f8f0: 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
f900: 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
f910: 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
f920: 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
f930: 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
f940: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
f950: 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
f960: 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
f970: 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
f980: 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
f990: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
f9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
f9b0: 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
f9c0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
f9d0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
f9e0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
f9f0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
fa00: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
fa10: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
fa20: 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ndex;..    /* If
fa30: 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
fa40: 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
fa50: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
fa60: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
fa70: 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
fa80: 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
fa90: 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a 20 20  atabase to 1..  
faa0: 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20    */.    pTab = 
fab0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
fac0: 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
fad0: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  lName);.    if( 
fae0: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
faf0: 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
fb00: 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29  & pTab->iDb==1 )
fb10: 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b  {.      iDb = 1;
fb20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
fb30: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
fb40: 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
fb50: 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
fb60: 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
fb70: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
fb80: 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
fb90: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
fba0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
fbb0: 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
fbc0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
fbd0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
fbe0: 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d  , pTblName->a[0]
fbf0: 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
fc00: 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e   pTblName->a[0].
fc10: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
fc20: 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
fc30: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
fc40: 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
fc50: 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29  iDb==pTab->iDb )
fc60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
fc70: 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
fc80: 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 20 70  );.    pTab =  p
fc90: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fca0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54 61 62  ;.    iDb = pTab
fcb0: 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66  ->iDb;.  }..  if
fcc0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
fcd0: 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
fce0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
fcf0: 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  ex;.  if( pTab->
fd00: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
fd10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fd20: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
fd30: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
fd40: 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
fd50: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
fd60: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
fd70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
fd80: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
fd90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fda0: 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
fdb0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
fdc0: 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
fdd0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
fde0: 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20  .  }.  isTemp = 
fdf0: 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20  pTab->iDb==1;.. 
fe00: 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
fe10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
fe20: 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
fe30: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
fe40: 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
fe50: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
fe60: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
fe70: 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
fe80: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
fe90: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
fea0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
feb0: 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
fec0: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
fed0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
fee0: 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
fef0: 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
ff00: 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
ff10: 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
ff20: 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
ff30: 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
ff40: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
ff50: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
ff60: 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
ff70: 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
ff80: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
ff90: 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
ffa0: 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
ffb0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
ffc0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
ffd0: 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
ffe0: 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
fff0: 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
10000 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
10010 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
10020 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
10030 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
10040 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
10050 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
10060 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
10070 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
10080 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
10090 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
100a0 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
100b0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
100c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
100d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
100e0 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
100f0 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
10100 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
10110 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10120 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
10130 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
10140 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e  busy ){.      In
10150 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b  dex *pISameName;
10160 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69      /* Another i
10170 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61  ndex with the sa
10180 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
10190 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61   Table *pTSameNa
101a0 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  me;    /* A tabl
101b0 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65  e with same name
101c0 20 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   as the index */
101d0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
101e0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
101f0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
10200 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
10210 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
10220 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
10230 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
10240 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
10250 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
10260 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
10270 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10280 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
10290 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
102a0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
102b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
102c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
102d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
102e0 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
102f0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
10300 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
10310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10320 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10330 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
10340 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
10350 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
10360 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
10370 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10390 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d  else if( pName==
103a0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
103b0 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
103c0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
103d0 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
103e0 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
103f0 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
10400 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
10410 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
10420 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
10430 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
10440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
10450 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
10460 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
10470 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
10480 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
10490 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
104a0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
104b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
104c0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
104d0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
104e0 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
104f0 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
10500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
10510 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
10520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
10530 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
10540 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
10550 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10560 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
10570 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
10580 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
10590 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
105a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
105b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
105c0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
105d0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
105e0 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
105f0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
10600 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
10610 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
10620 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10630 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
10640 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
10650 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
10660 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
10670 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
10680 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
10690 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
106a0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
106b0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
106c0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
106d0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
106e0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
106f0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
10700 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
10710 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
10720 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
10730 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
10740 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
10750 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
10760 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
10770 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
10780 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
10790 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
107a0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
107b0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
107c0 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
107d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
107e0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
107f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
10800 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
10810 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
10820 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
10830 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
10840 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
10850 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
10860 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
10890 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) + sizeof(CollS
108a0 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
108b0 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  pr );.  if( pInd
108c0 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
108d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
108e0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
108f0 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
10900 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
10910 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  l[pList->nExpr];
10920 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
10930 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
10940 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
10950 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72  t->nExpr];.  str
10960 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
10970 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
10980 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
10990 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
109a0 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
109b0 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
109c0 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
109d0 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
109e0 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
109f0 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
10a00 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
10a10 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
10a20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
10a30 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
10a40 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
10a50 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
10a60 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
10a70 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
10a80 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
10a90 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
10aa0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
10ab0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
10ac0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
10ad0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
10ae0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
10af0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
10b00 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
10b10 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
10b20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
10b30 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
10b40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10b50 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
10b60 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
10b70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10b80 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
10b90 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
10ba0 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
10bb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
10bc0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
10bd0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
10be0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
10bf0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
10c00 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
10c10 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
10c20 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
10c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
10c40 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
10c50 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
10c60 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
10c70 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
10c80 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
10c90 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
10ca0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
10cb0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
10cc0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
10cd0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
10ce0 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
10cf0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
10d00 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
10d10 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
10d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
10d30 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
10d40 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
10d50 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
10d60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
10d70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
10d90 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
10da0 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
10db0 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  xpr;..  if( pTab
10dc0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
10dd0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
10de0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
10df0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
10e00 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
10e10 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
10e20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
10e30 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
10e40 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
10e50 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
10e60 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
10e70 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
10e80 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
10e90 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
10ea0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
10eb0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
10ec0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
10ed0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
10ee0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
10ef0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
10f00 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
10f10 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
10f20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
10f30 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
10f40 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
10f50 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
10f60 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
10f70 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
10f80 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
10f90 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
10fa0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
10fb0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
10fc0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
10fd0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
10fe0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
10ff0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
11000 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
11010 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
11020 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
11030 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
11040 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
11050 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
11060 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
11070 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
11080 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
11090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
110a0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
110b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
110c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
110d0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
110e0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
110f0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
11100 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
11110 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
11120 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
11130 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
11140 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
11150 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
11160 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
11170 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
11180 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
11190 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
111a0 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
111b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
111c0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
111d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
111e0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
111f0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
11200 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
11210 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
11220 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
11230 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
11240 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
11250 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
11260 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
11270 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
11280 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
11290 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
112a0 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
112b0 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
112c0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
112d0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
112e0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
112f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
11300 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
11310 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
11320 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
11330 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
11340 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
11350 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
11360 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
11370 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
11380 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
11390 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
113a0 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
113b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
113c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
113d0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
113e0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
113f0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
11400 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
11410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11420 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11440 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
11450 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
11460 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
11470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11480 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
11490 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
114a0 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
114b0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
114c0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
114d0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
114e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
114f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
11500 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
11510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11520 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
11530 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
11540 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
11550 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
11560 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
11570 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
11580 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  s. .  */.  if( d
11590 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
115a0 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
115b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
115c0 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
115d0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64  [pIndex->iDb].id
115e0 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  xHash, .        
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
11610 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a  strlen(pIndex->z
11620 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78 29  Name)+1, pIndex)
11630 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
11640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
11650 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
11660 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
11670 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ailed */.      g
11680 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
11690 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
116a0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
116b0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
116c0 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
116d0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
116e0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
116f0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
11700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11710 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
11720 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
11730 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
11740 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
11750 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
11760 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
11770 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
11780 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
11790 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
117a0 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
117b0 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
117c0 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
117d0 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
117e0 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
117f0 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
11800 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
11810 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
11820 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
11830 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
11840 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
11850 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
11860 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
11870 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
11880 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
11890 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
118a0 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
118b0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
118c0 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
118d0 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
118e0 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
118f0 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
11900 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
11910 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
11920 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
11930 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
11940 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
11950 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
11960 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
11970 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
11980 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
11990 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
119a0 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
119b0 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
119c0 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
119d0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
119e0 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
119f0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
11a00 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
11a10 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69  busy==0 ){.    i
11a20 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
11a30 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c  v;.    int lbl1,
11a40 20 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20   lbl2;..    v = 
11a50 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11a60 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
11a70 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
11a80 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
11a90 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21     if( pTblName!
11aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11ab0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
11ac0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
11ad0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
11ae0 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
11af0 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  able(v, iDb);.  
11b00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
11b10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
11b20 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
11b30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
11b40 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
11b50 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c  , 0, 0, "index",
11b60 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
11b70 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
11b80 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
11b90 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
11ba0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
11bb0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
11bc0 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
11bd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
11be0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11bf0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61  AddOp(v, OP_Crea
11c00 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 29  teIndex, iDb, 0)
11c10 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61  ;.    if( pTblNa
11c20 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
11c30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11c40 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
11c50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11c60 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
11c70 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
11c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
11c90 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
11ca0 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20 20  te, 1, 0,.      
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
11cc0 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b  char*)&pIndex->k
11cd0 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
11ce0 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  FO);.    }.    s
11cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11d00 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
11d10 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53  , 0);.    if( pS
11d20 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a  tart && pEnd ){.
11d30 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f        if( onErro
11d40 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r==OE_None ){.  
11d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11d60 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
11d70 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 22   "CREATE INDEX "
11d80 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
11d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11da0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11db0 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43  angeP3(v, -1, "C
11dc0 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
11dd0 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  EX ", P3_STATIC)
11de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11e00 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
11e10 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d  0, 0);.      n =
11e20 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
11e30 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20   Addr(pName->z) 
11e40 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 1;.      sqlit
11e50 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
11e60 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20  , -1, pName->z, 
11e70 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
11e80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11e90 5f 43 6f 6e 63 61 74 2c 20 30 2c 20 30 29 3b 0a  _Concat, 0, 0);.
11ea0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11eb0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
11ec0 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c  akeRecord, 5, 0,
11ed0 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41   "tttit", P3_STA
11ee0 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
11ef0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11f00 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30  _PutIntKey, 0, 0
11f10 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  );.    if( pTblN
11f20 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
11f30 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11f40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61   OP_Integer, pTa
11f50 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20  b->iDb, 0);.    
11f60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11f70 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  Op(v, OP_OpenRea
11f80 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  d, 2, pTab->tnum
11f90 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64 62 65  );.      /* Vdbe
11fa0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
11fb0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  , pTab->zName));
11fc0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
11fd0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11fe0 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
11ff0 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a  2, pTab->nCol);.
12000 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c        lbl2 = sql
12010 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12020 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
12030 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12040 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62  OP_Rewind, 2, lb
12050 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20  l2);.      lbl1 
12060 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
12070 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
12080 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61     sqlite3Genera
12090 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49  teIndexKey(v, pI
120a0 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20 20 20 20  ndex, 2);.      
120b0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
120c0 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20  , OP_IdxPut, 1, 
120d0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
120e0 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20  =OE_None,.      
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
12110 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
12120 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
12130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12140 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
12150 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20   2, lbl1);.     
12160 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
12170 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32  lveLabel(v, lbl2
12180 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12190 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
121a0 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20  Close, 2, 0);.  
121b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
121c0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
121d0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
121e0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
121f0 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
12200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12210 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
12220 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
12230 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
12240 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
12250 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20 20 20  a, iDb, 0,.     
12260 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
12270 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20  tf("name='%q'", 
12280 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20  pIndex->zName), 
12290 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
122a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65   }.  }..  /* Whe
122b0 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
122c0 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
122d0 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
122e0 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
122f0 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
12300 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
12310 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
12320 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
12330 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
12340 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
12350 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
12360 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
12370 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64   UPDATE.  ** and
12380 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20   INSERT..  */.  
12390 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
123a0 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
123b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
123c0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
123d0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
123e0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
123f0 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
12400 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
12410 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
12420 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
12430 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
12440 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
12450 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
12460 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
12470 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
12480 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
12490 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
124a0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
124b0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
124c0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
124d0 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
124e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
124f0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
12500 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
12510 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
12520 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
12530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
12540 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
12550 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
12560 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
12570 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
12580 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
12590 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70 49      freeIndex(pI
125a0 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ndex);.  }.  sql
125b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
125c0 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  te(pList);.  sql
125d0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
125e0 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  e(pTblName);.  s
125f0 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
12600 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
12610 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12620 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
12630 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
12640 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
12650 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
12660 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
12670 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
12680 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
12690 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
126a0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
126b0 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
126c0 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
126d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
126e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
126f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
12700 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
12710 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
12720 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  n;.  assert( pNa
12730 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
12740 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
12750 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
12760 61 28 70 50 61 72 73 65 29 20 29 20 72 65 74 75  a(pParse) ) retu
12770 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  rn;.  pIndex = s
12780 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
12790 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
127a0 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
127b0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
127c0 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
127d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
127e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
127f0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
12800 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
12810 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
12820 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
12830 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
12840 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
12850 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
12860 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12870 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12880 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  "index associate
12890 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a  d with UNIQUE ".
128a0 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52        "or PRIMAR
128b0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
128c0 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70   cannot be dropp
128d0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74  ed", 0);.    got
128e0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
128f0 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
12900 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
12910 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
12920 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
12930 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
12940 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
12950 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
12960 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
12970 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
12980 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Index->iDb].zNam
12990 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
129a0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
129b0 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69  _TABLE(pIndex->i
129c0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
129d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
129e0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
129f0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
12a00 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
12a10 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
12a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12a30 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f  pIndex->iDb ) co
12a40 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
12a50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
12a60 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
12a70 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
12a80 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
12a90 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
12aa0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
12ab0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
12ac0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
12ad0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
12ae0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
12af0 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
12b00 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
12b10 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
12b20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12b30 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
12b40 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
12b50 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74 20 64  nst VdbeOpList d
12b60 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20  ropIndex[] = {. 
12b70 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
12b80 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
12b90 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f  , 0}, .      { O
12ba0 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
12bb0 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
12bc0 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50   1 */.      { OP
12bd0 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20  _MemStore,   1, 
12be0 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  1,       0},.   
12bf0 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c     { OP_MemLoad,
12c00 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20      1, 0,       
12c10 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20  0}, /* 3 */.    
12c20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
12c30 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30     0, 1,       0
12c40 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71  },.      { OP_Eq
12c50 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44  ,         0, ADD
12c60 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(8), 0},.      
12c70 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20  { OP_Next,      
12c80 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c   0, ADDR(3), 0},
12c90 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
12ca0 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
12cb0 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  9), 0},.      { 
12cc0 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30  OP_Delete,     0
12cd0 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
12ce0 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  * 8 */.    };.  
12cf0 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20    int base;..   
12d00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
12d10 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
12d20 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69  se, 0, pIndex->i
12d30 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
12d40 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
12d50 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  v, pIndex->iDb);
12d60 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
12d70 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
12d80 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
12d90 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e  opIndex), dropIn
12da0 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
12db0 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
12dc0 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d   base+1, pIndex-
12dd0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
12de0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
12df0 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e 64 65  kie(db, v, pInde
12e00 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 2f 2a 20  x->iDb);.    /* 
12e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e20 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
12e30 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49  pIndex->tnum, pI
12e40 6e 64 65 78 2d 3e 69 44 62 29 3b 20 2a 2f 0a 20  ndex->iDb); */. 
12e50 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
12e60 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
12e70 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d  x->tnum, pIndex-
12e80 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
12e90 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12ea0 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a  P_Close, 0, 0);.
12eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
12ec0 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p3(v, OP_DropInd
12ed0 65 78 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 2c  ex, pIndex->iDb,
12ee0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
12ef0 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
12f00 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
12f10 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
12f20 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  ete(pName);.}../
12f30 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
12f40 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
12f50 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
12f60 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
12f70 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
12f80 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
12f90 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
12fa0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
12fb0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
12fc0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
12fd0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c  IdListAppend(IdL
12fe0 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
12ff0 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66  n *pToken){.  if
13000 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
13010 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
13020 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
13030 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
13040 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
13050 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
13060 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
13070 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
13080 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  Id>=pList->nAllo
13090 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  c ){.    struct 
130a0 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  IdList_item *a;.
130b0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
130c0 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
130d0 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d  c*2 + 5;.    a =
130e0 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
130f0 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
13100 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c  nAlloc*sizeof(pL
13110 69 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20  ist->a[0]) );.  
13120 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
13130 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
13140 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
13150 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
13160 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
13170 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65  >a = a;.  }.  me
13180 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70  mset(&pList->a[p
13190 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73  List->nId], 0, s
131a0 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
131b0 5d 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  ]));.  pList->a[
131c0 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d  pList->nId].zNam
131d0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
131e0 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
131f0 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b  ;.  pList->nId++
13200 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
13210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
13220 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
13230 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
13240 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
13250 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
13260 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
13270 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
13280 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
13290 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f  List even if pTo
132a0 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ken is NULL..**.
132b0 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74  ** A new SrcList
132c0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
132d0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
132e0 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  ) fails..**.** I
132f0 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e  f pDatabase is n
13300 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e  ot null, it mean
13310 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  s that the table
13320 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   has an optional
13330 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d  .** database nam
13340 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20  e prefix.  Like 
13350 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65  this:  "database
13360 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44  .table".  The pD
13370 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74  atabase.** point
13380 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e  s to the table n
13390 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62  ame and the pTab
133a0 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  le points to the
133b0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
133c0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61  ** The SrcList.a
133d0 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69  [].zName field i
133e0 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
133f0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69  e table name whi
13400 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65  ch might.** come
13410 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66   from pTable (if
13420 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
13430 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74  LL) or from pDat
13440 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c  abase.  .** SrcL
13450 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73  ist.a[].zDatabas
13460 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  e is filled with
13470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
13480 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a  me from pTable,.
13490 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20  ** or with NULL 
134a0 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69  if no database i
134b0 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  s specified..**.
134c0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
134d0 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20  s, if call like 
134e0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
134f0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
13500 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b  stAppend(A,B,0);
13510 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
13520 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
13530 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
13540 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
13550 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
13560 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
13570 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
13580 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
13590 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
135a0 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
135b0 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
135c0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
135d0 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
135e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
135f0 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  end(SrcList *pLi
13600 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  st, Token *pTabl
13610 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  e, Token *pDatab
13620 61 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53  ase){.  struct S
13630 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
13640 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
13650 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
13660 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
13670 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
13680 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
13690 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
136a0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
136b0 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 1;.  }.  if(
136c0 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c   pList->nSrc>=pL
136d0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
136e0 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
136f0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
13700 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e  loc *= 2;.    pN
13710 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
13720 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  oc(pList,.      
13730 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13740 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
13750 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
13760 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
13770 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
13780 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
13790 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
137a0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
137b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
137c0 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
137d0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
137e0 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
137f0 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
13800 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
13810 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
13820 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
13830 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
13840 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
13850 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
13860 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
13870 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
13880 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
13890 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
138a0 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
138b0 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
138c0 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
138d0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
138e0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
138f0 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
13900 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
13910 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13920 28 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70  (pDatabase);.  p
13930 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
13940 2d 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72  -1;.  pList->nSr
13950 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  c++;.  return pL
13960 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
13970 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20  sign cursors to 
13980 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20  all tables in a 
13990 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20  SrcList.*/.void 
139a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
139b0 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73  signCursors(Pars
139c0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
139d0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
139e0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
139f0 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
13a00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
13a10 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
13a20 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  <0 ){.      pLis
13a30 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  t->a[i].iCursor 
13a40 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13a60 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61  *.** Add an alia
13a70 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64  s to the last id
13a80 65 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20  entifier on the 
13a90 67 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72  given identifier
13aa0 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
13ab0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64  qlite3SrcListAdd
13ac0 41 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70  Alias(SrcList *p
13ad0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
13ae0 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
13af0 74 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63  t && pList->nSrc
13b00 3e 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  >0 ){.    pList-
13b10 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
13b20 5d 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ].zAlias = sqlit
13b30 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
13b40 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  pToken);.  }.}..
13b50 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
13b60 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
13b70 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
13b80 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
13b90 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
13ba0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
13bb0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
13bc0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
13bd0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
13be0 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
13bf0 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
13c00 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
13c10 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
13c20 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
13c30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
13c40 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
13c50 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
13c60 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
13c70 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
13c80 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
13c90 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
13ca0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
13cb0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
13cc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
13cd0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13ce0 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
13cf0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
13d00 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
13d10 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
13d20 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
13d30 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
13d40 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
13d50 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
13d60 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
13d70 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
13d80 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
13d90 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
13da0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
13db0 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
13dc0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
13dd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
13de0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
13df0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
13e00 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
13e10 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
13e20 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
13e30 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
13e40 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
13e50 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
13e60 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
13e70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
13e80 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
13e90 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
13ea0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
13eb0 61 62 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61  ab && pItem->pTa
13ec0 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
13ed0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
13ee0 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 49  eleteTable(0, pI
13ef0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
13f00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
13f10 65 63 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  ectDelete(pItem-
13f20 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
13f30 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
13f40 28 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20  (pItem->pOn);.  
13f50 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
13f60 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 55 73  elete(pItem->pUs
13f70 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
13f80 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
13f90 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
13fa0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
13fb0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
13fc0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
13fd0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74  e *pParse, int t
13fe0 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ype){.  sqlite3 
13ff0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
14000 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
14010 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
14020 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
14030 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
14040 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14050 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
14060 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
14070 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
14080 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
14090 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
140a0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
140b0 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
140c0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
140d0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
140e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
140f0 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
14100 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
14110 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
14120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
14130 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
14140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14150 4f 70 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  Op(v, OP_Transac
14160 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
14170 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
14180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
14190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
141a0 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
141b0 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
141c0 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
141d0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
141e0 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
141f0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
14200 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
14210 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
14220 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
14230 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
14240 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
14250 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
14260 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
14270 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
14280 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
14290 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
142a0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
142b0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
142c0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
142d0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
142e0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
142f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14300 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14310 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14320 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
14330 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
14340 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
14350 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
14360 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
14370 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
14380 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
14390 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
143a0 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
143b0 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
143c0 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
143d0 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
143e0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
143f0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
14400 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
14410 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
14420 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
14430 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14440 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
14450 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
14460 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
14470 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
14480 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14490 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
144a0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
144b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
144c0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
144d0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
144e0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
144f0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
14500 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
14510 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
14520 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
14530 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
14540 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
14550 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
14560 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
14570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14580 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
14590 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70  atabase(Parse *p
145a0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
145b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
145c0 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44  db;.  if( db->aD
145d0 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21  b[1].pBt==0 && !
145e0 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
145f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
14600 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
14610 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41  ory(db, 0, 0, MA
14620 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
14630 62 5b 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[1].pBt);.    i
14640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14650 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14660 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14670 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
14680 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
14690 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
146a0 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
146b0 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
146c0 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
146d0 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
146e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
146f0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
14700 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74  flags & !db->aut
14710 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20  oCommit ){.     
14720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14730 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d  eeBeginTrans(db-
14740 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b  >aDb[1].pBt, 1);
14750 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14770 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14780 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
14790 62 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69  ble to get a wri
147a0 74 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20  te lock on ".   
147b0 20 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70         "the temp
147c0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66  orary database f
147d0 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ile");.        p
147e0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
147f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
14800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
14820 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14830 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
14840 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
14850 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
14860 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
14870 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
14880 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
14890 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
148a0 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
148b0 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
148c0 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
148d0 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
148e0 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
148f0 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
14900 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
14910 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
14920 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
14930 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
14940 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
14950 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
14960 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
14970 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
14980 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
14990 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
149a0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
149b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
149c0 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
149d0 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
149e0 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
149f0 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
14a00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
14a10 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
14a20 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
14a30 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
14a40 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
14a50 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
14a60 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
14a70 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
14a80 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
14a90 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
14aa0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
14ab0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
14ac0 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
14ad0 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
14ae0 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
14af0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
14b00 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
14b10 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
14b20 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
14b30 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
14b40 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
14b50 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
14b60 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
14b70 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
14b80 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
14b90 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
14ba0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
14bb0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
14bc0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
14bd0 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
14be0 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
14bf0 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
14c00 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
14c10 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
14c20 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
14c30 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
14c40 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
14c50 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
14c60 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
14c70 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
14c80 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
14c90 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
14ca0 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
14cb0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14cc0 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
14cd0 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
14ce0 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
14cf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14d00 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
14d10 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
14d20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
14d30 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
14d40 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
14d50 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
14d60 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
14d70 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  rse->cookieGoto=
14d80 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
14d90 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
14da0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
14db0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
14dc0 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  )+1;.  }.  if( i
14dd0 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  Db>=0 ){.    ass
14de0 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
14df0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14e00 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
14e10 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
14e20 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
14e30 3c 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20  <32 );.    mask 
14e40 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66  = 1<<iDb;.    if
14e50 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ( (pParse->cooki
14e60 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
14e70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
14e80 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
14e90 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72  mask;.      pPar
14ea0 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
14eb0 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
14ec0 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
14ed0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 62  e;.      if( iDb
14ee0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
14ef0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
14f00 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a  tabase(pParse);.
14f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14f20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
14f30 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
14f40 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
14f50 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
14f60 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
14f70 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
14f80 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
14f90 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
14fa0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
14fb0 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
14fc0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
14fd0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
14fe0 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
14ff0 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
15000 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
15010 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
15020 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
15030 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
15040 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
15050 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
15060 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
15070 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
15080 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
15090 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
150a0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
150b0 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
150c0 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
150d0 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
150e0 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
150f0 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
15100 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
15110 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
15120 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
15130 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
15140 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
15150 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
15160 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
15170 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
15180 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
15190 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
151a0 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
151b0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
151c0 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a 0a   not be set..**.
151d0 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73 65  ** Only database
151e0 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65 6d   iDb and the tem
151f0 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
15200 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79 20  ade writable by 
15210 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49 66  this call..** If
15220 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74 68   iDb==0, then th
15230 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70 20  e main and temp 
15240 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d 61  databases are ma
15250 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20 49  de writable.   I
15260 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65 6e  f.** iDb==1 then
15270 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20 64   only the temp d
15280 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65 20  atabase is made 
15290 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69 44  writable.  If iD
152a0 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  b>1 then the.** 
152b0 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c 69  specified auxili
152c0 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e 64  ary database and
152d0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
152e0 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
152f0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
15300 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
15310 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
15320 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
15330 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
15340 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
15350 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
15360 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
15370 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
15380 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
15390 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
153a0 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77  Db);.  pParse->w
153b0 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
153c0 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61  Db;.  if( setSta
153d0 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65  tement && pParse
153e0 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
153f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15400 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d  dOp(v, OP_Statem
15410 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ent, iDb, 0);.  
15420 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 26  }.  if( iDb!=1 &
15430 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
15440 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
15450 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
15460 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
15470 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
15480 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
15490 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  * .** Return the
154a0 20 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69 74   transient sqlit
154b0 65 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20  e3_value object 
154c0 75 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69 6e  used for encodin
154d0 67 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a  g conversions.**
154e0 20 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d 70   during SQL comp
154f0 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69  ilation..*/.sqli
15500 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
15510 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61  e3GetTransientVa
15520 6c 75 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  lue(sqlite3 *db)
15530 7b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 61  {.  if( !db->pVa
15540 6c 75 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  lue ){.    db->p
15550 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 56  Value = sqlite3V
15560 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a 20  alueNew();.  }. 
15570 20 72 65 74 75 72 6e 20 64 62 2d 3e 70 56 61 6c   return db->pVal
15580 75 65 3b 0a 7d 0a                                ue;.}.