/ Hex Artifact Content
Login

Artifact 98466ddf5e3142783d0c628992836c3c382c9233:


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 2a 2a 20 24    PRAGMA.**.** $
02e0: 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20 31 2e  Id: build.c,v 1.
02f0: 32 33 34 20 32 30 30 34 2f 30 36 2f 32 36 20 31  234 2004/06/26 1
0300: 34 3a 34 36 3a 34 30 20 64 72 68 20 45 78 70 20  4:46:40 drh Exp 
0310: 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  $.*/.#include "s
0320: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0330: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0340: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0350: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
0360: 6e 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74  n a new SQL stat
0370: 65 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69  ement is beginni
0380: 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73  ng to.** be pars
0390: 65 64 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  ed.  Check to se
03a0: 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20  e if the schema 
03b0: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
03c0: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
03d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 53 51  read from the SQ
03e0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 61 6e 64 20  LITE_MASTER and 
03f0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 4d 41 53 54  SQLITE_TEMP_MAST
0400: 45 52 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 49 66  ER tables..** If
0410: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 72   it does, then r
0420: 65 61 64 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ead it..*/.void 
0430: 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73  sqlite3BeginPars
0440: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0450: 20 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67   int explainFlag
0460: 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70  ){.  pParse->exp
0470: 6c 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e 46 6c  lain = explainFl
0480: 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56  ag;.  pParse->nV
0490: 61 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ar = 0;.}../*.**
04a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
04b0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
04c0: 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65  single SQL state
04d0: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
04e0: 20 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44   parsed and a VD
04f0: 42 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78  BE program to ex
0500: 65 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65  ecute that state
0510: 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a  ment has been.**
0520: 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73   prepared.  This
0530: 20 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68   routine puts th
0540: 65 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63  e finishing touc
0550: 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44  hes on the.** VD
0560: 42 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72  BE program and r
0570: 65 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65  esets the pParse
0580: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
0590: 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65  he next.** parse
05a0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
05b0: 74 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  t if an error oc
05c0: 63 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74  curred, it might
05d0: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
05e0: 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64  t.** no VDBE cod
05f0: 65 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e  e was generated.
0600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0610: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72  FinishCoding(Par
0620: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0630: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62  qlite *db;.  Vdb
0640: 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c  e *v;..  if( sql
0650: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
0660: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ed ) return;..  
0670: 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65  /* Begin by gene
0680: 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d  rating some term
0690: 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20  ination code at 
06a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
06b0: 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d   ** vdbe program
06c0: 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  .  */.  db = pPa
06d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73  rse->db;.  v = s
06e0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
06f0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
0700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
0710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c  eAddOp(v, OP_Hal
0720: 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  t, 0, 0);..    /
0730: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
0740: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
0750: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
0760: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
0770: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
0780: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
0790: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
07a0: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
07b0: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
07c0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
07d0: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
07e0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
07f0: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
0800: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
0810: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
0820: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
0830: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
0840: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
0850: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
0860: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
0870: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
0880: 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
0890: 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20   u32 mask;.     
08a0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
08b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
08c0: 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  eP2(v, pParse->c
08d0: 6f 6f 6b 69 65 47 6f 74 6f 2c 20 73 71 6c 69 74  ookieGoto, sqlit
08e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
08f0: 72 28 76 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  r(v));.      for
0900: 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20  (iDb=0, mask=1; 
0910: 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73  iDb<db->nDb; mas
0920: 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20  k<<=1, iDb++){. 
0930: 20 20 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b         if( (mask
0940: 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69   & pParse->cooki
0950: 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74  eMask)==0 ) cont
0960: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
0970: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
0980: 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
0990: 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70  , iDb, (mask & p
09a0: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
09b0: 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69  )!=0);.        i
09c0: 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  f( iDb!=1 ){.   
09d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
09e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65  beAddOp(v, OP_Ve
09f0: 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  rifyCookie, iDb,
0a00: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56   pParse->cookieV
0a10: 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20  alue[iDb]);.    
0a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
0a30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0a40: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
0a50: 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b   0, pParse->cook
0a60: 69 65 47 6f 74 6f 2b 31 29 3b 0a 20 20 20 20 7d  ieGoto+1);.    }
0a70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74  .  }..  /* Get t
0a80: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
0a90: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
0aa0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
0ab0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
0ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
0ad0: 2a 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c  *trace = (db->fl
0ae0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
0af0: 65 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64  eTrace)!=0 ? std
0b00: 6f 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c  out : 0;.    sql
0b10: 69 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c  ite3VdbeTrace(v,
0b20: 20 74 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c   trace);.    sql
0b30: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
0b40: 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61  y(v, pParse->nVa
0b50: 72 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  r, pParse->expla
0b60: 69 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  in);.    pParse-
0b70: 3e 72 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45  >rc = pParse->nE
0b80: 72 72 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f  rr ? SQLITE_ERRO
0b90: 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  R : SQLITE_DONE;
0ba0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
0bb0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
0bc0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65  }else if( pParse
0bd0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
0be0: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
0bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
0c00: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
0c10: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72  nTab = 0;.  pPar
0c20: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  se->nMem = 0;.  
0c30: 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30  pParse->nSet = 0
0c40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  ;.  pParse->nAgg
0c50: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
0c60: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
0c70: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
0c80: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   0;.}../*.** Loc
0c90: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
0ca0: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
0cb0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
0cc0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
0cd0: 62 61 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e  base table given
0ce0: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
0cf0: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
0d00: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
0d10: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
0d20: 62 61 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  base.** containi
0d30: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
0d40: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
0d50: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
0d60: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
0d70: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
0d80: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
0d90: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
0da0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
0db0: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
0dc0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
0dd0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
0de0: 6c 69 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d  licate table nam
0df0: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
0e00: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
0e10: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
0e20: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
0e30: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
0e40: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
0e50: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
0e60: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
0e70: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
0e80: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
0e90: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
0ea0: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
0eb0: 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  te *db, const ch
0ec0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
0ed0: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
0ee0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
0ef0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
0f00: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
0f10: 61 64 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  adSchema(db, 0);
0f20: 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65  .  assert( zName
0f30: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  !=0 );.  for(i=0
0f40: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
0f50: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
0f60: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
0f70: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
0f80: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
0f90: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
0fa0: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
0fb0: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
0fc0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
0fd0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
0fe0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
0ff0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1000: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1010: 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e  b[j].tblHash, zN
1020: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
1030: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
1040: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1050: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1060: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1070: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1080: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1090: 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61   .** a particula
10a0: 72 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  r database table
10b0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 0a   given the name.
10c0: 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  ** of that table
10d0: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
10e0: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
10f0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
1100: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
1110: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
1120: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1130: 2a 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 20  * Also leave an 
1140: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
1150: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
1160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1170: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1180: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
1190: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
11a0: 28 29 0a 2a 2a 20 69 73 20 74 68 61 74 20 74 68  ().** is that th
11b0: 69 73 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  is routine leave
11c0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
11d0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
11e0: 72 72 4d 73 67 0a 2a 2a 20 77 68 65 72 65 20 73  rrMsg.** where s
11f0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1200: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
1210: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
1220: 61 74 65 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ateTable(Parse *
1230: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1240: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
1250: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a   char *zDbase){.
1260: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 70    Table *p;..  p
1270: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1280: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
1290: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
12a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
12b0: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
12c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
12d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
12e0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
12f0: 2e 25 73 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e  .%s", zDbase, zN
1300: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ame);.    }else 
1310: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
1320: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
1330: 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1350: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1360: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 69 73 20  table \"%s\" is 
1370: 6e 6f 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  not in database 
1380: 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
1390: 20 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29    zName, zDbase)
13a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13c0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
13d0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
13e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
13f0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1400: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20  chema = 1;.  }. 
1410: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1420: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
1430: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
1440: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1450: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
1460: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
1470: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
1480: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
1490: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
14a0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
14b0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
14c0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
14d0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
14e0: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
14f0: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
1500: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
1510: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
1520: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
1530: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
1540: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
1550: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
1560: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
1570: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
1580: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
1590: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
15a0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
15b0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
15c0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
15d0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
15e0: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
15f0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
1600: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
1610: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1620: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
1630: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64  har *zDb){.  Ind
1640: 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  ex *p = 0;.  int
1650: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   i;.  int rc = s
1660: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1670: 28 64 62 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  (db, 0);.  for(i
1680: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1690: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
16a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
16b0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
16c0: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
16d0: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
16e0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  /.    if( zDb &&
16f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1700: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
1710: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
1720: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
1730: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
1740: 61 44 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20  aDb[j].idxHash, 
1750: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
1760: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28  ame)+1);.    if(
1770: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
1780: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1790: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
17a0: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
17b0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
17c0: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
17d0: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
17e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
17f0: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
1800: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
1810: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
1820: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
1830: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
1840: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
1850: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
1860: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
1870: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
1880: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
1890: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
18a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
18b0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
18c0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65  sqlite *db, Inde
18d0: 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20 2a  x *p){.  Index *
18e0: 70 4f 6c 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  pOld;..  assert(
18f0: 20 64 62 21 3d 30 20 26 26 20 70 2d 3e 7a 4e 61   db!=0 && p->zNa
1900: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20  me!=0 );.  pOld 
1910: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1920: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
1930: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 2d  iDb].idxHash, p-
1940: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d    strlen(p->zNam
1970: 65 29 2b 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  e)+1, 0);.  if( 
1980: 70 4f 6c 64 21 3d 30 20 26 26 20 70 4f 6c 64 21  pOld!=0 && pOld!
1990: 3d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =p ){.    sqlite
19a0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
19b0: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
19c0: 48 61 73 68 2c 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  Hash, pOld->zNam
19d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19e0: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
19f0: 4f 6c 64 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70  Old->zName)+1, p
1a00: 4f 6c 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Old);.  }.  if( 
1a10: 70 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20  p->zColAff ){.  
1a20: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
1a30: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a 20 20  zColAff);.  }.  
1a40: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
1a50: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74  ../*.** Unlink t
1a60: 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20 66  he given index f
1a70: 72 6f 6d 20 69 74 73 20 74 61 62 6c 65 2c 20 74  rom its table, t
1a80: 68 65 6e 20 72 65 6d 6f 76 65 0a 2a 2a 20 74 68  hen remove.** th
1a90: 65 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  e index from the
1aa0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
1ab0: 65 20 61 6e 64 20 66 72 65 65 20 69 74 73 20 6d  e and free its m
1ac0: 65 6d 6f 72 79 0a 2a 2a 20 73 74 72 75 63 74 75  emory.** structu
1ad0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
1ae0: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
1af0: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20  eteIndex(sqlite 
1b00: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  *db, Index *pInd
1b10: 65 78 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65  ex){.  if( pInde
1b20: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1b30: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
1b40: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1b50: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1b60: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
1b70: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
1b80: 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65 78      for(p=pIndex
1b90: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
1ba0: 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  ; p && p->pNext!
1bb0: 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e  =pIndex; p=p->pN
1bc0: 65 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70  ext){}.    if( p
1bd0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
1be0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 2d  ndex ){.      p-
1bf0: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
1c00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1c10: 7d 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  }.  sqliteDelete
1c20: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1c30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  );.}../*.** Eras
1c40: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
1c50: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
1c60: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
1c70: 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20   tables of.** a 
1c80: 73 69 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20  sigle database. 
1c90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ca0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61   called to recla
1cb0: 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66  im memory.** bef
1cc0: 6f 72 65 20 74 68 65 20 63 6c 6f 73 65 73 2e 20  ore the closes. 
1cd0: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
1ce0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
1cf0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
1d00: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
1d10: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
1d20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1d30: 2a 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65  ** If iDb<=0 the
1d40: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
1d50: 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c  rnal schema tabl
1d60: 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  es for all datab
1d70: 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49  ase.** files.  I
1d80: 66 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65  f iDb>=2 then re
1d90: 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
1da0: 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79   schema for only
1db0: 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66   the.** single f
1dc0: 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  ile indicated..*
1dd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
1de0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1df0: 61 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  a(sqlite *db, in
1e00: 74 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c  t iDb){.  HashEl
1e10: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
1e20: 68 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20  h temp1;.  Hash 
1e30: 74 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20  temp2;.  int i, 
1e40: 6a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  j;..  assert( iD
1e50: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1e60: 6e 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  nDb );.  db->fla
1e70: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
1e80: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72  itialized;.  for
1e90: 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44  (i=iDb; i<db->nD
1ea0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1eb0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1ec0: 69 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20  i];.    temp1 = 
1ed0: 70 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  pDb->tblHash;.  
1ee0: 20 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74    temp2 = pDb->t
1ef0: 72 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c  rigHash;.    sql
1f00: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44  ite3HashInit(&pD
1f10: 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c  b->trigHash, SQL
1f20: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
1f30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1f40: 48 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e  HashClear(&pDb->
1f50: 61 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  aFKey);.    sqli
1f60: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44  te3HashClear(&pD
1f70: 62 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20  b->idxHash);.   
1f80: 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
1f90: 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70  eHashFirst(&temp
1fa0: 32 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  2); pElem; pElem
1fb0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1fc0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54  pElem)){.      T
1fd0: 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
1fe0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
1ff0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20  a(pElem);.      
2000: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
2010: 67 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a  gger(pTrigger);.
2020: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2030: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2040: 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  2);.    sqlite3H
2050: 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62  ashInit(&pDb->tb
2060: 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41  lHash, SQLITE_HA
2070: 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20  SH_STRING, 0);. 
2080: 20 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c     for(pElem=sql
2090: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65  iteHashFirst(&te
20a0: 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  mp1); pElem; pEl
20b0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
20c0: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20  t(pElem)){.     
20d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
20e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
20f0: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
2100: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
2110: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  b, pTab);.    }.
2120: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43      sqlite3HashC
2130: 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20  lear(&temp1);.  
2140: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
2150: 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65  y(db, i, DB_Sche
2160: 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69  maLoaded);.    i
2170: 66 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72  f( iDb>0 ) retur
2180: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
2190: 20 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d   iDb==0 );.  db-
21a0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
21b0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
21c0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72  ..  /* If one or
21d0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78   more of the aux
21e0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
21f0: 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63  files has been c
2200: 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  losed,.  ** then
2210: 20 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f   remove then fro
2220: 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  m the auxiliary 
2230: 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20  database list.  
2240: 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a  We take the.  **
2250: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
2260: 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e  do this here sin
2270: 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20  ce we have just 
2280: 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74  deleted all of t
2290: 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68  he.  ** schema h
22a0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
22b0: 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20  herefore do not 
22c0: 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79  have to make any
22d0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
22e0: 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61   any of those ta
22f0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
2300: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
2310: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
2320: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
2330: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2340: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
2350: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
2360: 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65  Aux && pDb->xFre
2370: 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65  eAux ) pDb->xFre
2380: 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b  eAux(pDb->pAux);
2390: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78  .      pDb->pAux
23a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
23b0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
23c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
23d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
23e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
23f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
2400: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2410: 69 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61  iteFree(pDb->zNa
2420: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
2430: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2440: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2450: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
2460: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
2470: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
2480: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
2490: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
24a0: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
24b0: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
24c0: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
24d0: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
24e0: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
24f0: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
2500: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
2510: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
2520: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
2530: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
2540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2550: 65 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  e(db->aDb);.    
2560: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
2570: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
2580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2590: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
25a0: 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
25b0: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65   occurs.  If the
25c0: 72 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d  re were.** schem
25d0: 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67  a changes during
25e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
25f0: 2c 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74  , then we have t
2600: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69  o reset the.** i
2610: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
2620: 6c 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  les and reload t
2630: 68 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  hem from disk..*
2640: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
2650: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68  llbackInternalCh
2660: 61 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62  anges(sqlite *db
2670: 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ){.  if( db->fla
2680: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
2690: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
26a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
26b0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
26c0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
26d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
26f0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
2700: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
2710: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
2720: 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  es(sqlite *db){.
2730: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
2740: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
2750: 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nges;.}../*.** R
2760: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
2770: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2780: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2790: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
27a0: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
27b0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
27c0: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
27d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
27e0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
27f0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
2800: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
2810: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
2820: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
2830: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
2840: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72  hash table.  Nor
2850: 20 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a   does it remove.
2860: 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ** foreign keys 
2870: 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e  from the sqlite.
2880: 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65  aFKey hash table
2890: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
28a0: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
28b0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
28c0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
28d0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
28e0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
28f0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2900: 20 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   Indices associa
2910: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
2920: 6c 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20  le are unlinked 
2930: 66 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a  from the "db".**
2940: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
2950: 69 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66  if db!=NULL.  If
2960: 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63   db==NULL, indic
2970: 65 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a  es attached to.*
2980: 2a 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  * the table are 
2990: 64 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20  deleted, but it 
29a0: 69 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20  is assumed they 
29b0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
29c0: 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  n.** unlinked..*
29d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
29e0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
29f0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
2a00: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
2a10: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
2a20: 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a  *pNext;.  FKey *
2a30: 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65  pFKey, *pNextFKe
2a40: 79 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  y;..  if( pTable
2a50: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
2a60: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
2a70: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
2a80: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
2a90: 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  e.  */.  for(pIn
2aa0: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
2ab0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
2ac0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
2ad0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
2ae0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
2af0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d  rt( pIndex->iDb=
2b00: 3d 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20  =pTable->iDb || 
2b10: 28 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20  (pTable->iDb==0 
2b20: 26 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  && pIndex->iDb==
2b30: 31 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  1) );.    sqlite
2b40: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
2b50: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
2b60: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
2b70: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
2b80: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2b90: 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73  table.  The keys
2ba0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
2bb0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  e already been u
2bc0: 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65  nlinked from the
2bd0: 20 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20   db->aFKey hash 
2be0: 74 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f  table .  */.  fo
2bf0: 72 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e  r(pFKey=pTable->
2c00: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46  pFKey; pFKey; pF
2c10: 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a  Key=pNextFKey){.
2c20: 20 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20      pNextFKey = 
2c30: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
2c40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2c50: 61 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44  able->iDb<db->nD
2c60: 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
2c70: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2c80: 28 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65  (&db->aDb[pTable
2c90: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20  ->iDb].aFKey,.  
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
2cc0: 7a 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65  zTo, strlen(pFKe
2cd0: 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65  y->zTo)+1)!=pFKe
2ce0: 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  y );.    sqliteF
2cf0: 72 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a  ree(pFKey);.  }.
2d00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
2d10: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2d20: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2d30: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
2d40: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  e->nCol; i++){. 
2d50: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
2d60: 3d 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  = &pTable->aCol[
2d70: 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  i];.    sqliteFr
2d80: 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  ee(pCol->zName);
2d90: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2da0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
2db0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
2dc0: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20  l->zType);.  }. 
2dd0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62   sqliteFree(pTab
2de0: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  le->zName);.  sq
2df0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e00: 3e 61 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54  >aCol);.  if( pT
2e10: 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  able->zColAff ){
2e20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e30: 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29  pTable->zColAff)
2e40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2e50: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62  electDelete(pTab
2e60: 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  le->pSelect);.  
2e70: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2e80: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  e);.}../*.** Unl
2e90: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
2ea0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
2eb0: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
2ec0: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
2ed0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
2ee0: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
2ef0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
2f00: 6b 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  keys..*/.static 
2f10: 76 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e  void sqliteUnlin
2f20: 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28  kAndDeleteTable(
2f30: 73 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c  sqlite *db, Tabl
2f40: 65 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a  e *p){.  Table *
2f50: 70 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46  pOld;.  FKey *pF
2f60: 31 2c 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69  1, *pF2;.  int i
2f70: 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73   = p->iDb;.  ass
2f80: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
2f90: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
2fa0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
2fb0: 62 5b 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d  b[i].tblHash, p-
2fc0: 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70  >zName, strlen(p
2fd0: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a 20  ->zName)+1,0);. 
2fe0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2ff0: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
3000: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
3010: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
3020: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
3030: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
3040: 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  n(pF1->zTo) + 1;
3050: 0a 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74  .    pF2 = sqlit
3060: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
3070: 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46  aDb[i].aFKey, pF
3080: 31 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  1->zTo, nTo);.  
3090: 20 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29    if( pF2==pF1 )
30a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  {.      sqlite3H
30b0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
30c0: 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31  Db[i].aFKey, pF1
30d0: 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d  ->zTo, nTo, pF1-
30e0: 3e 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d  >pNextTo);.    }
30f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c  else{.      whil
3100: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
3110: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
3120: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
3130: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 32   }.      if( pF2
3140: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d   ){.        pF2-
3150: 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e  >pNextTo = pF1->
3160: 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d  pNextTo;.      }
3170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3180: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3190: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
31a0: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
31b0: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
31c0: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
31d0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
31e0: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20  t.** token with 
31f0: 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72  any quotations r
3200: 65 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74  emoved.  Space t
3210: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
3220: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
3230: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3240: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
3250: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
3260: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
3270: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
3280: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61  * Tokens are rea
3290: 6c 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  lly just pointer
32a0: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
32b0: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
32c0: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
32d0: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
32e0: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
32f0: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
3300: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
3310: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
3320: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
3330: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
3340: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
3350: 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  en(Token *pName)
3360: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
3370: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
3380: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
3390: 74 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d  teStrNDup(pName-
33a0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
33b0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
33c0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  e(zName);.  }els
33d0: 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  e{.    zName = 0
33e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
33f0: 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Name;.}../*.** O
3400: 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  pen the sqlite_m
3410: 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72  aster table stor
3420: 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e  ed in database n
3430: 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a  umber iDb for.**
3440: 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61   writing. The ta
3450: 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73  ble is opened us
3460: 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f  ing cursor 0..*/
3470: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65  .void sqlite3Ope
3480: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62  nMasterTable(Vdb
3490: 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *v, int iDb){.
34a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34b0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
34c0: 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c  , iDb, 0);.  sql
34d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
34e0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
34f0: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a  , MASTER_ROOT);.
3500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3510: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
3520: 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f  olumns, 0, 5); /
3530: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
3540: 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f  has 5 columns */
3550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
3560: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
3570: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
3580: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
3590: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
35a0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
35b0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
35c0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
35d0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
35e0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
35f0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
3600: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
3610: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
3620: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
3630: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69  exist..*/.int fi
3640: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
3650: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
3660: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
3670: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
3680: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  i++){.    if( pN
3690: 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64  ame->n==strlen(d
36a0: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29  b->aDb[i].zName)
36b0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 30 3d 3d   && .        0==
36c0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
36d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
36e0: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
36f0: 65 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20 20 72  e->n) ){.      r
3700: 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20  eturn i;.    }. 
3710: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
3720: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
3730: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
3740: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
3750: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
3760: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
3770: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
3780: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
3790: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
37a0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
37b0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
37c0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
37d0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
37e0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
37f0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
3800: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
3810: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
3820: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
3830: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
3840: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
3850: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
3860: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
3870: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
3880: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
3890: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
38a0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
38b0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
38c0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
38d0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
38e0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
38f0: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
3900: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
3910: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
3920: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
3930: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
3940: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
3950: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
3960: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
3970: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3980: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
3990: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
39a0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
39b0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
39c0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
39d0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
39e0: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
39f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
3a00: 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22      /* The "yyy"
3a10: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
3a20: 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65  x.yyy" */.  Toke
3a30: 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20  n **pUnqual     
3a40: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71  /* Write the unq
3a50: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20  ualified object 
3a60: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
3a70: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a90: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
3aa0: 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  g the object */.
3ab0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3ac0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
3ad0: 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61  f( pName2 && pNa
3ae0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
3af0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
3b00: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70  t.busy );.    *p
3b10: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
3b20: 0a 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44  .    iDb = findD
3b30: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
3b40: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
3b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3b60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
3b70: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
3b80: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
3b90: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
3ba0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
3bb0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
3bc0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
3bd0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
3be0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
3bf0: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
3c00: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
3c10: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
3c20: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3c30: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
3c40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3c50: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
3c60: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
3c70: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
3c80: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
3c90: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
3ca0: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
3cb0: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
3cc0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
3cd0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
3ce0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
3cf0: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
3d00: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
3d10: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
3d20: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
3d30: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
3d40: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
3d50: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
3d60: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
3d70: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
3d80: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
3d90: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
3da0: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
3db0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
3dc0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
3dd0: 69 74 2e 62 75 73 79 20 26 26 20 30 3d 3d 73 71  it.busy && 0==sq
3de0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
3df0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
3e00: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
3e10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3e20: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
3e30: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
3e40: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
3e50: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
3e60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
3e70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3e80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3e90: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
3ea0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
3eb0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
3ec0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
3ed0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
3ee0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
3ef0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
3f00: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
3f10: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
3f20: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3f30: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
3f40: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
3f50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
3f60: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
3f70: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
3f80: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
3f90: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
3fa0: 68 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b  he.** pStart tok
3fb0: 65 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45  en is the CREATE
3fc0: 20 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68   and pName is th
3fd0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  e table name.  T
3fe0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
3ff0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
4000: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
4010: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
4020: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
4030: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
4040: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
4050: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
4060: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
4070: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
4080: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
4090: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
40a0: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
40b0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
40c0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
40d0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
40e0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
40f0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
4100: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4110: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
4120: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
4130: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
4140: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
4150: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
4160: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
4170: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
4180: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
4190: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
41a0: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
41b0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
41c0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
41d0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
41e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
41f0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
4200: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
4210: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
4220: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
4230: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
4240: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
4250: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
4260: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4270: 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
4280: 20 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22   /* The "CREATE"
4290: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65   token */.  Toke
42a0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
42b0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
42c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
42d0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
42e0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
42f0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
4300: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
4310: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
4320: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
4330: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
4340: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
4350: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
4360: 20 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a   isView       /*
4370: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
4380: 20 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20   a VIEW */.){.  
4390: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20  Table *pTable;. 
43a0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
43b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73  char *zName;.  s
43c0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
43d0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
43e0: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
43f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4400: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
4410: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
4420: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4430: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
4440: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
4450: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
4460: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61   */..  /* The ta
4470: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
4480: 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61   to create is pa
4490: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
44a0: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
44b0: 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20    ** pName1 and 
44c0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
44d0: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
44e0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
44f0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
4500: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
4510: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
4520: 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65  ;.  ** .  ** The
4530: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4540: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
4550: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
4560: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4570: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
4580: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4590: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
45a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
45b0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
45c0: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
45d0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
45e0: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
45f0: 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a  me2 is ""..  **.
4600: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65    ** The call be
4610: 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61  low sets the pNa
4620: 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  me pointer to po
4630: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4640: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a   (pName1 or.  **
4650: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4660: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4670: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4680: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44   The variable iD
4690: 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f  b is.  ** set to
46a0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
46b0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
46c0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
46d0: 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  w is to be.  ** 
46e0: 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f  created in..  */
46f0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
4700: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
4710: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
4720: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
4730: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
4740: 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  n;.  if( isTemp 
4750: 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  && iDb>1 ){.    
4760: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
4770: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
4780: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
4790: 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20   qualified */.  
47a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
47b0: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
47c0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
47d0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
47e0: 69 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73  ied");.    pPars
47f0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
4800: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
4810: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
4820: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
4830: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
4840: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
4850: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4860: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
4870: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
4880: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
4890: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
48a0: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
48b0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
48c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
48d0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
48e0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
48f0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
4900: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
4910: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
4920: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
4930: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
4940: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
4950: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
4960: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
4970: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
4980: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4990: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
49a0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
49b0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
49c0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
49d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
49e0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
49f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4a00: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
4a10: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
4a20: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
4a30: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4a40: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
4a50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4a60: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4a70: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
4a80: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4a90: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
4aa0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
4ab0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
4ac0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
4ad0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4ae0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4af0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
4b00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4b10: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
4b20: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
4b30: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
4b40: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
4b50: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4b60: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4b70: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
4b80: 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e   /* Before tryin
4b90: 67 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65  g to create a te
4ba0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d  mporary table, m
4bb0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72  ake sure the Btr
4bc0: 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64  ee for.  ** hold
4bd0: 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
4be0: 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20  bles is open..  
4bf0: 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  */.  if( isTemp 
4c00: 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  && db->aDb[1].pB
4c10: 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
4c20: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
4c30: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4c40: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
4c50: 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
4c60: 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
4c70: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4ca0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
4cb0: 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
4cc0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
4cd0: 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
4ce0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
4cf0: 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
4d00: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
4d10: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  rr++;.      sqli
4d20: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4d30: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4d40: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66   }.    if( db->f
4d50: 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75 74 6f  lags & !db->auto
4d60: 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  Commit ){.      
4d70: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
4d80: 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62 2d 3e  eBeginTrans(db->
4d90: 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 29 3b 0a  aDb[1].pBt, 1);.
4da0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
4db0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
4dc0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4dd0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
4de0: 6c 65 20 74 6f 20 67 65 74 20 61 20 77 72 69 74  le to get a writ
4df0: 65 20 6c 6f 63 6b 20 6f 6e 20 22 0a 20 20 20 20  e lock on ".    
4e00: 20 20 20 20 20 20 22 74 68 65 20 74 65 6d 70 6f        "the tempo
4e10: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  rary database fi
4e20: 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  le");.        sq
4e30: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4e40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
4e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4e60: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
4e70: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
4e80: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
4e90: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
4ea0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
4eb0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
4ec0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
4ed0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
4ee0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
4ef0: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a  f.  ** it does..
4f00: 20 20 2a 2f 0a 20 20 70 54 61 62 6c 65 20 3d 20    */.  pTable = 
4f10: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
4f20: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
4f30: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
4f40: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
4f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4f60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
4f70: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
4f80: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
4f90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4fa0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
4fb0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  n;.  }.  if( (pI
4fc0: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
4fd0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
4fe0: 20 30 29 29 21 3d 30 20 26 26 0a 20 20 20 20 20   0))!=0 &&.     
4ff0: 20 20 20 20 20 28 70 49 64 78 2d 3e 69 44 62 3d       (pIdx->iDb=
5000: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
5010: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73 71 6c  busy) ){.    sql
5020: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5030: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
5040: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
5050: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
5060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
5070: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  e(zName);.    re
5080: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62  turn;.  }.  pTab
5090: 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  le = sqliteMallo
50a0: 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  c( sizeof(Table)
50b0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65   );.  if( pTable
50c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
50d0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
50e0: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
50f0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 73 71  ->nErr++;.    sq
5100: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
5110: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5120: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
5130: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
5140: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
5150: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
5160: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
5170: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
5180: 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  ->pIndex = 0;.  
5190: 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20 69 44  pTable->iDb = iD
51a0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
51b0: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
51c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
51d0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
51e0: 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72 73 65  Table);.  pParse
51f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
5200: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  able;..  /* Begi
5210: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
5220: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
5230: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
5240: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
5250: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
5260: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
5270: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
5280: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
5290: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
52a0: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
52b0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
52c0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
52d0: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
52e0: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
52f0: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
5300: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
5310: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
5320: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
5330: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
5340: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
5350: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
5360: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
5370: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
5380: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
5390: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
53a0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
53b0: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
53c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
53d0: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
53e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
53f0: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
5400: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
5410: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
5420: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
5430: 0a 20 20 20 20 2f 2a 20 45 76 65 72 79 20 74 69  .    /* Every ti
5440: 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69  me a new table i
5450: 73 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  s created the fi
5460: 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  le-format.    **
5470: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65   and encoding me
5480: 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65  ta-values are se
5490: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
54a0: 65 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63 61 73  e, in.    ** cas
54b0: 65 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  e this is the fi
54c0: 72 73 74 20 74 61 62 6c 65 20 63 72 65 61 74 65  rst table create
54d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
54e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
54f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5500: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 30  ->file_format, 0
5510: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5520: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
5530: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 29  tCookie, iDb, 1)
5540: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5550: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5560: 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 30  eger, db->enc, 0
5570: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
5590: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 29  tCookie, iDb, 4)
55a0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ;..    sqlite3Op
55b0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
55c0: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
55d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
55e0: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30  P_NewRecno, 0, 0
55f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
5610: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 0, 0);.    sq
5620: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5630: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
5640: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5650: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5660: 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29  PutIntKey, 0, 0)
5670: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5680: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
5690: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
56a0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
56b0: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
56c0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
56d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
56e0: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
56f0: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
5700: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
5710: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5720: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
5730: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
5740: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
5750: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
5760: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
5770: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
5780: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
5790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
57a0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
57b0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
57c0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
57d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
57e0: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
57f0: 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d  pCol;.  if( (p =
5800: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5810: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
5820: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
5830: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
5840: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
5850: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
5860: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
5870: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
5880: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 70  ite3StrICmp(z, p
5890: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
58a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
58b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
58c0: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
58d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
58e0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
58f0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
5900: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
5910: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f   }.  if( (p->nCo
5920: 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  l & 0x7)==0 ){. 
5930: 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b     Column *aNew;
5940: 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69  .    aNew = sqli
5950: 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 43  teRealloc( p->aC
5960: 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  ol, (p->nCol+8)*
5970: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
5980: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
5990: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
59a0: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
59b0: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
59c0: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
59d0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
59e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
59f0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
5a00: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
5a10: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
5a20: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
5a30: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
5a40: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
5a50: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
5a60: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
5a70: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
5a80: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
5a90: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
5aa0: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
5ab0: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
5ac0: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
5ad0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
5ae0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
5af0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
5b00: 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pCol->pColl = p
5b10: 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
5b20: 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  Coll;.  p->nCol+
5b30: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
5b40: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5b50: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
5b60: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
5b70: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
5b80: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
5b90: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
5ba0: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
5bb0: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
5bc0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
5bd0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
5be0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
5bf0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
5c00: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
5c10: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
5c20: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
5c30: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
5c40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5c50: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
5c60: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
5c70: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
5c80: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
5c90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
5ca0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
5cb0: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
5cc0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
5cd0: 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   onError;.}../*.
5ce0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5cf0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
5d00: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
5d10: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
5d20: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
5d30: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
5d40: 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20  nt.  The pFirst 
5d50: 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72  token is the fir
5d60: 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74  st.** token in t
5d70: 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  he sequence of t
5d80: 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72  okens that descr
5d90: 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ibe the type of 
5da0: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75  the.** column cu
5db0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5dc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c  nstruction.   pL
5dd0: 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20  ast is the last 
5de0: 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  token.** in the 
5df0: 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74  sequence.  Use t
5e00: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
5e10: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73  to construct a s
5e20: 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f  tring.** that co
5e30: 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e  ntains the typen
5e40: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
5e50: 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74  n and store that
5e60: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54   string.** in zT
5e70: 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ype..*/ .void sq
5e80: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
5e90: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
5ea0: 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73 74 2c  , Token *pFirst,
5eb0: 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29 7b 0a   Token *pLast){.
5ec0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5ed0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b  t i, j;.  int n;
5ee0: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a  .  char *z, **pz
5ef0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
5f00: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5f10: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5f20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5f30: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
5f40: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
5f50: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
5f60: 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d 20 26  Col[i];.  pz = &
5f70: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e  pCol->zType;.  n
5f80: 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20 41 64   = pLast->n + Ad
5f90: 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d 20 41  dr(pLast->z) - A
5fa0: 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29 3b 0a  ddr(pFirst->z);.
5fb0: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
5fc0: 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74 2d 3e  ing(pz, pFirst->
5fd0: 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20 3d 20  z, n, 0);.  z = 
5fe0: 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  *pz;.  if( z==0 
5ff0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
6000: 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  i=j=0; z[i]; i++
6010: 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a  ){.    int c = z
6020: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73  [i];.    if( iss
6030: 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e  pace(c) ) contin
6040: 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  ue;.    z[j++] =
6050: 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d   c;.  }.  z[j] =
6060: 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   0;.  pCol->affi
6070: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
6080: 66 69 6e 69 74 79 54 79 70 65 28 7a 2c 20 6e 29  finityType(z, n)
6090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67  ;.}../*.** The g
60a0: 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68  iven token is th
60b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
60c0: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  for the last col
60d0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20  umn added to.** 
60e0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
60f0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
6100: 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e  uction.  If "min
6110: 75 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c  usFlag" is true,
6120: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
6130: 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73   value token was
6140: 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d   preceded by a m
6150: 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a  inus sign..**.**
6160: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6170: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
6180: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
6190: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
61a0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
61b0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
61c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
61d0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
61e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
61f0: 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74  Token *pVal, int
6200: 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54   minusFlag){.  T
6210: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
6220: 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b 0a 20  ;.  char **pz;. 
6230: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
6240: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
6250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
6260: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
6270: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20   i<0 ) return;. 
6280: 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69   pz = &p->aCol[i
6290: 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28 20 6d  ].zDflt;.  if( m
62a0: 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20 20 20  inusFlag ){.    
62b0: 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
62c0: 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20 70 56  g(pz, "-", 1, pV
62d0: 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20  al->z, pVal->n, 
62e0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
62f0: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
6300: 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20  ng(pz, pVal->z, 
6310: 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d  pVal->n, 0);.  }
6320: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
6330: 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(*pz);.}../*.**
6340: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
6350: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
6360: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
6370: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
6380: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
6390: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
63a0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
63b0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
63c0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
63d0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
63e0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
63f0: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
6400: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
6410: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
6420: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
6430: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
6440: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
6450: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
6460: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
6470: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
6480: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
6490: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
64a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
64b0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
64c0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
64d0: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
64e0: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
64f0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
6500: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
6510: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20 69 64  mn as the row id
6520: 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a 0a 2a  .  (Exception:.*
6530: 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20  * For backwards 
6540: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
6550: 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62 61 73  th older databas
6560: 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  es, do not do th
6570: 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  is.** if the fil
6580: 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  e format version
6590: 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
65a0: 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20 74 68  than 1.)  Set th
65b0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
65c0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
65d0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
65e0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
65f0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
6600: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
6610: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
6620: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
6630: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
6640: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
6650: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
6660: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
6670: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
6680: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
6690: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
66a0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
66b0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
66c0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
66d0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
66e0: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
66f0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
6700: 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  yKey(Parse *pPar
6710: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
6720: 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  ist, int onError
6730: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6740: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
6750: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
6760: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
6770: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
6780: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
6790: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
67a0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
67b0: 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20  hasPrimKey ){.  
67c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
67d0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
67e0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
67f0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
6800: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
6810: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
6820: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
6830: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
6840: 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 3d  ab->hasPrimKey =
6850: 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   1;.  if( pList=
6860: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
6870: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
6880: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
6890: 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20  iCol].isPrimKey 
68a0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
68b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
68c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
68d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  .      for(iCol=
68e0: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
68f0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
6900: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6910: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
6920: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
6930: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
6940: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
6950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6960: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6970: 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d    if( iCol<pTab-
6980: 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e 61 43  >nCol ) pTab->aC
6990: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
69a0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ey = 1;.    }.  
69b0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
69c0: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
69d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
69e0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
69f0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
6a00: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
6a10: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
6a20: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
6a30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6a40: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
6a50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
6a60: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
6a70: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
6a80: 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d  f = onError;.  }
6a90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6aa0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
6ab0: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
6ac0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
6ad0: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
6ae0: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
6af0: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
6b00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6b10: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  te(pList);.  ret
6b20: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  urn;.}../*.** Se
6b30: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
6b40: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
6b50: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
6b60: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
6b70: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
6b80: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
6b90: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
6ba0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
6bb0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
6bc0: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
6bd0: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
6be0: 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  p;.  Index *pIdx
6bf0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
6c00: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
6c10: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6c20: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6c30: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
6c40: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f  ->nCol-1;..  pCo
6c50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
6c60: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
6c70: 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65 29 3b  , zType, nType);
6c80: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43  .  p->aCol[i].pC
6c90: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20  oll = pColl;..  
6ca0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
6cb0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
6cc0: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
6cd0: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
6ce0: 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61  e>",.  ** then a
6cf0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
6d00: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
6d10: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
6d20: 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c  ore the.  ** col
6d30: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
6d40: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
6d50: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
6d60: 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   case..  */.  fo
6d70: 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49 6e 64  r(pIdx = p->pInd
6d80: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
6d90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
6da0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
6db0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6dc0: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
6dd0: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49 64 78  umn[0]==i ) pIdx
6de0: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
6df0: 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a  0] = pColl;.  }.
6e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
6e10: 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 6e  and return an en
6e20: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64 62 2e  try from the db.
6e30: 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61  aCollSeq hash ta
6e40: 62 6c 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72  ble. If the entr
6e50: 79 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  y.** specified b
6e60: 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e 61 6d  y zName and nNam
6e70: 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61  e is not found a
6e80: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 27 63 72  nd parameter 'cr
6e90: 65 61 74 65 27 20 69 73 0a 2a 2a 20 74 72 75 65  eate' is.** true
6ea0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
6eb0: 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  new entry. Other
6ec0: 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  wise return NULL
6ed0: 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70 6f 69  ..**.** Each poi
6ee0: 6e 74 65 72 20 73 74 6f 72 65 64 20 69 6e 20 74  nter stored in t
6ef0: 68 65 20 73 71 6c 69 74 65 33 2e 61 43 6f 6c 6c  he sqlite3.aColl
6f00: 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 20 63  Seq hash table c
6f10: 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20 61 72  ontains an.** ar
6f20: 72 61 79 20 6f 66 20 74 68 72 65 65 20 43 6f 6c  ray of three Col
6f30: 6c 53 65 71 20 73 74 72 75 63 74 75 72 65 73 2e  lSeq structures.
6f40: 20 54 68 65 20 66 69 72 73 74 20 69 73 20 74 68   The first is th
6f50: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
6f60: 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65 72 72  ence.** prefferr
6f70: 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 74 68  ed for UTF-8, th
6f80: 65 20 73 65 63 6f 6e 64 20 55 54 46 2d 31 36 6c  e second UTF-16l
6f90: 65 2c 20 61 6e 64 20 74 68 65 20 74 68 69 72 64  e, and the third
6fa0: 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a   UTF-16be..**.**
6fb0: 20 53 74 6f 72 65 64 20 69 6d 6d 65 64 69 61 74   Stored immediat
6fc0: 65 6c 79 20 61 66 74 65 72 20 74 68 65 20 74 68  ely after the th
6fd0: 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ree collation se
6fe0: 71 75 65 6e 63 65 73 20 69 73 20 61 20 63 6f 70  quences is a cop
6ff0: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  y of.** the coll
7000: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
7010: 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72 20 74  ame. A pointer t
7020: 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20 69 73  o this string is
7030: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 65 61   stored in.** ea
7040: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
7050: 75 65 6e 63 65 20 73 74 72 75 63 74 75 72 65 2e  uence structure.
7060: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
7070: 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53 65 71  eq * findCollSeq
7080: 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74 65 20  Entry(.  sqlite 
7090: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
70a0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
70b0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65  nName,.  int cre
70c0: 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ate.){.  CollSeq
70d0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e   *pColl;.  if( n
70e0: 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d  Name<0 ) nName =
70f0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
7100: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
7110: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
7120: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
7130: 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66 28 20 30  nName);..  if( 0
7140: 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72 65 61 74  ==pColl && creat
7150: 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  e ){.    pColl =
7160: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 33   sqliteMalloc( 3
7170: 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c 29 20  *sizeof(*pColl) 
7180: 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b 0a 20  + nName + 1 );. 
7190: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
71a0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a        pColl[0].z
71b0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
71c0: 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70  Coll[3];.      p
71d0: 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d 20 53 51  Coll[0].enc = SQ
71e0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
71f0: 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20   pColl[1].zName 
7200: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b  = (char*)&pColl[
7210: 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  3];.      pColl[
7220: 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  1].enc = SQLITE_
7230: 55 54 46 31 36 4c 45 3b 0a 20 20 20 20 20 20 70  UTF16LE;.      p
7240: 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20  Coll[2].zName = 
7250: 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d  (char*)&pColl[3]
7260: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d  ;.      pColl[2]
7270: 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  .enc = SQLITE_UT
7280: 46 31 36 42 45 3b 0a 20 20 20 20 20 20 6d 65 6d  F16BE;.      mem
7290: 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61  cpy(pColl[0].zNa
72a0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
72b0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  );.      pColl[0
72c0: 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d  ].zName[nName] =
72d0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
72e0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
72f0: 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c  >aCollSeq, pColl
7300: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  [0].zName, nName
7310: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , pColl);.    }.
7320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
7330: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  ll;.}../*.** Par
7340: 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69  ameter zName poi
7350: 6e 74 73 20 74 6f 20 61 20 55 54 46 2d 38 20 65  nts to a UTF-8 e
7360: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20 6e 4e  ncoded string nN
7370: 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67 2e 0a  ame bytes long..
7380: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 43 6f  ** Return the Co
7390: 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72 20 66  llSeq* pointer f
73a0: 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  or the collation
73b0: 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20   sequence named 
73c0: 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74 68 65  zName.** for the
73d0: 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63 27 20   encoding 'enc' 
73e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
73f0: 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  e 'db'..**.** If
7400: 20 74 68 65 20 65 6e 74 72 79 20 73 70 65 63 69   the entry speci
7410: 66 69 65 64 20 69 73 20 6e 6f 74 20 66 6f 75 6e  fied is not foun
7420: 64 20 61 6e 64 20 27 63 72 65 61 74 65 27 20 69  d and 'create' i
7430: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65  s true, then cre
7440: 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65 6e 74  ate a.** new ent
7450: 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65 20 72  ry.  Otherwise r
7460: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43  eturn NULL..*/.C
7470: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 46  ollSeq *sqlite3F
7480: 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20 73 71  indCollSeq(.  sq
7490: 6c 69 74 65 20 2a 64 62 2c 0a 20 20 75 38 20 65  lite *db,.  u8 e
74a0: 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nc,.  const char
74b0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
74c0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72 65 61  Name,.  int crea
74d0: 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  te.){.  CollSeq 
74e0: 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c  *pColl = findCol
74f0: 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20 7a 4e  lSeqEntry(db, zN
7500: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72 65 61  ame, nName, crea
7510: 74 65 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  te);.  if( pColl
7520: 20 29 20 73 77 69 74 63 68 28 20 65 6e 63 20 29   ) switch( enc )
7530: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
7540: 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 62 72  E_UTF8:.      br
7550: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7560: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20  LITE_UTF16LE:.  
7570: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 26 70 43 6f      pColl = &pCo
7580: 6c 6c 5b 31 5d 3b 0a 20 20 20 20 20 20 62 72 65  ll[1];.      bre
7590: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
75a0: 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20  ITE_UTF16BE:.   
75b0: 20 20 20 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c     pColl = &pCol
75c0: 6c 5b 32 5d 3b 0a 20 20 20 20 20 20 62 72 65 61  l[2];.      brea
75d0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
75e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
75f0: 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 22 29 3b  Cannot happen");
7600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
7610: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  oll;.}../*.** In
7620: 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c 6c 61 74  voke the 'collat
7630: 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c  ion needed' call
7640: 62 61 63 6b 20 74 6f 20 72 65 71 75 65 73 74 20  back to request 
7650: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
7660: 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  ence.** in the d
7670: 61 74 61 62 61 73 65 20 74 65 78 74 20 65 6e 63  atabase text enc
7680: 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65 20 7a 4e  oding of name zN
7690: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
76a0: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c  e..** If the col
76b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a  lation sequence.
76c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
76d0: 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 73 71  allCollNeeded(sq
76e0: 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20  lite *db, const 
76f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
7700: 20 6e 4e 61 6d 65 29 7b 0a 20 20 61 73 73 65 72   nName){.  asser
7710: 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  t( !db->xCollNee
7720: 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c  ded || !db->xCol
7730: 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a 20 20 69  lNeeded16 );.  i
7740: 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61  f( nName<0 ) nNa
7750: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
7760: 65 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 43  e);.  if( db->xC
7770: 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a 20 20 20  ollNeeded ){.   
7780: 20 63 68 61 72 20 2a 7a 45 78 74 65 72 6e 61 6c   char *zExternal
7790: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
77a0: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
77b0: 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e      if( !zExtern
77c0: 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  al ) return;.   
77d0: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
77e0: 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64  (db->pCollNeeded
77f0: 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62  Arg, db, (int)db
7800: 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c  ->enc, zExternal
7810: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
7820: 65 28 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  e(zExternal);.  
7830: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c  }.  if( db->xCol
7840: 6c 4e 65 65 64 65 64 31 36 20 29 7b 0a 20 20 20  lNeeded16 ){.   
7850: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 45 78   char const *zEx
7860: 74 65 72 6e 61 6c 3b 0a 20 20 20 20 73 71 6c 69  ternal;.    sqli
7870: 74 65 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20  te3_value *pTmp 
7880: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e  = sqlite3GetTran
7890: 73 69 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a  sientValue(db);.
78a0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
78b0: 53 65 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c  SetStr(pTmp, -1,
78c0: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55   zName, SQLITE_U
78d0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
78e0: 49 43 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e  IC);.    zExtern
78f0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
7900: 65 54 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49  eText(pTmp, SQLI
7910: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7920: 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65 72  .    if( !zExter
7930: 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nal ) return;.  
7940: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
7950: 64 31 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  d16(db->pCollNee
7960: 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74  dedArg, db, (int
7970: 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72  )db->enc, zExter
7980: 6e 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nal);.  }.}../*.
7990: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
79a0: 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
79b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
79c0: 72 79 20 66 61 69 6c 73 20 74 6f 20 64 65 6c 69  ry fails to deli
79d0: 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69  ver a.** collati
79e0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  on function in t
79f0: 68 65 20 62 65 73 74 20 65 6e 63 6f 64 69 6e 67  he best encoding
7a00: 20 62 75 74 20 74 68 65 72 65 20 6d 61 79 20 62   but there may b
7a10: 65 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73  e other versions
7a20: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6c 6c  .** of this coll
7a30: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 28  ation function (
7a40: 66 6f 72 20 6f 74 68 65 72 20 74 65 78 74 20 65  for other text e
7a50: 6e 63 6f 64 69 6e 67 73 29 20 61 76 61 69 6c 61  ncodings) availa
7a60: 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a 2a 2a 20  ble. Use one.** 
7a70: 6f 66 20 74 68 65 73 65 20 69 6e 73 74 65 61 64  of these instead
7a80: 20 69 66 20 74 68 65 79 20 65 78 69 73 74 2e 20   if they exist. 
7a90: 41 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d  Avoid a UTF-8 <-
7aa0: 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76 65 72 73  > UTF-16 convers
7ab0: 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73 73 69 62  ion if.** possib
7ac0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
7ad0: 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 50  t synthCollSeq(P
7ae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f  arse *pParse, Co
7af0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
7b00: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 32   CollSeq *pColl2
7b10: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43  ;.  char *z = pC
7b20: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e  oll->zName;.  in
7b30: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  t n = strlen(z);
7b40: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20  .  sqlite *db = 
7b50: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
7b60: 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
7b70: 6e 73 74 20 75 38 20 61 45 6e 63 5b 5d 20 3d 20  nst u8 aEnc[] = 
7b80: 7b 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  { SQLITE_UTF16BE
7b90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
7ba0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 3b  , SQLITE_UTF8 };
7bb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b  .  for(i=0; i<3;
7bc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 6f 6c 6c   i++){.    pColl
7bd0: 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  2 = sqlite3FindC
7be0: 6f 6c 6c 53 65 71 28 64 62 2c 20 61 45 6e 63 5b  ollSeq(db, aEnc[
7bf0: 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  i], z, n, 0);.  
7c00: 20 20 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43    if( pColl2->xC
7c10: 6d 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  mp!=0 ){.      m
7c20: 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20 70 43 6f  emcpy(pColl, pCo
7c30: 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 6c  ll2, sizeof(Coll
7c40: 53 65 71 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Seq));.      ret
7c50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7c60: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
7c70: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
7c80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
7c90: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
7ca0: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
7cb0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
7cc0: 75 65 6e 63 65 3a 20 22 2c 20 0a 20 20 20 20 20  uence: ", .     
7cd0: 20 20 20 2d 31 2c 20 7a 2c 20 6e 2c 20 30 29 3b     -1, z, n, 0);
7ce0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
7cf0: 45 72 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Err++;.  return 
7d00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
7d10: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
7d20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
7d30: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
7d40: 75 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20  uence before it 
7d50: 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68  is used to.** ch
7d60: 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 64  eck that it is d
7d70: 65 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66  efined. An undef
7d80: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ined collation s
7d90: 65 71 75 65 6e 63 65 20 65 78 69 73 74 73 20 77  equence exists w
7da0: 68 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  hen.** a databas
7db0: 65 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74  e is loaded that
7dc0: 20 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65   contains refere
7dd0: 6e 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f  nces to collatio
7de0: 6e 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74  n sequences.** t
7df0: 68 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65  hat have not bee
7e00: 6e 20 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c  n defined by sql
7e10: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
7e20: 61 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a  ation() etc..**.
7e30: 2a 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  ** If required, 
7e40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c  this routine cal
7e50: 6c 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f  ls the 'collatio
7e60: 6e 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61  n needed' callba
7e70: 63 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ck to.** request
7e80: 20 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66   a definition of
7e90: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
7ea0: 65 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73  equence. If this
7eb0: 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a   doesn't work, .
7ec0: 2a 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  ** an equivalent
7ed0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7ee0: 6e 63 65 20 74 68 61 74 20 75 73 65 73 20 61 20  nce that uses a 
7ef0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69  text encoding di
7f00: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
7f10: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7f20: 65 20 69 73 20 73 75 62 73 74 69 74 75 74 65 64  e is substituted
7f30: 2c 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69  , if one is avai
7f40: 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lable..*/.int sq
7f50: 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65  lite3CheckCollSe
7f60: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
7f70: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
7f80: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26  {.  if( pColl &&
7f90: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b   !pColl->xCmp ){
7fa0: 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  .    /* No colla
7fb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
7fc0: 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74   this type for t
7fd0: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
7fe0: 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20  registered..    
7ff0: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c  ** Call the coll
8000: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f  ation factory to
8010: 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73   see if it can s
8020: 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e  upply us with on
8030: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
8040: 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61  llCollNeeded(pPa
8050: 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rse->db, pColl->
8060: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 43  zName, strlen(pC
8070: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  oll->zName));.  
8080: 20 20 69 66 28 20 21 70 43 6f 6c 6c 2d 3e 78 43    if( !pColl->xC
8090: 6d 70 20 26 26 20 73 79 6e 74 68 43 6f 6c 6c 53  mp && synthCollS
80a0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
80b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
80c0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
80d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
80e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
80f0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
8100: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
8110: 29 20 66 6f 72 20 61 6c 6c 20 63 6f 6c 6c 61 74  ) for all collat
8120: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 69 6e  ing sequences in
8130: 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e   an index,.** in
8140: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
8150: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6e 65   that all the ne
8160: 63 65 73 73 61 72 79 20 63 6f 6c 6c 61 74 69 6e  cessary collatin
8170: 67 20 73 65 71 75 65 6e 63 65 73 20 61 72 65 0a  g sequences are.
8180: 2a 2a 20 6c 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e  ** loaded..*/.in
8190: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 49 6e  t sqlite3CheckIn
81a0: 64 65 78 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  dexCollSeq(Parse
81b0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
81c0: 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20 70 49  *pIdx){.  if( pI
81d0: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  dx ){.    int i;
81e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
81f0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
8200: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
8210: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
8220: 65 71 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  eq(pParse, pIdx-
8230: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
8240: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
8250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8260: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
8270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8280: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8290: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
82a0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c  returns the coll
82b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
82c0: 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69  or database nati
82d0: 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64  ve text.** encod
82e0: 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62  ing identified b
82f0: 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61  y the string zNa
8300: 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65  me, length nName
8310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
8320: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
8330: 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  on sequence is n
8340: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  ot available, or
8350: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a   not available.*
8360: 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
8370: 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e  e native encodin
8380: 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  g, the collation
8390: 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f   factory is invo
83a0: 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73  ked to.** reques
83b0: 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c  t it. If the col
83c0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64  lation factory d
83d0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73  oes not supply s
83e0: 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a  uch a sequence,.
83f0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65  ** and the seque
8400: 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  nce is available
8410: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74   in another text
8420: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20   encoding, then 
8430: 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72  that is.** retur
8440: 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  ned instead..**.
8450: 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e  ** If no version
8460: 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  s of the request
8470: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65  ed collations se
8480: 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c  quence are avail
8490: 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74  able, or.** anot
84a0: 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73  her error occurs
84b0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
84c0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
84d0: 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20  message written 
84e0: 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a  into.** pParse..
84f0: 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69  */.CollSeq *sqli
8500: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
8510: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8520: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8530: 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20  e, int nName){. 
8540: 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65   u8 enc = pParse
8550: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 75 38 20  ->db->enc;.  u8 
8560: 69 6e 69 74 62 75 73 79 20 3d 20 70 50 61 72 73  initbusy = pPars
8570: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
8580: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
8590: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
85a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e  CollSeq(pParse->
85b0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
85c0: 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  nName, initbusy)
85d0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
85e0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
85f0: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
8600: 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  .    /* No colla
8610: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
8620: 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74   this type for t
8630: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
8640: 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 20 20  registered..    
8650: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c  ** Call the coll
8660: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f  ation factory to
8670: 20 73 65 65 20 69 66 20 69 74 20 63 61 6e 20 73   see if it can s
8680: 75 70 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e  upply us with on
8690: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
86a0: 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28 70 50 61  llCollNeeded(pPa
86b0: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
86c0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c  nName);.    pCol
86d0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
86e0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e 64  ollSeq(pParse->d
86f0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  b, enc, zName, n
8700: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
8710: 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f 6c  ( pColl && !pCol
8720: 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 20  l->xCmp ){.     
8730: 20 2f 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65   /* There may be
8740: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68   a version of th
8750: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
8760: 65 6e 63 65 20 74 68 61 74 20 72 65 71 75 69 72  ence that requir
8770: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  es.      ** tran
8780: 73 6c 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 20  slation between 
8790: 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65 61 72 63  encodings. Searc
87a0: 68 20 66 6f 72 20 69 74 20 77 69 74 68 20 73 79  h for it with sy
87b0: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e 0a 20 20  nthCollSeq()..  
87c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
87d0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50   synthCollSeq(pP
87e0: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a  arse, pColl) ){.
87f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
8800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8810: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
8820: 68 69 6e 67 20 68 61 73 20 62 65 65 6e 20 66 6f  hing has been fo
8830: 75 6e 64 2c 20 77 72 69 74 65 20 74 68 65 20 65  und, write the e
8840: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
8850: 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 69 66  o pParse */.  if
8860: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
8870: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
8880: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 69  ->xCmp) ){.    i
8890: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
88a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
88b0: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70  te3SetNString(&p
88c0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
88d0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
88e0: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 22 2c 20  on sequence: ", 
88f0: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 4e  -1,.          zN
8900: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
8910: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
8920: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 70 43  ->nErr++;.    pC
8930: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
8940: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
8950: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
8960: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
8970: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
8980: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
8990: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
89a0: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
89b0: 65 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  e..*/.char sqlit
89c0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
89d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
89e0: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
89f0: 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 73 74 72 75  int n, i;.  stru
8a00: 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
8a10: 68 61 72 20 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b  har *zSub;  /* K
8a20: 65 79 77 6f 72 64 73 20 73 75 62 73 74 72 69 6e  eywords substrin
8a30: 67 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  g to search for 
8a40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 6e 53 75 62  */.    char nSub
8a50: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e  ;         /* len
8a60: 67 74 68 20 6f 66 20 7a 53 75 62 20 2a 2f 0a 20  gth of zSub */. 
8a70: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
8a80: 3b 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74  ;     /* Affinit
8a90: 79 20 74 6f 20 72 65 74 75 72 6e 20 69 66 20 69  y to return if i
8aa0: 74 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 7d  t matches */.  }
8ab0: 20 73 75 62 73 74 72 69 6e 67 73 5b 5d 20 3d 20   substrings[] = 
8ac0: 7b 0a 20 20 20 20 7b 22 49 4e 54 22 2c 20 20 33  {.    {"INT",  3
8ad0: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  , SQLITE_AFF_INT
8ae0: 45 47 45 52 7d 2c 0a 20 20 20 20 7b 22 43 48 41  EGER},.    {"CHA
8af0: 52 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46  R", 4, SQLITE_AF
8b00: 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 43  F_TEXT},.    {"C
8b10: 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  LOB", 4, SQLITE_
8b20: 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b  AFF_TEXT},.    {
8b30: 22 54 45 58 54 22 2c 20 34 2c 20 53 51 4c 49 54  "TEXT", 4, SQLIT
8b40: 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20  E_AFF_TEXT},.   
8b50: 20 7b 22 42 4c 4f 42 22 2c 20 34 2c 20 53 51 4c   {"BLOB", 4, SQL
8b60: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20  ITE_AFF_NONE},. 
8b70: 20 7d 3b 0a 0a 20 20 69 66 28 20 6e 54 79 70 65   };..  if( nType
8b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
8b90: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  n SQLITE_AFF_NON
8ba0: 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  E;.  }.  for(i=0
8bb0: 3b 20 69 3c 73 69 7a 65 6f 66 28 73 75 62 73 74  ; i<sizeof(subst
8bc0: 72 69 6e 67 73 29 2f 73 69 7a 65 6f 66 28 73 75  rings)/sizeof(su
8bd0: 62 73 74 72 69 6e 67 73 5b 30 5d 29 3b 20 69 2b  bstrings[0]); i+
8be0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 31 20 3d  +){.    int c1 =
8bf0: 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a   substrings[i].z
8c00: 53 75 62 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20  Sub[0];.    int 
8c10: 63 32 20 3d 20 74 6f 6c 6f 77 65 72 28 63 31 29  c2 = tolower(c1)
8c20: 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20  ;.    int limit 
8c30: 3d 20 6e 54 79 70 65 20 2d 20 73 75 62 73 74 72  = nType - substr
8c40: 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20  ings[i].nSub;.  
8c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
8c60: 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  = substrings[i].
8c70: 7a 53 75 62 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  zSub;.    for(n=
8c80: 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b  0; n<=limit; n++
8c90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 20 3d  ){.      int c =
8ca0: 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20 20 20 20   zType[n];.     
8cb0: 20 69 66 28 20 28 63 3d 3d 63 31 20 7c 7c 20 63   if( (c==c1 || c
8cc0: 3d 3d 63 32 29 0a 20 20 20 20 20 20 20 20 20 20  ==c2).          
8cd0: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
8ce0: 53 74 72 4e 49 43 6d 70 28 26 7a 54 79 70 65 5b  StrNICmp(&zType[
8cf0: 6e 5d 2c 20 7a 2c 20 73 75 62 73 74 72 69 6e 67  n], z, substring
8d00: 73 5b 69 5d 2e 6e 53 75 62 29 20 29 7b 0a 20 20  s[i].nSub) ){.  
8d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 75 62        return sub
8d20: 73 74 72 69 6e 67 73 5b 69 5d 2e 61 66 66 69 6e  strings[i].affin
8d30: 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ity;.      }.   
8d40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8d50: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8d60: 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  IC;.}../*.** Com
8d70: 65 20 75 70 20 77 69 74 68 20 61 20 6e 65 77 20  e up with a new 
8d80: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 66 6f 72  random value for
8d90: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
8da0: 69 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 0a 2a  ie.  Make sure.*
8db0: 2a 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  * the new value 
8dc0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
8dd0: 6d 20 74 68 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a  m the old..**.**
8de0: 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   The schema cook
8df0: 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ie is used to de
8e00: 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65  termine when the
8e10: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a   schema for the.
8e20: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
8e30: 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68  ges.  After each
8e40: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20   schema change, 
8e50: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
8e60: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68  .** changes.  Wh
8e70: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72  en a process fir
8e80: 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68  st reads the sch
8e90: 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74  ema it records t
8ea0: 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54  he.** cookie.  T
8eb0: 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65  hereafter, whene
8ec0: 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61  ver it goes to a
8ed0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
8ee0: 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73  se,.** it checks
8ef0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d   the cookie to m
8f00: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68  ake sure the sch
8f10: 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e  ema has not chan
8f20: 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20  ged.** since it 
8f30: 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a  was last read..*
8f40: 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69  *.** This plan i
8f50: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  s not completely
8f60: 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20   bullet-proof.  
8f70: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
8f80: 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  or.** the schema
8f90: 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69   to change multi
8fa0: 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f  ple times and fo
8fb0: 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  r the cookie to 
8fc0: 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74  be.** set back t
8fd0: 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20  o prior value.  
8fe0: 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67  But schema chang
8ff0: 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e  es are infrequen
9000: 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f  t.** and the pro
9010: 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74  bability of hitt
9020: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f  ing the same coo
9030: 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c  kie value is onl
9040: 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e  y.** 1 chance in
9050: 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65   2^32.  So we're
9060: 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f   safe enough..*/
9070: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
9080: 6e 67 65 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65  ngeCookie(sqlite
9090: 20 2a 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69   *db, Vdbe *v, i
90a0: 6e 74 20 69 44 62 29 7b 0a 20 20 75 6e 73 69 67  nt iDb){.  unsig
90b0: 6e 65 64 20 63 68 61 72 20 72 3b 0a 20 20 69 6e  ned char r;.  in
90c0: 74 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65  t *pSchemaCookie
90d0: 20 3d 20 26 28 64 62 2d 3e 61 44 62 5b 69 44 62   = &(db->aDb[iDb
90e0: 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29  ].schema_cookie)
90f0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  ;..  sqlite3Rand
9100: 6f 6d 6e 65 73 73 28 31 2c 20 26 72 29 3b 0a 20  omness(1, &r);. 
9110: 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20   *pSchemaCookie 
9120: 3d 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65  = *pSchemaCookie
9130: 20 2b 20 72 20 2b 20 31 3b 0a 20 20 64 62 2d 3e   + r + 1;.  db->
9140: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
9150: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
9160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9170: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9180: 20 2a 70 53 63 68 65 6d 61 43 6f 6f 6b 69 65 2c   *pSchemaCookie,
9190: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
91a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
91b0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 29  tCookie, iDb, 0)
91c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
91d0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
91e0: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
91f0: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
9200: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
9210: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
9220: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
9230: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
9240: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
9250: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
9260: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
9270: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
9280: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
9290: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
92a0: 20 6e 3b 0a 20 20 69 6e 74 20 6e 65 65 64 51 75   n;.  int needQu
92b0: 6f 74 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6e  ote = 0;.  for(n
92c0: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
92d0: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
92e0: 5c 27 27 20 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64  \'' ){ n++; need
92f0: 51 75 6f 74 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20  Quote=1; }.  }. 
9300: 20 72 65 74 75 72 6e 20 6e 20 2b 20 6e 65 65 64   return n + need
9310: 51 75 6f 74 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  Quote*2;.}../*.*
9320: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
9330: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
9340: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
9350: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
9360: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
9370: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
9380: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
9390: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
93a0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 49   *pIdx, char *zI
93b0: 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20  dent){.  int i, 
93c0: 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20  j, needQuote;.  
93d0: 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72  i = *pIdx;.  for
93e0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
93f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
9400: 69 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  isalnum(zIdent[j
9410: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
9420: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
9430: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
9440: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c   zIdent[j]!=0 ||
9450: 20 69 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b   isdigit(zIdent[
9460: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
9470: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
9480: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
9490: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
94a0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
94b0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a   z[i++] = '\'';.
94c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
94d0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
94e0: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
94f0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
9500: 6e 74 5b 6a 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b  nt[j]=='\'' ) z[
9510: 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7d  i++] = '\'';.  }
9520: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
9530: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27   ) z[i++] = '\''
9540: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
9550: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
9560: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
9570: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9580: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
9590: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
95a0: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
95b0: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
95c0: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
95d0: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
95e0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
95f0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
9600: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
9610: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
9620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9630: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
9640: 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  t(Table *p){.  i
9650: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
9660: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
9670: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
9680: 20 2a 7a 45 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b   *zEnd;.  n = 0;
9690: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
96a0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
96b0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
96c0: 68 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  h(p->aCol[i].zNa
96d0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  me);.    if( p->
96e0: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b  aCol[i].zType ){
96f0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72  .      n += (str
9700: 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  len(p->aCol[i].z
9710: 54 79 70 65 29 20 2b 20 31 29 3b 0a 20 20 20 20  Type) + 1);.    
9720: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
9730: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
9740: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 34 30 20 29  e);.  if( n<40 )
9750: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
9760: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
9770: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
9780: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9790: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
97a0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
97b0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
97c0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
97d0: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
97e0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
97f0: 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a  MallocRaw( n );.
9800: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
9810: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72   return 0;.  str
9820: 63 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44  cpy(zStmt, p->iD
9830: 62 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54  b==1 ? "CREATE T
9840: 45 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43  EMP TABLE " : "C
9850: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
9860: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74    k = strlen(zSt
9870: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
9880: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
9890: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
98a0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
98b0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
98c0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79  i++){.    strcpy
98d0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70  (&zStmt[k], zSep
98e0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c  );.    k += strl
98f0: 65 6e 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  en(&zStmt[k]);. 
9900: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
9910: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
9920: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c  tmt, &k, p->aCol
9930: 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
9940: 69 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  if( p->aCol[i].z
9950: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 7a 53  Type ){.      zS
9960: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a  tmt[k++] = ' ';.
9970: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 53        strcpy(&zS
9980: 74 6d 74 5b 6b 5d 2c 20 70 2d 3e 61 43 6f 6c 5b  tmt[k], p->aCol[
9990: 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  i].zType);.     
99a0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 70 2d 3e   k += strlen(p->
99b0: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a  aCol[i].zType);.
99c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63      }.  }.  strc
99d0: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45  py(&zStmt[k], zE
99e0: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
99f0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
9a00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9a10: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
9a20: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
9a30: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
9a40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9a50: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
9a60: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
9a70: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
9a80: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
9a90: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
9aa0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
9ab0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
9ac0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
9ad0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
9ae0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
9af0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
9b00: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
9b10: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
9b20: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
9b30: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
9b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
9b50: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
9b60: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
9b70: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9b80: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
9b90: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
9ba0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
9bb0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
9bc0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
9bd0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
9be0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
9bf0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
9c00: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
9c10: 6e 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f  ntly changes, so
9c20: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
9c30: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
9c40: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
9c50: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
9c60: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
9c70: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
9c80: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
9c90: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
9ca0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
9cb0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
9cc0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
9cd0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
9ce0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
9cf0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
9d00: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
9d10: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
9d20: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
9d30: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
9d40: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
9d50: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
9d60: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
9d70: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9d80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9d90: 33 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20  3EndTable(Parse 
9da0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9db0: 70 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53  pEnd, Select *pS
9dc0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
9dd0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *p;.  sqlite *db
9de0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9df0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
9e00: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
9e10: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
9e20: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
9e30: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
9e40: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
9e50: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
9e60: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
9e70: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
9e80: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
9e90: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
9ea0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
9eb0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
9ec0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
9ed0: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
9ee0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
9ef0: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
9f00: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
9f10: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
9f20: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
9f30: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
9f40: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
9f50: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
9f60: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
9f70: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
9f80: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
9f90: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
9fa0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
9fb0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
9fc0: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
9fd0: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
9fe0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
9ff0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
a000: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
a010: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
a020: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
a030: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
a040: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
a050: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
a060: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
a070: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
a080: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
a090: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
a0a0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
a0b0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
a0c0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
a0d0: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
a0e0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
a0f0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
a100: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
a110: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
a120: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
a130: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
a140: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
a150: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
a160: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
a170: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
a180: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
a190: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
a1a0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
a1b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a1c0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a1d0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20  eturn;..    if( 
a1e0: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
a1f0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
a200: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
a210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a220: 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  3(v, OP_CreateTa
a230: 62 6c 65 2c 20 30 2c 20 70 2d 3e 69 44 62 2c 20  ble, 0, p->iDb, 
a240: 28 63 68 61 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c  (char*)&p->tnum,
a250: 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20   P3_POINTER);.  
a260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a270: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
a280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a290: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a2a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
a2b0: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a     p->tnum = 0;.
a2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a2d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
a2e0: 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  e, 0, 0);..    /
a2f0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
a300: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
a310: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
a320: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
a330: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
a340: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
a350: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
a360: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
a370: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
a380: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f 6e   new table is on
a390: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
a3a0: 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20 20  vdbe stack..    
a3b0: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74  **.    ** Once t
a3c0: 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
a3d0: 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69  en coded by sqli
a3e0: 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20  te3Select(), it 
a3f0: 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73  is in a.    ** s
a400: 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f  uitable state to
a410: 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63   query for the c
a420: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20  olumn names and 
a430: 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64  types to be used
a440: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e  .    ** by the n
a450: 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  ew table..    */
a460: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
a470: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
a480: 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20 20  *pSelTab;.      
a490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a4a0: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
a4b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a4c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a4d0: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62 2c  Integer, p->iDb,
a4e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a4f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a500: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
a510: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
a520: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
a530: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
a540: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
a550: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20 30   SRT_Table, 1, 0
a560: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
a570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a580: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
a590: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
a5a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
a5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
a5c0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
a5d0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
a5e0: 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65 63  Parse, 0, pSelec
a5f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
a600: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
a610: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
a620: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
a630: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
a640: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
a650: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
a660: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
a670: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
a680: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
a690: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
a6a0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
a6b0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
a6c0: 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62  Table(0, pSelTab
a6d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a6e0: 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  .  .    sqlite3O
a6f0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
a700: 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  , p->iDb);..    
a710: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a720: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
a730: 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d   0, p->pSelect==
a740: 30 3f 22 74 61 62 6c 65 22 3a 22 76 69 65 77 22  0?"table":"view"
a750: 2c 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ,P3_STATIC);.   
a760: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a770: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a780: 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  , 0, p->zName, 0
a790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a7a0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
a7b0: 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e  ng8, 0, 0, p->zN
a7c0: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
a7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a7e0: 20 4f 50 5f 50 75 6c 6c 2c 20 33 2c 20 30 29 3b   OP_Pull, 3, 0);
a7f0: 0a 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ..    if( pSelec
a800: 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  t ){.      char 
a810: 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  *z = createTable
a820: 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 6e  Stmt(p);.      n
a830: 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29   = z ? strlen(z)
a840: 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   : 0;.      sqli
a850: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a860: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a870: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a880: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a890: 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  -1, z, n);.     
a8a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
a8b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a8c0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 20   if( p->pSelect 
a8d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a8e0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a8f0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22  String8, 0, 0, "
a900: 43 52 45 41 54 45 20 56 49 45 57 20 22 2c 20 50  CREATE VIEW ", P
a910: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
a920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a930: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a940: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
a950: 20 30 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c   0, "CREATE TABL
a960: 45 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  E ", P3_STATIC);
a970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
a980: 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29  ssert( pEnd!=0 )
a990: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72  ;.      n = Addr
a9a0: 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72  (pEnd->z) - Addr
a9b0: 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  (pParse->sNameTo
a9c0: 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20  ken.z) + 1;.    
a9d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a9e0: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
a9f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
aa00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
aa10: 50 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73 65  P3(v, -1, pParse
aa20: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 2c 20  ->sNameToken.z, 
aa30: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
aa40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa50: 5f 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30 29 3b  _Concat8, 2, 0);
aa60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
aa70: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
aa80: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
aa90: 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54  , "tttit", P3_ST
aaa0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
aab0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
aac0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
aad0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  0);.    if( p->i
aae0: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  Db!=1 ){.      s
aaf0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
ab00: 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e 69 44 62  ie(db, v, p->iDb
ab10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ab20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ab30: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
ab40: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  ;..    sqlite3En
ab50: 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
ab60: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
ab70: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
ab80: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
ab90: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
aba0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
abb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
abc0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  rse->explain==0 
abd0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
abe0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
abf0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
ac00: 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64  *pFKey;.    pOld
ac10: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
ac20: 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d  sert(&db->aDb[p-
ac30: 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a  >iDb].tblHash, .
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
ac60: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
ac70: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
ac80: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
ac90: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
aca0: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
acb0: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
acc0: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
acd0: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
ace0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
acf0: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
ad00: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
ad10: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
ad20: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
ad30: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
ad40: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
ad50: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
ad60: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
ad70: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d  Find(&db->aDb[p-
ad80: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b  >iDb].aFKey, pFK
ad90: 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  ey->zTo, nTo);. 
ada0: 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68       sqlite3Hash
adb0: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
adc0: 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70  p->iDb].aFKey, p
add0: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20  FKey->zTo, nTo, 
ade0: 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  pFKey);.    }.  
adf0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
ae00: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ble = 0;.    db-
ae10: 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64  >nTable++;.    d
ae20: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
ae30: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
ae40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
ae50: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
ae60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
ae70: 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20  order to create 
ae80: 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f  a new VIEW.*/.vo
ae90: 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
aea0: 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  View(.  Parse *p
aeb0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
aec0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
aed0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42  t */.  Token *pB
aee0: 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65  egin,     /* The
aef0: 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
af00: 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74  at begins the st
af10: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
af20: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
af30: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
af40: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
af50: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
af60: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
af70: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
af80: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
af90: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
afa0: 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  w */.  Select *p
afb0: 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53  Select,   /* A S
afc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
afd0: 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
afe0: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f   the new view */
aff0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20  .  int isTemp   
b000: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f        /* TRUE fo
b010: 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69  r a TEMPORARY vi
b020: 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ew */.){.  Table
b030: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
b040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
b050: 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
b060: 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
b070: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20  oken *pName;..  
b080: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
b090: 65 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e  e(pParse, pBegin
b0a0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
b0b0: 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20  , isTemp, 1);.  
b0c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
b0d0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
b0e0: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
b0f0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
b100: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b110: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
b120: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
b130: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
b140: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
b150: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
b160: 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
b170: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
b180: 20 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c   p->iDb, "view",
b190: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
b1a0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
b1b0: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
b1c0: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
b1d0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b1e0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
b1f0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
b200: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
b210: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
b220: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
b230: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
b240: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
b250: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
b260: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
b270: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
b280: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
b290: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
b2a0: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
b2b0: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
b2c0: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
b2d0: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
b2e0: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
b2f0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
b300: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
b310: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
b320: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
b330: 74 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  tDup(pSelect);. 
b340: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b350: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b360: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
b370: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
b380: 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65     sqlite3ViewGe
b390: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
b3a0: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20  rse, p);.  }..  
b3b0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
b3c0: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
b3d0: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
b3e0: 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
b3f0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
b400: 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
b410: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
b420: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
b430: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
b440: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
b450: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
b460: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
b470: 20 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a   0;.  n = sEnd.z
b480: 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   - pBegin->z;.  
b490: 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
b4a0: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28   while( n>0 && (
b4b0: 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  z[n-1]==';' || i
b4c0: 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20  sspace(z[n-1])) 
b4d0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
b4e0: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
b4f0: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
b500: 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
b510: 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
b520: 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
b530: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
b540: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
b550: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
b560: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74  &sEnd, 0);.  ret
b570: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
b580: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
b590: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
b5a0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
b5b0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
b5c0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
b5d0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
b5e0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
b5f0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
b600: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b610: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
b620: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
b630: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b640: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
b650: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
b660: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
b670: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
b680: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
b690: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
b6a0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
b6b0: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
b6c0: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
b6d0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
b6e0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
b6f0: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
b700: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
b710: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
b720: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
b730: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
b740: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
b750: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
b760: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
b770: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
b780: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
b790: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
b7a0: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
b7b0: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
b7c0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
b7d0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
b7e0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
b7f0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
b800: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
b810: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
b820: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
b830: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
b840: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
b850: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
b860: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
b870: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
b880: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
b890: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
b8a0: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
b8b0: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
b8c0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
b8d0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
b8e0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
b8f0: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
b900: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
b910: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
b920: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
b930: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
b940: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
b950: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
b960: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b970: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
b980: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
b990: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
b9a0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
b9b0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
b9c0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
b9d0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
b9e0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
b9f0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
ba00: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ba10: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
ba20: 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30  ); /* If nCol==0
ba30: 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75  , then pTable mu
ba40: 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a  st be a VIEW */.
ba50: 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d    pSel = pTable-
ba60: 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
ba70: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
ba80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
ba90: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
baa0: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
bab0: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
bac0: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
bad0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
bae0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
baf0: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
bb00: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
bb10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
bb20: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
bb30: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
bb40: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
bb50: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
bb60: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
bb70: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
bb80: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
bb90: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
bba0: 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53  EList);.  if( pS
bbb0: 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b  el->pEList==0 ){
bbc0: 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  .    pSel->pELis
bbd0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
bbe0: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61  return 1;  /* Ma
bbf0: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
bc00: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   }.  pTable->nCo
bc10: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
bc20: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
bc30: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
bc40: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
bc50: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
bc60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
bc70: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
bc80: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
bc90: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
bca0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
bcb0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
bcc0: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
bcd0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
bce0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
bcf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
bd00: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
bd10: 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ab);.    DbSetPr
bd20: 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64  operty(pParse->d
bd30: 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20  b, pTable->iDb, 
bd40: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
bd50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bd60: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
bd70: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
bd80: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
bd90: 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20  Unbind(pSel);.  
bda0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bdb0: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
bdc0: 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  st);.  pSel->pEL
bdd0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
bde0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
bdf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
be00: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
be10: 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61  rom the VIEW pTa
be20: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
be30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
be40: 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f  d whenever any o
be50: 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69  ther table or vi
be60: 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a  ew is modified..
be70: 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73  ** The view pass
be80: 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
be90: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e  tine might depen
bea0: 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  d directly or in
beb0: 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74  directly.** on t
bec0: 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64  he modified or d
bed0: 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20  eleted table so 
bee0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  we need to clear
bef0: 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a   the old column.
bf00: 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74  ** names so that
bf10: 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
bf20: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
bf30: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
bf40: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
bf50: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
bf60: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
bf70: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61  olumn *pCol;.  a
bf80: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
bf90: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
bfa0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ect!=0 );.  for(
bfb0: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65  i=0, pCol=pTable
bfc0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65  ->aCol; i<pTable
bfd0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
bfe0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  l++){.    sqlite
bff0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Free(pCol->zName
c000: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
c010: 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  e(pCol->zDflt);.
c020: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
c030: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d  Col->zType);.  }
c040: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
c050: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  able->aCol);.  p
c060: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
c070: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
c080: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
c090: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
c0a0: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
c0b0: 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
c0c0: 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
c0d0: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
c0e0: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a  esetAll(sqlite *
c0f0: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
c100: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
c110: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
c120: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
c130: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
c140: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
c150: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
c160: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
c170: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
c180: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
c190: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c1a0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
c1b0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
c1c0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
c1d0: 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73     sqliteViewRes
c1e0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
c1f0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
c200: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
c210: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
c220: 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f  esetViews);.}../
c230: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
c240: 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61  en, look up a ta
c250: 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61  ble with that na
c260: 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e  me.  If not foun
c270: 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65  d, leave.** an e
c280: 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72  rror for the par
c290: 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20  ser to find and 
c2a0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
c2b0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 54 61  Table *sqlite3Ta
c2c0: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72  bleFromToken(Par
c2d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
c2e0: 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72  n *pTok){.  char
c2f0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65   *zName;.  Table
c300: 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20   *pTab;.  zName 
c310: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
c320: 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29 3b 0a 20 20  mToken(pTok);.  
c330: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
c340: 65 74 75 72 6e 20 30 3b 0a 20 20 70 54 61 62 20  eturn 0;.  pTab 
c350: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
c360: 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
c370: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
c380: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
c390: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
c3a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c3b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
c3c0: 73 75 63 68 20 74 61 62 6c 65 3a 20 25 54 22 2c  such table: %T",
c3d0: 20 70 54 6f 6b 29 3b 0a 20 20 20 20 70 50 61 72   pTok);.    pPar
c3e0: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
c3f0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
c400: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
c410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c420: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
c430: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
c440: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
c450: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
c460: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
c470: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
c480: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
c490: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
c4a0: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
c4b0: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
c4c0: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
c4d0: 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
c4e0: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
c4f0: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
c500: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
c510: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
c520: 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74  e->nErr || sqlit
c530: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
c540: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f   ) goto exit_dro
c550: 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65 72  p_table;.  asser
c560: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
c570: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
c580: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
c590: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
c5a0: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
c5b0: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
c5c0: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
c5d0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  =0 ) goto exit_d
c5e0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44 62  rop_table;.  iDb
c5f0: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
c600: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
c610: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
c620: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c630: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
c640: 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
c650: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
c660: 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
c670: 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e 69  MA_TABLE(pTab->i
c680: 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Db);.    const c
c690: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
c6a0: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
c6b0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
c6c0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
c6d0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
c6e0: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
c6f0: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
c700: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
c710: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
c720: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
c730: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
c740: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
c750: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
c760: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
c770: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
c780: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
c790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c7a0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44  se{.      if( iD
c7b0: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
c7c0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
c7d0: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  OP_TEMP_TABLE;. 
c7e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c7f0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
c800: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20  E_DROP_TABLE;.  
c810: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c820: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
c830: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
c840: 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
c850: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
c860: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c870: 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
c880: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
c890: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
c8a0: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
c8b0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
c8c0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c8d0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
c8e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
c8f0: 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65  f.  if( pTab->re
c900: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71  adOnly ){.    sq
c910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c920: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
c930: 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70  may not be dropp
c940: 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
c950: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
c960: 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  Err++;.    goto 
c970: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
c980: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69 65  .  }.  if( isVie
c990: 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
c9a0: 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
c9b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c9c0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
c9d0: 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
c9e0: 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
c9f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
ca00: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
ca10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
ca20: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
ca30: 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
ca40: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ca50: 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
ca60: 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
ca70: 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
ca80: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
ca90: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
caa0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
cab0: 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
cac0: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
cad0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
cae0: 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
caf0: 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
cb00: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
cb10: 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
cb20: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 4c 69   static VdbeOpLi
cb30: 73 74 20 64 72 6f 70 54 61 62 6c 65 5b 5d 20 3d  st dropTable[] =
cb40: 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65   {.      { OP_Re
cb50: 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44  wind,     0, ADD
cb60: 52 28 31 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20  R(13), 0},.     
cb70: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20   { OP_String8,  
cb80: 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30    0, 0,        0
cb90: 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20  }, /* 1 */.     
cba0: 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20   { OP_MemStore, 
cbb0: 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20 20 30    1, 1,        0
cbc0: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  },.      { OP_Me
cbd0: 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c 20  mLoad,    1, 0, 
cbe0: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
cbf0: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
cc00: 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20  lumn,     0, 2, 
cc10: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 73 71         0}, /* sq
cc20: 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74 62 6c 5f  lite_master.tbl_
cc30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20  name */.      { 
cc40: 4f 50 5f 4e 65 2c 20 20 20 20 20 20 20 20 20 30  OP_Ne,         0
cc50: 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a  , ADDR(12), 0},.
cc60: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
cc70: 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g8,    0, 0,    
cc80: 20 20 20 20 22 74 72 69 67 67 65 72 22 7d 2c 0a      "trigger"},.
cc90: 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d        { OP_Colum
cca0: 6e 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20  n,     0, 2,    
ccb0: 20 20 20 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74      0}, /* sqlit
ccc0: 65 5f 6d 61 73 74 65 72 2e 74 79 70 65 20 2a 2f  e_master.type */
ccd0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20  .      { OP_Eq, 
cce0: 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28          0, ADDR(
ccf0: 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  12), 0},.      {
cd00: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
cd10: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c  0, 0,        0},
cd20: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
cd30: 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
cd40: 31 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  13), 0},.      {
cd50: 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20   OP_Goto,       
cd60: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
cd70: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
cd80: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
cd90: 33 29 2c 20 20 30 7d 2c 20 2f 2a 20 31 32 20 2a  3),  0}, /* 12 *
cda0: 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 49 6e 64  /.    };.    Ind
cdb0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 54 72  ex *pIdx;.    Tr
cdc0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
cdd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
cde0: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
cdf0: 70 50 61 72 73 65 2c 20 30 2c 20 70 54 61 62 2d  pParse, 0, pTab-
ce00: 3e 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  >iDb);..    /* D
ce10: 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
ce20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ce30: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
ce40: 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
ce50: 20 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74     ** is generat
ce60: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
ce70: 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
ce80: 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
ce90: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d     ** sqlite_tem
cea0: 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
ceb0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
cec0: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 61 62   pTrigger = pTab
ced0: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
cee0: 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
cef0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
cf00: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
cf10: 70 54 61 62 2d 3e 69 44 62 20 7c 7c 20 70 54 72  pTab->iDb || pTr
cf20: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 31 20 29 3b  igger->iDb==1 );
cf30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72  .      sqlite3Dr
cf40: 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
cf50: 72 73 65 2c 20 70 54 72 69 67 67 65 72 2c 20 31  rse, pTrigger, 1
cf60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
cf70: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
cf80: 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
cf90: 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
cfa0: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
cfb0: 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65  .        pTrigge
cfc0: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
cfd0: 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
cfe0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  }..    /* Drop a
cff0: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
d000: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
d010: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
d020: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
d030: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
d040: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
d050: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
d060: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
d070: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
d080: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
d090: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
d0a0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
d0b0: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
d0c0: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
d0d0: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
d0e0: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
d0f0: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
d100: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
d110: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
d120: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
d130: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
d140: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
d150: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
d160: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
d170: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
d180: 28 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  (v, pTab->iDb);.
d190: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
d1a0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
d1b0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
d1c0: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
d1d0: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
d1e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
d1f0: 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a 4e  base+1, pTab->zN
d200: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
d210: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
d220: 28 64 62 2c 20 76 2c 20 70 54 61 62 2d 3e 69 44  (db, v, pTab->iD
d230: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
d240: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d250: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
d260: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
d270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d280: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
d290: 74 72 6f 79 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  troy, pTab->tnum
d2a0: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
d2b0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
d2c0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d2d0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d2e0: 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t){.        sqli
d2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d300: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78  OP_Destroy, pIdx
d310: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44  ->tnum, pIdx->iD
d320: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
d330: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
d340: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
d350: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
d360: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e 2d  * Delete the in-
d370: 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74 69  memory descripti
d380: 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  on of the table.
d390: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
d3a0: 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 53 51 4c  tion: if the SQL
d3b0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 67 61 6e   statement began
d3c0: 20 77 69 74 68 20 74 68 65 20 45 58 50 4c 41 49   with the EXPLAI
d3d0: 4e 20 6b 65 79 77 6f 72 64 2c 0a 20 20 2a 2a 20  N keyword,.  ** 
d3e0: 74 68 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  then no changes 
d3f0: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 2e 0a  should be made..
d400: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72    */.  if( !pPar
d410: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
d420: 20 20 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41     sqliteUnlinkA
d430: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
d440: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 64 62 2d  , pTab);.    db-
d450: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
d460: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
d470: 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65 77    }.  sqliteView
d480: 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
d490: 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61  );..exit_drop_ta
d4a0: 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
d4b0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61 6d  cListDelete(pNam
d4c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  e);.}../*.** Thi
d4d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d4e0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
d4f0: 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  new foreign key 
d500: 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  on the table.** 
d510: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
d520: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70  construction.  p
d530: 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e  FromCol determin
d540: 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  es which columns
d550: 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65  .** in the curre
d560: 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74  nt table point t
d570: 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  o the foreign ke
d580: 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d  y.  If pFromCol=
d590: 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65  =0 then.** conne
d5a0: 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68  ct the key to th
d5b0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e  e last column in
d5c0: 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20  serted.  pTo is 
d5d0: 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74  the name of.** t
d5e0: 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65  he table referre
d5f0: 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73  d to.  pToCol is
d600: 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65   a list of table
d610: 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a  s in the other.*
d620: 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74  * pTo table that
d630: 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
d640: 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61   points to.  fla
d650: 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  gs contains all.
d660: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
d670: 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63  bout the conflic
d680: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
d690: 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65  orithms specifie
d6a0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44  d.** in the ON D
d6b0: 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45  ELETE, ON UPDATE
d6c0: 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63   and ON INSERT c
d6d0: 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  lauses..**.** An
d6e0: 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20   FKey structure 
d6f0: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61  is created and a
d700: 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
d710: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  e currently.** u
d720: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
d730: 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d  n in the pParse-
d740: 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64  >pNewTable field
d750: 2e 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a  .  The new FKey.
d760: 2a 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64  ** is not linked
d770: 20 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20   into db->aFKey 
d780: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20  at this point - 
d790: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61  that does not ha
d7a0: 70 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71  ppen.** until sq
d7b0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e  lite3EndTable().
d7c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
d7d0: 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
d7e0: 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
d7f0: 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
d800: 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
d810: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
d820: 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
d830: 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
d840: 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
d850: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
d860: 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
d870: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d880: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d890: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
d8a0: 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
d8b0: 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
d8c0: 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
d8d0: 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
d8e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
d8f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
d900: 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
d910: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
d920: 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
d930: 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
d940: 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
d950: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
d960: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
d970: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
d980: 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
d990: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
d9a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d9b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
d9c0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
d9d0: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  l;.  char *z;.  
d9e0: 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b  FKey *pFKey = 0;
d9f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
da00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
da10: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
da20: 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
da30: 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
da40: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
da50: 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
da60: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
da70: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
da80: 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
da90: 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
daa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dab0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dac0: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
dad0: 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
dae0: 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
daf0: 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
db00: 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
db10: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
db20: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
db30: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
db40: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
db50: 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
db60: 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
db70: 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
db80: 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
db90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
dba0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
dbb0: 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
dbc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
dbd0: 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
dbe0: 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
dbf0: 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
dc00: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
dc10: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
dc20: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
dc30: 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
dc40: 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
dc50: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
dc60: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
dc70: 46 4b 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a  FKey) + nCol*siz
dc80: 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
dc90: 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
dca0: 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
dcb0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
dcc0: 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
dcd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
dce0: 65 20 2b 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43  e += strlen(pToC
dcf0: 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ol->a[i].zName) 
dd00: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
dd10: 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 4d   pFKey = sqliteM
dd20: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
dd30: 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
dd40: 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
dd50: 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
dd60: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
dd70: 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
dd80: 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
dd90: 46 4b 65 79 5b 31 5d 3b 0a 20 20 70 46 4b 65 79  FKey[1];.  pFKey
dda0: 2d 3e 61 43 6f 6c 20 3d 20 28 73 74 72 75 63 74  ->aCol = (struct
ddb0: 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a   sColMap*)z;.  z
ddc0: 20 2b 3d 20 73 69 7a 65 6f 66 28 73 74 72 75 63   += sizeof(struc
ddd0: 74 20 73 43 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b  t sColMap)*nCol;
dde0: 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20  .  pFKey->zTo = 
ddf0: 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70  z;.  memcpy(z, p
de00: 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a  To->z, pTo->n);.
de10: 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b    z[pTo->n] = 0;
de20: 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
de30: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
de40: 54 6f 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  To = 0;.  pFKey-
de50: 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
de60: 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
de70: 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
de80: 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
de90: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
dea0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
deb0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
dec0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
ded0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
dee0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
def0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
df00: 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
df10: 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
df20: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
df30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
df40: 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
df50: 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
df60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
df70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
df80: 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
df90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
dfa0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
dfb0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
dfc0: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
dfd0: 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
dfe0: 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
dff0: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
e000: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
e010: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
e020: 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
e030: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e040: 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
e050: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
e060: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
e070: 3d 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d  = strlen(pToCol-
e080: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
e090: 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
e0a0: 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
e0b0: 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
e0c0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
e0d0: 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
e0e0: 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
e0f0: 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
e100: 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
e110: 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
e120: 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20 66 6c  >deleteConf = fl
e130: 61 67 73 20 26 20 30 78 66 66 3b 0a 20 20 70 46  ags & 0xff;.  pF
e140: 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
e150: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  = (flags >> 8 ) 
e160: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
e170: 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 66  >insertConf = (f
e180: 6c 61 67 73 20 3e 3e 20 31 36 20 29 20 26 20 30  lags >> 16 ) & 0
e190: 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  xff;..  /* Link 
e1a0: 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
e1b0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
e1c0: 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
e1d0: 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
e1e0: 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
e1f0: 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
e200: 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b 65 79  sqliteFree(pFKey
e210: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
e220: 4c 69 73 74 44 65 6c 65 74 65 28 70 46 72 6f 6d  ListDelete(pFrom
e230: 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
e240: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 54  xprListDelete(pT
e250: 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
e260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e270: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
e280: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
e290: 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
e2a0: 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
e2b0: 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
e2c0: 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
e2d0: 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
e2e0: 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
e2f0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
e300: 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
e310: 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
e320: 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
e330: 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
e340: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
e350: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
e360: 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
e370: 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
e380: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
e390: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
e3a0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
e3b0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
e3c0: 73 44 65 66 65 72 72 65 64 29 7b 0a 20 20 54 61  sDeferred){.  Ta
e3d0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
e3e0: 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
e3f0: 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
e400: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
e410: 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
e420: 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
e430: 72 6e 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44  rn;.  pFKey->isD
e440: 65 66 65 72 72 65 64 20 3d 20 69 73 44 65 66 65  eferred = isDefe
e450: 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rred;.}../*.** C
e460: 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
e470: 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
e480: 6c 65 2e 20 20 70 49 6e 64 65 78 20 69 73 20 74  le.  pIndex is t
e490: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
e4a0: 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 61  ndex .** and pTa
e4b0: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
e4c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
e4d0: 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
e4e0: 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
e4f0: 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
e500: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
e510: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
e520: 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
e530: 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
e540: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
e550: 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
e560: 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
e570: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e580: 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
e590: 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
e5a0: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
e5b0: 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
e5c0: 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
e5d0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
e5e0: 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
e5f0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
e600: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
e610: 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
e620: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
e630: 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
e640: 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
e650: 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
e660: 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
e670: 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
e680: 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
e690: 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
e6a0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
e6b0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
e6c0: 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
e6d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
e6e0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
e6f0: 72 73 65 2c 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  rse,   /* All in
e700: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
e710: 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
e720: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
e730: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
e740: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
e750: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
e760: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
e770: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
e780: 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
e790: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
e7a0: 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
e7b0: 2c 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  ,  /* Table to i
e7c0: 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
e7d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
e7e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
e7f0: 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
e800: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
e810: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
e820: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
e830: 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
e840: 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
e850: 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
e860: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
e870: 61 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 43 52  art,   /* The CR
e880: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
e890: 62 65 67 69 6e 73 20 61 20 43 52 45 41 54 45 20  begins a CREATE 
e8a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
e8b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
e8c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
e8d0: 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
e8e0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
e8f0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
e900: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
e910: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
e920: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
e930: 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
e940: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
e950: 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
e960: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
e970: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54  .  int i, j;.  T
e980: 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20  oken nullId;    
e990: 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f  /* Fake token fo
e9a0: 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69  r an empty ID li
e9b0: 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20  st */.  DbFixer 
e9c0: 73 46 69 78 3b 20 20 20 20 2f 2a 20 46 6f 72 20  sFix;    /* For 
e9d0: 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
e9e0: 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
e9f0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  le */.  int isTe
ea00: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp;      /* True
ea10: 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
ea20: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69   index */.  sqli
ea30: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
ea40: 3e 64 62 3b 0a 0a 20 20 69 6e 74 20 69 44 62 3b  >db;..  int iDb;
ea50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ea60: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
ea70: 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
ea80: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
ea90: 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
eaa0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
eab0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
eac0: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
ead0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
eae0: 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
eaf0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
eb00: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
eb10: 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  dex;..  /*.  ** 
eb20: 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
eb30: 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
eb40: 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
eb50: 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
eb60: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
eb70: 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
eb80: 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
eb90: 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
eba0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
ebb0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
ebc0: 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
ebd0: 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
ebe0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
ebf0: 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
ec00: 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
ec10: 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
ec20: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
ec30: 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
ec40: 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
ec50: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
ec60: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
ec70: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
ec80: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
ec90: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
eca0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
ecb0: 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
ecc0: 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
ecd0: 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
ece0: 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
ecf0: 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
ed00: 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
ed10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
ed20: 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70   1..    */.    p
ed30: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Tab = sqlite3Src
ed40: 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73  ListLookup(pPars
ed50: 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  e, pTblName);.  
ed60: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
ed70: 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
ed80: 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 69 44  pTab && pTab->iD
ed90: 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 44  b==1 ){.      iD
eda0: 62 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  b = 1;.    }..  
edb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
edc0: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
edd0: 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22  se, iDb, "index"
ede0: 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20  , pName) &&.    
edf0: 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 53 72      sqlite3FixSr
ee00: 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
ee10: 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  lName).    ){.  
ee20: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
ee30: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
ee40: 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
ee50: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
ee60: 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
ee70: 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
ee80: 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
ee90: 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
eea0: 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
eeb0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
eec0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
eed0: 73 65 72 74 28 20 69 44 62 3d 3d 70 54 61 62 2d  sert( iDb==pTab-
eee0: 3e 69 44 62 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  >iDb );.  }else{
eef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
ef00: 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  me==0 );.    pTa
ef10: 62 20 3d 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  b =  pParse->pNe
ef20: 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 44 62 20  wTable;.    iDb 
ef30: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 7d  = pTab->iDb;.  }
ef40: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
ef50: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
ef60: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
ef70: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
ef80: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
ef90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
efa0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
efb0: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
efc0: 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
efd0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
efe0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
eff0: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
f000: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
f010: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
f020: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
f030: 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
f040: 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
f050: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f060: 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 73 54  index;.  }.  isT
f070: 65 6d 70 20 3d 20 70 54 61 62 2d 3e 69 44 62 3d  emp = pTab->iDb=
f080: 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  =1;..  /*.  ** F
f090: 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
f0a0: 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65  the index.  Make
f0b0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
f0c0: 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68  ot already anoth
f0d0: 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  er.  ** index or
f0e0: 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
f0f0: 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a  same name.  .  *
f100: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
f110: 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61  :  If we are rea
f120: 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ding the names o
f130: 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69  f permanent indi
f140: 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ces from the.  *
f150: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
f160: 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73  table (because s
f170: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
f180: 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63  s changed the sc
f190: 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f  hema) and.  ** o
f1a0: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ne of the index 
f1b0: 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77  names collides w
f1c0: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
f1d0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
f1e0: 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c  e or.  ** index,
f1f0: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f   then we will co
f200: 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73  ntinue to proces
f210: 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  s this index..  
f220: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65  **.  ** If pName
f230: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==0 it means tha
f240: 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65  t we are.  ** de
f250: 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69  aling with a pri
f260: 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51  mary key or UNIQ
f270: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20  UE constraint.  
f280: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e  We have to inven
f290: 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e  t our.  ** own n
f2a0: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
f2b0: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
f2c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
f2d0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
f2e0: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
f2f0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
f300: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
f310: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
f320: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
f330: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
f340: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
f350: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f360: 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
f370: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
f380: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
f390: 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20  ex *pISameName; 
f3a0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e     /* Another in
f3b0: 64 65 78 20 77 69 74 68 20 74 68 65 20 73 61 6d  dex with the sam
f3c0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
f3d0: 54 61 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d  Table *pTSameNam
f3e0: 65 3b 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65  e;    /* A table
f3f0: 20 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20   with same name 
f400: 61 73 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  as the index */.
f410: 20 20 20 20 20 20 69 66 28 20 28 70 49 53 61 6d        if( (pISam
f420: 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 46  eName = sqlite3F
f430: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
f440: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
f450: 2e 7a 4e 61 6d 65 29 29 21 3d 30 20 29 7b 0a 20  .zName))!=0 ){. 
f460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
f470: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f480: 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79  index %s already
f490: 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29   exists", zName)
f4a0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
f4b0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
f4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4d0: 69 66 28 20 28 70 54 53 61 6d 65 4e 61 6d 65 20  if( (pTSameName 
f4e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
f4f0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
f500: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
f510: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f520: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
f530: 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c  s already a tabl
f540: 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  e named %s", zNa
f550: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
f560: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
f570: 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
f580: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
f590: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63  Name==0 ){.    c
f5a0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
f5b0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
f5c0: 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
f5d0: 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
f5e0: 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
f5f0: 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
f600: 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
f610: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 22    sprintf(zBuf,"
f620: 5f 25 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61  _%d",n);.    zNa
f630: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
f640: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e  te3SetString(&zN
f650: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  ame, "sqlite_aut
f660: 6f 69 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e  oindex_", pTab->
f670: 7a 4e 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68  zName, zBuf, (ch
f680: 61 72 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20  ar*)0);.    if( 
f690: 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
f6a0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f6b0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  x;.  }..  /* Che
f6c0: 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
f6d0: 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
f6e0: 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
f6f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f700: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f710: 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
f720: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
f730: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
f740: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
f750: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
f760: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
f770: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
f780: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
f790: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f7a0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f7b0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
f7c0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
f7d0: 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 69 73  NDEX;.    if( is
f7e0: 54 65 6d 70 20 29 20 69 20 3d 20 53 51 4c 49 54  Temp ) i = SQLIT
f7f0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
f800: 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
f810: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
f820: 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
f830: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
f840: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
f850: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f860: 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
f870: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
f880: 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
f890: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
f8a0: 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
f8b0: 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
f8c0: 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
f8d0: 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
f8e0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
f8f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
f900: 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
f910: 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
f920: 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
f930: 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
f940: 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
f950: 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  z = pTab->aCol[p
f960: 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
f970: 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e  me;.    nullId.n
f980: 20 3d 20 73 74 72 6c 65 6e 28 6e 75 6c 6c 49 64   = strlen(nullId
f990: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
f9a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
f9b0: 41 70 70 65 6e 64 28 30 2c 20 30 2c 20 26 6e 75  Append(0, 0, &nu
f9c0: 6c 6c 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70  llId);.    if( p
f9d0: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
f9e0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
f9f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ;.  }..  /* .  *
fa00: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
fa10: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
fa20: 0a 20 20 2a 2f 0a 20 20 70 49 6e 64 65 78 20 3d  .  */.  pIndex =
fa30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
fa40: 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 73  izeof(Index) + s
fa50: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 31  trlen(zName) + 1
fa60: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
fa70: 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
fa80: 6f 66 28 69 6e 74 29 20 2b 20 73 69 7a 65 6f 66  of(int) + sizeof
fa90: 28 43 6f 6c 6c 53 65 71 2a 29 29 2a 70 4c 69 73  (CollSeq*))*pLis
faa0: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 69 66  t->nExpr );.  if
fab0: 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 20 67 6f  ( pIndex==0 ) go
fac0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
fad0: 6e 64 65 78 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ndex;.  pIndex->
fae0: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a  aiColumn = (int*
faf0: 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  )&pIndex->keyInf
fb00: 6f 2e 61 43 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e  o.aColl[pList->n
fb10: 45 78 70 72 5d 3b 0a 20 20 70 49 6e 64 65 78 2d  Expr];.  pIndex-
fb20: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
fb30: 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  &pIndex->aiColum
fb40: 6e 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  n[pList->nExpr];
fb50: 0a 20 20 73 74 72 63 70 79 28 70 49 6e 64 65 78  .  strcpy(pIndex
fb60: 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  ->zName, zName);
fb70: 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
fb80: 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
fb90: 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
fba0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
fbb0: 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
fbc0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
fbd0: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 70  x->autoIndex = p
fbe0: 4e 61 6d 65 3d 3d 30 3b 0a 20 20 70 49 6e 64 65  Name==0;.  pInde
fbf0: 78 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 0a 20  x->iDb = iDb;.. 
fc00: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
fc10: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
fc20: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
fc30: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
fc40: 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
fc50: 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
fc60: 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
fc70: 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
fc80: 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
fc90: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
fca0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
fcb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
fcc0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
fcd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
fce0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
fcf0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
fd00: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
fd10: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
fd20: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
fd30: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
fd40: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
fd50: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
fd60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
fd70: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
fd80: 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
fd90: 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
fda0: 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
fdb0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  e, pList->a[i].z
fdc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
fdd0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
fde0: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
fdf0: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
fe00: 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20  i] = j;.    if( 
fe10: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
fe20: 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
fe30: 74 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t( pList->a[i].p
fe40: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
fe50: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
fe60: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
fe70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
fe80: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65  r->pColl;.    }e
fe90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  lse{.      pInde
fea0: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
feb0: 5b 69 5d 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  [i] = pTab->aCol
fec0: 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d  [j].pColl;.    }
fed0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
fee0: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
fef0: 6c 6c 5b 69 5d 20 29 3b 0a 20 20 20 20 69 66 28  ll[i] );.    if(
ff00: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
ff10: 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
ff20: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
ff30: 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
ff40: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d  keyInfo.aColl[i]
ff50: 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
ff60: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ff70: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
ff80: 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  }.  pIndex->keyI
ff90: 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 4c 69  nfo.nField = pLi
ffa0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
ffb0: 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
ffc0: 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
ffd0: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
ffe0: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
fff0: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
10000 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
10010 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
10020 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
10030 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
10040 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
10050 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
10060 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
10070 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
10080 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
10090 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
100a0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
100b0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
100c0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
100d0 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
100e0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
100f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
10100 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
10110 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
10120 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
10130 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
10140 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
10150 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
10160 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
10170 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
10180 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
10190 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
101a0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
101b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
101c0 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
101d0 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
101e0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
101f0 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
10200 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
10210 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
10220 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
10230 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
10240 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
10250 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
10260 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
10270 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
10280 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ne );.      asse
10290 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e  rt( pIdx->autoIn
102a0 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dex );.      ass
102b0 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  ert( pIndex->onE
102c0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
102d0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
102e0 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65  ->nColumn!=pInde
102f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e  x->nColumn ) con
10300 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
10310 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43  (k=0; k<pIdx->nC
10320 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  olumn; k++){.   
10330 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
10340 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
10350 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
10360 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
10370 20 69 66 28 20 70 49 64 78 2d 3e 6b 65 79 49 6e   if( pIdx->keyIn
10380 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e  fo.aColl[k]!=pIn
10390 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  dex->keyInfo.aCo
103a0 6c 6c 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ll[k] ) break;. 
103b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
103c0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
103d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
103e0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
103f0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
10400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
10410 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
10420 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
10430 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
10440 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
10450 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
10460 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
10470 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
10480 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
10490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
104a0 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
104b0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
104c0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
104d0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
104e0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
104f0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
10500 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
10510 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
10520 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
10530 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
10540 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
10550 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
10560 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
10570 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
10580 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
10590 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
105a0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
105b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
105c0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
105d0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
105e0 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
105f0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
10600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
10610 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10620 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
10630 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
10640 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
10650 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
10660 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
10670 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
10680 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
10690 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
106a0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
106b0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
106c0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
106d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
106e0 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
106f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
10700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10710 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
10720 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
10730 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
10740 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
10750 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
10760 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
10770 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
10780 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 65 78   if( !pParse->ex
10790 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 49 6e 64  plain ){.    Ind
107a0 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73  ex *p;.    p = s
107b0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
107c0 28 26 64 62 2d 3e 61 44 62 5b 70 49 6e 64 65 78  (&db->aDb[pIndex
107d0 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20  ->iDb].idxHash, 
107e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
107f0 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
10800 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
10810 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31  pIndex->zName)+1
10820 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
10830 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
10840 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
10850 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
10860 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
10870 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  /.      goto exi
10880 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
10890 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
108a0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
108b0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
108c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
108d0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
108e0 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
108f0 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
10900 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
10910 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 74 61  qlite_master" ta
10920 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
10930 20 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74    So do not writ
10940 65 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 20 20  e to the disk.  
10950 2a 2a 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61  ** again.  Extra
10960 63 74 20 74 68 65 20 74 61 62 6c 65 20 6e 75 6d  ct the table num
10970 62 65 72 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ber from the db-
10980 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
10990 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eld..  */.  if( 
109a0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
109b0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
109c0 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
109d0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
109e0 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  num;.  }..  /* I
109f0 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
10a00 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
10a10 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
10a20 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
10a30 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
10a40 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
10a50 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
10a60 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
10a70 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
10a80 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
10a90 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
10aa0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
10ab0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
10ac0 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
10ad0 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
10ae0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
10af0 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
10b00 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
10b10 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
10b20 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
10b30 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
10b40 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
10b50 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
10b60 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
10b70 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
10b80 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
10b90 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
10ba0 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
10bb0 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
10bc0 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
10bd0 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
10be0 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
10bf0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
10c00 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
10c10 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
10c20 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
10c30 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
10c40 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
10c50 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
10c60 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
10c70 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
10c80 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
10c90 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
10ca0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
10cb0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
10cc0 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
10cd0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
10ce0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
10cf0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  y==0 ){.    int 
10d00 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
10d10 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62      int lbl1, lb
10d20 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  l2;..    v = sql
10d30 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
10d40 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
10d50 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10d60 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10d70 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
10d80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10d90 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
10da0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
10db0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10dc0 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
10dd0 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  e(v, iDb);.    }
10de0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10df0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
10e00 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
10e10 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10e20 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
10e30 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33  , 0, "index", P3
10e40 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
10e50 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10e60 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
10e70 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
10e80 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10e90 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
10ea0 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54 61  ring8, 0, 0, pTa
10eb0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
10ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
10ed0 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
10ee0 65 78 2c 20 30 2c 20 69 44 62 2c 28 63 68 61 72  ex, 0, iDb,(char
10ef0 2a 29 26 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  *)&pIndex->tnum,
10f00 50 33 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20  P3_POINTER);.   
10f10 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
10f20 30 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  0;.    if( pTblN
10f30 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
10f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10f50 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
10f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f70 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
10f80 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
10f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fa0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
10fb0 69 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20 20  ite, 1, 0,.     
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
10fe0 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
10ff0 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NFO);.    }.    
11000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11010 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
11020 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
11030 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29 7b  Start && pEnd ){
11040 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72 72  .      if( onErr
11050 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or==OE_None ){. 
11060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11070 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
11080 2c 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20  , "CREATE INDEX 
11090 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
110a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
110b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
110c0 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22  hangeP3(v, -1, "
110d0 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
110e0 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49 43  DEX ", P3_STATIC
110f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11110 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
11120 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e 20   0, 0);.      n 
11130 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20  = Addr(pEnd->z) 
11140 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a 29  - Addr(pName->z)
11150 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
11160 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
11170 76 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  v, -1, pName->z,
11180 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
11190 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
111a0 50 5f 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30 29  P_Concat8, 2, 0)
111b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
111c0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
111d0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
111e0 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53  0, "tttit", P3_S
111f0 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
11200 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11210 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
11220 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62   0);.    if( pTb
11230 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
11240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11250 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
11260 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Tab->iDb, 0);.  
11270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11280 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
11290 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  ead, 2, pTab->tn
112a0 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64  um);.      /* Vd
112b0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
112c0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
112d0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
112e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
112f0 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
11300 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  , 2, pTab->nCol)
11310 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73  ;.      lbl2 = s
11320 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11330 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
11340 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11350 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20  , OP_Rewind, 2, 
11360 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c  lbl2);.      lbl
11370 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
11380 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
11390 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
113a0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
113b0 70 49 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20 20  pIndex, 2);.    
113c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
113d0 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31  (v, OP_IdxPut, 1
113e0 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  , pIndex->onErro
113f0 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20  r!=OE_None,.    
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
11420 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
11430 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
11440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11450 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
11460 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
11470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11480 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
11490 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l2);.      sqlit
114a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
114b0 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a  P_Close, 2, 0);.
114c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
114d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
114e0 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d  se, 1, 0);.    }
114f0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
11500 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e!=0 ){.      if
11510 28 20 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  ( !isTemp ){.   
11520 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
11530 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
11540 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
11550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11560 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
11570 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
11580 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70  qlite3EndWriteOp
11590 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  eration(pParse);
115a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
115b0 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
115c0 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
115d0 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
115e0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
115f0 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
11600 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
11610 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
11620 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
11630 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
11640 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
11650 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
11660 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
11670 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
11680 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
11690 2f 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21  /.  if( onError!
116a0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70  =OE_Replace || p
116b0 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Tab->pIndex==0. 
116c0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
116d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
116e0 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
116f0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
11700 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
11710 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
11720 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  = pIndex;.  }els
11730 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  e{.    Index *pO
11740 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
11750 64 65 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  dex;.    while( 
11760 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
11770 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
11780 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
11790 61 63 65 20 29 7b 0a 20 20 20 20 20 20 70 4f 74  ace ){.      pOt
117a0 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
117b0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ext;.    }.    p
117c0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
117d0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
117e0 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
117f0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  = pIndex;.  }.  
11800 70 49 6e 64 65 78 20 3d 20 30 3b 0a 0a 20 20 2f  pIndex = 0;..  /
11810 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
11820 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
11830 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
11840 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 73    if( pIndex ) s
11850 71 6c 69 74 65 46 72 65 65 28 70 49 6e 64 65 78  qliteFree(pIndex
11860 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
11870 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
11880 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
11890 69 73 74 44 65 6c 65 74 65 28 70 54 62 6c 4e 61  istDelete(pTblNa
118a0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
118b0 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  e(zName);.  retu
118c0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
118d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
118e0 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
118f0 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
11900 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
11910 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
11920 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
11930 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
11940 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
11950 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
11960 73 74 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e  st *pName){.  In
11970 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
11980 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
11990 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
119a0 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
119b0 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
119c0 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
119d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
119e0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
119f0 3d 31 20 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d  =1 );.  pIndex =
11a00 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
11a10 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
11a20 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
11a30 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
11a40 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
11a50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11a60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11a70 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
11a80 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
11a90 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
11aa0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
11ab0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11ac0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
11ad0 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
11ae0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
11af0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11b00 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
11b10 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
11b20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
11b30 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
11b40 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
11b50 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
11b60 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
11b70 64 65 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66  dex;.  }./*.  if
11b80 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e 31 20  ( pIndex->iDb>1 
11b90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11ba0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11bb0 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73 63 68  cannot alter sch
11bc0 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65 64 20  ema of attached 
11bd0 22 0a 20 20 20 20 20 20 20 22 64 61 74 61 62 61  ".       "databa
11be0 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ses", 0);.    go
11bf0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
11c00 65 78 3b 0a 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64  ex;.  }.*/.#ifnd
11c10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11c20 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
11c30 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
11c40 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
11c50 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
11c60 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
11c70 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
11c80 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
11c90 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
11ca0 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
11cb0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
11cc0 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65  HEMA_TABLE(pInde
11cd0 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28  x->iDb);.    if(
11ce0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
11cf0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
11d00 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
11d10 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
11d20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11d30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
11d40 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  if( pIndex->iDb 
11d50 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
11d60 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
11d70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
11d80 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11d90 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
11da0 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
11db0 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
11dc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
11dd0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11de0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
11df0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
11e00 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
11e10 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
11e20 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
11e30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11e40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11e50 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ( v ){.    stati
11e60 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f  c VdbeOpList dro
11e70 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20  pIndex[] = {.   
11e80 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
11e90 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
11ea0 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f  0}, .      { OP_
11eb0 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30 2c 20  String8,     0, 
11ec0 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
11ed0 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  1 */.      { OP_
11ee0 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31  MemStore,   1, 1
11ef0 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
11f00 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20    { OP_MemLoad, 
11f10 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 30     1, 0,       0
11f20 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
11f30 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
11f40 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20 30 7d    0, 1,       0}
11f50 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c  ,.      { OP_Eq,
11f60 20 20 20 20 20 20 20 20 20 30 2c 20 41 44 44 52           0, ADDR
11f70 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (8), 0},.      {
11f80 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
11f90 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a  0, ADDR(3), 0},.
11fa0 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
11fb0 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 39         0, ADDR(9
11fc0 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
11fd0 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c  P_Delete,     0,
11fe0 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a   0,       0}, /*
11ff0 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20   8 */.    };.   
12000 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20 20 20   int base;..    
12010 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
12020 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
12030 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44  e, 0, pIndex->iD
12040 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  b);.    sqlite3O
12050 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76  penMasterTable(v
12060 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
12070 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
12080 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
12090 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
120a0 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49 6e 64  pIndex), dropInd
120b0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
120c0 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
120d0 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e  base+1, pIndex->
120e0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69  zName, 0);.    i
120f0 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 21 3d  f( pIndex->iDb!=
12100 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
12110 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
12120 62 2c 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44  b, v, pIndex->iD
12130 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
12140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12150 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
12160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12170 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
12180 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74  stroy, pIndex->t
12190 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
121a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
121b0 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
121c0 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
121d0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
121e0 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
121f0 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65  ion of this inde
12200 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  x..  */.  if( !p
12210 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
12220 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 6c  {.    sqlite3Unl
12230 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
12240 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
12250 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
12260 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
12270 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  nges;.  }..exit_
12280 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
12290 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
122a0 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
122b0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
122c0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
122d0 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
122e0 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
122f0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
12300 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
12310 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
12320 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
12330 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
12340 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
12350 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
12360 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
12370 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
12380 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
12390 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
123a0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
123b0 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
123c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
123d0 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
123e0 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
123f0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  .  if( pList->nI
12400 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  d>=pList->nAlloc
12410 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49   ){.    struct I
12420 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  dList_item *a;. 
12430 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
12440 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
12450 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20  *2 + 5;.    a = 
12460 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
12470 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
12480 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
12490 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
124a0 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
124b0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
124c0 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
124d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
124e0 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
124f0 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
12500 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
12510 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
12520 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
12530 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70  ));.  pList->a[p
12540 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
12550 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
12560 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
12570 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
12580 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
12590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
125a0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
125b0 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
125c0 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
125d0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
125e0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
125f0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
12600 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
12610 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
12620 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
12630 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
12640 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
12650 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
12660 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
12670 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
12680 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
12690 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
126a0 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
126b0 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
126c0 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
126d0 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
126e0 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
126f0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
12700 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
12710 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
12720 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
12730 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
12740 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
12750 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
12760 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
12770 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
12780 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
12790 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
127a0 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
127b0 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
127c0 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
127d0 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
127e0 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
127f0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
12800 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
12810 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
12820 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
12830 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
12840 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
12850 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
12860 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
12870 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
12880 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
12890 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
128a0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
128b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
128c0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
128d0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
128e0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
128f0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
12900 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
12910 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
12920 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
12930 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
12940 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
12950 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
12960 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12970 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
12980 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
12990 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
129a0 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
129b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
129c0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
129d0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
129e0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
129f0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
12a00 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
12a10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12a20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
12a30 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
12a40 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
12a50 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
12a60 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
12a70 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
12a80 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
12a90 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
12aa0 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
12ab0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
12ac0 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
12ad0 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
12ae0 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
12af0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
12b00 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12b10 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
12b20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
12b30 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
12b40 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
12b50 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
12b60 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
12b70 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
12b80 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
12b90 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
12ba0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
12bb0 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
12bc0 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
12bd0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
12be0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
12bf0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
12c00 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
12c10 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
12c20 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
12c30 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
12c40 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
12c50 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
12c60 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
12c70 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
12c80 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
12c90 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
12ca0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
12cb0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
12cc0 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
12cd0 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
12ce0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
12cf0 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
12d00 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
12d10 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
12d20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
12d30 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
12d40 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
12d50 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
12d60 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
12d70 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
12d80 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  +){.    if( pLis
12d90 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c  t->a[i].iCursor<
12da0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
12db0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
12dc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12dd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12de0 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73  .** Add an alias
12df0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65   to the last ide
12e00 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67  ntifier on the g
12e10 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20  iven identifier 
12e20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
12e30 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41  lite3SrcListAddA
12e40 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c  lias(SrcList *pL
12e50 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
12e60 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
12e70 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e   && pList->nSrc>
12e80 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
12e90 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
12ea0 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  .zAlias = sqlite
12eb0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
12ec0 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Token);.  }.}../
12ed0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
12ee0 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
12ef0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
12f00 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
12f10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
12f20 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
12f30 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
12f40 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
12f50 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
12f60 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
12f70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
12f80 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
12f90 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
12fa0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
12fb0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
12fc0 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
12fd0 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
12fe0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
12ff0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
13000 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
13010 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
13020 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
13030 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
13040 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
13050 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
13060 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
13070 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
13080 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
13090 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
130a0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
130b0 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
130c0 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
130d0 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
130e0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
130f0 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
13100 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
13110 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
13120 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
13130 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c  lete(SrcList *pL
13140 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
13150 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
13160 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
13170 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
13180 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13190 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
131a0 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  i].zDatabase);. 
131b0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
131c0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
131d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
131e0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
131f0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ias);.    if( pL
13200 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26  ist->a[i].pTab &
13210 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  & pList->a[i].pT
13220 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
13230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13240 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
13250 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
13260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13270 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
13280 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  pList->a[i].pSel
13290 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
132a0 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  3ExprDelete(pLis
132b0 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20  t->a[i].pOn);.  
132c0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
132d0 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
132e0 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ].pUsing);.  }. 
132f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
13300 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  t);.}../*.** Beg
13310 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
13320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13330 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
13340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
13350 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
13360 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
13370 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
13380 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
13390 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
133a0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
133b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
133c0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
133d0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
133e0 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
133f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13400 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
13410 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
13420 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
13430 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
13440 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13450 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
13460 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
13470 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
13480 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
13490 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
134a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
134b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
134c0 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
134d0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
134e0 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
134f0 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
13500 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
13510 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
13520 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
13530 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13540 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13550 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
13560 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
13570 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
13580 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13590 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
135a0 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
135b0 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
135c0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
135d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
135e0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
135f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13600 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
13610 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
13620 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
13630 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
13640 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
13650 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
13660 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
13670 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
13680 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
13690 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
136a0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
136b0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
136c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
136d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
136e0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
136f0 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
13700 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
13710 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13720 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
13730 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
13740 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
13750 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
13760 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13770 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
13780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13790 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
137a0 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
137b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
137c0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
137d0 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
137e0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
137f0 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
13800 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
13810 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
13820 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
13830 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
13840 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
13850 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
13860 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
13870 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
13880 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
13890 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
138a0 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
138b0 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
138c0 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
138d0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
138e0 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
138f0 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
13900 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
13910 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
13920 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
13930 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
13940 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13950 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
13960 20 4f 50 5f 47 6f 73 75 62 20 74 68 61 74 0a 2a   OP_Gosub that.*
13970 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
13980 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
13990 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
139a0 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
139b0 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
139c0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
139d0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
139e0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
139f0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
13a00 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
13a10 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
13a20 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
13a30 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
13a40 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
13a50 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
13a60 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
13a70 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
13a80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
13a90 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
13aa0 6e 64 20 74 68 65 20 4f 50 5f 47 6f 73 75 62 20  nd the OP_Gosub 
13ab0 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  P2 value.** will
13ac0 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e   be made to poin
13ad0 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75  t to that subrou
13ae0 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72  tine.  The gener
13af0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
13b00 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
13b10 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ion subroutine c
13b20 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73  ode happens in s
13b30 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
13b40 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
13b50 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13b60 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
13b70 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
13b80 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
13b90 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61  dbe *v;.  int ma
13ba0 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  sk;..  v = sqlit
13bb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13bc0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
13bd0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73  return;  /* This
13be0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66   only happens if
13bf0 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69   there was a pri
13c00 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62  or error */.  db
13c10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13c20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
13c30 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
13c40 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
13c50 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
13c60 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61  || iDb==1 );.  a
13c70 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b  ssert( iDb<32 );
13c80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
13c90 6f 6f 6b 69 65 4d 61 73 6b 3d 3d 30 20 29 7b 0a  ookieMask==0 ){.
13ca0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
13cb0 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
13cc0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13cd0 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Goto, 0, 0);.  }
13ce0 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62  .  mask = 1<<iDb
13cf0 3b 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d  ;.  if( (pParse-
13d00 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61  >cookieMask & ma
13d10 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  sk)==0 ){.    pP
13d20 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
13d30 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 70 50   |= mask;.    pP
13d40 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  arse->cookieValu
13d50 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
13d60 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  [iDb].schema_coo
13d70 6b 69 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  kie;.  }.}../*.*
13d80 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
13d90 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
13da0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
13db0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
13dc0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
13dd0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
13de0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13df0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
13e00 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
13e10 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
13e20 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
13e30 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
13e40 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
13e50 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
13e60 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
13e70 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
13e80 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
13e90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
13ea0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
13eb0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
13ec0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
13ed0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
13ee0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
13ef0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
13f00 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
13f10 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
13f20 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
13f30 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
13f40 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
13f50 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
13f60 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
13f70 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
13f80 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
13f90 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
13fa0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
13fb0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
13fc0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
13fd0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
13fe0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
13ff0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
14000 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
14010 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
14020 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  et..**.** Only d
14030 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20  atabase iDb and 
14040 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
14050 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  e are made writa
14060 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ble by this call
14070 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20  ..** If iDb==0, 
14080 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e  then the main an
14090 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73  d temp databases
140a0 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
140b0 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d  le.   If.** iDb=
140c0 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =1 then only the
140d0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69   temp database i
140e0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  s made writable.
140f0 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20    If iDb>1 then 
14100 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
14110 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
14120 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70  ase and the temp
14130 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61   database are ma
14140 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  de writable..*/.
14150 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
14160 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
14170 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14180 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
14190 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
141a0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
141b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
141c0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
141d0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  rn;.  sqlite3Cod
141e0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
141f0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50  arse, iDb);.  pP
14200 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20  arse->writeMask 
14210 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28  |= 1<<iDb;.  if(
14220 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b   setStatement ){
14230 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14240 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74  AddOp(v, OP_Stat
14250 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a  ement, iDb, 0);.
14260 20 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31    }.  if( iDb!=1
14270 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14280 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14290 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74  on(pParse, setSt
142a0 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d  atement, 1);.  }
142b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
142c0 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e  te code that con
142d0 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74  cludes an operat
142e0 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76  ion that may hav
142f0 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65  e changed.** the
14300 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61   database.  If a
14310 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
14320 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
14330 65 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a  ed, then emit.**
14340 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68   an OP_Commit th
14350 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  at will cause th
14360 65 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20  e changes to be 
14370 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
14380 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  k..**.** Note th
14390 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61  at checkpoints a
143a0 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
143b0 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68   committed at th
143c0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74  e end of.** a st
143d0 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61  atement.  Note a
143e0 6c 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 63  lso that there c
143f0 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63  an be multiple c
14400 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  alls to .** sqli
14410 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
14420 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65  ration() but the
14430 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  re should only b
14440 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61  e a single.** ca
14450 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e 64  ll to sqlite3End
14460 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29  WriteOperation()
14470 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
14480 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
14490 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
144a0 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72  ite3EndWriteOper
144b0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
144c0 72 73 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74  rse){.  /* Delet
144d0 65 20 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75 72  e me! */.  retur
144e0 6e 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74  n;.}../* .** Ret
144f0 75 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e  urn the transien
14500 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t sqlite3_value 
14510 6f 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20  object used for 
14520 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73  encoding convers
14530 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53  ions.** during S
14540 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a  QL compilation..
14550 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
14560 20 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e   *sqlite3GetTran
14570 73 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74  sientValue(sqlit
14580 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64  e *db){.  if( !d
14590 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20  b->pValue ){.   
145a0 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71   db->pValue = sq
145b0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b  lite3ValueNew();
145c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
145d0 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a              ->pValue;.}.