/ Hex Artifact Content
Login

Artifact 1d9a72adb51a544131b51bd4101846f781f3266d:


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 38 20 32 30 30 34 2f 30 37 2f 31 39 20 31  238 2004/07/19 1
0300: 37 3a 32 35 3a 32 35 20 64 72 68 20 45 78 70 20  7:25:25 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: 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20  Goto>0 ){.      
0890: 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  u32 mask;.      
08a0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73  int iDb;.      s
08b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
08c0: 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f  P2(v, pParse->co
08d0: 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71 6c 69  okieGoto-1, sqli
08e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
08f0: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 66 6f  dr(v));.      fo
0900: 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b  r(iDb=0, mask=1;
0910: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61   iDb<db->nDb; ma
0920: 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a  sk<<=1, iDb++){.
0930: 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 61 73          if( (mas
0940: 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  k & pParse->cook
0950: 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e  ieMask)==0 ) con
0960: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73  tinue;.        s
0970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
0980: 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
0990: 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20  n, iDb, (mask & 
09a0: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
09b0: 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  k)!=0);.        
09c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
09d0: 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f  (v, OP_VerifyCoo
09e0: 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73 65  kie, iDb, pParse
09f0: 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44  ->cookieValue[iD
0a00: 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  b]);.      }.   
0a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
0a20: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
0a30: 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  0, pParse->cooki
0a40: 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  eGoto);.    }.  
0a50: 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  }..  /* Get the 
0a60: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
0a70: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
0a80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
0a90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
0aa0: 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74 72   ){.    FILE *tr
0ab0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
0ac0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
0ad0: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
0ae0: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
0af0: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
0b00: 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
0b10: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76  3VdbeMakeReady(v
0b20: 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  , pParse->nVar, 
0b30: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29  pParse->explain)
0b40: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
0b50: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   = pParse->nErr 
0b60: 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
0b70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
0b80: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
0b90: 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  esSet = 0;.  }el
0ba0: 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72  se if( pParse->r
0bb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
0bc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
0bd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
0be0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
0bf0: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
0c00: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
0c10: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
0c20: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d 20   pParse->nAgg = 
0c30: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
0c40: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
0c50: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
0c60: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
0c70: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
0c80: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
0c90: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
0ca0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
0cb0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
0cc0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
0cd0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
0ce0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
0cf0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
0d00: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
0d10: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
0d20: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
0d30: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
0d40: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
0d50: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
0d60: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
0d70: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
0d80: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
0d90: 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d  d the.** first m
0da0: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73  atching table is
0db0: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
0dc0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70  checking for dup
0dd0: 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20  licate table.** 
0de0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
0df0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
0e00: 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c  r is TEMP first,
0e10: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
0e20: 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72   any.** auxiliar
0e30: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
0e40: 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  d using the ATTA
0e50: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  CH command..**.*
0e60: 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
0e70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
0e80: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
0e90: 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69  e3FindTable(sqli
0ea0: 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  te *db, const ch
0eb0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
0ec0: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
0ed0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
0ee0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
0ef0: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
0f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d  ;.  assert( (db-
0f10: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
0f20: 49 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20  Initialized) || 
0f30: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
0f40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
0f50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
0f60: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
0f70: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
0f80: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
0f90: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
0fa0: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
0fb0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
0fc0: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
0fd0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
0fe0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
0ff0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
1000: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62  d(&db->aDb[j].tb
1010: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  lHash, zName, st
1020: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
1030: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
1040: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1050: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1060: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1070: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1080: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
1090: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
10a0: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
10b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
10c0: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
10d0: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
10e0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
10f0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
1100: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1110: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1120: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
1130: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
1140: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
1150: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1160: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1170: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
1180: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
1190: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
11a0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
11b0: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
11c0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
11d0: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
11e0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
11f0: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
1200: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
1210: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 50  te3LocateTable(P
1220: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1230: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1240: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1250: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
1260: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
1270: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1280: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1290: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
12a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
12b0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
12c0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
12d0: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
12e0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
12f0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1300: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
1310: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
1320: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1330: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1340: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
1350: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( p==0 ){.    i
1360: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
1370: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1380: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1390: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 2e 25 73  uch table: %s.%s
13a0: 22 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  ", zDbase, zName
13b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
13c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13d0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
13e0: 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20  ame, 0)!=0 ){.  
13f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1400: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
1410: 6c 65 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74  le \"%s\" is not
1420: 20 69 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25   in database \"%
1430: 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  s\"",.         z
1440: 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20  Name, zDbase);. 
1450: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1460: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1470: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1480: 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 4e 61   table: %s", zNa
1490: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
14a0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
14b0: 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ma = 1;.  }.  re
14c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
14d0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
14e0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
14f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
1500: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
1510: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
1520: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
1530: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
1540: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1550: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
1560: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
1570: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1580: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
1590: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
15a0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
15b0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
15c0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
15d0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
15e0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
15f0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
1600: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
1610: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
1620: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
1630: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
1640: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
1650: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
1660: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
1670: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
1680: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
1690: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
16a0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
16b0: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64  dIndex(sqlite *d
16c0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
16d0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
16e0: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
16f0: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
1700: 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e  .  assert( (db->
1710: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
1720: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7c 7c 20 64  nitialized) || d
1730: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
1740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1750: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1760: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
1770: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
1780: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
1790: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
17a0: 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74  zDb && sqlite3St
17b0: 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61  rICmp(zDb, db->a
17c0: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
17d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
17e0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
17f0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69 64 78  (&db->aDb[j].idx
1800: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1810: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1820: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1830: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
1850: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
1860: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
1870: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
1880: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
1890: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
18a0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
18b0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
18c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
18d0: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
18e0: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
18f0: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
1900: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
1910: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
1920: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
1930: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
1940: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1950: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1960: 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65  oid sqliteDelete
1970: 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a 64 62  Index(sqlite *db
1980: 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49  , Index *p){.  I
1990: 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20 20 61  ndex *pOld;..  a
19a0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 26 26 20  ssert( db!=0 && 
19b0: 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  p->zName!=0 );. 
19c0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
19d0: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
19e0: 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61  Db[p->iDb].idxHa
19f0: 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  sh, p->zName,.  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e 28 70          strlen(p
1a20: 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  ->zName)+1, 0);.
1a30: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 26 26    if( pOld!=0 &&
1a40: 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20 20 20   pOld!=p ){.    
1a50: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1a60: 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44  t(&db->aDb[p->iD
1a70: 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f 6c 64  b].idxHash, pOld
1a80: 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1aa0: 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61 6d 65  rlen(pOld->zName
1ab0: 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20 7d 0a  )+1, pOld);.  }.
1ac0: 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41 66 66    if( p->zColAff
1ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1ae0: 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ee(p->zColAff);.
1af0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
1b00: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  (p);.}../*.** Un
1b10: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69  link the given i
1b20: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61  ndex from its ta
1b30: 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65  ble, then remove
1b40: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72  .** the index fr
1b50: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
1b60: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
1b70: 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   its memory.** s
1b80: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
1b90: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
1ba0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
1bb0: 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64 65 78  qlite *db, Index
1bc0: 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 66 28   *pIndex){.  if(
1bd0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
1be0: 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20  >pIndex==pIndex 
1bf0: 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  ){.    pIndex->p
1c00: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
1c10: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
1c20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
1c30: 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  x *p;.    for(p=
1c40: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
1c50: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e  pIndex; p && p->
1c60: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20 70  pNext!=pIndex; p
1c70: 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  =p->pNext){}.   
1c80: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 4e 65   if( p && p->pNe
1c90: 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  xt==pIndex ){.  
1ca0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
1cb0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
1cc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1cd0: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
1ce0: 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
1cf0: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
1d00: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
1d10: 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  rom the in-memor
1d20: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66  y hash tables of
1d30: 0a 2a 2a 20 61 20 73 69 67 6c 65 20 64 61 74 61  .** a sigle data
1d40: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
1d50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
1d60: 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a   reclaim memory.
1d70: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 63 6c  ** before the cl
1d80: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
1d90: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
1da0: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
1db0: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
1dc0: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
1dd0: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1de0: 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73 63 68  n or if a.** sch
1df0: 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73 6d 61  ema-cookie misma
1e00: 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  tch occurs..**.*
1e10: 2a 20 49 66 20 69 44 62 3c 3d 30 20 74 68 65 6e  * If iDb<=0 then
1e20: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
1e30: 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62 6c 65  nal schema table
1e40: 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
1e50: 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20 49 66  se.** files.  If
1e60: 20 69 44 62 3e 3d 32 20 74 68 65 6e 20 72 65 73   iDb>=2 then res
1e70: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
1e80: 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c 79 20  schema for only 
1e90: 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 66 69  the.** single fi
1ea0: 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  le indicated..*/
1eb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
1ec0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
1ed0: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74  (sqlite *db, int
1ee0: 20 69 44 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   iDb){.  HashEle
1ef0: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
1f00: 20 74 65 6d 70 31 3b 0a 20 20 48 61 73 68 20 74   temp1;.  Hash t
1f10: 65 6d 70 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  emp2;.  int i, j
1f20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
1f30: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
1f40: 44 62 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  Db );.  db->flag
1f50: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69  s &= ~SQLITE_Ini
1f60: 74 69 61 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28  tialized;.  for(
1f70: 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=iDb; i<db->nDb
1f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
1f90: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
1fa0: 5d 3b 0a 20 20 20 20 74 65 6d 70 31 20 3d 20 70  ];.    temp1 = p
1fb0: 44 62 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20  Db->tblHash;.   
1fc0: 20 74 65 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72   temp2 = pDb->tr
1fd0: 69 67 48 61 73 68 3b 0a 20 20 20 20 73 71 6c 69  igHash;.    sqli
1fe0: 74 65 33 48 61 73 68 49 6e 69 74 28 26 70 44 62  te3HashInit(&pDb
1ff0: 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51 4c 49  ->trigHash, SQLI
2000: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
2010: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  0);.    sqlite3H
2020: 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 61  ashClear(&pDb->a
2030: 46 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  FKey);.    sqlit
2040: 65 33 48 61 73 68 43 6c 65 61 72 28 26 70 44 62  e3HashClear(&pDb
2050: 2d 3e 69 64 78 48 61 73 68 29 3b 0a 20 20 20 20  ->idxHash);.    
2060: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
2070: 48 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 32  HashFirst(&temp2
2080: 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
2090: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
20a0: 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 72  Elem)){.      Tr
20b0: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 20  igger *pTrigger 
20c0: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
20d0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73  (pElem);.      s
20e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
20f0: 67 65 72 28 70 54 72 69 67 67 65 72 29 3b 0a 20  ger(pTrigger);. 
2100: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2110: 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70 32  HashClear(&temp2
2120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  );.    sqlite3Ha
2130: 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c  shInit(&pDb->tbl
2140: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
2150: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
2160: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
2170: 74 65 48 61 73 68 46 69 72 73 74 28 26 74 65 6d  teHashFirst(&tem
2180: 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  p1); pElem; pEle
2190: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
21a0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20  (pElem)){.      
21b0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
21c0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
21d0: 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
21e0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
21f0: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  , pTab);.    }. 
2200: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
2210: 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20 20 20  ear(&temp1);.   
2220: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
2230: 28 64 62 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d  (db, i, DB_Schem
2240: 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66  aLoaded);.    if
2250: 28 20 69 44 62 3e 30 20 29 20 72 65 74 75 72 6e  ( iDb>0 ) return
2260: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2270: 69 44 62 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e  iDb==0 );.  db->
2280: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
2290: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
22a0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20  .  /* If one or 
22b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75 78 69  more of the auxi
22c0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
22d0: 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20 63 6c  iles has been cl
22e0: 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  osed,.  ** then 
22f0: 72 65 6d 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d  remove then from
2300: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2310: 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20 20 57  atabase list.  W
2320: 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20  e take the.  ** 
2330: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 64  opportunity to d
2340: 6f 20 74 68 69 73 20 68 65 72 65 20 73 69 6e 63  o this here sinc
2350: 65 20 77 65 20 68 61 76 65 20 6a 75 73 74 20 64  e we have just d
2360: 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20 74 68  eleted all of th
2370: 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20 68 61  e.  ** schema ha
2380: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
2390: 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68  erefore do not h
23a0: 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  ave to make any 
23b0: 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
23c0: 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74 61 62  any of those tab
23d0: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
23e0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
23f0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2400: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
2410: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
2420: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
2430: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 41       if( pDb->pA
2440: 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72 65 65  ux && pDb->xFree
2450: 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72 65 65  Aux ) pDb->xFree
2460: 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a  Aux(pDb->pAux);.
2470: 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75 78 20        pDb->pAux 
2480: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2490: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
24a0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
24b0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
24c0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
24d0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
24e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
24f0: 74 65 46 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d  teFree(pDb->zNam
2500: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
2510: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
2520: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2530: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
2540: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
2550: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
2560: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
2570: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
2580: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
2590: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
25a0: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
25b0: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
25c0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
25d0: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
25e0: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
25f0: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
2600: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
2610: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
2620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2630: 28 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64  (db->aDb);.    d
2640: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
2650: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
2660: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2670: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2680: 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  ever a rollback 
2690: 6f 63 63 75 72 73 2e 20 20 49 66 20 74 68 65 72  occurs.  If ther
26a0: 65 20 77 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61  e were.** schema
26b0: 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20   changes during 
26c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
26d0: 20 74 68 65 6e 20 77 65 20 68 61 76 65 20 74 6f   then we have to
26e0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e   reset the.** in
26f0: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
2700: 65 73 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68  es and reload th
2710: 65 6d 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f  em from disk..*/
2720: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
2730: 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61  lbackInternalCha
2740: 6e 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29  nges(sqlite *db)
2750: 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  {.  if( db->flag
2760: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
2770: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
2780: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
2790: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
27a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
27b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27c0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  called when a co
27d0: 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  mmit occurs..*/.
27e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
27f0: 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
2800: 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20  s(sqlite *db){. 
2810: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2820: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
2830: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ges;.}../*.** Re
2840: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
2850: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
2860: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2870: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
2880: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
2890: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
28a0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
28b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28c0: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
28d0: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
28e0: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
28f0: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
2900: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
2910: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
2920: 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20  ash table.  Nor 
2930: 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a  does it remove.*
2940: 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66  * foreign keys f
2950: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61  rom the sqlite.a
2960: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e  FKey hash table.
2970: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
2980: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
2990: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
29a0: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
29b0: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
29c0: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
29d0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
29e0: 49 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  Indices associat
29f0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
2a00: 65 20 61 72 65 20 75 6e 6c 69 6e 6b 65 64 20 66  e are unlinked f
2a10: 72 6f 6d 20 74 68 65 20 22 64 62 22 0a 2a 2a 20  rom the "db".** 
2a20: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
2a30: 66 20 64 62 21 3d 4e 55 4c 4c 2e 20 20 49 66 20  f db!=NULL.  If 
2a40: 64 62 3d 3d 4e 55 4c 4c 2c 20 69 6e 64 69 63 65  db==NULL, indice
2a50: 73 20 61 74 74 61 63 68 65 64 20 74 6f 0a 2a 2a  s attached to.**
2a60: 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20 64   the table are d
2a70: 65 6c 65 74 65 64 2c 20 62 75 74 20 69 74 20 69  eleted, but it i
2a80: 73 20 61 73 73 75 6d 65 64 20 74 68 65 79 20 68  s assumed they h
2a90: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
2aa0: 0a 2a 2a 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2f  .** unlinked..*/
2ab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
2ac0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
2ad0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
2ae0: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
2af0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
2b00: 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70  pNext;.  FKey *p
2b10: 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79  FKey, *pNextFKey
2b20: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  ;..  if( pTable=
2b30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
2b40: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e  /* Delete all in
2b50: 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
2b60: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
2b70: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  .  */.  for(pInd
2b80: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
2b90: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
2ba0: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
2bb0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
2bc0: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
2bd0: 74 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d  t( pIndex->iDb==
2be0: 70 54 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28  pTable->iDb || (
2bf0: 70 54 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26  pTable->iDb==0 &
2c00: 26 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31  & pIndex->iDb==1
2c10: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44  ) );.    sqliteD
2c20: 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70  eleteIndex(db, p
2c30: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
2c40: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72  * Delete all for
2c50: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
2c60: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
2c70: 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a  able.  The keys.
2c80: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
2c90: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e   already been un
2ca0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
2cb0: 64 62 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74  db->aFKey hash t
2cc0: 61 62 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72  able .  */.  for
2cd0: 28 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70  (pFKey=pTable->p
2ce0: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
2cf0: 65 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20  ey=pNextFKey){. 
2d00: 20 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70     pNextFKey = p
2d10: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b  FKey->pNextFrom;
2d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
2d30: 62 6c 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62  ble->iDb<db->nDb
2d40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d50: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2d60: 26 64 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d  &db->aDb[pTable-
2d70: 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20  >iDb].aFKey,.   
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
2da0: 54 6f 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79  To, strlen(pFKey
2db0: 2d 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79  ->zTo)+1)!=pFKey
2dc0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   );.    sqliteFr
2dd0: 65 65 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a  ee(pFKey);.  }..
2de0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
2df0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2e00: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 66  itself..  */.  f
2e10: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65  or(i=0; i<pTable
2e20: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
2e30: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
2e40: 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69   &pTable->aCol[i
2e50: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ];.    sqliteFre
2e60: 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  e(pCol->zName);.
2e70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2e80: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
2e90: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
2ea0: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20  ->zType);.  }.  
2eb0: 73 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c  sqliteFree(pTabl
2ec0: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
2ed0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e  iteFree(pTable->
2ee0: 61 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54 61  aCol);.  if( pTa
2ef0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a  ble->zColAff ){.
2f00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2f10: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
2f20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
2f30: 6c 65 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c  lectDelete(pTabl
2f40: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  e->pSelect);.  s
2f50: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
2f60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
2f70: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
2f80: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
2f90: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
2fa0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
2fb0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
2fc0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
2fd0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
2fe0: 65 79 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eys..*/.static v
2ff0: 6f 69 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b  oid sqliteUnlink
3000: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
3010: 71 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65  qlite *db, Table
3020: 20 2a 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70   *p){.  Table *p
3030: 4f 6c 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31  Old;.  FKey *pF1
3040: 2c 20 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20  , *pF2;.  int i 
3050: 3d 20 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  = p->iDb;.  asse
3060: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70  rt( db!=0 );.  p
3070: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
3080: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
3090: 5b 69 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  [i].tblHash, p->
30a0: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d  zName, strlen(p-
30b0: 3e 7a 4e 61 6d 65 29 2b 31 2c 30 29 3b 0a 20 20  >zName)+1,0);.  
30c0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20  assert( pOld==0 
30d0: 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20  || pOld==p );.  
30e0: 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79  for(pF1=p->pFKey
30f0: 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e  ; pF1; pF1=pF1->
3100: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
3110: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
3120: 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a  (pF1->zTo) + 1;.
3130: 20 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65      pF2 = sqlite
3140: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
3150: 44 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31  Db[i].aFKey, pF1
3160: 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  ->zTo, nTo);.   
3170: 20 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b   if( pF2==pF1 ){
3180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61  .      sqlite3Ha
3190: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
31a0: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
31b0: 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e  >zTo, nTo, pF1->
31c0: 70 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65  pNextTo);.    }e
31d0: 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  lse{.      while
31e0: 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e  ( pF2 && pF2->pN
31f0: 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46  extTo!=pF1 ){ pF
3200: 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20  2=pF2->pNextTo; 
3210: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20  }.      if( pF2 
3220: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e  ){.        pF2->
3230: 70 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70  pNextTo = pF1->p
3240: 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a  NextTo;.      }.
3250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
3260: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
3270: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
3280: 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72  Given a token, r
3290: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
32a0: 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
32b0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61 74  the text of that
32c0: 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69 74 68 20 61  .** token with a
32d0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 73 20 72 65  ny quotations re
32e0: 6d 6f 76 65 64 2e 20 20 53 70 61 63 65 20 74 6f  moved.  Space to
32f0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
3300: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
3310: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3320: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
3330: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
3340: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
3350: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3360: 20 54 6f 6b 65 6e 73 20 61 72 65 20 72 65 61 6c   Tokens are real
3370: 6c 79 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  ly just pointers
3380: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
3390: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
33a0: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
33b0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
33c0: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
33d0: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
33e0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
33f0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
3400: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
3410: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
3420: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3430: 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  n(Token *pName){
3440: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
3450: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
3460: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
3470: 65 53 74 72 4e 44 75 70 28 70 4e 61 6d 65 2d 3e  eStrNDup(pName->
3480: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
3490: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
34a0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
34b0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
34c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
34d0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
34e0: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
34f0: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
3500: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
3510: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
3520: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
3530: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
3540: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
3550: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
3560: 4d 61 73 74 65 72 54 61 62 6c 65 28 56 64 62 65  MasterTable(Vdbe
3570: 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *v, int iDb){. 
3580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3590: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
35a0: 20 69 44 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69   iDb, 0);.  sqli
35b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
35c0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
35d0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20   MASTER_ROOT);. 
35e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35f0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
3600: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
3610: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
3620: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
3630: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
3640: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
3650: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
3660: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
3670: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
3680: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
3690: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
36a0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
36b0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
36c0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
36d0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
36e0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
36f0: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
3700: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
3710: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e  xist..*/.int fin
3720: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
3730: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
3740: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
3750: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
3760: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4e 61  ++){.    if( pNa
3770: 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62  me->n==strlen(db
3780: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[i].zName) 
3790: 26 26 20 0a 20 20 20 20 20 20 20 20 30 3d 3d 73  && .        0==s
37a0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 64  qlite3StrNICmp(d
37b0: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c  b->aDb[i].zName,
37c0: 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65   pName->z, pName
37d0: 2d 3e 6e 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ->n) ){.      re
37e0: 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
37f0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
3800: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
3810: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
3820: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
3830: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
3840: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
3850: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
3860: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
3870: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
3880: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
3890: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
38a0: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
38b0: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
38c0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
38d0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
38e0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
38f0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
3900: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
3910: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
3920: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
3930: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
3940: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
3950: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
3960: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
3970: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
3980: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
3990: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
39a0: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
39b0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
39c0: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
39d0: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
39e0: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
39f0: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
3a00: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
3a10: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
3a20: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
3a30: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
3a40: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
3a50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3a60: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
3a70: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
3a80: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
3a90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
3aa0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
3ab0: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
3ac0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
3ad0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
3ae0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
3af0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
3b00: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
3b10: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
3b20: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
3b30: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
3b40: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
3b50: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b70: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
3b80: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
3b90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3ba0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
3bb0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
3bc0: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
3bd0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
3be0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
3bf0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
3c00: 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62      iDb = findDb
3c10: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
3c20: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
3c30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
3c50: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
3c60: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
3c70: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3c80: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
3c90: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
3ca0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
3cb0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
3cc0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
3cd0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
3ce0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
3cf0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
3d00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
3d10: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
3d20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3d30: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
3d40: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
3d50: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
3d60: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
3d70: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
3d80: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
3d90: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
3da0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
3db0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
3dc0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
3dd0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
3de0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
3df0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
3e00: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
3e10: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
3e20: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
3e30: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
3e40: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
3e50: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
3e60: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
3e70: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
3e80: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
3e90: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
3ea0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
3eb0: 74 2e 62 75 73 79 20 26 26 20 30 3d 3d 73 71 6c  t.busy && 0==sql
3ec0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
3ed0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
3ee0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
3ef0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3f00: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
3f10: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
3f20: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
3f30: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
3f40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
3f50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
3f60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3f70: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
3f80: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
3f90: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
3fa0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
3fb0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
3fc0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
3fd0: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
3fe0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
3ff0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4000: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4010: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4020: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4030: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4040: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4050: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4060: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4070: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4080: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4090: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
40a0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
40b0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
40c0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
40d0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
40e0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
40f0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4100: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4110: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4120: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4130: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4140: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4150: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4160: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4170: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4180: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4190: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
41a0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
41b0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
41c0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
41d0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
41e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
41f0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4200: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4210: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4220: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4230: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4240: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4250: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4260: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4270: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4280: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4290: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
42a0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
42b0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
42c0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
42d0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
42e0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
42f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4300: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4310: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4320: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4330: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4340: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4350: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4360: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4370: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4380: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4390: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
43a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
43b0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
43c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
43d0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
43e0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
43f0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4400: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
4410: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
4420: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
4430: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4440: 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20  isView       /* 
4450: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
4460: 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54  a VIEW */.){.  T
4470: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
4480: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
4490: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
44a0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
44b0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
44c0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
44d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
44e0: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
44f0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
4500: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4510: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
4520: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
4530: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
4540: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
4550: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
4560: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
4570: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
4580: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
4590: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
45a0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
45b0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
45c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
45d0: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
45e0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
45f0: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
4600: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
4610: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
4620: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
4630: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
4640: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
4650: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
4660: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
4670: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
4680: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
4690: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
46a0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
46b0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
46c0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
46d0: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
46e0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
46f0: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
4700: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
4710: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
4720: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
4730: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
4740: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
4750: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
4760: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
4770: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
4780: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
4790: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
47a0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
47b0: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
47c0: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
47d0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
47e0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
47f0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
4800: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
4810: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
4820: 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  ;.  if( isTemp &
4830: 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f  & iDb>1 ){.    /
4840: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
4850: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
4860: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
4870: 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20  qualified */.   
4880: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4890: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
48a0: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
48b0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
48c0: 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed");.    pParse
48d0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
48e0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
48f0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
4900: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
4910: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
4920: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
4930: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4940: 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (pName);.  if( z
4950: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
4960: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
4970: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
4980: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
4990: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
49a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
49b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
49c0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
49d0: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
49e0: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
49f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
4a00: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
4a10: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
4a20: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
4a30: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
4a40: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
4a50: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
4a60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
4a70: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
4a80: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
4a90: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
4aa0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
4ab0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  {.      sqliteFr
4ac0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
4ad0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4ae0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
4af0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
4b00: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
4b10: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
4b20: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
4b30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b40: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
4b50: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
4b60: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
4b70: 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d 70        if( isTemp
4b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
4b90: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
4ba0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
4bb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4bc0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
4bd0: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
4be0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4bf0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
4c00: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
4c10: 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e, zName, 0, zDb
4c20: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
4c30: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4c40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4c50: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
4c60: 2f 2a 20 42 65 66 6f 72 65 20 74 72 79 69 6e 67  /* Before trying
4c70: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 65 6d   to create a tem
4c80: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6d 61  porary table, ma
4c90: 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 72 65  ke sure the Btre
4ca0: 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f 6c 64 69  e for.  ** holdi
4cb0: 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
4cc0: 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a 20 20 2a  les is open..  *
4cd0: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 26  /.  if( isTemp &
4ce0: 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  & db->aDb[1].pBt
4cf0: 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
4d00: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
4d10: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
4d20: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
4d30: 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c  0, 0, MAX_PAGES,
4d40: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
4d50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
4d60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4d70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4d80: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
4d90: 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
4da0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
4db0: 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
4dc0: 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
4dd0: 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
4de0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
4df0: 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  r++;.      pPars
4e00: 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
4e10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
4e20: 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
4e30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
4e40: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62   db->flags & !db
4e50: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
4e60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4e70: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
4e80: 73 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  s(db->aDb[1].pBt
4e90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
4ea0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4eb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ec0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4ed0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20   "unable to get 
4ee0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  a write lock on 
4ef0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65  ".          "the
4f00: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
4f10: 61 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20  ase file");.    
4f20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4f30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
4f40: 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
4f50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4f70: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
4f80: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
4f90: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
4fa0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
4fb0: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
4fc0: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
4fd0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
4fe0: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
4ff0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
5000: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 0a 20  .  ** it does.. 
5010: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
5020: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
5030: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
5040: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 61 62 6c   return;.  pTabl
5050: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
5060: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
5070: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
5080: 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  me);.  if( pTabl
5090: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
50a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
50b0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
50c0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
50d0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
50e0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
50f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
5100: 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33   (pIdx = sqlite3
5110: 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
5120: 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 20 0a  ame, 0))!=0 && .
5130: 20 20 20 20 20 20 28 20 69 44 62 3d 3d 30 20 7c        ( iDb==0 |
5140: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
5150: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5160: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5170: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
5180: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
5190: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
51a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
51b0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
51c0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d  ;.  }.  pTable =
51d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
51e0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
51f0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
5200: 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  ){.    pParse->r
5210: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5220: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
5230: 72 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  rr++;.    sqlite
5240: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
5250: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
5260: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
5270: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
5280: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  nCol = 0;.  pTab
5290: 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->aCol = 0;.  
52a0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20  pTable->iPKey = 
52b0: 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 49  -1;.  pTable->pI
52c0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 70 54 61 62  ndex = 0;.  pTab
52d0: 6c 65 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20  le->iDb = iDb;. 
52e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
52f0: 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74 65 33  wTable ) sqlite3
5300: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
5310: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5320: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
5330: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
5340: 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
5350: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
5360: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
5370: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
5380: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
5390: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
53a0: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
53b0: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
53c0: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
53d0: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
53e0: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
53f0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
5400: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
5410: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
5420: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
5430: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
5440: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
5450: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
5460: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
5470: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
5480: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
5490: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
54a0: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
54b0: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
54c0: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
54d0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
54e0: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
54f0: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
5500: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
5510: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
5520: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
5530: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
5540: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
5550: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
5560: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
5570: 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61   /* Every time a
5580: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63 72   new table is cr
5590: 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66  eated the file-f
55a0: 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 61 6e 64  ormat.    ** and
55b0: 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76   encoding meta-v
55c0: 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69 6e  alues are set in
55d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
55e0: 6e 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68  n.    ** case th
55f0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
5600: 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e 0a 20  table created.. 
5610: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5620: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5630: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 66 69  _Integer, db->fi
5640: 6c 65 5f 66 6f 72 6d 61 74 2c 20 30 29 3b 0a 20  le_format, 0);. 
5650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5660: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
5670: 6b 69 65 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  kie, iDb, 1);.  
5680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5690: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
56a0: 2c 20 64 62 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20  , db->enc, 0);. 
56b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
56c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
56d0: 6b 69 65 2c 20 69 44 62 2c 20 34 29 3b 0a 0a 20  kie, iDb, 4);.. 
56e0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
56f0: 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62  sterTable(v, iDb
5700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5710: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
5720: 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20  wRecno, 0, 0);. 
5730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5740: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
5750: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5760: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5770: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
5780: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5790: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
57a0: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
57b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
57c0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
57d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
57e0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
57f0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
5800: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
5810: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
5820: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
5830: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
5840: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5850: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
5860: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
5870: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
5880: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
5890: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
58a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
58b0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
58c0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
58d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
58e0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
58f0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
5900: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5910: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
5920: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
5930: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5940: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5950: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
5960: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5970: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
5980: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
5990: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
59a0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
59b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
59c0: 53 74 72 49 43 6d 70 28 7a 2c 20 70 2d 3e 61 43  StrICmp(z, p->aC
59d0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ol[i].zName)==0 
59e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
59f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5a00: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
5a10: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
5a20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
5a30: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  ee(z);.      ret
5a40: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
5a50: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
5a60: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
5a70: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
5a80: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   aNew = sqliteRe
5a90: 61 6c 6c 6f 63 28 20 70 2d 3e 61 43 6f 6c 2c 20  alloc( p->aCol, 
5aa0: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
5ab0: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
5ac0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
5ad0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
5ae0: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
5af0: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
5b00: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
5b10: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
5b20: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
5b30: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
5b40: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
5b50: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
5b60: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
5b70: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
5b80: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
5b90: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
5ba0: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
5bb0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
5bc0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
5bd0: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
5be0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
5bf0: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
5c00: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
5c10: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
5c20: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
5c30: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
5c40: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
5c50: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
5c60: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
5c70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5c80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
5c90: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
5ca0: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
5cb0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
5cc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5cd0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
5ce0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
5cf0: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
5d00: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
5d10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
5d20: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
5d30: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
5d40: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
5d50: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
5d60: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5d70: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
5d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
5d90: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
5da0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
5db0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
5dc0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
5dd0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
5de0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28  p->nCol-1;.  if(
5df0: 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b   i>=0 ) p->aCol[
5e00: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45  i].notNull = onE
5e10: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rror;.}../*.** T
5e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5e30: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
5e40: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
5e50: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
5e60: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
5e70: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5e80: 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65   The pFirst toke
5e90: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n is the first.*
5ea0: 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73  * token in the s
5eb0: 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e  equence of token
5ec0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
5ed0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a  the type of the.
5ee0: 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  ** column curren
5ef0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
5f00: 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20  uction.   pLast 
5f10: 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  is the last toke
5f20: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75  n.** in the sequ
5f30: 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20  ence.  Use this 
5f40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63  information to c
5f50: 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e  onstruct a strin
5f60: 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69  g.** that contai
5f70: 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20  ns the typename 
5f80: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  of the column an
5f90: 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72  d store that str
5fa0: 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e  ing.** in zType.
5fb0: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
5fc0: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50  3AddColumnType(P
5fd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
5fe0: 6b 65 6e 20 2a 70 46 69 72 73 74 2c 20 54 6f 6b  ken *pFirst, Tok
5ff0: 65 6e 20 2a 70 4c 61 73 74 29 7b 0a 20 20 54 61  en *pLast){.  Ta
6000: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 2c  ble *p;.  int i,
6010: 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63   j;.  int n;.  c
6020: 68 61 72 20 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20  har *z, **pz;.  
6030: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
6040: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
6050: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
6060: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
6070: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
6080: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
6090: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
60a0: 69 5d 3b 0a 20 20 70 7a 20 3d 20 26 70 43 6f 6c  i];.  pz = &pCol
60b0: 2d 3e 7a 54 79 70 65 3b 0a 20 20 6e 20 3d 20 70  ->zType;.  n = p
60c0: 4c 61 73 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70  Last->n + Addr(p
60d0: 4c 61 73 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28  Last->z) - Addr(
60e0: 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20 73 71  pFirst->z);.  sq
60f0: 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
6100: 70 7a 2c 20 70 46 69 72 73 74 2d 3e 7a 2c 20 6e  pz, pFirst->z, n
6110: 2c 20 30 29 3b 0a 20 20 7a 20 3d 20 2a 70 7a 3b  , 0);.  z = *pz;
6120: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
6130: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  turn;.  for(i=j=
6140: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
6150: 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b 69 5d 3b     int c = z[i];
6160: 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
6170: 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  (c) ) continue;.
6180: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
6190: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
61a0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
61b0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
61c0: 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b 0a 7d 0a  tyType(z, n);.}.
61d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69 76 65 6e  ./*.** The given
61e0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 64 65   token is the de
61f0: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
6200: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
6210: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
6220: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
6230: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6240: 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75 73 46 6c  on.  If "minusFl
6250: 61 67 22 20 69 73 20 74 72 75 65 2c 20 69 74 0a  ag" is true, it.
6260: 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 76 61 6c  ** means the val
6270: 75 65 20 74 6f 6b 65 6e 20 77 61 73 20 70 72 65  ue token was pre
6280: 63 65 64 65 64 20 62 79 20 61 20 6d 69 6e 75 73  ceded by a minus
6290: 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   sign..**.** Thi
62a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
62b0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
62c0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
62d0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
62e0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
62f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
6300: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
6310: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
6320: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
6330: 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20 6d 69 6e  n *pVal, int min
6340: 75 73 46 6c 61 67 29 7b 0a 20 20 54 61 62 6c 65  usFlag){.  Table
6350: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
6360: 63 68 61 72 20 2a 2a 70 7a 3b 0a 20 20 69 66 28  char **pz;.  if(
6370: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
6380: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
6390: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
63a0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30  Col-1;.  if( i<0
63b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 7a 20   ) return;.  pz 
63c0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44  = &p->aCol[i].zD
63d0: 66 6c 74 3b 0a 20 20 69 66 28 20 6d 69 6e 75 73  flt;.  if( minus
63e0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  Flag ){.    sqli
63f0: 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
6400: 2c 20 22 2d 22 2c 20 31 2c 20 70 56 61 6c 2d 3e  , "-", 1, pVal->
6410: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
6420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6430: 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70  ite3SetNString(p
6440: 7a 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  z, pVal->z, pVal
6450: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ->n, 0);.  }.  s
6460: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 2a 70  qlite3Dequote(*p
6470: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  z);.}../*.** Des
6480: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
6490: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
64a0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
64b0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
64c0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
64d0: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
64e0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
64f0: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
6500: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
6510: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
6520: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
6530: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
6540: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
6550: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
6560: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
6570: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
6580: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
6590: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
65a0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
65b0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
65c0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
65d0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
65e0: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
65f0: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
6600: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
6610: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
6620: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
6630: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
6640: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
6650: 73 20 74 68 65 20 72 6f 77 20 69 64 2e 20 20 28  s the row id.  (
6660: 45 78 63 65 70 74 69 6f 6e 3a 0a 2a 2a 20 46 6f  Exception:.** Fo
6670: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
6680: 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
6690: 6c 64 65 72 20 64 61 74 61 62 61 73 65 73 2c 20  lder databases, 
66a0: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 2a  do not do this.*
66b0: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * if the file fo
66c0: 72 6d 61 74 20 76 65 72 73 69 6f 6e 20 6e 75 6d  rmat version num
66d0: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
66e0: 20 31 2e 29 20 20 53 65 74 20 74 68 65 20 54 61   1.)  Set the Ta
66f0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
6700: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
6710: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6720: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
6730: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
6740: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
6750: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
6760: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
6770: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
6780: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
6790: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
67a0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
67b0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
67c0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
67d0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
67e0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
67f0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
6800: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
6810: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6820: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
6830: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
6840: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6850: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
6860: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
6870: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
6880: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6890: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
68a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
68b0: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
68c0: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72  Tab==0 ) goto pr
68d0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
68e0: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
68f0: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
6900: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6910: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
6920: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
6930: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
6940: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
6950: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
6960: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
6970: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
6980: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
6990: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
69a0: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
69b0: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
69c0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
69d0: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
69e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
69f0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
6a00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6a10: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
6a20: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
6a30: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
6a40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6a50: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
6a60: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
6a70: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
6a80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
6a90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6ab0: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
6ac0: 6c 20 29 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l ) pTab->aCol[i
6ad0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
6ae0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
6af0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
6b00: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
6b10: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
6b20: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
6b30: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
6b40: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
6b50: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
6b60: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
6b70: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
6b80: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
6b90: 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   ){.    pTab->iP
6ba0: 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Key = iCol;.    
6bb0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20  pTab->keyConf = 
6bc0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65  onError;.  }else
6bd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
6be0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
6bf0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
6c00: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 29 3b   onError, 0, 0);
6c10: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
6c20: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
6c30: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
6c40: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
6c50: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
6c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6c70: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
6c80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
6c90: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
6ca0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
6cb0: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
6cc0: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
6cd0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
6ce0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
6cf0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
6d00: 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70 65  zType, int nType
6d10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
6d20: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
6d30: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
6d40: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
6d50: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
6d60: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
6d70: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
6d80: 6f 6c 2d 31 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  ol-1;..  pColl =
6d90: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
6da0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 54  llSeq(pParse, zT
6db0: 79 70 65 2c 20 6e 54 79 70 65 29 3b 0a 20 20 70  ype, nType);.  p
6dc0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 70 43 6f 6c 6c 20  ->aCol[i].pColl 
6dd0: 3d 20 70 43 6f 6c 6c 3b 0a 0a 20 20 2f 2a 20 49  = pColl;..  /* I
6de0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
6df0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
6e00: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
6e10: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
6e20: 0a 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e  .  ** then an in
6e30: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
6e40: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
6e50: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
6e60: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  the.  ** collati
6e70: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
6e80: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
6e90: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
6ea0: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  e..  */.  for(pI
6eb0: 64 78 20 3d 20 70 2d 3e 70 49 6e 64 65 78 3b 20  dx = p->pIndex; 
6ec0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
6ed0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 61 73 73  >pNext){.    ass
6ee0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
6ef0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  mn==1 );.    if(
6f00: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6f10: 30 5d 3d 3d 69 20 29 20 70 49 64 78 2d 3e 6b 65  0]==i ) pIdx->ke
6f20: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
6f30: 20 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pColl;.  }.}../
6f40: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 6e 64 20  *.** Locate and 
6f50: 72 65 74 75 72 6e 20 61 6e 20 65 6e 74 72 79 20  return an entry 
6f60: 66 72 6f 6d 20 74 68 65 20 64 62 2e 61 43 6f 6c  from the db.aCol
6f70: 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65 2e  lSeq hash table.
6f80: 20 49 66 20 74 68 65 20 65 6e 74 72 79 0a 2a 2a   If the entry.**
6f90: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7a 4e   specified by zN
6fa0: 61 6d 65 20 61 6e 64 20 6e 4e 61 6d 65 20 69 73  ame and nName is
6fb0: 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 70   not found and p
6fc0: 61 72 61 6d 65 74 65 72 20 27 63 72 65 61 74 65  arameter 'create
6fd0: 27 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  ' is.** true, th
6fe0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
6ff0: 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
7000: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
7010: 0a 2a 2a 20 45 61 63 68 20 70 6f 69 6e 74 65 72  .** Each pointer
7020: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
7030: 71 6c 69 74 65 33 2e 61 43 6f 6c 6c 53 65 71 20  qlite3.aCollSeq 
7040: 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e 74 61  hash table conta
7050: 69 6e 73 20 61 6e 0a 2a 2a 20 61 72 72 61 79 20  ins an.** array 
7060: 6f 66 20 74 68 72 65 65 20 43 6f 6c 6c 53 65 71  of three CollSeq
7070: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
7080: 20 66 69 72 73 74 20 69 73 20 74 68 65 20 63 6f   first is the co
7090: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
70a0: 0a 2a 2a 20 70 72 65 66 66 65 72 72 65 64 20 66  .** prefferred f
70b0: 6f 72 20 55 54 46 2d 38 2c 20 74 68 65 20 73 65  or UTF-8, the se
70c0: 63 6f 6e 64 20 55 54 46 2d 31 36 6c 65 2c 20 61  cond UTF-16le, a
70d0: 6e 64 20 74 68 65 20 74 68 69 72 64 20 55 54 46  nd the third UTF
70e0: 2d 31 36 62 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f  -16be..**.** Sto
70f0: 72 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  red immediately 
7100: 61 66 74 65 72 20 74 68 65 20 74 68 72 65 65 20  after the three 
7110: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7120: 63 65 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ces is a copy of
7130: 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  .** the collatio
7140: 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 2e  n sequence name.
7150: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
7160: 69 73 20 73 74 72 69 6e 67 20 69 73 20 73 74 6f  is string is sto
7170: 72 65 64 20 69 6e 0a 2a 2a 20 65 61 63 68 20 63  red in.** each c
7180: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7190: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
71a0: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
71b0: 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72   findCollSeqEntr
71c0: 79 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  y(.  sqlite *db,
71d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
71e0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d  Name,.  int nNam
71f0: 65 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a  e,.  int create.
7200: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
7210: 6f 6c 6c 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  oll;.  if( nName
7220: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
7230: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 43  len(zName);.  pC
7240: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
7250: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
7260: 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
7270: 65 29 3b 0a 0a 20 20 69 66 28 20 30 3d 3d 70 43  e);..  if( 0==pC
7280: 6f 6c 6c 20 26 26 20 63 72 65 61 74 65 20 29 7b  oll && create ){
7290: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
72a0: 69 74 65 4d 61 6c 6c 6f 63 28 20 33 2a 73 69 7a  iteMalloc( 3*siz
72b0: 65 6f 66 28 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e  eof(*pColl) + nN
72c0: 61 6d 65 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  ame + 1 );.    i
72d0: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
72e0: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65    pColl[0].zName
72f0: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
7300: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
7310: 5b 30 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [0].enc = SQLITE
7320: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 43 6f  _UTF8;.      pCo
7330: 6c 6c 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63  ll[1].zName = (c
7340: 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a  har*)&pColl[3];.
7350: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65        pColl[1].e
7360: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
7370: 36 4c 45 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  6LE;.      pColl
7380: 5b 32 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [2].zName = (cha
7390: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
73a0: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63      pColl[2].enc
73b0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
73c0: 45 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  E;.      memcpy(
73d0: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  pColl[0].zName, 
73e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
73f0: 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e       pColl[0].zN
7400: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
7410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
7420: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 43 6f  hInsert(&db->aCo
7430: 6c 6c 53 65 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e  llSeq, pColl[0].
7440: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 70 43  zName, nName, pC
7450: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
7460: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
7470: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
7480: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
7490: 74 6f 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64  to a UTF-8 encod
74a0: 65 64 20 73 74 72 69 6e 67 20 6e 4e 61 6d 65 20  ed string nName 
74b0: 62 79 74 65 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52  bytes long..** R
74c0: 65 74 75 72 6e 20 74 68 65 20 43 6f 6c 6c 53 65  eturn the CollSe
74d0: 71 2a 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 74  q* pointer for t
74e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
74f0: 75 65 6e 63 65 20 6e 61 6d 65 64 20 7a 4e 61 6d  uence named zNam
7500: 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 63  e.** for the enc
7510: 6f 64 69 6e 67 20 27 65 6e 63 27 20 66 72 6f 6d  oding 'enc' from
7520: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 27 64   the database 'd
7530: 62 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  b'..**.** If the
7540: 20 65 6e 74 72 79 20 73 70 65 63 69 66 69 65 64   entry specified
7550: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e   is not found an
7560: 64 20 27 63 72 65 61 74 65 27 20 69 73 20 74 72  d 'create' is tr
7570: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
7580: 61 0a 2a 2a 20 6e 65 77 20 65 6e 74 72 79 2e 20  a.** new entry. 
7590: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
75a0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53  n NULL..*/.CollS
75b0: 65 71 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 43  eq *sqlite3FindC
75c0: 6f 6c 6c 53 65 71 28 0a 20 20 73 71 6c 69 74 65  ollSeq(.  sqlite
75d0: 20 2a 64 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a   *db,.  u8 enc,.
75e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
75f0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  ame,.  int nName
7600: 2c 0a 20 20 69 6e 74 20 63 72 65 61 74 65 0a 29  ,.  int create.)
7610: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
7620: 6c 6c 20 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71  ll = findCollSeq
7630: 45 6e 74 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c  Entry(db, zName,
7640: 20 6e 4e 61 6d 65 2c 20 63 72 65 61 74 65 29 3b   nName, create);
7650: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 20 73  .  if( pColl ) s
7660: 77 69 74 63 68 28 20 65 6e 63 20 29 7b 0a 20 20  witch( enc ){.  
7670: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
7680: 46 38 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  F8:.      break;
7690: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
76a0: 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20  _UTF16LE:.      
76b0: 70 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 31  pColl = &pColl[1
76c0: 5d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ];.      break;.
76d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
76e0: 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20 70  UTF16BE:.      p
76f0: 43 6f 6c 6c 20 3d 20 26 70 43 6f 6c 6c 5b 32 5d  Coll = &pColl[2]
7700: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7710: 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20     default: .   
7720: 20 20 20 61 73 73 65 72 74 28 21 22 43 61 6e 6e     assert(!"Cann
7730: 6f 74 20 68 61 70 70 65 6e 22 29 3b 0a 20 20 7d  ot happen");.  }
7740: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
7750: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
7760: 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20   the 'collation 
7770: 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b  needed' callback
7780: 20 74 6f 20 72 65 71 75 65 73 74 20 61 20 63 6f   to request a co
7790: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
77a0: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
77b0: 61 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ase text encodin
77c0: 67 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c  g of name zName,
77d0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
77e0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  * If the collati
77f0: 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73  on sequence.*/.s
7800: 74 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 43  tatic void callC
7810: 6f 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74 65  ollNeeded(sqlite
7820: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
7830: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61   *zName, int nNa
7840: 6d 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  me){.  assert( !
7850: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
7860: 7c 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  || !db->xCollNee
7870: 64 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e  ded16 );.  if( n
7880: 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d  Name<0 ) nName =
7890: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
78a0: 20 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e    if( db->xCollN
78b0: 65 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68 61  eeded ){.    cha
78c0: 72 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73  r *zExternal = s
78d0: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e 61  qliteStrNDup(zNa
78e0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
78f0: 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29  if( !zExternal )
7900: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d   return;.    db-
7910: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2d  >xCollNeeded(db-
7920: 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  >pCollNeededArg,
7930: 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e   db, (int)db->en
7940: 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20  c, zExternal);. 
7950: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45     sqliteFree(zE
7960: 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20  xternal);.  }.  
7970: 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  if( db->xCollNee
7980: 64 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68 61  ded16 ){.    cha
7990: 72 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72 6e  r const *zExtern
79a0: 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  al;.    sqlite3_
79b0: 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73 71  value *pTmp = sq
79c0: 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e  lite3GetTransien
79d0: 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20 20  tValue(db);.    
79e0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
79f0: 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61  tr(pTmp, -1, zNa
7a00: 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  me, SQLITE_UTF8,
7a10: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
7a20: 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d  .    zExternal =
7a30: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
7a40: 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55  t(pTmp, SQLITE_U
7a50: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20  TF16NATIVE);.   
7a60: 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20   if( !zExternal 
7a70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62  ) return;.    db
7a80: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28  ->xCollNeeded16(
7a90: 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
7aa0: 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d  rg, db, (int)db-
7ab0: 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29  >enc, zExternal)
7ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
7ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7ae0: 61 6c 6c 65 64 20 69 66 20 74 68 65 20 63 6f 6c  alled if the col
7af0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 66  lation factory f
7b00: 61 69 6c 73 20 74 6f 20 64 65 6c 69 76 65 72 20  ails to deliver 
7b10: 61 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 66  a.** collation f
7b20: 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  unction in the b
7b30: 65 73 74 20 65 6e 63 6f 64 69 6e 67 20 62 75 74  est encoding but
7b40: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 6f 74   there may be ot
7b50: 68 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  her versions.** 
7b60: 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  of this collatio
7b70: 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20  n function (for 
7b80: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
7b90: 69 6e 67 73 29 20 61 76 61 69 6c 61 62 6c 65 2e  ings) available.
7ba0: 20 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74   Use one.** of t
7bb0: 68 65 73 65 20 69 6e 73 74 65 61 64 20 69 66 20  hese instead if 
7bc0: 74 68 65 79 20 65 78 69 73 74 2e 20 41 76 6f 69  they exist. Avoi
7bd0: 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54  d a UTF-8 <-> UT
7be0: 46 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e 20  F-16 conversion 
7bf0: 69 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 0a  if.** possible..
7c00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
7c10: 6e 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  nthCollSeq(Parse
7c20: 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65   *pParse, CollSe
7c30: 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c  q *pColl){.  Col
7c40: 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20  lSeq *pColl2;.  
7c50: 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d  char *z = pColl-
7c60: 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20  >zName;.  int n 
7c70: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 73  = strlen(z);.  s
7c80: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
7c90: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
7ca0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
7cb0: 75 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53 51  u8 aEnc[] = { SQ
7cc0: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51  LITE_UTF16BE, SQ
7cd0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 53 51  LITE_UTF16LE, SQ
7ce0: 4c 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20 66  LITE_UTF8 };.  f
7cf0: 6f 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b  or(i=0; i<3; i++
7d00: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20  ){.    pColl2 = 
7d10: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
7d20: 65 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c 20  eq(db, aEnc[i], 
7d30: 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66  z, n, 0);.    if
7d40: 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d  ( pColl2->xCmp!=
7d50: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  0 ){.      memcp
7d60: 79 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c  y(pColl, pColl2,
7d70: 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 29   sizeof(CollSeq)
7d80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7d90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
7da0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
7db0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
7dc0: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
7dd0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
7de0: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63  rMsg, "no such c
7df0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7e00: 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20 2d  e: ", .        -
7e10: 31 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7d  1, z, n, 0);.  }
7e20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b  .  pParse->nErr+
7e30: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  +;.  return SQLI
7e40: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
7e50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7e60: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63  is called on a c
7e70: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7e80: 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
7e90: 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  sed to.** check 
7ea0: 74 68 61 74 20 69 74 20 69 73 20 64 65 66 69 6e  that it is defin
7eb0: 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65 64  ed. An undefined
7ec0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7ed0: 6e 63 65 20 65 78 69 73 74 73 20 77 68 65 6e 0a  nce exists when.
7ee0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 69 73  ** a database is
7ef0: 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f 6e   loaded that con
7f00: 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
7f10: 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   to collation se
7f20: 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20  quences.** that 
7f30: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64 65  have not been de
7f40: 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  fined by sqlite3
7f50: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
7f60: 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49  n() etc..**.** I
7f70: 66 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73  f required, this
7f80: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74   routine calls t
7f90: 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  he 'collation ne
7fa0: 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74  eded' callback t
7fb0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20 64  o.** request a d
7fc0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
7fd0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7fe0: 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f 65  nce. If this doe
7ff0: 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61  sn't work, .** a
8000: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c  n equivalent col
8010: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8020: 74 68 61 74 20 75 73 65 73 20 61 20 74 65 78 74  that uses a text
8030: 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65 72   encoding differ
8040: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
8050: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
8060: 20 73 75 62 73 74 69 74 75 74 65 64 2c 20 69 66   substituted, if
8070: 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c   one is availabl
8080: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
8090: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61  3CheckCollSeq(Pa
80a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
80b0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
80c0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43  if( pColl && !pC
80d0: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
80e0: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
80f0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69   sequence of thi
8100: 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  s type for this 
8110: 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69  encoding is regi
8120: 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43  stered..    ** C
8130: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
8140: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
8150: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
8160: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
8170: 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f     */.    callCo
8180: 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d  llNeeded(pParse-
8190: 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >db, pColl->zNam
81a0: 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d  e, strlen(pColl-
81b0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66  >zName));.    if
81c0: 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26  ( !pColl->xCmp &
81d0: 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70  & synthCollSeq(p
81e0: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
81f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8200: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8210: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
8220: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8230: 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  ** Call sqlite3C
8240: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f  heckCollSeq() fo
8250: 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20  r all collating 
8260: 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20  sequences in an 
8270: 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64  index,.** in ord
8280: 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  er to verify tha
8290: 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73  t all the necess
82a0: 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ary collating se
82b0: 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c  quences are.** l
82c0: 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oaded..*/.int sq
82d0: 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43  lite3CheckIndexC
82e0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
82f0: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
8300: 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29  x){.  if( pIdx )
8310: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
8320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
8330: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
8340: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8350: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
8360: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79  Parse, pIdx->key
8370: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29  Info.aColl[i]) )
8380: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8390: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
83a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
83b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
83c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
83d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
83e0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
83f0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
8400: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
8410: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
8420: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
8430: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
8440: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
8450: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
8460: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
8470: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
8480: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
8490: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
84a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
84b0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
84c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
84d0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
84e0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
84f0: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
8500: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
8510: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
8520: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
8530: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
8540: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
8550: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
8560: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
8570: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
8580: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
8590: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
85a0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
85b0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
85c0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
85d0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
85e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
85f0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
8600: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
8610: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
8620: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43  .** pParse..*/.C
8630: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
8640: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
8650: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
8660: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
8670: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20  nt nName){.  u8 
8680: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
8690: 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74  ->enc;.  u8 init
86a0: 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64  busy = pParse->d
86b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
86c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
86d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
86e0: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
86f0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
8700: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
8710: 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26  if( !initbusy &&
8720: 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f   (!pColl || !pCo
8730: 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20  ll->xCmp) ){.   
8740: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
8750: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69   sequence of thi
8760: 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  s type for this 
8770: 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69  encoding is regi
8780: 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43  stered..    ** C
8790: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
87a0: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
87b0: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
87c0: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
87d0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f     */.    callCo
87e0: 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d  llNeeded(pParse-
87f0: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  >db, zName, nNam
8800: 65 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  e);.    pColl = 
8810: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
8820: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65  eq(pParse->db, e
8830: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
8840: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
8850: 6f 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78  oll && !pColl->x
8860: 43 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Cmp ){.      /* 
8870: 54 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 76  There may be a v
8880: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  ersion of the co
8890: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
88a0: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 20   that requires. 
88b0: 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74       ** translat
88c0: 69 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63 6f  ion between enco
88d0: 64 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66 6f  dings. Search fo
88e0: 72 20 69 74 20 77 69 74 68 20 73 79 6e 74 68 43  r it with synthC
88f0: 6f 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20 20  ollSeq()..      
8900: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79 6e  */.      if( syn
8910: 74 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  thCollSeq(pParse
8920: 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , pColl) ){.    
8930: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8940: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8950: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67  .  /* If nothing
8960: 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c   has been found,
8970: 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72   write the error
8980: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50   message into pP
8990: 61 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21 69  arse */.  if( !i
89a0: 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f  nitbusy && (!pCo
89b0: 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll || !pColl->xC
89c0: 6d 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  mp) ){.    if( p
89d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
89e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
89f0: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
8a00: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20  e->zErrMsg, "no 
8a10: 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  such collation s
8a20: 65 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c 0a  equence: ", -1,.
8a30: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
8a40: 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   nName, 0);.    
8a50: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  }.    pParse->nE
8a60: 72 72 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  rr++;.    pColl 
8a70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8a80: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a  n pColl;.}..../*
8a90: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
8aa0: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
8ab0: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
8ac0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
8ad0: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
8ae0: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
8af0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
8b00: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
8b10: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
8b20: 74 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20  t nType){.  int 
8b30: 6e 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20 7b  n, i;.  struct {
8b40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8b50: 2a 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f  *zSub;  /* Keywo
8b60: 72 64 73 20 73 75 62 73 74 72 69 6e 67 20 74 6f  rds substring to
8b70: 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20   search for */. 
8b80: 20 20 20 63 68 61 72 20 6e 53 75 62 3b 20 20 20     char nSub;   
8b90: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
8ba0: 6f 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63  of zSub */.    c
8bb0: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
8bc0: 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f    /* Affinity to
8bd0: 20 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d 61   return if it ma
8be0: 74 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62  tches */.  } sub
8bf0: 73 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20  strings[] = {.  
8c00: 20 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53 51    {"INT",  3, SQ
8c10: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8c20: 7d 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c 20  },.    {"CHAR", 
8c30: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
8c40: 58 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22  XT},.    {"CLOB"
8c50: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
8c60: 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58  TEXT},.    {"TEX
8c70: 54 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46  T", 4, SQLITE_AF
8c80: 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42  F_TEXT},.    {"B
8c90: 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  LOB", 4, SQLITE_
8ca0: 41 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a  AFF_NONE},.  };.
8cb0: 0a 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30 20  .  if( nType==0 
8cc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8cd0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
8ce0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
8cf0: 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67  sizeof(substring
8d00: 73 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74 72  s)/sizeof(substr
8d10: 69 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  ings[0]); i++){.
8d20: 20 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75 62      int c1 = sub
8d30: 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b  strings[i].zSub[
8d40: 30 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d  0];.    int c2 =
8d50: 20 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20   tolower(c1);.  
8d60: 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54    int limit = nT
8d70: 79 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67 73  ype - substrings
8d80: 5b 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f  [i].nSub;.    co
8d90: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 75  nst char *z = su
8da0: 62 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62  bstrings[i].zSub
8db0: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
8dc0: 3c 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20  <=limit; n++){. 
8dd0: 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54 79       int c = zTy
8de0: 70 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28  pe[n];.      if(
8df0: 20 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32   (c==c1 || c==c2
8e00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ).             &
8e10: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e  & 0==sqlite3StrN
8e20: 49 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20  ICmp(&zType[n], 
8e30: 7a 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d  z, substrings[i]
8e40: 2e 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  .nSub) ){.      
8e50: 20 20 72 65 74 75 72 6e 20 73 75 62 73 74 72 69    return substri
8e60: 6e 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b  ngs[i].affinity;
8e70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8e80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8e90: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
8ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70  }../*.** Come up
8eb0: 20 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64   with a new rand
8ec0: 6f 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  om value for the
8ed0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20   schema cookie. 
8ee0: 20 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68   Make sure.** th
8ef0: 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64  e new value is d
8f00: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
8f10: 65 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e old..**.** The
8f20: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
8f30: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
8f40: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
8f50: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
8f60: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
8f70: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
8f80: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
8f90: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
8fa0: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
8fb0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
8fc0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
8fd0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
8fe0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
8ff0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
9000: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
9010: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
9020: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
9030: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
9040: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
9050: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
9060: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
9070: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
9080: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
9090: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
90a0: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
90b0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
90c0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
90d0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
90e0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
90f0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
9100: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
9110: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
9120: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
9130: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
9140: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
9150: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
9160: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
9170: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
9180: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
9190: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
91a0: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
91b0: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
91c0: 6f 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62  ookie(sqlite *db
91d0: 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  , Vdbe *v, int i
91e0: 44 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Db){.  unsigned 
91f0: 63 68 61 72 20 72 3b 0a 20 20 69 6e 74 20 2a 70  char r;.  int *p
9200: 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 26  SchemaCookie = &
9210: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63  (db->aDb[iDb].sc
9220: 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20  hema_cookie);.. 
9230: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
9240: 73 73 28 31 2c 20 26 72 29 3b 0a 20 20 2a 70 53  ss(1, &r);.  *pS
9250: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a 70  chemaCookie = *p
9260: 53 63 68 65 6d 61 43 6f 6f 6b 69 65 20 2b 20 72  SchemaCookie + r
9270: 20 2b 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   + 1;.  db->flag
9280: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
9290: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
92a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
92b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2a 70 53   OP_Integer, *pS
92c0: 63 68 65 6d 61 43 6f 6f 6b 69 65 2c 20 30 29 3b  chemaCookie, 0);
92d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
92e0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  dOp(v, OP_SetCoo
92f0: 6b 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a  kie, iDb, 0);.}.
9300: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
9310: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
9320: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
9330: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
9340: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
9350: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
9360: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
9370: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
9380: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
9390: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
93a0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
93b0: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
93c0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
93d0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
93e0: 20 20 69 6e 74 20 6e 65 65 64 51 75 6f 74 65 20    int needQuote 
93f0: 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  = 0;.  for(n=0; 
9400: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
9410: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20     if( *z=='\'' 
9420: 29 7b 20 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74  ){ n++; needQuot
9430: 65 3d 31 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  e=1; }.  }.  ret
9440: 75 72 6e 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74  urn n + needQuot
9450: 65 2a 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  e*2;.}../*.** Wr
9460: 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65  ite an identifie
9470: 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  r onto the end o
9480: 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  f the given stri
9490: 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74  ng.  Add.** quot
94a0: 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73 20  e characters as 
94b0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
94c0: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
94d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
94e0: 64 78 2c 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  dx, char *zIdent
94f0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  ){.  int i, j, n
9500: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
9510: 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30  *pIdx;.  for(j=0
9520: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
9530: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c  ){.    if( !isal
9540: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
9550: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
9560: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
9570: 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64  needQuote =  zId
9580: 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64  ent[j]!=0 || isd
9590: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
95c0: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
95d0: 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28  j)!=TK_ID;.  if(
95e0: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
95f0: 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f  ++] = '\'';.  fo
9600: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
9610: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
9620: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
9630: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
9640: 5d 3d 3d 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d  ]=='\'' ) z[i++]
9650: 20 3d 20 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69   = '\'';.  }.  i
9660: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
9670: 5b 69 2b 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20  [i++] = '\'';.  
9680: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
9690: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
96a0: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
96b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
96c0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
96d0: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
96e0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
96f0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
9700: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
9710: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
9720: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
9730: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
9740: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
9750: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
9760: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
9770: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61  eateTableStmt(Ta
9780: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
9790: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
97a0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
97b0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
97c0: 6e 64 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  nd;.  n = 0;.  f
97d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
97e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  l; i++){.    n +
97f0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
9800: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  >aCol[i].zName);
9810: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  .    if( p->aCol
9820: 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a 20 20 20  [i].zType ){.   
9830: 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28     n += (strlen(
9840: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  p->aCol[i].zType
9850: 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ) + 1);.    }.  
9860: 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65  }.  n += identLe
9870: 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ngth(p->zName);.
9880: 20 20 69 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20    if( n<40 ){.  
9890: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
98a0: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
98b0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
98c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
98d0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
98e0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
98f0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
9900: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
9910: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
9920: 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
9930: 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20 20 69 66  ocRaw( n );.  if
9940: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20 72 65 74  ( zStmt==0 ) ret
9950: 75 72 6e 20 30 3b 0a 20 20 73 74 72 63 70 79 28  urn 0;.  strcpy(
9960: 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31  zStmt, p->iDb==1
9970: 20 3f 20 22 43 52 45 41 54 45 20 54 45 4d 50 20   ? "CREATE TEMP 
9980: 54 41 42 4c 45 20 22 20 3a 20 22 43 52 45 41 54  TABLE " : "CREAT
9990: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
99a0: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b  = strlen(zStmt);
99b0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
99c0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
99d0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
99e0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '(';.  for(i=0;
99f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
9a00: 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53  {.    strcpy(&zS
9a10: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
9a20: 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26     k += strlen(&
9a30: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
9a40: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
9a50: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
9a60: 20 26 6b 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   &k, p->aCol[i].
9a70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
9a80: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  p->aCol[i].zType
9a90: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b   ){.      zStmt[
9aa0: 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  k++] = ' ';.    
9ab0: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
9ac0: 6b 5d 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  k], p->aCol[i].z
9ad0: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6b 20 2b  Type);.      k +
9ae0: 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c  = strlen(p->aCol
9af0: 5b 69 5d 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20  [i].zType);.    
9b00: 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26  }.  }.  strcpy(&
9b10: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b  zStmt[k], zEnd);
9b20: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
9b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9b40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9b50: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
9b60: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
9b70: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
9b80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9b90: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
9ba0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9bb0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
9bc0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
9bd0: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
9be0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
9bf0: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
9c00: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
9c10: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
9c20: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
9c30: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
9c40: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
9c50: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
9c60: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
9c70: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
9c80: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
9c90: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
9ca0: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
9cb0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
9cc0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
9cd0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
9ce0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9cf0: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
9d00: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
9d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
9d20: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
9d30: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9d40: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
9d50: 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65   changes, so the
9d60: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
9d70: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
9d80: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
9d90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
9da0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
9db0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
9dc0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
9dd0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
9de0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
9df0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
9e00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
9e10: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
9e20: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
9e30: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
9e40: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
9e50: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
9e60: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
9e70: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
9e80: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
9e90: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
9ea0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
9eb0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
9ec0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
9ed0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
9ee0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  rse, Token *pEnd
9ef0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
9f00: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
9f10: 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70    sqlite *db = p
9f20: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
9f30: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
9f40: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61  elect==0) || pPa
9f50: 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c  rse->nErr || sql
9f60: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
9f70: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
9f80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9f90: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
9fb0: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
9fc0: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
9fd0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9fe0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
9ff0: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
a000: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
a010: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
a020: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
a030: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
a040: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
a050: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
a060: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
a070: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
a080: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
a090: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
a0a0: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
a0b0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
a0c0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
a0d0: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
a0e0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
a0f0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
a100: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
a110: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
a120: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
a130: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
a140: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
a150: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
a160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
a170: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
a180: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
a190: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
a1a0: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
a1b0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
a1c0: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
a1d0: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
a1e0: 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  cord number.  **
a1f0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
a200: 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64 20  le entry should 
a210: 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74 68  already be on th
a220: 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  e stack..  **.  
a230: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
a240: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
a250: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
a260: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
a270: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
a280: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
a290: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
a2a0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
a2b0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
a2c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
a2d0: 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20 20    Vdbe *v;..    
a2e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a2f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
a300: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
a310: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  n;..    if( p->p
a320: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
a330: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
a340: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 73  table */.      s
a350: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a360: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
a370: 20 30 2c 20 70 2d 3e 69 44 62 2c 20 28 63 68 61   0, p->iDb, (cha
a380: 72 2a 29 26 70 2d 3e 74 6e 75 6d 2c 20 50 33 5f  r*)&p->tnum, P3_
a390: 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d 65  POINTER);.    }e
a3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a3b0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71  view */.      sq
a3c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a3d0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
a3e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
a3f0: 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 0a 20 20 20  ->tnum = 0;..   
a400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a410: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
a420: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 0);..    /* If
a430: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
a440: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
a450: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
a460: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
a470: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
a480: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
a490: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
a4a0: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
a4b0: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
a4c0: 20 74 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65   table is on the
a4d0: 20 74 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65   top of the vdbe
a4e0: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20   stack..    **. 
a4f0: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
a500: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
a510: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
a520: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
a530: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
a540: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
a550: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
a560: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
a570: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
a580: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
a590: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
a5a0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
a5b0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
a5c0: 6c 54 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  lTab;.      sqli
a5d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a5e0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
a5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a600: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
a610: 67 65 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b  ger, p->iDb, 0);
a620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a630: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
a640: 65 6e 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a  enWrite, 1, 0);.
a650: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
a660: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
a670: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
a680: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54  se, pSelect, SRT
a690: 5f 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c  _Table, 1, 0, 0,
a6a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a6b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a6c0: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
a6d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
a6e0: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
a6f0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20          pSelTab 
a700: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
a710: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
a720: 65 2c 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e, 0, pSelect);.
a730: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
a740: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
a750: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a760: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
a770: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
a780: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
a790: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
a7a0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
a7b0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
a7c0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
a7d0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
a7e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
a7f0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
a800: 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  e(0, pSelTab);. 
a810: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
a820: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
a830: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 2d  asterTable(v, p-
a840: 3e 69 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69  >iDb);..    sqli
a850: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
a860: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
a870: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74  p->pSelect==0?"t
a880: 61 62 6c 65 22 3a 22 76 69 65 77 22 2c 50 33 5f  able":"view",P3_
a890: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
a8a0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
a8b0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
a8c0: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   p->zName, 0);. 
a8d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a8e0: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
a8f0: 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c   0, 0, p->zName,
a900: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a910: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a920: 50 75 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20 20  Pull, 3, 0);..  
a930: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
a940: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
a950: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
a960: 28 70 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a  (p);.      n = z
a970: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
a980: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a990: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
a9a0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
a9b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a9c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
a9d0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
a9e0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20  iteFree(z);.    
a9f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
aa00: 20 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20   p->pSelect ){. 
aa10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aa20: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69  beOp3(v, OP_Stri
aa30: 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41  ng8, 0, 0, "CREA
aa40: 54 45 20 56 49 45 57 20 22 2c 20 50 33 5f 53 54  TE VIEW ", P3_ST
aa50: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ATIC);.      }el
aa60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
aa70: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
aa80: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
aa90: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 2c  "CREATE TABLE ",
aaa0: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
aab0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
aac0: 74 28 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  t( pEnd!=0 );.  
aad0: 20 20 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e      n = Addr(pEn
aae0: 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61  d->z) - Addr(pPa
aaf0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
ab00: 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71  z) + 1;.      sq
ab10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ab20: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
ab30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
ab40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
ab50: 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 4e  , -1, pParse->sN
ab60: 61 6d 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a  ameToken.z, n);.
ab70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ab80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
ab90: 63 61 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20 20  cat8, 2, 0);.   
aba0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
abb0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
abc0: 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74  Record, 5, 0, "t
abd0: 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43  ttit", P3_STATIC
abe0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
abf0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
ac00: 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
ac10: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
ac20: 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70  eCookie(db, v, p
ac30: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
ac40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ac50: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
ac60: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ..    sqlite3End
ac70: 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
ac80: 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Parse);.  }..  /
ac90: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
aca0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
acb0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
acc0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
acd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
ace0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 26  se->explain==0 &
acf0: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
ad00: 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  0 ){.    Table *
ad10: 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20 2a  pOld;.    FKey *
ad20: 70 46 4b 65 79 3b 0a 20 20 20 20 70 4f 6c 64 20  pFKey;.    pOld 
ad30: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
ad40: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
ad50: 69 44 62 5d 2e 74 62 6c 48 61 73 68 2c 20 0a 20  iDb].tblHash, . 
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e             p->zN
ad80: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
ad90: 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20 20  Name)+1, p);.   
ada0: 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
adb0: 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
adc0: 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
add0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
ade0: 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
adf0: 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 72  ert() */.      r
ae00: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
ae10: 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70 46   for(pFKey=p->pF
ae20: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
ae30: 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72  y=pFKey->pNextFr
ae40: 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  om){.      int n
ae50: 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65  To = strlen(pFKe
ae60: 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20  y->zTo) + 1;.   
ae70: 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
ae80: 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  o = sqlite3HashF
ae90: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ind(&db->aDb[p->
aea0: 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46 4b 65  iDb].aFKey, pFKe
aeb0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20  y->zTo, nTo);.  
aec0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
aed0: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70  nsert(&db->aDb[p
aee0: 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20 70 46  ->iDb].aFKey, pF
aef0: 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70  Key->zTo, nTo, p
af00: 46 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  FKey);.    }.   
af10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
af20: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
af30: 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62  nTable++;.    db
af40: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
af50: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
af60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
af70: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
af80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
af90: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
afa0: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
afb0: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
afc0: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
afd0: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
afe0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
aff0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
b000: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
b010: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
b020: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
b030: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
b040: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
b050: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
b060: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
b070: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
b080: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
b090: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
b0a0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
b0b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
b0c0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
b0d0: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
b0e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
b0f0: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
b100: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
b110: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20    int isTemp    
b120: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
b130: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
b140: 77 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  w */.){.  Table 
b150: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
b160: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
b170: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
b180: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
b190: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73  ken *pName;..  s
b1a0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
b1b0: 28 70 50 61 72 73 65 2c 20 70 42 65 67 69 6e 2c  (pParse, pBegin,
b1c0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
b1d0: 20 69 73 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70   isTemp, 1);.  p
b1e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b1f0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
b200: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
b210: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b220: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b230: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b240: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
b250: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
b260: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
b270: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
b280: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
b290: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
b2a0: 70 2d 3e 69 44 62 2c 20 22 76 69 65 77 22 2c 20  p->iDb, "view", 
b2b0: 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73 71  pName).    && sq
b2c0: 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
b2d0: 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a 20  sFix, pSelect). 
b2e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b2f0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
b300: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
b310: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
b320: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
b330: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
b340: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
b350: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
b360: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
b370: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
b380: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
b390: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
b3a0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
b3b0: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
b3c0: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
b3d0: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
b3e0: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
b3f0: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
b400: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
b410: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
b420: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
b430: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
b440: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
b450: 44 75 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  Dup(pSelect);.  
b460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
b470: 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  ete(pSelect);.  
b480: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
b490: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
b4a0: 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74    sqlite3ViewGet
b4b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
b4c0: 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  se, p);.  }..  /
b4d0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
b4e0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
b4f0: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
b500: 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
b510: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
b520: 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
b530: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
b540: 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b  n;.  if( sEnd.z[
b550: 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b  0]!=0 && sEnd.z[
b560: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
b570: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
b580: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
b590: 30 3b 0a 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20  0;.  n = sEnd.z 
b5a0: 2d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  - pBegin->z;.  z
b5b0: 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   = pBegin->z;.  
b5c0: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
b5d0: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
b5e0: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
b5f0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
b600: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
b610: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
b620: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
b630: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
b640: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
b650: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b660: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
b670: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26  dTable(pParse, &
b680: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
b690: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
b6a0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b6b0: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
b6c0: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
b6d0: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
b6e0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
b6f0: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
b700: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
b710: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
b720: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
b730: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
b740: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
b750: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b760: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
b770: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
b780: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
b790: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
b7a0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
b7b0: 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  le){.  ExprList 
b7c0: 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63  *pEList;.  Selec
b7d0: 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65  t *pSel;.  Table
b7e0: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74   *pSelTab;.  int
b7f0: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73   nErr = 0;..  as
b800: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
b810: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
b820: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
b830: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
b840: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
b850: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
b860: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
b870: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
b880: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
b890: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
b8a0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
b8b0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
b8c0: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
b8d0: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
b8e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
b8f0: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
b900: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
b910: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
b920: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
b930: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
b940: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
b950: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
b960: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
b970: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
b980: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
b990: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
b9a0: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
b9b0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
b9c0: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
b9d0: 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65  Actually, this e
b9e0: 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70  rror is caught p
b9f0: 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f  reviously and so
ba00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
ba10: 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  est.  ** should 
ba20: 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75  always fail.  Bu
ba30: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
ba40: 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74  it in place just
ba50: 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a   to be safe..  *
ba60: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
ba70: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
ba80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ba90: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
baa0: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
bab0: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
bac0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
bad0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
bae0: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
baf0: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
bb00: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
bb10: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
bb20: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
bb30: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
bb40: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
bb50: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
bb60: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
bb70: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
bb80: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
bb90: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
bba0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
bbb0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
bbc0: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
bbd0: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
bbe0: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20  s in this list. 
bbf0: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65   But we will nee
bc00: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
bc10: 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20   list.  ** back 
bc20: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
bc30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66  configuration af
bc40: 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20  terwards, so we 
bc50: 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20  save a copy of. 
bc60: 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
bc70: 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f   in pEList..  */
bc80: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
bc90: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c  ->pEList;.  pSel
bca0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
bcb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 45  e3ExprListDup(pE
bcc0: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65  List);.  if( pSe
bcd0: 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  l->pEList==0 ){.
bce0: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
bcf0: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72   = pEList;.    r
bd00: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c  eturn 1;  /* Mal
bd10: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
bd20: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  }.  pTable->nCol
bd30: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
bd40: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
bd50: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
bd60: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
bd70: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
bd80: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
bd90: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
bda0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
bdb0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
bdc0: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
bdd0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
bde0: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
bdf0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
be00: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
be10: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
be20: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
be30: 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f  b);.    DbSetPro
be40: 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62  perty(pParse->db
be50: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44  , pTable->iDb, D
be60: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
be70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
be80: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
be90: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
bea0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55    sqlite3SelectU
beb0: 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73  nbind(pSel);.  s
bec0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
bed0: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73  lete(pSel->pELis
bee0: 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  t);.  pSel->pELi
bef0: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72  st = pEList;.  r
bf00: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
bf10: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
bf20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
bf30: 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62  om the VIEW pTab
bf40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
bf50: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bf60: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74   whenever any ot
bf70: 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65  her table or vie
bf80: 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  w is modified..*
bf90: 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65  * The view passe
bfa0: 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
bfb0: 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64  ine might depend
bfc0: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
bfd0: 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68  irectly.** on th
bfe0: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65  e modified or de
bff0: 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77  leted table so w
c000: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20  e need to clear 
c010: 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a  the old column.*
c020: 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20  * names so that 
c030: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
c040: 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
c050: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
c060: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
c070: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
c080: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
c090: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
c0a0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
c0b0: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
c0c0: 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ct!=0 );.  for(i
c0d0: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d  =0, pCol=pTable-
c0e0: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d  >aCol; i<pTable-
c0f0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
c100: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
c110: 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  ree(pCol->zName)
c120: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
c130: 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20  (pCol->zDflt);. 
c140: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
c150: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  ol->zType);.  }.
c160: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
c170: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  ble->aCol);.  pT
c180: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
c190: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
c1a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
c1b0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
c1c0: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
c1d0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
c1e0: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
c1f0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
c200: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
c210: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
c220: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
c230: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
c240: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
c250: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
c260: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
c270: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
c280: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
c290: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
c2a0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
c2b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c2c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
c2d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
c2e0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
c2f0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
c300: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
c310: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
c320: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
c330: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
c340: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 23 69  setViews);.}..#i
c350: 66 20 30 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  f 0./*.** Given 
c360: 61 20 74 6f 6b 65 6e 2c 20 6c 6f 6f 6b 20 75 70  a token, look up
c370: 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
c380: 61 74 20 6e 61 6d 65 2e 20 20 49 66 20 6e 6f 74  at name.  If not
c390: 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 0a 2a 2a   found, leave.**
c3a0: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 74 68   an error for th
c3b0: 65 20 70 61 72 73 65 72 20 74 6f 20 66 69 6e 64  e parser to find
c3c0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
c3d0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
c3e0: 74 65 33 54 61 62 6c 65 46 72 6f 6d 54 6f 6b 65  te3TableFromToke
c3f0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
c400: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 29 7b 0a 20   Token *pTok){. 
c410: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
c420: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 7a  Table *pTab;.  z
c430: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
c440: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
c450: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
c460: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c470: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
c480: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
c490: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  db, zName, 0);. 
c4a0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
c4b0: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
c4c0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c4d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c4e0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
c4f0: 20 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20 20 20   %T", pTok);.   
c500: 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
c510: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  hema = 1;.  }.  
c520: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 23  return pTab;.}.#
c530: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
c540: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c550: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
c560: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
c570: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
c580: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
c590: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
c5a0: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
c5b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
c5c0: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
c5d0: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
c5e0: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
c5f0: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
c600: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
c610: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
c620: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
c630: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
c640: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c650: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
c660: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
c670: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c680: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
c690: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
c6a0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
c6b0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
c6c0: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
c6d0: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
c6e0: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
c6f0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
c700: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c710: 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
c720: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  Tab->iDb;.  asse
c730: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
c740: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
c750: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c760: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
c770: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
c780: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c790: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
c7a0: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b  ABLE(pTab->iDb);
c7b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c7c0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
c7d0: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
c7e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c7f0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c800: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
c810: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
c820: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c830: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
c840: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
c850: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
c860: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
c870: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
c880: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
c890: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c8a0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
c8b0: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
c8c0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c8d0: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
c8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
c8f0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
c900: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
c910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c920: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
c930: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
c940: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c950: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
c960: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
c970: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
c980: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c990: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c9a0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
c9b0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c9c0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c9d0: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
c9e0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
c9f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
ca00: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
ca10: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
ca20: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
ca30: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
ca40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ca50: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
ca60: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
ca70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
ca80: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
ca90: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
caa0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
cab0: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
cac0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
cad0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cae0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
caf0: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
cb00: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
cb10: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
cb20: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
cb30: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
cb40: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
cb50: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
cb60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
cb70: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
cb80: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
cb90: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
cba0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
cbb0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
cbc0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
cbd0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
cbe0: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
cbf0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
cc00: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
cc10: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
cc20: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
cc30: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
cc40: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
cc50: 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64  tic VdbeOpList d
cc60: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
cc70: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
cc80: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 33  ,     0, ADDR(13
cc90: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
cca0: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
ccb0: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
ccc0: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
ccd0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
cce0: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
ccf0: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
cd00: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
cd10: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
cd20: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
cd30: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
cd40: 20 20 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65     0}, /* sqlite
cd50: 5f 6d 61 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65  _master.tbl_name
cd60: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
cd70: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
cd80: 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20  DR(12), 0},.    
cd90: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
cda0: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
cdb0: 22 74 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20  "trigger"},.    
cdc0: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
cdd0: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
cde0: 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  0}, /* sqlite_ma
cdf0: 73 74 65 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20  ster.type */.   
ce00: 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20     { OP_Eq,     
ce10: 20 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c      0, ADDR(12),
ce20: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ce30: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
ce40: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
ce50: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
ce60: 20 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c      0, ADDR(13),
ce70: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ce80: 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41  Goto,       0, A
ce90: 44 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(3),  0},.   
cea0: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
ceb0: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
cec0: 20 30 7d 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20   0}, /* 12 */.  
ced0: 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a    };.    Index *
cee0: 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65  pIdx;.    Trigge
cef0: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
cf00: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
cf10: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
cf20: 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62  se, 0, pTab->iDb
cf30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
cf40: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
cf50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
cf60: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
cf70: 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
cf80: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
cf90: 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
cfa0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
cfb0: 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
cfc0: 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
cfd0: 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
cfe0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
cff0: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
d000: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
d010: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
d020: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
d030: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62  igger->iDb==pTab
d040: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
d050: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
d060: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
d070: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
d080: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
d090: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
d0a0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
d0b0: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
d0c0: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
d0d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d0e0: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
d0f0: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
d100: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
d110: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
d120: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
d130: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
d140: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
d150: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  to the.    ** ta
d160: 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
d170: 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
d180: 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
d190: 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
d1a0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  .    ** every ro
d1b0: 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
d1c0: 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
d1d0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
d1e0: 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a   one being.    *
d1f0: 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
d200: 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
d210: 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75  seperately becau
d220: 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
d230: 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
d240: 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
d250: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
d260: 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
d270: 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  n another.    **
d280: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
d290: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  /.    sqlite3Ope
d2a0: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
d2b0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
d2c0: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  base = sqlite3Vd
d2d0: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
d2e0: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
d2f0: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
d300: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d310: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
d320: 2b 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  +1, pTab->zName,
d330: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
d340: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
d350: 20 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a   v, pTab->iDb);.
d360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d370: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
d380: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
d390: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
d3a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d3b0: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
d3c0: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54  , pTab->tnum, pT
d3d0: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20  ab->iDb);.      
d3e0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d3f0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d400: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
d430: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
d440: 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a  um, pIdx->iDb);.
d450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d460: 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74    sqlite3EndWrit
d470: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
d480: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
d490: 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
d4a0: 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
d4b0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
d4c0: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
d4d0: 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61  : if the SQL sta
d4e0: 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74  tement began wit
d4f0: 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  h the EXPLAIN ke
d500: 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  yword,.  ** then
d510: 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75   no changes shou
d520: 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ld be made..  */
d530: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
d540: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
d550: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
d560: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
d570: 61 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ab);.    db->fla
d580: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
d590: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
d5a0: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
d5b0: 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a  tAll(db, iDb);..
d5c0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
d5d0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
d5e0: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
d5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d600: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
d610: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
d620: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
d630: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
d640: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
d650: 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
d660: 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
d670: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
d680: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
d690: 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
d6a0: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
d6b0: 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
d6c0: 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
d6d0: 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
d6e0: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
d6f0: 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
d700: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
d710: 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
d720: 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
d730: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
d740: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
d750: 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
d760: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
d770: 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
d780: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
d790: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
d7a0: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
d7b0: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
d7c0: 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
d7d0: 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
d7e0: 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
d7f0: 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
d800: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
d810: 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
d820: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
d830: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
d840: 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
d850: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
d860: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
d870: 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
d880: 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
d890: 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
d8a0: 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
d8b0: 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
d8c0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
d8d0: 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
d8e0: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a  3EndTable()..**.
d8f0: 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
d900: 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
d910: 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
d920: 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
d930: 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
d940: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
d950: 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
d960: 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
d970: 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
d980: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
d990: 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
d9a0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
d9b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d9c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d9d0: 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
d9e0: 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
d9f0: 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
da00: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
da10: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
da20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
da30: 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
da40: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
da50: 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
da60: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
da70: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
da80: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
da90: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
daa0: 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
dab0: 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54  ithms. */.){.  T
dac0: 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
dad0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
dae0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
daf0: 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
db00: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79   char *z;.  FKey
db10: 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20   *pFKey = 0;..  
db20: 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
db30: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
db40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
db50: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
db60: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
db70: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
db80: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
db90: 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
dba0: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
dbb0: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
dbc0: 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
dbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
dbe0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
dbf0: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
dc00: 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
dc10: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
dc20: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
dc30: 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
dc40: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
dc50: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
dc60: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
dc70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
dc80: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
dc90: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
dca0: 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
dcb0: 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
dcc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
dcd0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
dce0: 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
dcf0: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
dd00: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
dd10: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
dd20: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
dd30: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
dd40: 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
dd50: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
dd60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
dd70: 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
dd80: 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
dd90: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
dda0: 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
ddb0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
ddc0: 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
ddd0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
dde0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
ddf0: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
de00: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
de10: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
de20: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
de30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
de40: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
de50: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
de60: 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
de70: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
de80: 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
de90: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
dea0: 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
deb0: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
dec0: 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
ded0: 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
dee0: 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
def0: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
df00: 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
df10: 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
df20: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
df30: 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
df40: 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
df50: 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
df60: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
df70: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
df80: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
df90: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
dfa0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
dfb0: 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
dfc0: 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
dfd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
dfe0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
dff0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
e000: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
e010: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
e020: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e030: 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
e040: 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
e050: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
e060: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
e070: 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
e080: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
e090: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
e0a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e0b0: 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
e0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
e0d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
e0e0: 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
e0f0: 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
e100: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
e110: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
e120: 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
e130: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
e140: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
e150: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
e160: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
e170: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
e180: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
e190: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
e1a0: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
e1b0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e1c0: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
e1d0: 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
e1e0: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
e1f0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
e200: 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
e210: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
e220: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
e230: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
e240: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
e250: 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
e260: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
e270: 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
e280: 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
e290: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
e2a0: 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
e2b0: 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
e2c0: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
e2d0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
e2e0: 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
e2f0: 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
e300: 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
e310: 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
e320: 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
e330: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
e340: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e350: 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29  Delete(pFromCol)
e360: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
e370: 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c  istDelete(pToCol
e380: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e390: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e3a0: 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
e3b0: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
e3c0: 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
e3d0: 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
e3e0: 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
e3f0: 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
e400: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
e410: 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
e420: 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
e430: 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
e440: 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
e450: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
e460: 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
e470: 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
e480: 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
e490: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
e4a0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
e4b0: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
e4c0: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
e4d0: 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
e4e0: 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
e4f0: 65 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20  erred){.  Table 
e500: 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
e510: 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
e520: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
e530: 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
e540: 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
e550: 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
e560: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
e570: 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64  red = isDeferred
e580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e590: 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
e5a0: 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
e5b0: 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e   pIndex is the n
e5c0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
e5d0: 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20   .** and pTable 
e5e0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
e5f0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
e600: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
e610: 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
e620: 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
e630: 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
e640: 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
e650: 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
e660: 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
e670: 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
e680: 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
e690: 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
e6a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
e6b0: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
e6c0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
e6d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
e6e0: 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
e6f0: 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
e700: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
e710: 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
e720: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e730: 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
e740: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
e750: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
e760: 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
e770: 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
e780: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
e790: 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
e7a0: 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
e7b0: 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
e7c0: 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
e7d0: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
e7e0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
e7f0: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
e800: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
e810: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e820: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
e830: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
e840: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
e850: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
e860: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
e870: 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
e880: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
e890: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
e8a0: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
e8b0: 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
e8c0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
e8d0: 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f  st *pTblName,  /
e8e0: 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
e8f0: 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
e900: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
e910: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e920: 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
e930: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
e940: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
e950: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a   onError,     /*
e960: 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
e970: 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
e980: 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
e990: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
e9a0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
e9b0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
e9c0: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
e9d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
e9e0: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
e9f0: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
ea00: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
ea10: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
ea20: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
ea30: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20  e *pTab = 0; /* 
ea40: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
ea50: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
ea60: 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54  pIndex = 0; /* T
ea70: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
ea80: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
ea90: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
eaa0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
eab0: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
eac0: 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
ead0: 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
eae0: 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
eaf0: 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
eb00: 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
eb10: 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
eb20: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20  /.  int isTemp; 
eb30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
eb40: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
eb50: 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  ex */.  sqlite *
eb60: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
eb70: 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ..  int iDb;    
eb80: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
eb90: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
eba0: 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
ebb0: 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
ebc0: 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55  *pName = 0; /* U
ebd0: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
ebe0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
ebf0: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28  create */..  if(
ec00: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ec10: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
ec20: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
ec30: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ec40: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
ec50: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
ec60: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
ec70: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
ec80: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
ec90: 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
eca0: 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
ecb0: 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
ecc0: 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
ecd0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
ece0: 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
ecf0: 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
ed00: 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
ed10: 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
ed20: 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
ed30: 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
ed40: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
ed50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
ed60: 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
ed70: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
ed80: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
ed90: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
eda0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
edb0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
edc0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
edd0: 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20  _index;..    /* 
ede0: 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
edf0: 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
ee00: 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
ee10: 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
ee20: 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
ee30: 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
ee40: 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a   database to 1..
ee50: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20      */.    pTab 
ee60: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
ee70: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
ee80: 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  TblName);.    if
ee90: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
eea0: 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
eeb0: 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31   && pTab->iDb==1
eec0: 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20   ){.      iDb = 
eed0: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
eee0: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
eef0: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
ef00: 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
ef10: 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20  ame) &&.        
ef20: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
ef30: 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
ef40: 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
ef50: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ef60: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
ef70: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
ef80: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
ef90: 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  se, pTblName->a[
efa0: 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
efb0: 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
efc0: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
efd0: 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
efe0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
eff0: 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
f000: 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62  ( iDb==pTab->iDb
f010: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
f020: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
f030: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
f040: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
f050: 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54  le;.    iDb = pT
f060: 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20  ab->iDb;.  }..  
f070: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
f080: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
f090: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
f0a0: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
f0b0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
f0c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f0d0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
f0e0: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
f0f0: 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
f100: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
f110: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f120: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  x;.  }.  if( pTa
f130: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
f140: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f150: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
f160: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
f170: 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
f180: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
f190: 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20  x;.  }.  isTemp 
f1a0: 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a  = pTab->iDb==1;.
f1b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
f1c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f1d0: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
f1e0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
f1f0: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
f200: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
f210: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
f220: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
f230: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
f240: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
f250: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
f260: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
f270: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
f280: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f290: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
f2a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
f2b0: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
f2c0: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
f2d0: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
f2e0: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
f2f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
f300: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
f310: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
f320: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
f330: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
f340: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
f350: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
f360: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
f370: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
f380: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
f390: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
f3a0: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
f3b0: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
f3c0: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
f3d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
f3e0: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
f3f0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
f400: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
f410: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f420: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
f430: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
f440: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
f450: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  dex;.    if( zNa
f460: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
f470: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f480: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f490: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
f4a0: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
f4b0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
f4c0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
f4d0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
f4e0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
f4f0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
f500: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
f510: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
f520: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
f530: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
f540: 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65     Table *pTSame
f550: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61  Name;    /* A ta
f560: 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61  ble with same na
f570: 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20  me as the index 
f580: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  */.      if( SQL
f590: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
f5a0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
f5b0: 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
f5c0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f5d0: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
f5e0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
f5f0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
f600: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
f610: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
f620: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f630: 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
f640: 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
f650: 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
f660: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f670: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f680: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f690: 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pTSameName = sq
f6a0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
f6b0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
f6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f6d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f6e0: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
f6f0: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
f700: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
f710: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
f720: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f740: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
f750: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
f760: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
f770: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
f780: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
f790: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
f7a0: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
f7b0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
f7c0: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
f7d0: 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22  rintf(zBuf,"_%d"
f7e0: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
f7f0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
f800: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
f810: 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
f820: 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ex_", pTab->zNam
f830: 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  e, zBuf, (char*)
f840: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
f850: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
f860: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f870: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
f880: 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
f890: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
f8a0: 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
f8b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f8c0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
f8d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f8e0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54  zDb = db->aDb[pT
f8f0: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ab->iDb].zName;.
f900: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f910: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f920: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
f930: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
f940: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
f950: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f960: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f970: 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
f980: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
f990: 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70  ;.    if( isTemp
f9a0: 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
f9b0: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
f9c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f9d0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f9e0: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
f9f0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
fa00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
fa10: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
fa20: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
fa30: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
fa40: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
fa50: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
fa60: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
fa70: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
fa80: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
fa90: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
faa0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
fab0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
fac0: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
fad0: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
fae0: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
faf0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
fb00: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
fb10: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
fb20: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
fb30: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
fb40: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
fb50: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
fb60: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
fb70: 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64  nd(0, 0, &nullId
fb80: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
fb90: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
fba0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
fbb0: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
fbc0: 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
fbd0: 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
fbe0: 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  /.  pIndex = sql
fbf0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
fc00: 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65  f(Index) + strle
fc10: 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20  n(zName) + 1 +. 
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69         (sizeof(i
fc40: 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c  nt) + sizeof(Col
fc50: 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e  lSeq*))*pList->n
fc60: 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49  Expr );.  if( pI
fc70: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
fc80: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
fc90: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
fca0: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
fcb0: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
fcc0: 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oll[pList->nExpr
fcd0: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
fce0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
fcf0: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
fd00: 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73  ist->nExpr];.  s
fd10: 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  trcpy(pIndex->zN
fd20: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70  ame, zName);.  p
fd30: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
fd40: 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
fd50: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
fd60: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
fd70: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
fd80: 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
fd90: 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
fda0: 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  ==0;.  pIndex->i
fdb0: 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20  Db = iDb;..  /* 
fdc0: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
fdd0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
fde0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
fdf0: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
fe00: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
fe10: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
fe20: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
fe30: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
fe40: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
fe50: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
fe60: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
fe70: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
fe80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fe90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
fea0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
feb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
fec0: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
fed0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
fee0: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
fef0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
ff00: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
ff10: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
ff20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
ff30: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
ff40: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
ff50: 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
ff60: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70    pTab->zName, p
ff70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
ff80: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
ff90: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ffa0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
ffb0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
ffc0: 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
ffd0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b  t->a[i].pExpr ){
ffe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fff0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10000 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
10010 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
10020 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73  .aColl[i] = pLis
10030 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
10040 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
10050 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
10060 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
10070 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
10080 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  pColl;.    }.   
10090 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
100a0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
100b0 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ] );.    if( !db
100c0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a  ->init.busy && .
100d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
100e0 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
100f0 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  se, pIndex->keyI
10100 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20  nfo.aColl[i]) . 
10110 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
10120 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10130 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ex;.    }.  }.  
10140 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
10150 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e  nField = pList->
10160 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54  nExpr;..  if( pT
10170 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
10180 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
10190 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
101a0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
101b0 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
101c0 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
101d0 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
101e0 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
101f0 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
10200 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
10210 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
10220 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
10230 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
10240 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
10250 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
10260 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
10270 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
10280 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
10290 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
102a0 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
102b0 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
102c0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
102d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
102e0 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
102f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
10300 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
10310 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
10320 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
10330 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
10340 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
10350 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
10360 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
10370 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
10380 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
10390 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
103a0 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
103b0 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
103c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
103d0 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
103e0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
103f0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10400 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
10410 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
10420 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
10430 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
10440 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10450 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
10460 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10470 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
10480 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
10490 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
104a0 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
104b0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
104c0 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
104d0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
104e0 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
104f0 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
10500 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
10510 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
10520 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
10530 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
10540 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  Coll[k]!=pIndex-
10550 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
10560 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
10570 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
10580 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
10590 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
105a0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
105b0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
105d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
105e0 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
105f0 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
10600 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
10610 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
10620 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
10630 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
10640 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
10650 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
10660 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
10670 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
10680 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
10690 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
106a0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
106b0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
106c0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
106d0 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
106e0 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
106f0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
10700 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
10710 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
10720 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
10730 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
10740 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
10750 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
10760 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
10770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
10780 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
10790 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
107a0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
107b0 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
107c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
107d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
107e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
107f0 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
10800 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
10810 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
10820 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
10830 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
10840 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
10850 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
10860 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
10870 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
10880 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
10890 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
108a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
108b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
108c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
108d0 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
108e0 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
108f0 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
10900 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
10910 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
10920 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
10930 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
10940 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
10950 6e 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  n ){.    Index *
10960 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
10970 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
10980 2d 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44  ->aDb[pIndex->iD
10990 62 5d 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  b].idxHash, .   
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
109c0 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64  ame, strlen(pInd
109d0 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49  ex->zName)+1, pI
109e0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
109f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10a00 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
10a10 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
10a20 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
10a30 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
10a40 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10a50 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
10a60 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
10a70 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20  Changes;.  }..  
10a80 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
10a90 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
10aa0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
10ab0 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
10ac0 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
10ad0 65 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  e_master" table 
10ae0 6f 6e 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f  on the disk.  So
10af0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
10b00 20 74 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61   the disk.  ** a
10b10 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
10b20 68 65 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  he table number 
10b30 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
10b40 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
10b50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10b60 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 54 62  init.busy && pTb
10b70 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
10b80 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
10b90 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
10ba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
10bb0 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
10bc0 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
10bd0 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
10be0 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
10bf0 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
10c00 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
10c10 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
10c20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
10c30 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
10c40 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
10c50 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
10c60 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
10c70 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
10c80 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
10c90 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
10ca0 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
10cb0 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
10cc0 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
10cd0 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
10ce0 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
10cf0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
10d00 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
10d10 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
10d20 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
10d30 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
10d40 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
10d50 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
10d60 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
10d70 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
10d80 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
10d90 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
10da0 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
10db0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
10dc0 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
10dd0 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
10de0 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
10df0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
10e00 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
10e10 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
10e20 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
10e30 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
10e40 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
10e50 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
10e60 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
10e70 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
10e80 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
10e90 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
10ea0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
10eb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
10ec0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
10ed0 69 6e 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a  int lbl1, lbl2;.
10ee0 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
10ef0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10f00 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
10f10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10f20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  _index;.    if( 
10f30 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
10f40 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
10f50 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10f60 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
10f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
10f80 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c  enMasterTable(v,
10f90 20 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20   iDb);.    }.   
10fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10fb0 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f  p(v, OP_NewRecno
10fc0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
10fd0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10fe0 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c  P_String8, 0, 0,
10ff0 20 22 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41   "index", P3_STA
11000 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
11010 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
11020 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49  tring8, 0, 0, pI
11030 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
11040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11050 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
11060 38 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  8, 0, 0, pTab->z
11070 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
11080 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11090 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
110a0 30 2c 20 69 44 62 2c 28 63 68 61 72 2a 29 26 70  0, iDb,(char*)&p
110b0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50  Index->tnum,P3_P
110c0 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e  OINTER);.    pIn
110d0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20  dex->tnum = 0;. 
110e0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
110f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11100 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11110 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
11120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11130 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
11140 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  , iDb, 0);.     
11150 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
11160 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
11170 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
11180 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11190 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  r*)&pIndex->keyI
111a0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
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 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
111d0 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
111e0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  );.    if( pStar
111f0 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
11200 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d     if( onError==
11210 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20  OE_None ){.     
11220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11230 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43  angeP3(v, -1, "C
11240 52 45 41 54 45 20 49 4e 44 45 58 20 22 2c 20 50  REATE INDEX ", P
11250 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
11260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11270 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11280 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41  eP3(v, -1, "CREA
11290 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
112a0 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
112b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
112c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
112d0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
112e0 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64  0);.      n = Ad
112f0 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
11300 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31  dr(pName->z) + 1
11310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11320 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
11330 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b  1, pName->z, n);
11340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11350 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
11360 6e 63 61 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20  ncat8, 2, 0);.  
11370 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
11380 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
11390 65 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22  eRecord, 5, 0, "
113a0 74 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49  tttit", P3_STATI
113b0 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
113c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
113d0 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
113e0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
113f0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
11400 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11410 50 5f 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d  P_Integer, pTab-
11420 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
11430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11440 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
11450 20 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b   2, pTab->tnum);
11460 0a 20 20 20 20 20 20 2f 2a 20 56 64 62 65 43 6f  .      /* VdbeCo
11470 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
11480 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a  pTab->zName)); *
11490 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
114a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
114b0 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c  etNumColumns, 2,
114c0 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20   pTab->nCol);.  
114d0 20 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74      lbl2 = sqlit
114e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
114f0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
11500 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11510 5f 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32  _Rewind, 2, lbl2
11520 29 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20  );.      lbl1 = 
11530 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11540 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
11550 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
11560 49 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64  IndexKey(v, pInd
11570 65 78 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71  ex, 2);.      sq
11580 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11590 4f 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49  OP_IdxPut, 1, pI
115a0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
115b0 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20  E_None,.        
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
115d0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
115e0 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
115f0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
11600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11610 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32  Op(v, OP_Next, 2
11620 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73  , lbl1);.      s
11630 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
11640 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b  eLabel(v, lbl2);
11650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11660 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
11670 6f 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ose, 2, 0);.    
11680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11690 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
116a0 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
116b0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
116c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
116d0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62  3ChangeCookie(db
116e0 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  , v, iDb);.     
116f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11700 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
11710 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11720 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
11730 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20  tion(pParse);.  
11740 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
11750 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
11760 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
11770 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
11780 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
11790 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
117a0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
117b0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
117c0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
117d0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
117e0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
117f0 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
11800 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
11810 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
11820 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
11830 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
11840 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
11850 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
11860 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
11870 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
11880 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 70 49  Replace){.    pI
11890 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ndex->pNext = pT
118a0 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
118b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
118c0 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Index;.  }else{.
118d0 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65      Index *pOthe
118e0 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  r = pTab->pIndex
118f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74  ;.    while( pOt
11900 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
11910 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
11920 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
11930 20 29 7b 0a 20 20 20 20 20 20 70 4f 74 68 65 72   ){.      pOther
11940 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
11950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
11960 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
11970 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70  er->pNext;.    p
11980 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Other->pNext = p
11990 49 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  Index;.  }.  pIn
119a0 64 65 78 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  dex = 0;..  /* C
119b0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
119c0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
119d0 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
119e0 66 28 20 70 49 6e 64 65 78 20 29 20 73 71 6c 69  f( pIndex ) sqli
119f0 74 65 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a  teFree(pIndex);.
11a00 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
11a10 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
11a20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
11a30 44 65 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29  Delete(pTblName)
11a40 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
11a50 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b  Name);.  return;
11a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11a70 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
11a80 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
11a90 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
11aa0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
11ab0 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
11ac0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
11ad0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
11ae0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
11af0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
11b00 2a 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  *pName){.  Index
11b10 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
11b20 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64   *v;.  sqlite *d
11b30 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
11b40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
11b50 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
11b60 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
11b70 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
11b80 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
11b90 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
11ba0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
11bb0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
11bc0 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78  return;.  pIndex
11bd0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
11be0 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
11bf0 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
11c00 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
11c10 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
11c20 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11c30 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11c40 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
11c50 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
11c60 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  ;.    pParse->ch
11c70 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
11c80 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
11c90 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
11ca0 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
11cb0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
11cc0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11cd0 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
11ce0 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
11cf0 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
11d00 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
11d10 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
11d20 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
11d30 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11d40 69 6e 64 65 78 3b 0a 20 20 7d 0a 2f 2a 0a 20 20  index;.  }./*.  
11d50 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 3e  if( pIndex->iDb>
11d60 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
11d70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11d80 20 22 63 61 6e 6e 6f 74 20 61 6c 74 65 72 20 73   "cannot alter s
11d90 63 68 65 6d 61 20 6f 66 20 61 74 74 61 63 68 65  chema of attache
11da0 64 20 22 0a 20 20 20 20 20 20 20 22 64 61 74 61  d ".       "data
11db0 62 61 73 65 73 22 2c 20 30 29 3b 0a 20 20 20 20  bases", 0);.    
11dc0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11dd0 6e 64 65 78 3b 0a 20 20 7d 0a 2a 2f 0a 23 69 66  ndex;.  }.*/.#if
11de0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11df0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11e00 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
11e10 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
11e20 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
11e30 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
11e40 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
11e50 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
11e60 3e 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62  >aDb[pIndex->iDb
11e70 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
11e80 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
11e90 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 49 6e  SCHEMA_TABLE(pIn
11ea0 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 69  dex->iDb);.    i
11eb0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11ec0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11ed0 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
11ee0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
11ef0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
11f00 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
11f10 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 44    if( pIndex->iD
11f20 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
11f30 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
11f40 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
11f50 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11f60 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
11f70 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
11f80 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
11f90 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
11fa0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
11fb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
11fc0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11fd0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
11fe0 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
11ff0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
12000 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12010 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12020 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
12030 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64  tic VdbeOpList d
12040 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20  ropIndex[] = {. 
12050 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
12060 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 39 29  ,     0, ADDR(9)
12070 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b 20 4f  , 0}, .      { O
12080 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 20 30  P_String8,     0
12090 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
120a0 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
120b0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
120c0 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   1,       0},.  
120d0 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64      { OP_MemLoad
120e0 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20 20  ,    1, 0,      
120f0 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20   0}, /* 3 */.   
12100 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20     { OP_Column, 
12110 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20 20      0, 1,       
12120 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 45  0},.      { OP_E
12130 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  q,         0, AD
12140 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20 20  DR(8), 0},.     
12150 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20   { OP_Next,     
12160 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30 7d    0, ADDR(3), 0}
12170 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74  ,.      { OP_Got
12180 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52  o,       0, ADDR
12190 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b  (9), 0},.      {
121a0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20 20   OP_Delete,     
121b0 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
121c0 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  /* 8 */.    };. 
121d0 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20 20     int base;..  
121e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
121f0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
12200 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  rse, 0, pIndex->
12210 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
12220 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
12230 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29  (v, pIndex->iDb)
12240 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c  ;.    base = sql
12250 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
12260 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64  t(v, ArraySize(d
12270 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70 49  ropIndex), dropI
12280 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
12290 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
122a0 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65 78  , base+1, pIndex
122b0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
122c0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
122d0 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e 64  okie(db, v, pInd
122e0 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71  ex->iDb);.    sq
122f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12300 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
12310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12320 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
12330 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e 74  stroy, pIndex->t
12340 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  num, pIndex->iDb
12350 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
12360 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
12370 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  pParse);.  }..  
12380 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 69 6e  /* Delete the in
12390 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72 69 70 74  -memory descript
123a0 69 6f 6e 20 6f 66 20 74 68 69 73 20 69 6e 64 65  ion of this inde
123b0 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  x..  */.  if( !p
123c0 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
123d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 6c  {.    sqlite3Unl
123e0 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
123f0 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
12400 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
12410 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
12420 6e 67 65 73 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  nges;.  }..exit_
12430 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
12440 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
12450 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  te(pName);.}../*
12460 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
12470 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
12480 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
12490 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
124a0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
124b0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
124c0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
124d0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
124e0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
124f0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
12500 64 4c 69 73 74 41 70 70 65 6e 64 28 49 64 4c 69  dListAppend(IdLi
12510 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
12520 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28   *pToken){.  if(
12530 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
12540 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d   pList = sqliteM
12550 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 64  alloc( sizeof(Id
12560 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
12570 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
12580 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
12590 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d  >nAlloc = 0;.  }
125a0 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 49  .  if( pList->nI
125b0 64 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  d>=pList->nAlloc
125c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49   ){.    struct I
125d0 64 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  dList_item *a;. 
125e0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
125f0 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
12600 2a 32 20 2b 20 35 3b 0a 20 20 20 20 61 20 3d 20  *2 + 5;.    a = 
12610 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
12620 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
12630 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
12640 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
12650 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
12660 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
12670 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20  Delete(pList);. 
12680 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
12690 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
126a0 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d  a = a;.  }.  mem
126b0 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  set(&pList->a[pL
126c0 69 73 74 2d 3e 6e 49 64 5d 2c 20 30 2c 20 73 69  ist->nId], 0, si
126d0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
126e0 29 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 70  ));.  pList->a[p
126f0 4c 69 73 74 2d 3e 6e 49 64 5d 2e 7a 4e 61 6d 65  List->nId].zName
12700 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
12710 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b  omToken(pToken);
12720 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b 2b 3b  .  pList->nId++;
12730 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
12740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
12750 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
12760 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
12770 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
12780 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
12790 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
127a0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
127b0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
127c0 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
127d0 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
127e0 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73 74 20  * A new SrcList 
127f0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
12800 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
12810 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   fails..**.** If
12820 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
12830 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
12840 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
12850 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
12860 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
12870 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
12880 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
12890 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
128a0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
128b0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
128c0 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
128d0 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
128e0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
128f0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
12900 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
12910 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
12920 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
12930 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
12940 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
12950 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
12960 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
12970 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
12980 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
12990 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
129a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
129b0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
129c0 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
129d0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
129e0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
129f0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
12a00 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
12a10 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
12a20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
12a30 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29 3b 0a  tAppend(A,B,0);.
12a40 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
12a50 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
12a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
12a70 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
12a80 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
12a90 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
12aa0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
12ab0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41  3SrcListAppend(A
12ac0 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,C);.**.** The
12ad0 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65  n C is the table
12ae0 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74   name and B is t
12af0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
12b00 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
12b10 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12b20 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  nd(SrcList *pLis
12b30 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  t, Token *pTable
12b40 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61  , Token *pDataba
12b50 73 65 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  se){.  struct Sr
12b60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
12b70 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
12b80 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
12b90 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
12ba0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
12bb0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
12bc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12bd0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
12be0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
12bf0 70 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 70 4c 69  pList->nSrc>=pLi
12c00 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
12c10 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
12c20 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
12c30 6f 63 20 2a 3d 20 32 3b 0a 20 20 20 20 70 4e 65  oc *= 2;.    pNe
12c40 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
12c50 63 28 70 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  c(pList,.       
12c60 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
12c70 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74 2d  pList) + (pList-
12c80 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  >nAlloc-1)*sizeo
12c90 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
12ca0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
12cb0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12cc0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
12cd0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
12ce0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
12cf0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a    pList = pNew;.
12d00 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
12d10 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
12d20 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Src];.  memset(p
12d30 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
12d40 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
12d50 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
12d60 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
12d70 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
12d80 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
12d90 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
12da0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b  Table ){.    Tok
12db0 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74  en *pTemp = pDat
12dc0 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61  abase;.    pData
12dd0 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20  base = pTable;. 
12de0 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d     pTable = pTem
12df0 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  p;.  }.  pItem->
12e00 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
12e10 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61  ameFromToken(pTa
12e20 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
12e30 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
12e40 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
12e50 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 70 49  pDatabase);.  pI
12e60 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 2d  tem->iCursor = -
12e70 31 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63  1;.  pList->nSrc
12e80 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  ++;.  return pLi
12e90 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  st;.}../*.** Ass
12ea0 69 67 6e 20 63 75 72 73 6f 72 73 20 74 6f 20 61  ign cursors to a
12eb0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
12ec0 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
12ed0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
12ee0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
12ef0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
12f00 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
12f10 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
12f20 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
12f30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  +){.    if( pLis
12f40 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c  t->a[i].iCursor<
12f50 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
12f60 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d  ->a[i].iCursor =
12f70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12f90 0a 2a 2a 20 41 64 64 20 61 6e 20 61 6c 69 61 73  .** Add an alias
12fa0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 69 64 65   to the last ide
12fb0 6e 74 69 66 69 65 72 20 6f 6e 20 74 68 65 20 67  ntifier on the g
12fc0 69 76 65 6e 20 69 64 65 6e 74 69 66 69 65 72 20  iven identifier 
12fd0 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
12fe0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64 41  lite3SrcListAddA
12ff0 6c 69 61 73 28 53 72 63 4c 69 73 74 20 2a 70 4c  lias(SrcList *pL
13000 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
13010 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
13020 20 26 26 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e   && pList->nSrc>
13030 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
13040 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
13050 2e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  .zAlias = sqlite
13060 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
13070 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Token);.  }.}../
13080 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
13090 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
130a0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
130b0 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  te(IdList *pList
130c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
130d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
130e0 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
130f0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
13100 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
13110 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
13120 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
13130 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
13140 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
13150 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
13160 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
13170 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
13180 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
13190 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
131a0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
131b0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
131c0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
131d0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
131e0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
131f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
13200 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
13210 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
13220 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
13230 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
13240 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
13250 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
13260 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
13270 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
13280 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n -1;.}../*.** D
13290 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
132a0 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
132b0 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
132c0 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
132d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
132e0 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c  lete(SrcList *pL
132f0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
13300 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
13310 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
13320 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
13330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
13340 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  teFree(pList->a[
13350 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  i].zDatabase);. 
13360 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
13370 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
13380 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
13390 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  (pList->a[i].zAl
133a0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ias);.    if( pL
133b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26  ist->a[i].pTab &
133c0 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54  & pList->a[i].pT
133d0 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
133e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
133f0 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
13400 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29  List->a[i].pTab)
13410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13420 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
13430 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c  pList->a[i].pSel
13440 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
13450 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73  3ExprDelete(pLis
13460 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20  t->a[i].pOn);.  
13470 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
13480 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
13490 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ].pUsing);.  }. 
134a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
134b0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  t);.}../*.** Beg
134c0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
134d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
134e0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
134f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
13500 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
13510 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
13520 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
13530 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
13540 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
13550 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
13560 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13570 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
13580 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
13590 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
135a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
135b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
135c0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
135d0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
135e0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
135f0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13600 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
13610 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  rn;.  sqlite3Vdb
13620 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74  eAddOp(v, OP_Aut
13630 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
13640 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
13650 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
13660 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
13670 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
13680 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
13690 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
136a0 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
136b0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
136c0 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
136d0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
136e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
136f0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13700 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
13710 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
13720 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
13730 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13740 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
13750 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
13760 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
13770 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
13780 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13790 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
137a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
137b0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
137c0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
137d0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
137e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
137f0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
13800 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
13810 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
13820 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
13830 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
13840 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
13850 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
13860 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
13870 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
13880 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13890 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
138a0 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
138b0 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
138c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
138d0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
138e0 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
138f0 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  K", 0, 0) ) retu
13900 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
13910 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13920 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
13930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13940 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
13950 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a  mit, 1, 1);.  }.
13960 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13970 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
13980 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
13990 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
139a0 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
139b0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
139c0 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
139d0 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
139e0 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
139f0 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
13a00 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
13a10 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
13a20 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
13a30 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
13a40 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
13a50 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
13a60 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
13a70 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
13a80 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
13a90 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
13aa0 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
13ab0 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
13ac0 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
13ad0 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
13ae0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
13af0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13b00 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
13b10 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
13b20 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
13b30 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
13b40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
13b50 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
13b60 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
13b70 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
13b80 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
13b90 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
13ba0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
13bb0 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
13bc0 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
13bd0 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
13be0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
13bf0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
13c00 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
13c10 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
13c20 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
13c30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
13c40 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
13c50 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
13c60 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
13c70 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
13c80 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
13c90 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
13ca0 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
13cb0 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
13cc0 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
13cd0 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
13ce0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
13cf0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
13d00 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
13d10 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
13d20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
13d30 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
13d40 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
13d50 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
13d60 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
13d70 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
13d80 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
13d90 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
13da0 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
13db0 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
13dc0 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
13dd0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
13de0 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
13df0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13e00 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  iDb){.  sqlite *
13e10 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
13e20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20   int mask;..  v 
13e30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13e40 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13e50 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  v==0 ) return;  
13e60 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  /* This only hap
13e70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77 61  pens if there wa
13e80 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  s a prior error 
13e90 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
13ea0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61 72  ->db;.  if( pPar
13eb0 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  se->cookieGoto==
13ec0 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
13ed0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71  >cookieGoto = sq
13ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13ef0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
13f00 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  +1;.  }.  if( iD
13f10 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b>=0 ){.    asse
13f20 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
13f30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
13f40 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
13f50 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
13f60 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
13f70 33 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d  32 );.    mask =
13f80 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28   1<<iDb;.    if(
13f90 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65   (pParse->cookie
13fa0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
13fb0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
13fc0 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
13fd0 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ask;.      pPars
13fe0 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
13ff0 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  Db] = db->aDb[iD
14000 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
14010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14020 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
14030 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
14040 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
14050 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
14060 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
14070 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
14080 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14090 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
140a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
140b0 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
140c0 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
140d0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
140e0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
140f0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
14100 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
14110 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
14120 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
14130 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
14140 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
14150 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
14160 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
14170 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
14180 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
14190 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
141a0 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
141b0 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
141c0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
141d0 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
141e0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
141f0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
14200 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
14210 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
14220 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
14230 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
14240 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
14250 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
14260 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
14270 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
14280 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
14290 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
142a0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
142b0 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
142c0 65 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  e set..**.** Onl
142d0 79 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61  y database iDb a
142e0 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  nd the temp data
142f0 62 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72  base are made wr
14300 69 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63  itable by this c
14310 61 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d  all..** If iDb==
14320 30 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e  0, then the main
14330 20 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61   and temp databa
14340 73 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69  ses are made wri
14350 74 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69  table.   If.** i
14360 44 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20  Db==1 then only 
14370 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
14380 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
14390 6c 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68  le.  If iDb>1 th
143a0 65 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  en the.** specif
143b0 69 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61  ied auxiliary da
143c0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74  tabase and the t
143d0 65 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65  emp database are
143e0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a   made writable..
143f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
14400 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14410 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
14420 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
14430 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
14440 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
14450 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
14460 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
14470 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
14480 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
14490 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
144a0 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
144b0 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
144c0 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
144d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
144e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
144f0 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30  tatement, iDb, 0
14500 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  );.  }.  if( iDb
14510 21 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=1 ){.    sqlit
14520 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
14530 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65  ation(pParse, se
14540 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a  tStatement, 1);.
14550 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
14560 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
14570 63 6f 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65  concludes an ope
14580 72 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ration that may 
14590 68 61 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20  have changed.** 
145a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
145b0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  f a statement tr
145c0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
145d0 61 72 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74  arted, then emit
145e0 0a 2a 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74  .** an OP_Commit
145f0 20 74 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65   that will cause
14600 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
14610 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  be committed to 
14620 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  disk..**.** Note
14630 20 74 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74   that checkpoint
14640 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
14650 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74  lly committed at
14660 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61   the end of.** a
14670 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74   statement.  Not
14680 65 20 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72  e also that ther
14690 65 20 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c  e can be multipl
146a0 65 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  e calls to .** s
146b0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
146c0 4f 70 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20  Operation() but 
146d0 74 68 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  there should onl
146e0 79 20 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  y be a single.**
146f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
14700 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
14710 6e 28 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  n() at the concl
14720 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  usion of the sta
14730 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
14740 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f  sqlite3EndWriteO
14750 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
14760 70 50 61 72 73 65 29 7b 0a 20 20 2f 2a 20 44 65  pParse){.  /* De
14770 6c 65 74 65 20 6d 65 21 20 2a 2f 0a 20 20 72 65  lete me! */.  re
14780 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  turn;.}../* .** 
14790 52 65 74 75 72 6e 20 74 68 65 20 74 72 61 6e 73  Return the trans
147a0 69 65 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c  ient sqlite3_val
147b0 75 65 20 6f 62 6a 65 63 74 20 75 73 65 64 20 66  ue object used f
147c0 6f 72 20 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76  or encoding conv
147d0 65 72 73 69 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e  ersions.** durin
147e0 67 20 53 51 4c 20 63 6f 6d 70 69 6c 61 74 69 6f  g SQL compilatio
147f0 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  n..*/.sqlite3_va
14800 6c 75 65 20 2a 73 71 6c 69 74 65 33 47 65 74 54  lue *sqlite3GetT
14810 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 73 71  ransientValue(sq
14820 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28  lite *db){.  if(
14830 20 21 64 62 2d 3e 70 56 61 6c 75 65 20 29 7b 0a   !db->pValue ){.
14840 20 20 20 20 64 62 2d 3e 70 56 61 6c 75 65 20 3d      db->pValue =
14850 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14860 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
14870 20 64 62 2d 3e 70 56 61 6c 75 65 3b 0a 7d 0a      db->pValue;.}.