/ Hex Artifact Content
Login

Artifact d1870caf93cce22e6991116e39cf5c05c73882ee:


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 34 31 20 32 30 30 34 2f 30 37 2f 32 34 20 30  241 2004/07/24 0
0300: 33 3a 33 30 3a 34 38 20 64 72 68 20 45 78 70 20  3:30:48 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 6e 67 6c 65 20 64 61 74  .** a single dat
1d40: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
1d50: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1d60: 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79  o reclaim memory
1d70: 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64  .** before the d
1d80: 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20  atabase closes. 
1d90: 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c   It is also call
1da0: 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ed during a roll
1db0: 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65  back.** if there
1dc0: 20 77 65 72 65 20 73 63 68 65 6d 61 20 63 68 61   were schema cha
1dd0: 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65 20  nges during the 
1de0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69  transaction or i
1df0: 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f  f a.** schema-co
1e00: 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63  okie mismatch oc
1e10: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  curs..**.** If i
1e20: 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73 65 74  Db<=0 then reset
1e30: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
1e40: 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20  hema tables for 
1e50: 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  all database.** 
1e60: 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d  files.  If iDb>=
1e70: 32 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  2 then reset the
1e80: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
1e90: 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a   for only the.**
1ea0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64   single file ind
1eb0: 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  icated..*/.void 
1ec0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
1ed0: 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74  rnalSchema(sqlit
1ee0: 65 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  e *db, int iDb){
1ef0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
1f00: 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 31  em;.  Hash temp1
1f10: 3b 0a 20 20 48 61 73 68 20 74 65 6d 70 32 3b 0a  ;.  Hash temp2;.
1f20: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61    int i, j;..  a
1f30: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
1f40: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1f50: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
1f60: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
1f70: 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b  ed;.  for(i=iDb;
1f80: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1f90: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
1fa0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
1fb0: 20 74 65 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62   temp1 = pDb->tb
1fc0: 6c 48 61 73 68 3b 0a 20 20 20 20 74 65 6d 70 32  lHash;.    temp2
1fd0: 20 3d 20 70 44 62 2d 3e 74 72 69 67 48 61 73 68   = pDb->trigHash
1fe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
1ff0: 68 49 6e 69 74 28 26 70 44 62 2d 3e 74 72 69 67  hInit(&pDb->trig
2000: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
2010: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
2020: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
2030: 61 72 28 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b  ar(&pDb->aFKey);
2040: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
2050: 43 6c 65 61 72 28 26 70 44 62 2d 3e 69 64 78 48  Clear(&pDb->idxH
2060: 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 70 45  ash);.    for(pE
2070: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
2080: 72 73 74 28 26 74 65 6d 70 32 29 3b 20 70 45 6c  rst(&temp2); pEl
2090: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
20a0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
20b0: 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72 20  {.      Trigger 
20c0: 2a 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69  *pTrigger = sqli
20d0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
20e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20f0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 28 70 54  DeleteTrigger(pT
2100: 72 69 67 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  rigger);.    }. 
2110: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c     sqlite3HashCl
2120: 65 61 72 28 26 74 65 6d 70 32 29 3b 0a 20 20 20  ear(&temp2);.   
2130: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
2140: 28 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20  (&pDb->tblHash, 
2150: 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49  SQLITE_HASH_STRI
2160: 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  NG, 0);.    for(
2170: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
2180: 46 69 72 73 74 28 26 74 65 6d 70 31 29 3b 20 70  First(&temp1); p
2190: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
21a0: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
21b0: 29 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  )){.      Table 
21c0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
21d0: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
21e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
21f0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
2200: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2210: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 74  ite3HashClear(&t
2220: 65 6d 70 31 29 3b 0a 20 20 20 20 44 62 43 6c 65  emp1);.    DbCle
2230: 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
2240: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
2250: 64 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3e  d);.    if( iDb>
2260: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
2270: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
2280: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
2290: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
22a0: 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20  nChanges;..  /* 
22b0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  If one or more o
22c0: 66 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  f the auxiliary 
22d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
22e0: 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a  as been closed,.
22f0: 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65    ** then remove
2300: 20 74 68 65 6e 20 66 72 6f 6d 20 74 68 65 20 61   then from the a
2310: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2320: 65 20 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65  e list.  We take
2330: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74   the.  ** opport
2340: 75 6e 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73  unity to do this
2350: 20 68 65 72 65 20 73 69 6e 63 65 20 77 65 20 68   here since we h
2360: 61 76 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64  ave just deleted
2370: 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a   all of the.  **
2380: 20 73 63 68 65 6d 61 20 68 61 73 68 20 74 61 62   schema hash tab
2390: 6c 65 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72  les and therefor
23a0: 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
23b0: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
23c0: 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66  s.  ** to any of
23d0: 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20   those tables.. 
23e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
23f0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2400: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
2410: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
2420: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
2430: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Bt==0 ){.      i
2440: 66 28 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20  f( pDb->pAux && 
2450: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20  pDb->xFreeAux ) 
2460: 70 44 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44  pDb->xFreeAux(pD
2470: 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  b->pAux);.      
2480: 70 44 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  pDb->pAux = 0;. 
2490: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
24a0: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
24b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
24c0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
24d0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
24e0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
24f0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
2500: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  (pDb->zName);.  
2510: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
2520: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
2530: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
2540: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
2550: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
2560: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
2570: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
2580: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
2590: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
25a0: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
25b0: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
25c0: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
25d0: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
25e0: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
25f0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
2600: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
2610: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
2620: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
2630: 73 71 6c 69 74 65 46 72 65 65 28 64 62 2d 3e 61  sqliteFree(db->a
2640: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
2650: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
2660: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2670: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2680: 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
2690: 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
26a0: 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
26b0: 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68 61 6e 67  .** schema chang
26c0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
26d0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
26e0: 77 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74  we have to reset
26f0: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c   the.** internal
2700: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
2710: 20 72 65 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f   reload them fro
2720: 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  m disk..*/.void 
2730: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49  sqlite3RollbackI
2740: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73  nternalChanges(s
2750: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 66  qlite *db){.  if
2760: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
2770: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2780: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
2790: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
27a0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d  hema(db, 0);.  }
27b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
27c0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
27d0: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
27e0: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
27f0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
2800: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
2810: 74 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  te *db){.  db->f
2820: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
2830: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
2840: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2850: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
2860: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
2870: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2880: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
2890: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
28a0: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
28b0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
28c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
28d0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
28e0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
28f0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
2900: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
2910: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
2920: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
2930: 62 6c 65 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69  ble.  Nor does i
2940: 74 20 72 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65  t remove.** fore
2950: 69 67 6e 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ign keys from th
2960: 65 20 73 71 6c 69 74 65 2e 61 46 4b 65 79 20 68  e sqlite.aFKey h
2970: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
2980: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
2990: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
29a0: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
29b0: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
29c0: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
29d0: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
29e0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65  le..**.** Indice
29f0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2a00: 68 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  h the table are 
2a10: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2a20: 65 20 22 64 62 22 0a 2a 2a 20 64 61 74 61 20 73  e "db".** data s
2a30: 74 72 75 63 74 75 72 65 20 69 66 20 64 62 21 3d  tructure if db!=
2a40: 4e 55 4c 4c 2e 20 20 49 66 20 64 62 3d 3d 4e 55  NULL.  If db==NU
2a50: 4c 4c 2c 20 69 6e 64 69 63 65 73 20 61 74 74 61  LL, indices atta
2a60: 63 68 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 74  ched to.** the t
2a70: 61 62 6c 65 20 61 72 65 20 64 65 6c 65 74 65 64  able are deleted
2a80: 2c 20 62 75 74 20 69 74 20 69 73 20 61 73 73 75  , but it is assu
2a90: 6d 65 64 20 74 68 65 79 20 68 61 76 65 20 61 6c  med they have al
2aa0: 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 75 6e  ready been.** un
2ab0: 6c 69 6e 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  linked..*/.void 
2ac0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
2ad0: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 54  le(sqlite *db, T
2ae0: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
2af0: 20 69 6e 74 20 69 3b 0a 20 20 49 6e 64 65 78 20   int i;.  Index 
2b00: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
2b10: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20  .  FKey *pFKey, 
2b20: 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20 69  *pNextFKey;..  i
2b30: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20 72  f( pTable==0 ) r
2b40: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 65 6c  eturn;..  /* Del
2b50: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
2b60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b70: 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  this table.  */.
2b80: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
2b90: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2ba0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
2bb0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
2bc0: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
2bd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
2be0: 64 65 78 2d 3e 69 44 62 3d 3d 70 54 61 62 6c 65  dex->iDb==pTable
2bf0: 2d 3e 69 44 62 20 7c 7c 20 28 70 54 61 62 6c 65  ->iDb || (pTable
2c00: 2d 3e 69 44 62 3d 3d 30 20 26 26 20 70 49 6e 64  ->iDb==0 && pInd
2c10: 65 78 2d 3e 69 44 62 3d 3d 31 29 20 29 3b 0a 20  ex->iDb==1) );. 
2c20: 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 49     sqliteDeleteI
2c30: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
2c40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
2c50: 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b  te all foreign k
2c60: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
2c70: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
2c80: 20 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73   The keys.  ** s
2c90: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
2ca0: 64 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  dy been unlinked
2cb0: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 46   from the db->aF
2cc0: 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 20 0a  Key hash table .
2cd0: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79    */.  for(pFKey
2ce0: 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20  =pTable->pFKey; 
2cf0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65  pFKey; pFKey=pNe
2d00: 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65  xtFKey){.    pNe
2d10: 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e  xtFKey = pFKey->
2d20: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61  pNextFrom;.    a
2d30: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 69  ssert( pTable->i
2d40: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
2d50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d60: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2d70: 44 62 5b 70 54 61 62 6c 65 2d 3e 69 44 62 5d 2e  Db[pTable->iDb].
2d80: 61 46 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  aFKey,.         
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74    pFKey->zTo, st
2db0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
2dc0: 2b 31 29 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20  +1)!=pFKey );.  
2dd0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 46 4b    sqliteFree(pFK
2de0: 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ey);.  }..  /* D
2df0: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
2e00: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
2e10: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2e20: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
2e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 6f 6c 75  ; i++){.    Colu
2e40: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62  mn *pCol = &pTab
2e50: 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  le->aCol[i];.   
2e60: 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c   sqliteFree(pCol
2e70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
2e80: 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a  liteFree(pCol->z
2e90: 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Dflt);.    sqlit
2ea0: 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  eFree(pCol->zTyp
2eb0: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
2ec0: 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a 4e 61  Free(pTable->zNa
2ed0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
2ee0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  e(pTable->aCol);
2ef0: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 7a  .  if( pTable->z
2f00: 43 6f 6c 41 66 66 20 29 7b 0a 20 20 20 20 73 71  ColAff ){.    sq
2f10: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2f20: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 7d 0a 20  >zColAff);.  }. 
2f30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2f40: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
2f50: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46  lect);.  sqliteF
2f60: 72 65 65 28 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  ree(pTable);.}..
2f70: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
2f80: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
2f90: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
2fa0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
2fb0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
2fc0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
2fd0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
2fe0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
2ff0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3000: 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  liteUnlinkAndDel
3010: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 20  eteTable(sqlite 
3020: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
3030: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
3040: 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46 32   FKey *pF1, *pF2
3050: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 69  ;.  int i = p->i
3060: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  Db;.  assert( db
3070: 21 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  !=0 );.  pOld = 
3080: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3090: 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74 62  t(&db->aDb[i].tb
30a0: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
30b0: 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65   strlen(p->zName
30c0: 29 2b 31 2c 30 29 3b 0a 20 20 61 73 73 65 72 74  )+1,0);.  assert
30d0: 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c  ( pOld==0 || pOl
30e0: 64 3d 3d 70 20 29 3b 0a 20 20 66 6f 72 28 70 46  d==p );.  for(pF
30f0: 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 31 3b  1=p->pFKey; pF1;
3100: 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78 74 46   pF1=pF1->pNextF
3110: 72 6f 6d 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  rom){.    int nT
3120: 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 31 2d 3e  o = strlen(pF1->
3130: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 70 46  zTo) + 1;.    pF
3140: 32 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  2 = sqlite3HashF
3150: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  ind(&db->aDb[i].
3160: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3170: 20 6e 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 70   nTo);.    if( p
3180: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
3190: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
31a0: 72 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 61  rt(&db->aDb[i].a
31b0: 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20  FKey, pF1->zTo, 
31c0: 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74 54  nTo, pF1->pNextT
31d0: 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
31e0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 32 20       while( pF2 
31f0: 26 26 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 21  && pF2->pNextTo!
3200: 3d 70 46 31 20 29 7b 20 70 46 32 3d 70 46 32 2d  =pF1 ){ pF2=pF2-
3210: 3e 70 4e 65 78 74 54 6f 3b 20 7d 0a 20 20 20 20  >pNextTo; }.    
3220: 20 20 69 66 28 20 70 46 32 20 29 7b 0a 20 20 20    if( pF2 ){.   
3230: 20 20 20 20 20 70 46 32 2d 3e 70 4e 65 78 74 54       pF2->pNextT
3240: 6f 20 3d 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f  o = pF1->pNextTo
3250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3260: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 6c    }.  sqlite3Del
3270: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b  eteTable(db, p);
3280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
3290: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
32a0: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
32b0: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
32c0: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
32d0: 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f  ken with any quo
32e0: 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e  tations removed.
32f0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
3300: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
3310: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
3320: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
3330: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
3340: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
3350: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
3360: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e  ion..**.** Token
3370: 73 20 61 72 65 20 72 65 61 6c 6c 79 20 6a 75 73  s are really jus
3380: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
3390: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
33a0: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
33b0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
33c0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
33d0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
33e0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
33f0: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
3400: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
3410: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
3420: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
3430: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 54 6f 6b 65  meFromToken(Toke
3440: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
3450: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
3460: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
3470: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
3480: 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  up(pName->z, pNa
3490: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
34a0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
34b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34c0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
34d0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
34e0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
34f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
3500: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
3510: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
3520: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
3530: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
3540: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
3550: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
3560: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
3570: 54 61 62 6c 65 28 56 64 62 65 20 2a 76 2c 20 69  Table(Vdbe *v, i
3580: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
3590: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
35a0: 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20  P_Integer, iDb, 
35b0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
35c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
35d0: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
35e0: 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71 6c 69 74  R_ROOT);.  sqlit
35f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3600: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
3610: 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71 6c 69 74   0, 5); /* sqlit
3620: 65 5f 6d 61 73 74 65 72 20 68 61 73 20 35 20 63  e_master has 5 c
3630: 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  olumns */.}../*.
3640: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
3650: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
3660: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
3670: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
3680: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
3690: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
36a0: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
36b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
36c0: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
36d0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
36e0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
36f0: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
3700: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
3710: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
3720: 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62 28 73 71  */.int findDb(sq
3730: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
3740: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
3750: 69 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  i;.  Db *pDb;.  
3760: 66 6f 72 28 70 44 62 3d 64 62 2d 3e 61 44 62 2c  for(pDb=db->aDb,
3770: 20 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b   i=0; i<db->nDb;
3780: 20 69 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20   i++, pDb++){.  
3790: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 6e 3d 3d    if( pName->n==
37a0: 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61 6d  strlen(pDb->zNam
37b0: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 30  e) && .        0
37c0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
37d0: 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4e  p(pDb->zName, pN
37e0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
37f0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3800: 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n i;.    }.  }. 
3810: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
3820: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
3830: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
3840: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
3850: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
3860: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
3870: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
3880: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
3890: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
38a0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
38b0: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
38c0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
38d0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
38e0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
38f0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
3900: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
3910: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
3920: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
3930: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
3940: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
3950: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
3960: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
3970: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
3980: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
3990: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
39a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
39b0: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
39c0: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
39d0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
39e0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
39f0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
3a00: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
3a10: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
3a20: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
3a30: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
3a40: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
3a50: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3a60: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
3a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3a80: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
3a90: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
3aa0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3ab0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
3ac0: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
3ad0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
3ae0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
3af0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
3b00: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
3b10: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
3b20: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
3b30: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
3b40: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
3b50: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
3b60: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
3b70: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b90: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
3ba0: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
3bb0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
3bc0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
3bd0: 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26  ..  if( pName2 &
3be0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
3bf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
3c00: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
3c10: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
3c20: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
3c30: 66 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  findDb(db, pName
3c40: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
3c50: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
3c60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3c70: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
3c80: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
3c90: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
3ca0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
3cb0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
3cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3cd0: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
3ce0: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
3cf0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
3d00: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
3d10: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
3d20: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
3d30: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
3d40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3d50: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
3d60: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
3d70: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
3d80: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
3d90: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
3da0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
3db0: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
3dc0: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
3dd0: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
3de0: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
3df0: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
3e00: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
3e10: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
3e20: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
3e30: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
3e40: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
3e50: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
3e60: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
3e70: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
3e80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
3e90: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
3ea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
3eb0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
3ec0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
3ed0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
3ee0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
3ef0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
3f00: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
3f10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f20: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
3f30: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
3f40: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
3f50: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
3f70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
3f80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3f90: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
3fa0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
3fb0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
3fc0: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
3fd0: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
3fe0: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
3ff0: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
4000: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
4010: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
4020: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
4030: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
4040: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
4050: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
4060: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
4070: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
4080: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
4090: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
40a0: 65 2e 20 20 54 68 65 0a 2a 2a 20 70 53 74 61 72  e.  The.** pStar
40b0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 43  t token is the C
40c0: 52 45 41 54 45 20 61 6e 64 20 70 4e 61 6d 65 20  REATE and pName 
40d0: 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  is the table nam
40e0: 65 2e 20 20 54 68 65 20 69 73 54 65 6d 70 0a 2a  e.  The isTemp.*
40f0: 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  * flag is true i
4100: 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75  f the table shou
4110: 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ld be stored in 
4120: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
4130: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
4140: 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65  nstead of in the
4150: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
4160: 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ile.  This is no
4170: 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a  rmally the case.
4180: 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d  ** when the "TEM
4190: 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59  P" or "TEMPORARY
41a0: 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73  " keyword occurs
41b0: 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43   in between.** C
41c0: 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e  REATE and TABLE.
41d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74  .**.** The new t
41e0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69  able record is i
41f0: 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70  nitialized and p
4200: 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e  ut in pParse->pN
4210: 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d  ewTable..** As m
4220: 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54  ore of the CREAT
4230: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
4240: 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64  t is parsed, add
4250: 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a  itional action.*
4260: 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  * routines will 
4270: 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64  be called to add
4280: 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f   more informatio
4290: 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64  n to this record
42a0: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
42b0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
42c0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  BLE statement, t
42d0: 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  he sqlite3EndTab
42e0: 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  le() routine.** 
42f0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
4300: 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72  plete the constr
4310: 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  uction of the ne
4320: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a  w table record..
4330: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
4340: 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72  tartTable(.  Par
4350: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
4360: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4370: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
4380: 72 74 2c 20 20 20 2f 2a 20 54 68 65 20 22 43 52  rt,   /* The "CR
4390: 45 41 54 45 22 20 74 6f 6b 65 6e 20 2a 2f 0a 20  EATE" token */. 
43a0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
43b0: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
43c0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
43d0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
43e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
43f0: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
4400: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
4410: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
4420: 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  r view */.  int 
4430: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
4440: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
4450: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
4460: 20 20 69 6e 74 20 69 73 56 69 65 77 20 20 20 20    int isView    
4470: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
4480: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
4490: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
44a0: 6c 65 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  le;.  Index *pId
44b0: 78 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  x;.  char *zName
44c0: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
44d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
44e0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
44f0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
4500: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
4510: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
4520: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
4530: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
4540: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
4550: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
4560: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  reate */..  /* T
4570: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4580: 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20   name to create 
4590: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
45a0: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
45b0: 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31  kens.  ** pName1
45c0: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
45d0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
45e0: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
45f0: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4600: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
4610: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
4620: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a  (...);.  ** .  *
4630: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
4640: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
4650: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
4660: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
4670: 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61  d if.  ** the ta
4680: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
4690: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
46a0: 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   i.e.:.  **.  **
46b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
46c0: 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a  y(...);.  **.  *
46d0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
46e0: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
46f0: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
4700: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
4710: 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68  ll below sets th
4720: 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20  e pName pointer 
4730: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4740: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
4750: 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  .  ** pName2) th
4760: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4770: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4780: 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62  name. The variab
4790: 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73  le iDb is.  ** s
47a0: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
47b0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
47c0: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f  that the table o
47d0: 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a  r view is to be.
47e0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e    ** created in.
47f0: 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
4800: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4810: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
4820: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
4830: 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
4840: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 73  return;.  if( is
4850: 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b  Temp && iDb>1 ){
4860: 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74  .    /* If creat
4870: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
4880: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
4890: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 20  ot be qualified 
48a0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
48b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
48c0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
48d0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
48e0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
48f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
4900: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4910: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69    if( isTemp ) i
4920: 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73  Db = 1;..  pPars
4930: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
4940: 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20  *pName;.  zName 
4950: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
4960: 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20  mToken(pName);. 
4970: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
4980: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
4990: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
49a0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
49b0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
49c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
49d0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
49e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  urn;.  }.  if( d
49f0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
4a00: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
4a10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4a20: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
4a30: 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70   assert( (isTemp
4a40: 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b   & 1)==isTemp );
4a50: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
4a60: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  e;.    char *zDb
4a70: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
4a80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
4a90: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
4aa0: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
4ab0: 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
4ac0: 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20  BLE(isTemp), 0, 
4ad0: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
4ae0: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4af0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4b00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
4b10: 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
4b20: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
4b30: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4b40: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
4b50: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
4b60: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
4b70: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
4b80: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
4b90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
4ba0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
4bb0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
4bc0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
4bd0: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
4be0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
4bf0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42  QLITE_CREATE_TAB
4c00: 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LE;.      }.    
4c10: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
4c20: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
4c30: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
4c40: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
4c50: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4c60: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
4c70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
4c80: 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
4c90: 74 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65  trying to create
4ca0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
4cb0: 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  le, make sure th
4cc0: 65 20 42 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a  e Btree for.  **
4cd0: 20 68 6f 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61   holding tempora
4ce0: 72 79 20 74 61 62 6c 65 73 20 69 73 20 6f 70 65  ry tables is ope
4cf0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  n..  */.  if( is
4d00: 54 65 6d 70 20 26 26 20 64 62 2d 3e 61 44 62 5b  Temp && db->aDb[
4d10: 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
4d20: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
4d30: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
4d40: 6c 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72  lite3BtreeFactor
4d50: 79 28 64 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f  y(db, 0, 0, MAX_
4d60: 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b  PAGES, &db->aDb[
4d70: 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
4d80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4d90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4da0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4db0: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
4dc0: 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
4dd0: 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
4de0: 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
4df0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
4e00: 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
4e10: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
4e20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
4e30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
4e40: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ee(zName);.     
4e50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4e60: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
4e70: 20 26 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   & !db->autoComm
4e80: 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  it ){.      rc =
4e90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
4ea0: 69 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  inTrans(db->aDb[
4eb0: 31 5d 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  1].pBt, 1);.    
4ec0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4ed0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
4ee0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4ef0: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
4f00: 6f 20 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f  o get a write lo
4f10: 63 6b 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20  ck on ".        
4f20: 20 20 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79    "the temporary
4f30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 29   database file")
4f40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4f50: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
4f60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
4f70: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65  = rc;.        re
4f80: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
4f90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
4fa0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
4fb0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
4fc0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
4fd0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
4fe0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
4ff0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
5000: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
5010: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
5020: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
5030: 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oes..  */.  if( 
5040: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5050: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
5060: 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  rse) ) return;. 
5070: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
5080: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
5090: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
50a0: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b].zName);.  if(
50b0: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73   pTable ){.    s
50c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
50d0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
50e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
50f0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  , pName);.    sq
5100: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
5110: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5120: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
5130: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
5140: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
5150: 30 20 26 26 20 0a 20 20 20 20 20 20 28 20 69 44  0 && .      ( iD
5160: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
5170: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 73  t.busy) ){.    s
5180: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5190: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
51a0: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
51b0: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
51c0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
51d0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
51e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54  return;.  }.  pT
51f0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c  able = sqliteMal
5200: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
5210: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
5220: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  le==0 ){.    pPa
5230: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
5240: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
5250: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5260: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
5270: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5280: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
5290: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
52a0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
52b0: 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d    pTable->aCol =
52c0: 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50   0;.  pTable->iP
52d0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
52e0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  le->pIndex = 0;.
52f0: 20 20 70 54 61 62 6c 65 2d 3e 69 44 62 20 3d 20    pTable->iDb = 
5300: 69 44 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73  iDb;.  if( pPars
5310: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73  e->pNewTable ) s
5320: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
5330: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  e(db, pParse->pN
5340: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
5350: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
5360: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 42 65  pTable;..  /* Be
5370: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
5380: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
5390: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
53a0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
53b0: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
53c0: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
53d0: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
53e0: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
53f0: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
5400: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
5410: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
5420: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
5430: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
5440: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
5450: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
5460: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
5470: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
5480: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
5490: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
54a0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
54b0: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
54c0: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
54d0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
54e0: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
54f0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
5500: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
5510: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
5520: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
5530: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
5540: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
5550: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
5560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
5570: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
5580: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
5590: 29 3b 0a 20 20 20 20 2f 2a 20 45 76 65 72 79 20  );.    /* Every 
55a0: 74 69 6d 65 20 61 20 6e 65 77 20 74 61 62 6c 65  time a new table
55b0: 20 69 73 20 63 72 65 61 74 65 64 20 74 68 65 20   is created the 
55c0: 66 69 6c 65 2d 66 6f 72 6d 61 74 0a 20 20 20 20  file-format.    
55d0: 2a 2a 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  ** and encoding 
55e0: 6d 65 74 61 2d 76 61 6c 75 65 73 20 61 72 65 20  meta-values are 
55f0: 73 65 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  set in the datab
5600: 61 73 65 2c 20 69 6e 0a 20 20 20 20 2a 2a 20 63  ase, in.    ** c
5610: 61 73 65 20 74 68 69 73 20 69 73 20 74 68 65 20  ase this is the 
5620: 66 69 72 73 74 20 74 61 62 6c 65 20 63 72 65 61  first table crea
5630: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
5640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5650: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5660: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
5670: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5680: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5690: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
56a0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
56b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
56c0: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 65 6e 63 2c  nteger, db->enc,
56d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
56e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
56f0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
5700: 34 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  4);..    sqlite3
5710: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
5720: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  v, iDb);.    sql
5730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5740: 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
5750: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5760: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5770: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
5780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5790: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
57a0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
57b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
57c0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
57d0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
57e0: 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d   Add a new colum
57f0: 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  n to the table c
5800: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
5810: 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a  onstructed..**.*
5820: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
5830: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
5840: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f  once for each co
5850: 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  lumn declaration
5860: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
5870: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5880: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
5890: 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65  ble() gets calle
58a0: 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65  d.** first to ge
58b0: 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20  t things going. 
58c0: 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   Then this routi
58d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
58e0: 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e   each.** column.
58f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5900: 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20  AddColumn(Parse 
5910: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
5920: 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  pName){.  Table 
5930: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
5940: 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  har *z;.  Column
5950: 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70   *pCol;.  if( (p
5960: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
5970: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
5980: 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  n;.  z = sqlite3
5990: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
59a0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
59b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
59c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
59d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
59e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
59f0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
5a00: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
5a10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5a20: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
5a30: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
5a40: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
5a50: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
5a60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
5a70: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
5a80: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
5a90: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
5aa0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
5ab0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d 3e  liteRealloc( p->
5ac0: 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b 38  aCol, (p->nCol+8
5ad0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
5ae0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
5af0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
5b00: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
5b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
5b20: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
5b30: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
5b40: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
5b50: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
5b60: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
5b70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
5b80: 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66  s no type specif
5b90: 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76  ied, columns hav
5ba0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66  e the default af
5bb0: 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e  finity.  ** 'NON
5bc0: 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  E'. If there is 
5bd0: 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  a type specified
5be0: 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64  , then sqlite3Ad
5bf0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69  dColumnType() wi
5c00: 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  ll.  ** be calle
5c10: 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43  d next to set pC
5c20: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72  ol->affinity cor
5c30: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70  rectly..  */.  p
5c40: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
5c50: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
5c60: 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d  .  pCol->pColl =
5c70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
5c80: 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43 6f  ltColl;.  p->nCo
5c90: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
5ca0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5cb0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
5cc0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
5cd0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
5ce0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
5cf0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
5d00: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
5d10: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
5d20: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
5d30: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
5d40: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
5d50: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
5d60: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
5d70: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
5d80: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5d90: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
5da0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
5db0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
5dc0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5dd0: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
5de0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5df0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
5e00: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
5e10: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
5e20: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
5e30: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
5e40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5e50: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
5e60: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
5e70: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
5e80: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
5e90: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5ea0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
5eb0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
5ec0: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
5ed0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
5ee0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
5ef0: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
5f00: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
5f10: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
5f20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
5f30: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
5f40: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
5f50: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
5f60: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
5f70: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
5f80: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
5f90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
5fa0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
5fb0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
5fc0: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
5fd0: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
5fe0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
5ff0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
6000: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72 73  se, Token *pFirs
6010: 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74 29  t, Token *pLast)
6020: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
6030: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
6040: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 2a  n;.  char *z, **
6050: 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  pz;.  Column *pC
6060: 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  ol;.  if( (p = p
6070: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6080: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
6090: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
60a0: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
60b0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
60c0: 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20 3d  >aCol[i];.  pz =
60d0: 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20   &pCol->zType;. 
60e0: 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b 20   n = pLast->n + 
60f0: 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20 2d  Addr(pLast->z) -
6100: 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a 29   Addr(pFirst->z)
6110: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53  ;.  sqlite3SetNS
6120: 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73 74  tring(pz, pFirst
6130: 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a 20  ->z, n, 0);.  z 
6140: 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d 3d  = *pz;.  if( z==
6150: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
6160: 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  r(i=j=0; z[i]; i
6170: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ++){.    int c =
6180: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69   z[i];.    if( i
6190: 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e 74  sspace(c) ) cont
61a0: 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d  inue;.    z[j++]
61b0: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d   = c;.  }.  z[j]
61c0: 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66   = 0;.  pCol->af
61d0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
61e0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c 20  AffinityType(z, 
61f0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  n);.}../*.** The
6200: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20   given token is 
6210: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
6220: 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20 63  e for the last c
6230: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a  olumn added to.*
6240: 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  * the table curr
6250: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
6260: 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d  truction.  If "m
6270: 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72 75  inusFlag" is tru
6280: 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  e, it.** means t
6290: 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77  he value token w
62a0: 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20 61  as preceded by a
62b0: 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a   minus sign..**.
62c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
62d0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
62e0: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
62f0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
6300: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
6310: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6320: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
6330: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
6340: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
6350: 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69  , Token *pVal, i
6360: 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20  nt minusFlag){. 
6370: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
6380: 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a 3b   i;.  char **pz;
6390: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
63a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
63b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
63c0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69  = p->nCol-1;.  i
63d0: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 3b  f( i<0 ) return;
63e0: 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f 6c  .  pz = &p->aCol
63f0: 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66 28  [i].zDflt;.  if(
6400: 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20 20   minusFlag ){.  
6410: 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72    sqlite3SetNStr
6420: 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c 20  ing(pz, "-", 1, 
6430: 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e  pVal->z, pVal->n
6440: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
6450: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
6460: 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e 7a  ring(pz, pVal->z
6470: 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a 20  , pVal->n, 0);. 
6480: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75   }.  sqlite3Dequ
6490: 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ote(*pz);.}../*.
64a0: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
64b0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
64c0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
64d0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
64e0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
64f0: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
6500: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
6510: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
6520: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
6530: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
6540: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
6550: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
6560: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
6570: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
6580: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
6590: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
65a0: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
65b0: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
65c0: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
65d0: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
65e0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
65f0: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
6600: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
6610: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
6620: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
6630: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
6640: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
6650: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
6660: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
6670: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 20  lumn as the row 
6680: 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e 3a  id.  (Exception:
6690: 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72 64  .** For backward
66a0: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
66b0: 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61 62  with older datab
66c0: 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f 20  ases, do not do 
66d0: 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20 66  this.** if the f
66e0: 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69  ile format versi
66f0: 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  on number is les
6700: 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74 20  s than 1.)  Set 
6710: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
6720: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
6730: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
6740: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
6750: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
6760: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
6770: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
6780: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
6790: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
67a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
67b0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
67c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
67d0: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
67e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
67f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
6800: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
6810: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
6820: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
6830: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
6840: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
6850: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
6860: 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70 50  aryKey(Parse *pP
6870: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
6880: 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72 72  pList, int onErr
6890: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  or){.  Table *pT
68a0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
68b0: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
68c0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
68d0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
68e0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
68f0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
6900: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
6910: 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b 0a  ->hasPrimKey ){.
6920: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6930: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
6940: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
6950: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
6960: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
6970: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
6980: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
6990: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
69a0: 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79  pTab->hasPrimKey
69b0: 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69 73   = 1;.  if( pLis
69c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c  t==0 ){.    iCol
69d0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20   = pTab->nCol - 
69e0: 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  1;.    pTab->aCo
69f0: 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65  l[iCol].isPrimKe
6a00: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
6a10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6a20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
6a30: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f  ){.      for(iCo
6a40: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
6a50: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
6a60: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6a70: 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d  e3StrICmp(pList-
6a80: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61  >a[i].zName, pTa
6a90: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
6aa0: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
6ab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6ad0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61      if( iCol<pTa
6ae0: 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d 3e  b->nCol ) pTab->
6af0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
6b00: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  mKey = 1;.    }.
6b10: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
6b20: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
6b30: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
6b40: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
6b50: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
6b60: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
6b70: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
6b80: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
6b90: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6ba0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
6bb0: 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54  R")==0 ){.    pT
6bc0: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
6bd0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
6be0: 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20  onf = onError;. 
6bf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6c00: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
6c10: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
6c20: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
6c30: 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  0, 0);.    pList
6c40: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
6c50: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
6c60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
6c70: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 72  lete(pList);.  r
6c80: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6c90: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
6ca0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
6cb0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6cc0: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
6cd0: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
6ce0: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
6cf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
6d00: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
6d10: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
6d20: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
6d30: 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65   nType){.  Table
6d40: 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49   *p;.  Index *pI
6d50: 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dx;.  CollSeq *p
6d60: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Coll;.  int i;..
6d70: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
6d80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
6d90: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
6da0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20 70   p->nCol-1;..  p
6db0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
6dc0: 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
6dd0: 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70 65  se, zType, nType
6de0: 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  );.  p->aCol[i].
6df0: 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 0a  pColl = pColl;..
6e00: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
6e10: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
6e20: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
6e30: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
6e40: 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65 6e  ype>",.  ** then
6e50: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
6e60: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
6e70: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
6e80: 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  efore the.  ** c
6e90: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
6ea0: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
6eb0: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
6ec0: 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  he case..  */.  
6ed0: 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70 49  for(pIdx = p->pI
6ee0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
6ef0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
6f00: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
6f10: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20  >nColumn==1 );. 
6f20: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
6f30: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70 49  olumn[0]==i ) pI
6f40: 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
6f50: 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[0] = pColl;.  
6f60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  }.}../*.** Locat
6f70: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  e and return an 
6f80: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64  entry from the d
6f90: 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20  b.aCollSeq hash 
6fa0: 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65 6e  table. If the en
6fb0: 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  try.** specified
6fc0: 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e 4e   by zName and nN
6fd0: 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  ame is not found
6fe0: 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 27   and parameter '
6ff0: 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74 72  create' is.** tr
7000: 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ue, then create 
7010: 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74 68  a new entry. Oth
7020: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
7030: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70  LL..**.** Each p
7040: 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69 6e  ointer stored in
7050: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43 6f   the sqlite3.aCo
7060: 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c 65  llSeq hash table
7070: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a 20   contains an.** 
7080: 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20 43  array of three C
7090: 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72 65  ollSeq structure
70a0: 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73 20  s. The first is 
70b0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
70c0: 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66 65  quence.** preffe
70d0: 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20  rred for UTF-8, 
70e0: 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d 31  the second UTF-1
70f0: 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68 69  6le, and the thi
7100: 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a 0a  rd UTF-16be..**.
7110: 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64 69  ** Stored immedi
7120: 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65 20  ately after the 
7130: 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  three collation 
7140: 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20 63  sequences is a c
7150: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f  opy of.** the co
7160: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7170: 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65 72   name. A pointer
7180: 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20   to this string 
7190: 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
71a0: 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  each collation s
71b0: 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75 72  equence structur
71c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
71d0: 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c 53  lSeq * findCollS
71e0: 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69 74  eqEntry(.  sqlit
71f0: 65 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  e *db,.  const c
7200: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
7210: 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63  t nName,.  int c
7220: 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53  reate.){.  CollS
7230: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66 28  eq *pColl;.  if(
7240: 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65   nName<0 ) nName
7250: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
7260: 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  pColl = sqli
7270: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
7280: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
7290: 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66 28  , nName);..  if(
72a0: 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72 65   0==pColl && cre
72b0: 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  ate ){.    pColl
72c0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
72d0: 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c 6c   3*sizeof(*pColl
72e0: 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29 3b  ) + nName + 1 );
72f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
7300: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d  {.      pColl[0]
7310: 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  .zName = (char*)
7320: 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20  &pColl[3];.     
7330: 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d 20   pColl[0].enc = 
7340: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
7350: 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61 6d     pColl[1].zNam
7360: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c  e = (char*)&pCol
7370: 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c  l[3];.      pCol
7380: 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54  l[1].enc = SQLIT
7390: 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20 20  E_UTF16LE;.     
73a0: 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65 20   pColl[2].zName 
73b0: 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b  = (char*)&pColl[
73c0: 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b  3];.      pColl[
73d0: 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  2].enc = SQLITE_
73e0: 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20 20 6d  UTF16BE;.      m
73f0: 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e 7a  emcpy(pColl[0].z
7400: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
7410: 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  me);.      pColl
7420: 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d  [0].zName[nName]
7430: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
7440: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64  te3HashInsert(&d
7450: 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43 6f  b->aCollSeq, pCo
7460: 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e 61  ll[0].zName, nNa
7470: 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  me, pColl);.    
7480: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7490: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  Coll;.}../*.** P
74a0: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
74b0: 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d 38  oints to a UTF-8
74c0: 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 20   encoded string 
74d0: 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e 67  nName bytes long
74e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
74f0: 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65 72  CollSeq* pointer
7500: 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 69   for the collati
7510: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
7520: 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20 74  d zName.** for t
7530: 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e 63  he encoding 'enc
7540: 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ' from the datab
7550: 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a 20  ase 'db'..**.** 
7560: 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70 65  If the entry spe
7570: 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66 6f  cified is not fo
7580: 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65 27  und and 'create'
7590: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 63   is true, then c
75a0: 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20 65  reate a.** new e
75b0: 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73 65  ntry.  Otherwise
75c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
75d0: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
75e0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20 20  3FindCollSeq(.  
75f0: 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 75 38  sqlite *db,.  u8
7600: 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63 68   enc,.  const ch
7610: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
7620: 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63 72   nName,.  int cr
7630: 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  eate.){.  CollSe
7640: 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64 43  q *pColl = findC
7650: 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c 20  ollSeqEntry(db, 
7660: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63 72  zName, nName, cr
7670: 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
7680: 20 53 51 4c 49 54 45 5f 55 54 46 38 3d 3d 31 20   SQLITE_UTF8==1 
7690: 26 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  && SQLITE_UTF16L
76a0: 45 3d 3d 32 20 26 26 20 53 51 4c 49 54 45 5f 55  E==2 && SQLITE_U
76b0: 54 46 31 36 42 45 3d 3d 33 20 29 3b 0a 20 20 61  TF16BE==3 );.  a
76c0: 73 73 65 72 74 28 20 65 6e 63 3e 3d 53 51 4c 49  ssert( enc>=SQLI
76d0: 54 45 5f 55 54 46 38 20 26 26 20 65 6e 63 3c 3d  TE_UTF8 && enc<=
76e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
76f0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 20  ;.  if( pColl ) 
7700: 70 43 6f 6c 6c 20 2b 3d 20 65 6e 63 2d 31 3b 0a  pColl += enc-1;.
7710: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
7720: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
7730: 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e  the 'collation n
7740: 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20  eeded' callback 
7750: 74 6f 20 72 65 71 75 65 73 74 20 61 20 63 6f 6c  to request a col
7760: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a  lation sequence.
7770: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
7780: 73 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  se text encoding
7790: 20 6f 66 20 6e 61 6d 65 20 7a 4e 61 6d 65 2c 20   of name zName, 
77a0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
77b0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
77c0: 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2f 0a 73 74  n sequence.*/.st
77d0: 61 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f  atic void callCo
77e0: 6c 6c 4e 65 65 64 65 64 28 73 71 6c 69 74 65 20  llNeeded(sqlite 
77f0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
7800: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
7810: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 64  e){.  assert( !d
7820: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c  b->xCollNeeded |
7830: 7c 20 21 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  | !db->xCollNeed
7840: 65 64 31 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e  ed16 );.  if( nN
7850: 61 6d 65 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20  ame<0 ) nName = 
7860: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
7870: 20 69 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65   if( db->xCollNe
7880: 65 64 65 64 20 29 7b 0a 20 20 20 20 63 68 61 72  eded ){.    char
7890: 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71   *zExternal = sq
78a0: 6c 69 74 65 53 74 72 4e 44 75 70 28 7a 4e 61 6d  liteStrNDup(zNam
78b0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69  e, nName);.    i
78c0: 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29 20  f( !zExternal ) 
78d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d 3e  return;.    db->
78e0: 78 43 6f 6c 6c 4e 65 65 64 65 64 28 64 62 2d 3e  xCollNeeded(db->
78f0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
7900: 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e 65 6e 63  db, (int)db->enc
7910: 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b 0a 20 20  , zExternal);.  
7920: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 45 78    sqliteFree(zEx
7930: 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69  ternal);.  }.  i
7940: 66 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  f( db->xCollNeed
7950: 65 64 31 36 20 29 7b 0a 20 20 20 20 63 68 61 72  ed16 ){.    char
7960: 20 63 6f 6e 73 74 20 2a 7a 45 78 74 65 72 6e 61   const *zExterna
7970: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  l;.    sqlite3_v
7980: 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20 73 71 6c  alue *pTmp = sql
7990: 69 74 65 33 47 65 74 54 72 61 6e 73 69 65 6e 74  ite3GetTransient
79a0: 56 61 6c 75 65 28 64 62 29 3b 0a 20 20 20 20 73  Value(db);.    s
79b0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
79c0: 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a 4e 61 6d  r(pTmp, -1, zNam
79d0: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  e, SQLITE_UTF8, 
79e0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
79f0: 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20      zExternal = 
7a00: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
7a10: 28 70 54 6d 70 2c 20 53 51 4c 49 54 45 5f 55 54  (pTmp, SQLITE_UT
7a20: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
7a30: 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c 20 29  if( !zExternal )
7a40: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 64 62 2d   return;.    db-
7a50: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 28 64  >xCollNeeded16(d
7a60: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
7a70: 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62 2d 3e  g, db, (int)db->
7a80: 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c 29 3b  enc, zExternal);
7a90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
7aa0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7ab0: 6c 6c 65 64 20 69 66 20 74 68 65 20 63 6f 6c 6c  lled if the coll
7ac0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 66 61  ation factory fa
7ad0: 69 6c 73 20 74 6f 20 64 65 6c 69 76 65 72 20 61  ils to deliver a
7ae0: 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  .** collation fu
7af0: 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 65  nction in the be
7b00: 73 74 20 65 6e 63 6f 64 69 6e 67 20 62 75 74 20  st encoding but 
7b10: 74 68 65 72 65 20 6d 61 79 20 62 65 20 6f 74 68  there may be oth
7b20: 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  er versions.** o
7b30: 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  f this collation
7b40: 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f   function (for o
7b50: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
7b60: 6e 67 73 29 20 61 76 61 69 6c 61 62 6c 65 2e 20  ngs) available. 
7b70: 55 73 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  Use one.** of th
7b80: 65 73 65 20 69 6e 73 74 65 61 64 20 69 66 20 74  ese instead if t
7b90: 68 65 79 20 65 78 69 73 74 2e 20 41 76 6f 69 64  hey exist. Avoid
7ba0: 20 61 20 55 54 46 2d 38 20 3c 2d 3e 20 55 54 46   a UTF-8 <-> UTF
7bb0: 2d 31 36 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  -16 conversion i
7bc0: 66 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  f.** possible..*
7bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
7be0: 74 68 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  thCollSeq(Parse 
7bf0: 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c 53 65 71  *pParse, CollSeq
7c00: 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 43 6f 6c 6c   *pColl){.  Coll
7c10: 53 65 71 20 2a 70 43 6f 6c 6c 32 3b 0a 20 20 63  Seq *pColl2;.  c
7c20: 68 61 72 20 2a 7a 20 3d 20 70 43 6f 6c 6c 2d 3e  har *z = pColl->
7c30: 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 20 3d  zName;.  int n =
7c40: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 73 71   strlen(z);.  sq
7c50: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
7c60: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
7c70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
7c80: 38 20 61 45 6e 63 5b 5d 20 3d 20 7b 20 53 51 4c  8 aEnc[] = { SQL
7c90: 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c  ITE_UTF16BE, SQL
7ca0: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c  ITE_UTF16LE, SQL
7cb0: 49 54 45 5f 55 54 46 38 20 7d 3b 0a 20 20 66 6f  ITE_UTF8 };.  fo
7cc0: 72 28 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29  r(i=0; i<3; i++)
7cd0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 32 20 3d 20 73  {.    pColl2 = s
7ce0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
7cf0: 71 28 64 62 2c 20 61 45 6e 63 5b 69 5d 2c 20 7a  q(db, aEnc[i], z
7d00: 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , n, 0);.    if(
7d10: 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 21 3d 30   pColl2->xCmp!=0
7d20: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
7d30: 28 70 43 6f 6c 6c 2c 20 70 43 6f 6c 6c 32 2c 20  (pColl, pColl2, 
7d40: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 29 29  sizeof(CollSeq))
7d50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
7d60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
7d70: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
7d80: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
7d90: 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
7da0: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
7db0: 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  Msg, "no such co
7dc0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7dd0: 3a 20 22 2c 20 0a 20 20 20 20 20 20 20 20 2d 31  : ", .        -1
7de0: 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7d 0a  , z, n, 0);.  }.
7df0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7e00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7e10: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
7e20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7e30: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63 6f  s called on a co
7e40: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7e50: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75 73   before it is us
7e60: 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74  ed to.** check t
7e70: 68 61 74 20 69 74 20 69 73 20 64 65 66 69 6e 65  hat it is define
7e80: 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65 64 20  d. An undefined 
7e90: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7ea0: 63 65 20 65 78 69 73 74 73 20 77 68 65 6e 0a 2a  ce exists when.*
7eb0: 2a 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  * a database is 
7ec0: 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f 6e 74  loaded that cont
7ed0: 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  ains references 
7ee0: 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  to collation seq
7ef0: 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20 68  uences.** that h
7f00: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64 65 66  ave not been def
7f10: 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ined by sqlite3_
7f20: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
7f30: 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49 66  () etc..**.** If
7f40: 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73 20   required, this 
7f50: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 68  routine calls th
7f60: 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65  e 'collation nee
7f70: 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ded' callback to
7f80: 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20 64 65  .** request a de
7f90: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
7fa0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7fb0: 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f 65 73  ce. If this does
7fc0: 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61 6e  n't work, .** an
7fd0: 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c 6c   equivalent coll
7fe0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
7ff0: 68 61 74 20 75 73 65 73 20 61 20 74 65 78 74 20  hat uses a text 
8000: 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65 72 65  encoding differe
8010: 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 6d  nt.** from the m
8020: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
8030: 73 75 62 73 74 69 74 75 74 65 64 2c 20 69 66 20  substituted, if 
8040: 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  one is available
8050: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8060: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61 72  CheckCollSeq(Par
8070: 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c 6c  se *pParse, Coll
8080: 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
8090: 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43 6f  f( pColl && !pCo
80a0: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
80b0: 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* No collation 
80c0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
80d0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 65   type for this e
80e0: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73  ncoding is regis
80f0: 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61  tered..    ** Ca
8100: 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ll the collation
8110: 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20   factory to see 
8120: 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79  if it can supply
8130: 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20   us with one..  
8140: 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c    */.    callCol
8150: 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e  lNeeded(pParse->
8160: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
8170: 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  , strlen(pColl->
8180: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66 28  zName));.    if(
8190: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26 26   !pColl->xCmp &&
81a0: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70 50   synthCollSeq(pP
81b0: 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 0a  arse, pColl) ){.
81c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
81d0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
81e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
81f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8200: 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 68  * Call sqlite3Ch
8210: 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f 72  eckCollSeq() for
8220: 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20 73   all collating s
8230: 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20 69  equences in an i
8240: 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ndex,.** in orde
8250: 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  r to verify that
8260: 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73 61   all the necessa
8270: 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ry collating seq
8280: 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c 6f  uences are.** lo
8290: 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  aded..*/.int sql
82a0: 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f  ite3CheckIndexCo
82b0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
82c0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
82d0: 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b  ){.  if( pIdx ){
82e0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
82f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
8300: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
8310: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8320: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50  3CheckCollSeq(pP
8330: 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49  arse, pIdx->keyI
8340: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b  nfo.aColl[i]) ){
8350: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8360: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8370: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8390: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
83a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
83b0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
83c0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
83d0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
83e0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
83f0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
8400: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
8410: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
8420: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
8430: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
8440: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
8450: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
8460: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
8470: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
8480: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
8490: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
84a0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
84b0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
84c0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
84d0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
84e0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
84f0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
8500: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
8510: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
8520: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
8530: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
8540: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
8550: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
8560: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
8570: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
8580: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
8590: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
85a0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
85b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
85c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
85d0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
85e0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
85f0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f  ** pParse..*/.Co
8600: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
8610: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
8620: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
8630: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
8640: 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65  t nName){.  u8 e
8650: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
8660: 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62  >enc;.  u8 initb
8670: 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  usy = pParse->db
8680: 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43  ->init.busy;.  C
8690: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
86a0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
86b0: 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65  eq(pParse->db, e
86c0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  nc, zName, nName
86d0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
86e0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
86f0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
8700: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
8710: 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* No collation 
8720: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
8730: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 65   type for this e
8740: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73  ncoding is regis
8750: 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61  tered..    ** Ca
8760: 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ll the collation
8770: 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20   factory to see 
8780: 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79  if it can supply
8790: 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20   us with one..  
87a0: 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c    */.    callCol
87b0: 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e  lNeeded(pParse->
87c0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
87d0: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  );.    pColl = s
87e0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
87f0: 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e  q(pParse->db, en
8800: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
8810: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
8820: 6c 6c 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43  ll && !pColl->xC
8830: 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  mp ){.      /* T
8840: 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 76 65  here may be a ve
8850: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c  rsion of the col
8860: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
8870: 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 20 20  that requires.  
8880: 20 20 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69      ** translati
8890: 6f 6e 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64  on between encod
88a0: 69 6e 67 73 2e 20 53 65 61 72 63 68 20 66 6f 72  ings. Search for
88b0: 20 69 74 20 77 69 74 68 20 73 79 6e 74 68 43 6f   it with synthCo
88c0: 6c 6c 53 65 71 28 29 2e 0a 20 20 20 20 20 20 2a  llSeq()..      *
88d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 79 6e 74  /.      if( synt
88e0: 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  hCollSeq(pParse,
88f0: 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pColl) ){.     
8900: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
8910: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
8920: 20 20 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20    /* If nothing 
8930: 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20  has been found, 
8940: 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72 20  write the error 
8950: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 70 50 61  message into pPa
8960: 72 73 65 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e  rse */.  if( !in
8970: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
8980: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
8990: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  p) ){.    if( pP
89a0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
89b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
89c0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
89d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73  ->zErrMsg, "no s
89e0: 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  uch collation se
89f0: 71 75 65 6e 63 65 3a 20 22 2c 20 2d 31 2c 0a 20  quence: ", -1,. 
8a00: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
8a10: 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  nName, 0);.    }
8a20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  .    pParse->nEr
8a30: 72 2b 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  r++;.    pColl =
8a40: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
8a50: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   pColl;.}..../*.
8a60: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
8a70: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
8a80: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
8a90: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
8aa0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
8ab0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f  ffinity type..*/
8ac0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
8ad0: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
8ae0: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74  char *zType, int
8af0: 20 6e 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e   nType){.  int n
8b00: 2c 20 69 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a  , i;.  struct {.
8b10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8b20: 7a 53 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72  zSub;  /* Keywor
8b30: 64 73 20 73 75 62 73 74 72 69 6e 67 20 74 6f 20  ds substring to 
8b40: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
8b50: 20 20 63 68 61 72 20 6e 53 75 62 3b 20 20 20 20    char nSub;    
8b60: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
8b70: 66 20 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63 68  f zSub */.    ch
8b80: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
8b90: 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20   /* Affinity to 
8ba0: 72 65 74 75 72 6e 20 69 66 20 69 74 20 6d 61 74  return if it mat
8bb0: 63 68 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73  ches */.  } subs
8bc0: 74 72 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20  trings[] = {.   
8bd0: 20 7b 22 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c   {"INT",  3, SQL
8be0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d  ITE_AFF_INTEGER}
8bf0: 2c 0a 20 20 20 20 7b 22 43 48 41 52 22 2c 20 34  ,.    {"CHAR", 4
8c00: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  , SQLITE_AFF_TEX
8c10: 54 7d 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c  T},.    {"CLOB",
8c20: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
8c30: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54  EXT},.    {"TEXT
8c40: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
8c50: 5f 54 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c  _TEXT},.    {"BL
8c60: 4f 42 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  OB", 4, SQLITE_A
8c70: 46 46 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a  FF_NONE},.  };..
8c80: 20 20 69 66 28 20 6e 54 79 70 65 3d 3d 30 20 29    if( nType==0 )
8c90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8ca0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
8cb0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
8cc0: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
8cd0: 29 2f 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69  )/sizeof(substri
8ce0: 6e 67 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ngs[0]); i++){. 
8cf0: 20 20 20 69 6e 74 20 63 31 20 3d 20 73 75 62 73     int c1 = subs
8d00: 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30  trings[i].zSub[0
8d10: 5d 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20  ];.    int c2 = 
8d20: 74 6f 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20 20  tolower(c1);.   
8d30: 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79   int limit = nTy
8d40: 70 65 20 2d 20 73 75 62 73 74 72 69 6e 67 73 5b  pe - substrings[
8d50: 69 5d 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e  i].nSub;.    con
8d60: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 75 62  st char *z = sub
8d70: 73 74 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b  strings[i].zSub;
8d80: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
8d90: 3d 6c 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20  =limit; n++){.  
8da0: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 54 79 70      int c = zTyp
8db0: 65 5b 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[n];.      if( 
8dc0: 28 63 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29  (c==c1 || c==c2)
8dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8de0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
8df0: 43 6d 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a  Cmp(&zType[n], z
8e00: 2c 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  , substrings[i].
8e10: 6e 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 20  nSub) ){.       
8e20: 20 72 65 74 75 72 6e 20 73 75 62 73 74 72 69 6e   return substrin
8e30: 67 73 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  gs[i].affinity;.
8e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e50: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
8e60: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d  E_AFF_NUMERIC;.}
8e70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20  ../*.** Come up 
8e80: 77 69 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f  with a new rando
8e90: 6d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  m value for the 
8ea0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
8eb0: 4d 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65  Make sure.** the
8ec0: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 64 69   new value is di
8ed0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
8ee0: 20 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   old..**.** The 
8ef0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
8f00: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
8f10: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
8f20: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
8f30: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
8f40: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
8f50: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
8f60: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
8f70: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
8f80: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
8f90: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
8fa0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
8fb0: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
8fc0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
8fd0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
8fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
8ff0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
9000: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
9010: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
9020: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
9030: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
9040: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
9050: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
9060: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
9070: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
9080: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
9090: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
90a0: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
90b0: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
90c0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
90d0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
90e0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
90f0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
9100: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
9110: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
9120: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
9130: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
9140: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
9150: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
9160: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
9170: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
9180: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
9190: 6f 6b 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c  okie(sqlite *db,
91a0: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
91b0: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  b){.  unsigned c
91c0: 68 61 72 20 72 3b 0a 20 20 69 6e 74 20 2a 70 53  har r;.  int *pS
91d0: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 26 28  chemaCookie = &(
91e0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
91f0: 65 6d 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20 20  ema_cookie);..  
9200: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
9210: 73 28 31 2c 20 26 72 29 3b 0a 20 20 2a 70 53 63  s(1, &r);.  *pSc
9220: 68 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a 70 53  hemaCookie = *pS
9230: 63 68 65 6d 61 43 6f 6f 6b 69 65 20 2b 20 72 20  chemaCookie + r 
9240: 2b 20 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  + 1;.  db->flags
9250: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
9260: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
9270: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9280: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2a 70 53 63  OP_Integer, *pSc
9290: 68 65 6d 61 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a  hemaCookie, 0);.
92a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
92b0: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  Op(v, OP_SetCook
92c0: 69 65 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a  ie, iDb, 0);.}..
92d0: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
92e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
92f0: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
9300: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
9310: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
9320: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
9330: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
9340: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
9350: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
9360: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
9370: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
9380: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
9390: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
93a0: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
93b0: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
93c0: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
93d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
93e0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
93f0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9400: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
9410: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
9420: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
9430: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
9440: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
9450: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
9460: 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20  identifier onto 
9470: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67  the end of the g
9480: 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64  iven string.  Ad
9490: 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  d.** quote chara
94a0: 63 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e  cters as needed.
94b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
94c0: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
94d0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
94e0: 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20 20 69 6e  r *zIdent){.  in
94f0: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
9500: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
9510: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
9520: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
9530: 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a 49 64  if( !isalnum(zId
9540: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
9550: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
9560: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
9570: 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a 5d 21  te =  zIdent[j]!
9580: 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28 7a 49  =0 || isdigit(zI
9590: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
95a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
95b0: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
95c0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
95d0: 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64 51 75  ID;.  if( needQu
95e0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
95f0: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
9600: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
9610: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
9620: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
9630: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
9640: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
9650: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
9660: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
9670: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
9680: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
9690: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
96a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
96b0: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
96c0: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
96d0: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
96e0: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
96f0: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
9700: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
9710: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
9720: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
9730: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
9740: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
9750: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
9760: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
9770: 6d 74 28 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  mt(Table *p){.  
9780: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
9790: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
97a0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
97b0: 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43  , *zEnd, *z;.  C
97c0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
97d0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
97e0: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
97f0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
9800: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
9810: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
9820: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
9830: 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65   z = pCol->zType
9840: 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20  ;.    if( z ){. 
9850: 20 20 20 20 20 6e 20 2b 3d 20 28 73 74 72 6c 65       n += (strle
9860: 6e 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  n(z) + 1);.    }
9870: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
9880: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
9890: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
98a0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
98b0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
98c0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
98d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
98e0: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
98f0: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
9900: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
9910: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
9920: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
9930: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d   zStmt = sqliteM
9940: 61 6c 6c 6f 63 52 61 77 28 20 6e 20 29 3b 0a 20  allocRaw( n );. 
9950: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 20   if( zStmt==0 ) 
9960: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 74 72 63  return 0;.  strc
9970: 70 79 28 7a 53 74 6d 74 2c 20 70 2d 3e 69 44 62  py(zStmt, p->iDb
9980: 3d 3d 31 20 3f 20 22 43 52 45 41 54 45 20 54 45  ==1 ? "CREATE TE
9990: 4d 50 20 54 41 42 4c 45 20 22 20 3a 20 22 43 52  MP TABLE " : "CR
99a0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
99b0: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 6d   k = strlen(zStm
99c0: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
99d0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
99e0: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
99f0: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
9a00: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
9a10: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
9a20: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
9a30: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
9a40: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
9a50: 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d 74 5b 6b   strlen(&zStmt[k
9a60: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
9a70: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
9a80: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
9a90: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
9aa0: 69 66 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a  if( (z = pCol->z
9ab0: 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Type)!=0 ){.    
9ac0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
9ad0: 20 27 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79   ';.      strcpy
9ae0: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 29 3b 0a  (&zStmt[k], z);.
9af0: 20 20 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65        k += strle
9b00: 6e 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n(z);.    }.  }.
9b10: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
9b20: 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  k], zEnd);.  ret
9b30: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
9b40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9b50: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
9b60: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
9b70: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
9b80: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
9b90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
9ba0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
9bb0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
9bc0: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
9bd0: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
9be0: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
9bf0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
9c00: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
9c10: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
9c20: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
9c30: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
9c40: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
9c50: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
9c60: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
9c70: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
9c80: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
9c90: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
9ca0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
9cb0: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
9cc0: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
9cd0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
9ce0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
9cf0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
9d00: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
9d10: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
9d20: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
9d30: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
9d40: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
9d50: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
9d60: 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  es, so the entry
9d70: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
9d80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
9d90: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
9da0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
9db0: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
9dc0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
9dd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
9de0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
9df0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
9e00: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
9e10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
9e20: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
9e30: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
9e40: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
9e50: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
9e60: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
9e70: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
9e80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
9e90: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
9ea0: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
9eb0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
9ec0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
9ed0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
9ee0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
9ef0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65 6c 65  oken *pEnd, Sele
9f00: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
9f10: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69  Table *p;.  sqli
9f20: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
9f30: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e  >db;..  if( (pEn
9f40: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
9f50: 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  =0) || pParse->n
9f60: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
9f70: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
9f80: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70 50 61  eturn;.  p = pPa
9f90: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9fa0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
9fb0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
9fc0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
9fd0: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
9fe0: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
9ff0: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
a000: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
a010: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
a020: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
a030: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
a040: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
a050: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
a060: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
a070: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
a080: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
a090: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
a0a0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
a0b0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
a0c0: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
a0d0: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
a0e0: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
a0f0: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
a100: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
a110: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
a120: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
a130: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
a140: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
a150: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
a160: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
a170: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
a180: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
a190: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
a1a0: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
a1b0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
a1c0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
a1d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
a1e0: 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e  e.  The record n
a1f0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
a200: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74  he new table ent
a210: 72 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  ry should alread
a220: 79 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63  y be on the stac
a230: 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  k..  **.  ** If 
a240: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
a250: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
a260: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
a270: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
a280: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
a290: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
a2a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
a2b0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
a2c0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
a2d0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
a2e0: 20 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71   *v;..    v = sq
a2f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
a300: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
a310: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
a320: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
a330: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
a340: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
a350: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
a360: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a370: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 70 2d 3e  CreateTable, p->
a380: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  iDb, 0);.    }el
a390: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
a3a0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  iew */.      sql
a3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a3c0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
a3d0: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  0);.    }..    s
a3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a3f0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
a400: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  0);..    /* If t
a410: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
a420: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
a430: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
a440: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
a450: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
a460: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
a470: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
a480: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
a490: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
a4a0: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
a4b0: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
a4c0: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
a4d0: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
a4e0: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
a4f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
a500: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
a510: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
a520: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
a530: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
a540: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
a550: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
a560: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
a570: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
a580: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
a590: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
a5a0: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
a5b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a5c0: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
a5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
a5f0: 72 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  r, p->iDb, 0);. 
a600: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a610: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
a620: 57 72 69 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  Write, 1, 0);.  
a630: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
a640: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
a650: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
a660: 2c 20 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 54  , pSelect, SRT_T
a670: 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 2c 20 30  able, 1, 0, 0, 0
a680: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a690: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a6a0: 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30 29 3b  OP_Close, 1, 0);
a6b0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
a6c0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
a6d0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
a6e0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
a6f0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
a700: 20 30 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20   0, pSelect);.  
a710: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
a720: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
a730: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a740: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
a750: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
a760: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
a770: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
a780: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
a790: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
a7a0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
a7b0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
a7c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
a7d0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
a7e0: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
a7f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
a800: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
a810: 74 65 72 54 61 62 6c 65 28 76 2c 20 70 2d 3e 69  terTable(v, p->i
a820: 44 62 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  Db);..    sqlite
a830: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
a840: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d  tring8, 0, 0, p-
a850: 3e 70 53 65 6c 65 63 74 3d 3d 30 3f 22 74 61 62  >pSelect==0?"tab
a860: 6c 65 22 3a 22 76 69 65 77 22 2c 50 33 5f 53 54  le":"view",P3_ST
a870: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
a880: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a890: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
a8a0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a8c0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a8d0: 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 30  , 0, p->zName, 0
a8e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a8f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
a900: 6c 6c 2c 20 33 2c 20 30 29 3b 0a 0a 20 20 20 20  ll, 3, 0);..    
a910: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
a920: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 63       char *z = c
a930: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 70  reateTableStmt(p
a940: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 7a 20 3f  );.      n = z ?
a950: 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a   strlen(z) : 0;.
a960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a970: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
a980: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
a990: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a9a0: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 7a 2c  angeP3(v, -1, z,
a9b0: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
a9c0: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d 65  eFree(z);.    }e
a9d0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
a9e0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
a9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aa00: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
aa10: 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45  8, 0, 0, "CREATE
aa20: 20 56 49 45 57 20 22 2c 20 50 33 5f 53 54 41 54   VIEW ", P3_STAT
aa30: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
aa40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aa50: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53  3VdbeOp3(v, OP_S
aa60: 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 43  tring8, 0, 0, "C
aa70: 52 45 41 54 45 20 54 41 42 4c 45 20 22 2c 20 50  REATE TABLE ", P
aa80: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
aa90: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
aaa0: 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
aab0: 20 20 6e 20 3d 20 41 64 64 72 28 70 45 6e 64 2d    n = Addr(pEnd-
aac0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 50 61 72 73  >z) - Addr(pPars
aad0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29  e->sNameToken.z)
aae0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   + 1;.      sqli
aaf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ab00: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
ab10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ab20: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
ab30: 2d 31 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  -1, pParse->sNam
ab40: 65 54 6f 6b 65 6e 2e 7a 2c 20 6e 29 3b 0a 20 20  eToken.z, n);.  
ab50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab60: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  ddOp(v, OP_Conca
ab70: 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d  t8, 2, 0);.    }
ab80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab90: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
aba0: 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74  cord, 5, 0, "ttt
abb0: 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  it", P3_STATIC);
abc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
abd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49  AddOp(v, OP_PutI
abe0: 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20  ntKey, 0, 0);.  
abf0: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
ac00: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e  ookie(db, v, p->
ac10: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
ac20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ac30: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
ac40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ac50: 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
ac60: 65 6d 61 2c 20 70 2d 3e 69 44 62 2c 20 30 2c 0a  ema, p->iDb, 0,.
ac70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
ac80: 50 72 69 6e 74 66 28 22 74 62 6c 5f 6e 61 6d 65  Printf("tbl_name
ac90: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
aca0: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 0a  , P3_DYNAMIC);..
acb0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
acc0: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
acd0: 72 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rse);.  }..  /* 
ace0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
acf0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
ad00: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
ad10: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
ad20: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
ad30: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
ad40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
ad50: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
ad60: 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a     FKey *pFKey;.
ad70: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
ad80: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62  e3HashInsert(&db
ad90: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 74 62  ->aDb[p->iDb].tb
ada0: 6c 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  lHash, .        
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74      p->zName, st
add0: 72 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31  rlen(p->zName)+1
ade0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
adf0: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
ae00: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
ae10: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
ae20: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
ae30: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
ae40: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
ae50: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 46      }.    for(pF
ae60: 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  Key=p->pFKey; pF
ae70: 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79  Key; pFKey=pFKey
ae80: 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20  ->pNextFrom){.  
ae90: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74      int nTo = st
aea0: 72 6c 65 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  rlen(pFKey->zTo)
aeb0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 46 4b 65   + 1;.      pFKe
aec0: 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 73 71 6c  y->pNextTo = sql
aed0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
aee0: 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46  ->aDb[p->iDb].aF
aef0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
af00: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
af10: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
af20: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
af30: 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54  aFKey, pFKey->zT
af40: 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a  o, nTo, pFKey);.
af50: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
af60: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b  ->pNewTable = 0;
af70: 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b  .    db->nTable+
af80: 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  +;.    db->flags
af90: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
afa0: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a  nChanges;.  }.}.
afb0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
afc0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
afd0: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
afe0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
aff0: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
b000: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
b010: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b020: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
b030: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
b040: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
b050: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
b060: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
b070: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
b080: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b090: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
b0a0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b0b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b0c0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
b0d0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
b0e0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b0f0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b100: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
b110: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
b120: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
b130: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
b140: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
b150: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
b160: 73 54 65 6d 70 20 20 20 20 20 20 20 20 20 2f 2a  sTemp         /*
b170: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
b180: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 29 7b  ORARY view */.){
b190: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
b1a0: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
b1b0: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
b1c0: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
b1d0: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
b1e0: 61 6d 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53  ame;..  sqlite3S
b1f0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
b200: 2c 20 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31  , pBegin, pName1
b210: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
b220: 2c 20 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  , 1);.  p = pPar
b230: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
b240: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
b250: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
b260: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b270: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b280: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b290: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
b2a0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
b2b0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
b2c0: 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
b2d0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
b2e0: 20 70 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c   pParse, p->iDb,
b2f0: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
b300: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
b310: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
b320: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
b330: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
b340: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
b350: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
b360: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
b370: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
b380: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
b390: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
b3a0: 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
b3b0: 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
b3c0: 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
b3d0: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
b3e0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
b3f0: 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
b400: 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
b410: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
b420: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
b430: 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
b440: 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
b450: 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
b460: 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
b470: 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
b480: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
b490: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 53 65  te3SelectDup(pSe
b4a0: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
b4b0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65  SelectDelete(pSe
b4c0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50  lect);.  if( !pP
b4d0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
b4e0: 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  usy ){.    sqlit
b4f0: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
b500: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
b510: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
b520: 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
b530: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
b540: 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45  tement.  Make sE
b550: 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a  nd point to.  **
b560: 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20   the end..  */. 
b570: 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e   sEnd = pParse->
b580: 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66  sLastToken;.  if
b590: 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26  ( sEnd.z[0]!=0 &
b5a0: 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  & sEnd.z[0]!=';'
b5b0: 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
b5c0: 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
b5d0: 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
b5e0: 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  = sEnd.z - pBegi
b5f0: 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 70 42 65 67  n->z;.  z = pBeg
b600: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
b610: 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31 5d 3d 3d  n>0 && (z[n-1]==
b620: 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a  ';' || isspace(z
b630: 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20  [n-1])) ){ n--; 
b640: 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
b650: 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
b660: 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
b670: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
b680: 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
b690: 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
b6a0: 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
b6b0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
b6c0: 70 50 61 72 73 65 2c 20 26 73 45 6e 64 2c 20 30  pParse, &sEnd, 0
b6d0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
b6e0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
b6f0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
b700: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
b710: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
b720: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
b730: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
b740: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
b750: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
b760: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
b770: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
b780: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
b790: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
b7a0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
b7b0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
b7c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
b7d0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
b7e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
b7f0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
b800: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b810: 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  ;.  Select *pSel
b820: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  ;.  Table *pSelT
b830: 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  ab;.  int nErr =
b840: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
b850: 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  Table );..  /* A
b860: 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
b870: 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
b880: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
b890: 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
b8a0: 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
b8b0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
b8c0: 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
b8d0: 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
b8e0: 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
b8f0: 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
b900: 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
b910: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
b920: 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
b930: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
b940: 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
b950: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
b960: 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
b970: 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
b980: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
b990: 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
b9a0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
b9b0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
b9c0: 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
b9d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
b9e0: 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
b9f0: 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
ba00: 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
ba10: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
ba20: 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69 73  y, this error is
ba30: 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75 73   caught previous
ba40: 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f  ly and so the fo
ba50: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a  llowing test.  *
ba60: 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  * should always 
ba70: 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69  fail.  But we wi
ba80: 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70  ll leave it in p
ba90: 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20  lace just to be 
baa0: 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  safe..  */.  if(
bab0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
bac0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bad0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
bae0: 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
baf0: 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
bb00: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
bb10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bb20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  }..  /* If we ge
bb30: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
bb40: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
bb50: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
bb60: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
bb70: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
bb80: 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49 66  pSelect ); /* If
bb90: 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 70   nCol==0, then p
bba0: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 20  Table must be a 
bbb0: 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20 3d  VIEW */.  pSel =
bbc0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
bbd0: 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
bbe0: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
bbf0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
bc00: 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
bc10: 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
bc20: 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
bc30: 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77 65  is list.  But we
bc40: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72 65   will need to re
bc50: 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a 20  store the list. 
bc60: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
bc70: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
bc80: 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72 64  ration afterward
bc90: 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61 20  s, so we save a 
bca0: 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68 65  copy of.  ** the
bcb0: 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45 4c   original in pEL
bcc0: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c 69  ist..  */.  pELi
bcd0: 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69 73  st = pSel->pELis
bce0: 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  t;.  pSel->pELis
bcf0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
bd00: 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b 0a  istDup(pEList);.
bd10: 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c 69    if( pSel->pELi
bd20: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 65  st==0 ){.    pSe
bd30: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  l->pEList = pELi
bd40: 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  st;.    return 1
bd50: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69  ;  /* Malloc fai
bd60: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 61  led */.  }.  pTa
bd70: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
bd80: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
bd90: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
bda0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20  lect(pParse, 0, 
bdb0: 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53 65  pSel);.  if( pSe
bdc0: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
bdd0: 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
bde0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 6c  ==0 );.    pTabl
bdf0: 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
be00: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54 61  b->nCol;.    pTa
be10: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
be20: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 70  Tab->aCol;.    p
be30: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
be40: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61  ;.    pSelTab->a
be50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Col = 0;.    sql
be60: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
be70: 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  0, pSelTab);.   
be80: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 70   DbSetProperty(p
be90: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 6c  Parse->db, pTabl
bea0: 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65 73  e->iDb, DB_Unres
beb0: 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c 73  etViews);.  }els
bec0: 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  e{.    pTable->n
bed0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45 72  Col = 0;.    nEr
bee0: 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  r++;.  }.  sqlit
bef0: 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28 70  e3SelectUnbind(p
bf00: 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Sel);.  sqlite3E
bf10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53  xprListDelete(pS
bf20: 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  el->pEList);.  p
bf30: 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45  Sel->pEList = pE
bf40: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  List;.  return n
bf50: 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Err;  .}../*.** 
bf60: 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  Clear the column
bf70: 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   names from the 
bf80: 56 49 45 57 20 70 54 61 62 6c 65 2e 0a 2a 2a 0a  VIEW pTable..**.
bf90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bfa0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
bfb0: 65 72 20 61 6e 79 20 6f 74 68 65 72 20 74 61 62  er any other tab
bfc0: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 6d 6f  le or view is mo
bfd0: 64 69 66 69 65 64 2e 0a 2a 2a 20 54 68 65 20 76  dified..** The v
bfe0: 69 65 77 20 70 61 73 73 65 64 20 69 6e 74 6f 20  iew passed into 
bff0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
c000: 68 74 20 64 65 70 65 6e 64 20 64 69 72 65 63 74  ht depend direct
c010: 6c 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79  ly or indirectly
c020: 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 64 69 66  .** on the modif
c030: 69 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 74  ied or deleted t
c040: 61 62 6c 65 20 73 6f 20 77 65 20 6e 65 65 64 20  able so we need 
c050: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 6f 6c 64  to clear the old
c060: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 61 6d 65 73   column.** names
c070: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69   so that they wi
c080: 6c 6c 20 62 65 20 72 65 63 6f 6d 70 75 74 65 64  ll be recomputed
c090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c0a0: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
c0b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c  ColumnNames(Tabl
c0c0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
c0d0: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
c0e0: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
c0f0: 54 61 62 6c 65 21 3d 30 20 26 26 20 70 54 61 62  Table!=0 && pTab
c100: 6c 65 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  le->pSelect!=0 )
c110: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
c120: 6c 3d 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20  l=pTable->aCol; 
c130: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
c140: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
c150: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f    sqliteFree(pCo
c160: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  l->zName);.    s
c170: 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e  qliteFree(pCol->
c180: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69  zDflt);.    sqli
c190: 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79  teFree(pCol->zTy
c1a0: 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pe);.  }.  sqlit
c1b0: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
c1c0: 6f 6c 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  ol);.  pTable->a
c1d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
c1e0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a  e->nCol = 0;.}..
c1f0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
c200: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
c210: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
c220: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
c230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
c240: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
c250: 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20  sqlite *db, int 
c260: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
c270: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
c280: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
c290: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
c2a0: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
c2b0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
c2c0: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
c2d0: 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b  dx].tblHash); i;
c2e0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
c2f0: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
c300: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
c310: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
c320: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
c330: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
c340: 65 56 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e  eViewResetColumn
c350: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
c360: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
c370: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
c380: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
c390: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  s);.}../*.** Thi
c3a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c3b0: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
c3c0: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
c3d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
c3e0: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
c3f0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
c400: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
c410: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
c420: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
c430: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
c440: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
c450: 77 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  w){.  Table *pTa
c460: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
c470: 69 6e 74 20 62 61 73 65 3b 0a 20 20 73 71 6c 69  int base;.  sqli
c480: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
c490: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
c4a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
c4b0: 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
c4c0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67  alloc_failed ) g
c4d0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c4e0: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
c4f0: 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
c500: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
c510: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
c520: 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
c530: 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
c540: 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
c550: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
c560: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c570: 74 61 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 70  table;.  iDb = p
c580: 54 61 62 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65  Tab->iDb;.  asse
c590: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
c5a0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 23 69 66  b<db->nDb );.#if
c5b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c5c0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
c5d0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
c5e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c5f0: 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
c600: 41 42 4c 45 28 70 54 61 62 2d 3e 69 44 62 29 3b  ABLE(pTab->iDb);
c610: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c620: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
c630: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  Tab->iDb].zName;
c640: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c650: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c660: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
c670: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
c680: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c690: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
c6a0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
c6b0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  w ){.      if( i
c6c0: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
c6d0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
c6e0: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
c6f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c700: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
c710: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
c720: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
c730: 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31        if( iDb==1
c740: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
c750: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
c760: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
c770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c780: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
c790: 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
c7a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c7b0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
c7c0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
c7d0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
c7e0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
c7f0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c800: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
c810: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c820: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c830: 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
c840: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
c850: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
c860: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
c870: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
c880: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
c890: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
c8a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c8b0: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
c8c0: 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
c8d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
c8e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
c8f0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  +;.    goto exit
c900: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
c910: 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
c920: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
c930: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c940: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c950: 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
c960: 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
c970: 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
c980: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
c990: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
c9a0: 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
c9b0: 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
c9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c9d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c9e0: 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
c9f0: 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
ca00: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
ca10: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
ca20: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
ca30: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
ca40: 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
ca50: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
ca60: 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
ca70: 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
ca80: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
ca90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
caa0: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 74 61  if( v ){.    sta
cab0: 74 69 63 20 56 64 62 65 4f 70 4c 69 73 74 20 64  tic VdbeOpList d
cac0: 72 6f 70 54 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20  ropTable[] = {. 
cad0: 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64       { OP_Rewind
cae0: 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 33  ,     0, ADDR(13
caf0: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
cb00: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
cb10: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
cb20: 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 1 */.      { O
cb30: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31 2c  P_MemStore,   1,
cb40: 20 31 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20   1,        0},. 
cb50: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
cb60: 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
cb70: 20 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20     0}, /* 3 */. 
cb80: 20 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e       { OP_Column
cb90: 2c 20 20 20 20 20 30 2c 20 32 2c 20 20 20 20 20  ,     0, 2,     
cba0: 20 20 20 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65     0}, /* sqlite
cbb0: 5f 6d 61 73 74 65 72 2e 74 62 6c 5f 6e 61 6d 65  _master.tbl_name
cbc0: 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e   */.      { OP_N
cbd0: 65 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41 44  e,         0, AD
cbe0: 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20 20  DR(12), 0},.    
cbf0: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20    { OP_String8, 
cc00: 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20     0, 0,        
cc10: 22 74 72 69 67 67 65 72 22 7d 2c 0a 20 20 20 20  "trigger"},.    
cc20: 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20    { OP_Column,  
cc30: 20 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20     0, 2,        
cc40: 30 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61  0}, /* sqlite_ma
cc50: 73 74 65 72 2e 74 79 70 65 20 2a 2f 0a 20 20 20  ster.type */.   
cc60: 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20     { OP_Eq,     
cc70: 20 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c      0, ADDR(12),
cc80: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cc90: 44 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30  Delete,     0, 0
cca0: 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
ccb0: 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20     { OP_Rewind, 
ccc0: 20 20 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c      0, ADDR(13),
ccd0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cce0: 47 6f 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41  Goto,       0, A
ccf0: 44 44 52 28 33 29 2c 20 20 30 7d 2c 0a 20 20 20  DDR(3),  0},.   
cd00: 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20     { OP_Next,   
cd10: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
cd20: 20 30 7d 2c 20 2f 2a 20 31 32 20 2a 2f 0a 20 20   0}, /* 12 */.  
cd30: 20 20 7d 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a    };.    Index *
cd40: 70 49 64 78 3b 0a 20 20 20 20 54 72 69 67 67 65  pIdx;.    Trigge
cd50: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
cd60: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
cd70: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
cd80: 73 65 2c 20 30 2c 20 70 54 61 62 2d 3e 69 44 62  se, 0, pTab->iDb
cd90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
cda0: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
cdb0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
cdc0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
cdd0: 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a  pped. Code.    *
cde0: 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
cdf0: 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
ce00: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
ce10: 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a  ter and/or.    *
ce20: 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
ce30: 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
ce40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 72  ..    */.    pTr
ce50: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
ce60: 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69 6c  rigger;.    whil
ce70: 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
ce80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
ce90: 69 67 67 65 72 2d 3e 69 44 62 3d 3d 70 54 61 62  igger->iDb==pTab
cea0: 2d 3e 69 44 62 20 7c 7c 20 70 54 72 69 67 67 65  ->iDb || pTrigge
ceb0: 72 2d 3e 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  r->iDb==1 );.   
cec0: 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
ced0: 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
cee0: 20 70 54 72 69 67 67 65 72 2c 20 31 29 3b 0a 20   pTrigger, 1);. 
cef0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
cf00: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
cf10: 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
cf20: 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
cf30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cf40: 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
cf50: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
cf60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
cf70: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53     /* Drop all S
cf80: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
cf90: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
cfa0: 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
cfb0: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  to the.    ** ta
cfc0: 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
cfd0: 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
cfe0: 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
cff0: 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
d000: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  .    ** every ro
d010: 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
d020: 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
d030: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
d040: 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a   one being.    *
d050: 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
d060: 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
d070: 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61 75  seperately becau
d080: 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
d090: 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
d0a0: 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
d0b0: 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
d0c0: 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
d0d0: 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  n another.    **
d0e0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
d0f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  /.    sqlite3Ope
d100: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
d110: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20  pTab->iDb);.    
d120: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  base = sqlite3Vd
d130: 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
d140: 72 72 61 79 53 69 7a 65 28 64 72 6f 70 54 61 62  rraySize(dropTab
d150: 6c 65 29 2c 20 64 72 6f 70 54 61 62 6c 65 29 3b  le), dropTable);
d160: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d170: 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
d180: 2b 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  +1, pTab->zName,
d190: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
d1a0: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c  ChangeCookie(db,
d1b0: 20 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a   v, pTab->iDb);.
d1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d1d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
d1e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
d1f0: 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20   !isView ){.    
d200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d210: 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
d220: 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 70 54  , pTab->tnum, pT
d230: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20  ab->iDb);.      
d240: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d250: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d260: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d270: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d280: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
d290: 65 73 74 72 6f 79 2c 20 70 49 64 78 2d 3e 74 6e  estroy, pIdx->tn
d2a0: 75 6d 2c 20 70 49 64 78 2d 3e 69 44 62 29 3b 0a  um, pIdx->iDb);.
d2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d2c0: 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74    sqlite3EndWrit
d2d0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
d2e0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
d2f0: 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
d300: 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
d310: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  f the table..  *
d320: 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e  *.  ** Exception
d330: 3a 20 69 66 20 74 68 65 20 53 51 4c 20 73 74 61  : if the SQL sta
d340: 74 65 6d 65 6e 74 20 62 65 67 61 6e 20 77 69 74  tement began wit
d350: 68 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  h the EXPLAIN ke
d360: 79 77 6f 72 64 2c 0a 20 20 2a 2a 20 74 68 65 6e  yword,.  ** then
d370: 20 6e 6f 20 63 68 61 6e 67 65 73 20 73 68 6f 75   no changes shou
d380: 6c 64 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f  ld be made..  */
d390: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
d3a0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 73  explain ){.    s
d3b0: 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64 44 65  qliteUnlinkAndDe
d3c0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
d3d0: 61 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  ab);.    db->fla
d3e0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
d3f0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
d400: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
d410: 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a  tAll(db, iDb);..
d420: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a  exit_drop_table:
d430: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
d440: 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
d450: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d460: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
d470: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
d480: 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
d490: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
d4a0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
d4b0: 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
d4c0: 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
d4d0: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
d4e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
d4f0: 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
d500: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
d510: 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
d520: 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
d530: 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
d540: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
d550: 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
d560: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
d570: 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
d580: 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
d590: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
d5a0: 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
d5b0: 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
d5c0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
d5d0: 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
d5e0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
d5f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
d600: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
d610: 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
d620: 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
d630: 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
d640: 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
d650: 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
d660: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
d670: 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
d680: 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
d690: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
d6a0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
d6b0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
d6c0: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
d6d0: 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54  wTable field.  T
d6e0: 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69  he new FKey.** i
d6f0: 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74  s not linked int
d700: 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74  o db->aFKey at t
d710: 68 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74  his point - that
d720: 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e   does not happen
d730: 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65  .** until sqlite
d740: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a  3EndTable()..**.
d750: 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
d760: 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
d770: 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
d780: 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
d790: 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
d7a0: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
d7b0: 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
d7c0: 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
d7d0: 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
d7e0: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
d7f0: 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
d800: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
d810: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d820: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d830: 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
d840: 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
d850: 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
d860: 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
d870: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
d880: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
d890: 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
d8a0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
d8b0: 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
d8c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
d8d0: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
d8e0: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
d8f0: 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
d900: 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
d910: 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 54  ithms. */.){.  T
d920: 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
d930: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
d940: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
d950: 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
d960: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 46 4b 65 79   char *z;.  FKey
d970: 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 20 20   *pFKey = 0;..  
d980: 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29  assert( pTo!=0 )
d990: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
d9a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
d9b0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
d9c0: 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
d9d0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
d9e0: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
d9f0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
da00: 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
da10: 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
da20: 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
da30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
da40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
da50: 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
da60: 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
da70: 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
da80: 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
da90: 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
daa0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
dab0: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
dac0: 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
dad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
dae0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
daf0: 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
db00: 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
db10: 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
db20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
db30: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
db40: 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
db50: 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
db60: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
db70: 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
db80: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
db90: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
dba0: 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
dbb0: 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
dbc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
dbd0: 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
dbe0: 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
dbf0: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
dc00: 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
dc10: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
dc20: 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
dc30: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
dc40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
dc50: 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
dc60: 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
dc70: 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
dc80: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
dc90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
dca0: 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
dcb0: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
dcc0: 28 20 70 46 4b 65 79 3d 3d 30 20 29 20 67 6f 74  ( pFKey==0 ) got
dcd0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 70 46 4b 65  o fk_end;.  pFKe
dce0: 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
dcf0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
dd00: 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
dd10: 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
dd20: 5b 31 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43  [1];.  pFKey->aC
dd30: 6f 6c 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f  ol = (struct sCo
dd40: 6c 4d 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20  lMap*)z;.  z += 
dd50: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43  sizeof(struct sC
dd60: 6f 6c 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70  olMap)*nCol;.  p
dd70: 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
dd80: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
dd90: 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
dda0: 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a  pTo->n] = 0;.  z
ddb0: 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20   += pTo->n+1;.  
ddc0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
ddd0: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f   0;.  pFKey->nCo
dde0: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
ddf0: 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
de00: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
de10: 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
de20: 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
de30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
de40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
de50: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
de60: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
de70: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
de80: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
de90: 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
dea0: 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
deb0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
dec0: 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
ded0: 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
dee0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
def0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
df10: 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
df20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
df30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
df40: 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
df50: 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
df60: 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
df70: 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
df80: 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
df90: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
dfa0: 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
dfb0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
dfc0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
dfd0: 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
dfe0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
dff0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
e000: 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  rlen(pToCol->a[i
e010: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
e020: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
e030: 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d  Col = z;.      m
e040: 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
e050: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
e060: 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
e070: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
e080: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
e090: 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
e0a0: 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c   0;.  pFKey->del
e0b0: 65 74 65 43 6f 6e 66 20 3d 20 66 6c 61 67 73 20  eteConf = flags 
e0c0: 26 20 30 78 66 66 3b 0a 20 20 70 46 4b 65 79 2d  & 0xff;.  pFKey-
e0d0: 3e 75 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 66  >updateConf = (f
e0e0: 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78  lags >> 8 ) & 0x
e0f0: 66 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 6e 73  ff;.  pFKey->ins
e100: 65 72 74 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73  ertConf = (flags
e110: 20 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 3b   >> 16 ) & 0xff;
e120: 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
e130: 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
e140: 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
e150: 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
e160: 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
e170: 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
e180: 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
e190: 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a 20  teFree(pFKey);. 
e1a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
e1b0: 44 65 6c 65 74 65 28 70 46 72 6f 6d 43 6f 6c 29  Delete(pFromCol)
e1c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
e1d0: 69 73 74 44 65 6c 65 74 65 28 70 54 6f 43 6f 6c  istDelete(pToCol
e1e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e1f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e200: 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
e210: 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
e220: 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
e230: 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
e240: 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
e250: 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
e260: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
e270: 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
e280: 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
e290: 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
e2a0: 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
e2b0: 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
e2c0: 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
e2d0: 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
e2e0: 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
e2f0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
e300: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
e310: 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
e320: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
e330: 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
e340: 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
e350: 65 72 72 65 64 29 7b 0a 20 20 54 61 62 6c 65 20  erred){.  Table 
e360: 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
e370: 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
e380: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
e390: 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
e3a0: 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
e3b0: 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
e3c0: 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
e3d0: 72 65 64 20 3d 20 69 73 44 65 66 65 72 72 65 64  red = isDeferred
e3e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e3f0: 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
e400: 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
e410: 20 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e   pIndex is the n
e420: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
e430: 20 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20   .** and pTable 
e440: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
e450: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
e460: 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
e470: 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
e480: 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
e490: 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
e4a0: 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
e4b0: 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
e4c0: 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
e4d0: 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
e4e0: 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
e4f0: 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
e500: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
e510: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
e520: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
e530: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
e540: 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
e550: 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
e560: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
e570: 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
e580: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e590: 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
e5a0: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
e5b0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
e5c0: 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
e5d0: 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
e5e0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
e5f0: 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
e600: 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
e610: 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
e620: 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
e630: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
e640: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
e650: 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
e660: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
e670: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e680: 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
e690: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
e6a0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
e6b0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
e6c0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
e6d0: 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
e6e0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
e6f0: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
e700: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
e710: 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
e720: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
e730: 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f  st *pTblName,  /
e740: 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
e750: 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
e760: 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
e770: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
e780: 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
e790: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
e7a0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
e7b0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a   onError,     /*
e7c0: 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
e7d0: 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
e7e0: 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
e7f0: 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
e800: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
e810: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
e820: 6e 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ns a CREATE TABL
e830: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
e840: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20   Token *pEnd    
e850: 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61    /* The ")" tha
e860: 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45  t closes the CRE
e870: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
e880: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ent */.){.  Tabl
e890: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20  e *pTab = 0; /* 
e8a0: 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
e8b0: 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
e8c0: 70 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54  pIndex = 0; /* T
e8d0: 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
e8e0: 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
e8f0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
e900: 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e  nt i, j;.  Token
e910: 20 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46   nullId;    /* F
e920: 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e  ake token for an
e930: 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a   empty ID list *
e940: 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  /.  DbFixer sFix
e950: 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69  ;    /* For assi
e960: 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
e970: 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
e980: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20  /.  int isTemp; 
e990: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
e9a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64   a temporary ind
e9b0: 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  ex */.  sqlite *
e9c0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
e9d0: 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ..  int iDb;    
e9e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e9f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
ea00: 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
ea10: 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
ea20: 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55  *pName = 0; /* U
ea30: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
ea40: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
ea50: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28  create */..  if(
ea60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ea70: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
ea80: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
ea90: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
eaa0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
eab0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
eac0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
ead0: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
eae0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
eaf0: 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
eb00: 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
eb10: 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
eb20: 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
eb30: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
eb40: 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
eb50: 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
eb60: 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
eb70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
eb80: 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
eb90: 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
eba0: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
ebb0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
ebc0: 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
ebd0: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
ebe0: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
ebf0: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
ec00: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
ec10: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
ec20: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
ec30: 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20  _index;..    /* 
ec40: 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
ec50: 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
ec60: 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
ec70: 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
ec80: 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
ec90: 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
eca0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a   database to 1..
ecb0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20      */.    pTab 
ecc0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
ecd0: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
ece0: 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  TblName);.    if
ecf0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
ed00: 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
ed10: 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31   && pTab->iDb==1
ed20: 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20   ){.      iDb = 
ed30: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
ed40: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
ed50: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
ed60: 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
ed70: 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20  ame) &&.        
ed80: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
ed90: 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
eda0: 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
edb0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
edc0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
edd0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
ede0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
edf0: 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  se, pTblName->a[
ee00: 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
ee10: 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
ee20: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
ee30: 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
ee40: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ee50: 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
ee60: 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62  ( iDb==pTab->iDb
ee70: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
ee80: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
ee90: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
eea0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
eeb0: 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54  le;.    iDb = pT
eec0: 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20  ab->iDb;.  }..  
eed0: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
eee0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
eef0: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ef00: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
ef10: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
ef20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ef30: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
ef40: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
ef50: 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
ef60: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
ef70: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ef80: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  x;.  }.  if( pTa
ef90: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
efa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
efb0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
efc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
efd0: 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
efe0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
eff0: 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20  x;.  }.  isTemp 
f000: 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a  = pTab->iDb==1;.
f010: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
f020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f030: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
f040: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
f050: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
f060: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
f070: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
f080: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
f090: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
f0a0: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
f0b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
f0c0: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
f0d0: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
f0e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f0f0: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
f100: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
f110: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
f120: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
f130: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
f140: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
f150: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
f160: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
f170: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
f180: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
f190: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
f1a0: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
f1b0: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
f1c0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
f1d0: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
f1e0: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
f1f0: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
f200: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
f210: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
f220: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
f230: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
f240: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
f250: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
f260: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
f270: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
f280: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
f290: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
f2a0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
f2b0: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  dex;.    if( zNa
f2c0: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
f2d0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f2e0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f2f0: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
f300: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
f310: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
f320: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
f330: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
f340: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
f350: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
f360: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
f370: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
f380: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
f390: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
f3a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65     Table *pTSame
f3b0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61  Name;    /* A ta
f3c0: 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61  ble with same na
f3d0: 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20  me as the index 
f3e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  */.      if( SQL
f3f0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
f400: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
f410: 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
f420: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f430: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
f440: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
f450: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
f460: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
f470: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
f480: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f490: 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
f4a0: 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
f4b0: 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
f4c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f4d0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f4f0: 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pTSameName = sq
f500: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
f510: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
f520: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f530: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f540: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
f550: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
f560: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
f570: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
f580: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f5a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
f5b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
f5c0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
f5d0: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
f5e0: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
f5f0: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
f600: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
f610: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
f620: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
f630: 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22  rintf(zBuf,"_%d"
f640: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
f650: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
f660: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
f670: 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
f680: 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ex_", pTab->zNam
f690: 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  e, zBuf, (char*)
f6a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
f6b0: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
f6c0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f6d0: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
f6e0: 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
f6f0: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
f700: 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
f710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f720: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
f730: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f740: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54  zDb = db->aDb[pT
f750: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ab->iDb].zName;.
f760: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f770: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f780: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
f790: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
f7a0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
f7b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f7c0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f7d0: 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
f7e0: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
f7f0: 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70  ;.    if( isTemp
f800: 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
f810: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
f820: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f830: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f840: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
f850: 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
f860: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f870: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f880: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f890: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
f8a0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
f8b0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
f8c0: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
f8d0: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
f8e0: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
f8f0: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
f900: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
f910: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
f920: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
f930: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
f940: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
f950: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
f960: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
f970: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
f980: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
f990: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
f9a0: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
f9b0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
f9c0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
f9d0: 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64  nd(0, 0, &nullId
f9e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
f9f0: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
fa00: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
fa10: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
fa20: 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
fa30: 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
fa40: 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  /.  pIndex = sql
fa50: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
fa60: 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65  f(Index) + strle
fa70: 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20  n(zName) + 1 +. 
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69         (sizeof(i
faa0: 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c  nt) + sizeof(Col
fab0: 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e  lSeq*))*pList->n
fac0: 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49  Expr );.  if( pI
fad0: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
fae0: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
faf0: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
fb00: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
fb10: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
fb20: 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oll[pList->nExpr
fb30: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
fb40: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
fb50: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
fb60: 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73  ist->nExpr];.  s
fb70: 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  trcpy(pIndex->zN
fb80: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70  ame, zName);.  p
fb90: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
fba0: 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
fbb0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
fbc0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
fbd0: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
fbe0: 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
fbf0: 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
fc00: 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  ==0;.  pIndex->i
fc10: 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20  Db = iDb;..  /* 
fc20: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
fc30: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
fc40: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
fc50: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
fc60: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
fc70: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
fc80: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
fc90: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
fca0: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
fcb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
fcc0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
fcd0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
fce0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fcf0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
fd00: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
fd10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
fd20: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
fd30: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
fd40: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
fd50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
fd60: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
fd70: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
fd80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fd90: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
fda0: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
fdb0: 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
fdc0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70    pTab->zName, p
fdd0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
fde0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
fdf0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
fe00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
fe10: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
fe20: 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
fe30: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b  t->a[i].pExpr ){
fe40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fe50: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
fe60: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
fe70: 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
fe80: 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73  .aColl[i] = pLis
fe90: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
fea0: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
feb0: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
fec0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
fed0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
fee0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  pColl;.    }.   
fef0: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
ff00: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
ff10: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ] );.    if( !db
ff20: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a  ->init.busy && .
ff30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
ff40: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
ff50: 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  se, pIndex->keyI
ff60: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20  nfo.aColl[i]) . 
ff70: 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
ff80: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
ff90: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ex;.    }.  }.  
ffa0: 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
ffb0: 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e  nField = pList->
ffc0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54  nExpr;..  if( pT
ffd0: 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
ffe0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
fff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
10000 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
10010 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
10020 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
10030 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
10040 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
10050 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
10060 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
10070 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
10080 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
10090 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
100a0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
100b0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
100c0 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
100d0 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
100e0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
100f0 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
10100 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
10110 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
10120 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
10130 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
10140 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
10150 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
10160 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
10170 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
10180 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
10190 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
101a0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
101b0 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
101c0 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
101d0 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
101e0 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
101f0 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
10200 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
10210 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
10220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
10230 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
10240 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
10250 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
10260 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
10270 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
10280 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
10290 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
102a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
102b0 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
102c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
102d0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
102e0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
102f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
10300 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
10310 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
10320 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
10330 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
10340 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
10350 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
10360 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
10370 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
10380 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
10390 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
103a0 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  Coll[k]!=pIndex-
103b0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
103c0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
103d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
103e0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
103f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
10400 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
10410 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
10420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
10430 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
10440 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
10450 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
10460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
10470 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
10480 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
10490 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
104a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
104b0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
104c0 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
104d0 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
104e0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
104f0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
10500 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
10510 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
10520 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
10530 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
10540 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
10550 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
10560 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
10570 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
10580 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
10590 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
105a0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
105b0 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
105c0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
105d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
105e0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
105f0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
10600 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
10610 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
10620 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10630 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10640 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10650 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
10660 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
10670 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
10680 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
10690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
106a0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
106b0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
106c0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
106d0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
106e0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
106f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
10700 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
10710 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
10720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10730 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
10740 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
10750 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
10760 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
10770 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
10780 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
10790 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
107a0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
107b0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
107c0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
107d0 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
107e0 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
107f0 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
10820 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
10830 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
10840 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
10850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10860 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
10870 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
10880 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
10890 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
108a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
108b0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
108c0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
108d0 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
108e0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
108f0 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
10900 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
10910 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
10920 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
10930 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
10940 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
10950 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
10960 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
10970 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
10980 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
10990 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
109a0 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
109b0 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
109c0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
109d0 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
109e0 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
109f0 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
10a00 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
10a10 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
10a20 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
10a30 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
10a40 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
10a50 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
10a60 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
10a70 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
10a80 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
10a90 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
10aa0 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
10ab0 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
10ac0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
10ad0 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
10ae0 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
10af0 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
10b00 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
10b10 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
10b20 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
10b30 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
10b40 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
10b50 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
10b60 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
10b70 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
10b80 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
10b90 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
10ba0 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
10bb0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
10bc0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
10bd0 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
10be0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
10bf0 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
10c00 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
10c10 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
10c20 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
10c30 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
10c40 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
10c50 31 2c 20 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20  1, lbl2;..    v 
10c60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
10c70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
10c80 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
10c90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
10ca0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
10cb0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e!=0 ){.      sq
10cc0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10cd0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
10ce0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
10cf0 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
10d00 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a  rTable(v, iDb);.
10d10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10d20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10d30 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
10d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10d50 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
10d60 67 38 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78  g8, 0, 0, "index
10d70 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
10d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10d90 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
10da0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
10db0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
10dc0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10dd0 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
10de0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10e00 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
10e10 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
10e20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  0);.    if( pTbl
10e30 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
10e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10e50 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
10e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10e70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10e80 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
10e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ea0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
10eb0 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20  rite, 1, 0,.    
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
10ee0 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
10ef0 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  INFO);.    }.   
10f00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10f10 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
10f20 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
10f30 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
10f40 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72  {.      if( onEr
10f50 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror==OE_None ){.
10f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10f70 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
10f80 31 2c 20 22 43 52 45 41 54 45 20 49 4e 44 45 58  1, "CREATE INDEX
10f90 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a   ", P3_STATIC);.
10fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fc0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10fd0 22 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49  "CREATE UNIQUE I
10fe0 4e 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49  NDEX ", P3_STATI
10ff0 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
11000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11010 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
11020 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e  , 0, 0);.      n
11030 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
11040 20 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a   - Addr(pName->z
11050 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
11060 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
11070 28 76 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a  (v, -1, pName->z
11080 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
11090 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
110a0 4f 50 5f 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30  OP_Concat8, 2, 0
110b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
110c0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
110d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c  P_MakeRecord, 5,
110e0 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f   0, "tttit", P3_
110f0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c  STATIC);.    sql
11100 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11110 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30   OP_PutIntKey, 0
11120 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54  , 0);.    if( pT
11130 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
11140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11150 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11160 70 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20  pTab->iDb, 0);. 
11170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11180 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
11190 52 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74  Read, 2, pTab->t
111a0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56  num);.      /* V
111b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
111c0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
111d0 29 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  )); */.      sql
111e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
111f0 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
11200 73 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  s, 2, pTab->nCol
11210 29 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20  );.      lbl2 = 
11220 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11230 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
11240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11250 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c  v, OP_Rewind, 2,
11260 20 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62   lbl2);.      lb
11270 6c 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  l1 = sqlite3Vdbe
11280 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
11290 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e        sqlite3Gen
112a0 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c  erateIndexKey(v,
112b0 20 70 49 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20   pIndex, 2);.   
112c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
112d0 33 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20  3(v, OP_IdxPut, 
112e0 31 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  1, pIndex->onErr
112f0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20  or!=OE_None,.   
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75     "indexed colu
11320 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
11330 75 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  ue", P3_STATIC);
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 4e 65  beAddOp(v, OP_Ne
11360 78 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20  xt, 2, lbl1);.  
11370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
11380 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
11390 62 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  bl2);.      sqli
113a0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
113b0 4f 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b  OP_Close, 2, 0);
113c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
113d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
113e0 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
113f0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
11400 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62  ookie(db, v, iDb
11410 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11420 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11430 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
11440 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72      sqlite3EndWr
11450 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
11460 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
11470 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
11480 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
11490 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  b, 0,.         s
114a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 6e  qlite3MPrintf("n
114b0 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65  ame='%q'", pInde
114c0 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59  x->zName), P3_DY
114d0 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
114e0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
114f0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
11500 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
11510 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
11520 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
11530 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
11540 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
11550 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
11560 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
11570 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
11580 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
11590 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  or the correct o
115a0 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41  peration of UPDA
115b0 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45  TE.  ** and INSE
115c0 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  RT..  */.  if( d
115d0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
115e0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
115f0 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
11600 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
11610 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
11620 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
11630 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
11640 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
11650 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
11660 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
11670 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
11680 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
11690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
116a0 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
116b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
116c0 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
116d0 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
116e0 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
116f0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
11700 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
11710 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
11720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11730 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
11740 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
11750 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
11760 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
11770 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20   }.    pIndex = 
11780 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
11790 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
117a0 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
117b0 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
117c0 20 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65   pIndex ) sqlite
117d0 46 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20  Free(pIndex);.  
117e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
117f0 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
11800 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
11810 6c 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a  lete(pTblName);.
11820 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
11830 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
11840 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11850 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
11860 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
11870 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
11880 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
11890 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
118a0 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
118b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
118c0 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
118d0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
118e0 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
118f0 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
11900 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  v;.  sqlite *db 
11910 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
11920 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
11930 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
11940 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
11950 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
11960 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
11970 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11980 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
11990 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65  ema(pParse) ) re
119a0 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d  turn;.  pIndex =
119b0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
119c0 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
119d0 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
119e0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
119f0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
11a00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11a10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11a20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
11a30 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
11a40 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
11a50 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
11a60 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11a70 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
11a80 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
11a90 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
11aa0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11ab0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
11ac0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
11ad0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
11ae0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
11af0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
11b00 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
11b10 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
11b20 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
11b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11b40 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
11b50 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
11b60 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
11b70 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
11b80 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
11b90 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
11ba0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
11bb0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
11bc0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
11bd0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
11be0 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
11bf0 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  >iDb);.    if( s
11c00 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11c10 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
11c20 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
11c30 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
11c40 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
11c50 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
11c60 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20  ( pIndex->iDb ) 
11c70 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
11c80 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
11c90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
11ca0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
11cb0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
11cc0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
11cd0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
11ce0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11cf0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
11d00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
11d10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
11d20 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
11d30 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
11d40 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
11d50 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11d60 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11d70 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
11d80 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49  VdbeOpList dropI
11d90 6e 64 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  ndex[] = {.     
11da0 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
11db0 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d    0, ADDR(9), 0}
11dc0 2c 20 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  , .      { OP_St
11dd0 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20  ring8,    0, 0, 
11de0 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
11df0 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
11e00 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
11e10 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
11e20 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20   OP_MemLoad,    
11e30 31 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  1, 0,       0}, 
11e40 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
11e50 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
11e60 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
11e70 20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20       { OP_Eq,   
11e80 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29        0, ADDR(8)
11e90 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50  , 0},.      { OP
11ea0 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
11eb0 41 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20  ADDR(3), 0},.   
11ec0 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
11ed0 20 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20      0, ADDR(9), 
11ee0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44  0},.      { OP_D
11ef0 65 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c  elete,     0, 0,
11f00 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20         0}, /* 8 
11f10 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  */.    };.    in
11f20 74 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c  t base;..    sql
11f30 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
11f40 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
11f50 30 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b  0, pIndex->iDb);
11f60 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
11f70 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70  MasterTable(v, p
11f80 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
11f90 20 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56   base = sqlite3V
11fa0 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20  dbeAddOpList(v, 
11fb0 41 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e  ArraySize(dropIn
11fc0 64 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29  dex), dropIndex)
11fd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11fe0 65 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73  eChangeP3(v, bas
11ff0 65 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  e+1, pIndex->zNa
12000 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
12010 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
12020 64 62 2c 20 76 2c 20 70 49 6e 64 65 78 2d 3e 69  db, v, pIndex->i
12030 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
12040 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12050 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
12060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12070 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  Op(v, OP_Destroy
12080 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
12090 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
120a0 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74    sqlite3EndWrit
120b0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
120c0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  e);.  }..  /* De
120d0 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lete the in-memo
120e0 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  ry description o
120f0 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
12100 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  */.  if( !pParse
12110 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
12120 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
12130 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
12140 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62   pIndex);.    db
12150 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
12160 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
12170 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
12180 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
12190 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e  SrcListDelete(pN
121a0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ame);.}../*.** A
121b0 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
121c0 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
121d0 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
121e0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
121f0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
12200 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
12210 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
12220 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
12230 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
12240 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
12250 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70  Append(IdList *p
12260 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
12270 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ken){.  if( pLis
12280 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
12290 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
122a0 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  ( sizeof(IdList)
122b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
122c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
122d0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  .    pList->nAll
122e0 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  oc = 0;.  }.  if
122f0 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c  ( pList->nId>=pL
12300 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ist->nAlloc ){. 
12310 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
12320 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c  _item *a;.    pL
12330 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
12340 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
12350 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  5;.    a = sqlit
12360 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e  eRealloc(pList->
12370 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  a, pList->nAlloc
12380 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
12390 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
123a0 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  a==0 ){.      sq
123b0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
123c0 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  e(pList);.      
123d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
123e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
123f0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
12400 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
12410 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  nId], 0, sizeof(
12420 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
12430 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d   pList->a[pList-
12440 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >nId].zName = sq
12450 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
12460 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c  en(pToken);.  pL
12470 69 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65  ist->nId++;.  re
12480 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
12490 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
124a0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
124b0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
124c0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
124d0 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
124e0 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
124f0 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
12500 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
12510 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73  ven if pToken is
12520 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e   NULL..**.** A n
12530 65 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65  ew SrcList is re
12540 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
12550 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
12560 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  s..**.** If pDat
12570 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
12580 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
12590 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
125a0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
125b0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
125c0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
125d0 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
125e0 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
125f0 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
12600 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
12610 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
12620 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
12630 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
12640 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
12650 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
12660 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
12670 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
12680 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
12690 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
126a0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
126b0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
126c0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
126d0 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
126e0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
126f0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
12700 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
12710 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
12720 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
12730 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
12740 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
12750 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
12760 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
12770 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12780 6e 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,0);.**.**
12790 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
127a0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
127b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
127c0 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
127d0 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
127e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
127f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
12800 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29  istAppend(A,B,C)
12810 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
12820 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
12830 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
12840 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a  tabase name..*/.
12850 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
12860 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72  SrcListAppend(Sr
12870 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  cList *pList, To
12880 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b  ken *pTable, Tok
12890 65 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a  en *pDatabase){.
128a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
128b0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
128c0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
128d0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
128e0 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
128f0 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
12900 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
12910 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
12920 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
12930 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
12940 2d 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e  ->nSrc>=pList->n
12950 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
12960 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
12970 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d  pList->nAlloc *=
12980 20 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   2;.    pNew = s
12990 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
129a0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
129b0 20 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74     sizeof(*pList
129c0 29 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ) + (pList->nAll
129d0 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69  oc-1)*sizeof(pLi
129e0 73 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  st->a[0]) );.   
129f0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
12a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
12a10 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
12a20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12a30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  0;.    }.    pLi
12a40 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
12a50 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
12a60 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b  >a[pList->nSrc];
12a70 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c  .  memset(pItem,
12a80 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74   0, sizeof(pList
12a90 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  ->a[0]));.  if( 
12aa0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
12ab0 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
12ac0 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
12ad0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
12ae0 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
12af0 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
12b00 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
12b10 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
12b20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
12b30 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
12b40 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
12b50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
12b60 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b  omToken(pTable);
12b70 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
12b80 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
12b90 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61  eFromToken(pData
12ba0 62 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  base);.  pItem->
12bb0 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
12bc0 70 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20  pList->nSrc++;. 
12bd0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
12be0 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63  ../*.** Assign c
12bf0 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61  ursors to all ta
12c00 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
12c10 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
12c20 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
12c30 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
12c40 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
12c50 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
12c60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
12c70 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
12c80 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
12c90 69 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a  i].iCursor<0 ){.
12ca0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
12cb0 5d 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72  ].iCursor = pPar
12cc0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12cd0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
12ce0 64 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74  dd an alias to t
12cf0 68 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69  he last identifi
12d00 65 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  er on the given 
12d10 69 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e  identifier list.
12d20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12d30 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28  SrcListAddAlias(
12d40 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
12d50 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
12d60 20 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70    if( pList && p
12d70 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  List->nSrc>0 ){.
12d80 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69      pList->a[pLi
12d90 73 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69  st->nSrc-1].zAli
12da0 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
12db0 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e  FromToken(pToken
12dc0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12dd0 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
12de0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12df0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64  3IdListDelete(Id
12e00 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
12e10 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
12e20 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
12e30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
12e40 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
12e50 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
12e60 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
12e70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
12e80 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
12e90 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
12ea0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
12eb0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
12ec0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
12ed0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
12ee0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
12ef0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
12f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
12f10 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
12f20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
12f30 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
12f40 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
12f50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
12f60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
12f70 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
12f80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
12f90 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
12fa0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
12fb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
12fc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
12fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
12fe0 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69   an entire SrcLi
12ff0 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  st including all
13000 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
13010 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
13020 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
13030 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
13040 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
13050 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
13060 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
13070 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
13080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
13090 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 44  e(pList->a[i].zD
130a0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
130b0 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
130c0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
130d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
130e0 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 29 3b  t->a[i].zAlias);
130f0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13100 61 5b 69 5d 2e 70 54 61 62 20 26 26 20 70 4c 69  a[i].pTab && pLi
13110 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 2d 3e 69  st->a[i].pTab->i
13120 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
13130 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
13140 65 54 61 62 6c 65 28 30 2c 20 70 4c 69 73 74 2d  eTable(0, pList-
13150 3e 61 5b 69 5d 2e 70 54 61 62 29 3b 0a 20 20 20  >a[i].pTab);.   
13160 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
13170 6c 65 63 74 44 65 6c 65 74 65 28 70 4c 69 73 74  lectDelete(pList
13180 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 29 3b  ->a[i].pSelect);
13190 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
131a0 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
131b0 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  i].pOn);.    sql
131c0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
131d0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 55 73  (pList->a[i].pUs
131e0 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ing);.  }.  sqli
131f0 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
13200 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
13210 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
13220 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
13230 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
13240 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
13250 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65  lite *db;.  Vdbe
13260 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
13270 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
13280 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
13290 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
132a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
132b0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
132c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
132d0 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
132e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
132f0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13300 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
13310 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
13320 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
13330 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13340 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
13350 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
13360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13370 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
13380 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
13390 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
133a0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
133b0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
133c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
133d0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
133e0 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  te *db;.  Vdbe *
133f0 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  v;..  if( pParse
13400 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73  ==0 || (db=pPars
13410 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d  e->db)==0 || db-
13420 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
13430 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
13440 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
13450 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
13460 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
13470 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13480 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13490 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
134a0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
134b0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
134c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
134d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
134e0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
134f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13500 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
13510 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
13520 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   Rollback a tran
13530 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
13540 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
13550 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
13560 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
13570 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
13580 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
13590 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
135a0 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
135b0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
135c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
135d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
135e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
135f0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
13600 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13610 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13620 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
13630 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
13640 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  , 0) ) return;..
13650 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13660 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13670 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
13680 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13690 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
136a0 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
136b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
136c0 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
136d0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
136e0 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
136f0 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
13700 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
13710 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
13720 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
13730 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
13740 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
13750 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
13760 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
13770 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
13780 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13790 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
137a0 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
137b0 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
137c0 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
137d0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
137e0 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
137f0 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
13800 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
13810 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
13820 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
13830 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
13840 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
13850 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
13860 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
13870 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
13880 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
13890 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
138a0 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
138b0 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
138c0 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
138d0 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
138e0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
138f0 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
13900 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
13910 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
13920 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
13930 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
13940 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
13950 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
13960 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
13970 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
13980 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
13990 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
139a0 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
139b0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
139c0 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
139d0 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
139e0 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
139f0 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
13a00 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
13a10 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
13a20 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
13a30 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
13a40 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
13a50 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
13a60 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
13a70 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
13a80 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
13a90 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
13aa0 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
13ab0 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
13ac0 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
13ad0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
13ae0 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
13af0 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
13b00 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
13b10 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
13b20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
13b30 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
13b40 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
13b50 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
13b60 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
13b70 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  mask;..  v = sql
13b80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13b90 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
13ba0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
13bb0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
13bc0 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70  if there was a p
13bd0 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20  rior error */.  
13be0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
13bf0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
13c00 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a  ookieGoto==0 ){.
13c10 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
13c20 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
13c30 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13c40 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20  Goto, 0, 0)+1;. 
13c50 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20   }.  if( iDb>=0 
13c60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
13c70 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
13c80 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
13c90 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c  b[iDb].pBt!=0 ||
13ca0 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61   iDb==1 );.    a
13cb0 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b  ssert( iDb<32 );
13cc0 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
13cd0 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
13ce0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
13cf0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
13d00 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
13d10 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
13d20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
13d30 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
13d40 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63   db->aDb[iDb].sc
13d50 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
13d60 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
13d70 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
13d80 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73  de that prepares
13d90 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70   for doing an op
13da0 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  eration that.** 
13db0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
13dc0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
13dd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74   This routine st
13de0 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73  arts a new trans
13df0 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65  action if we are
13e00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74   not already wit
13e10 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63  hin.** a transac
13e20 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65  tion.  If we are
13e30 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20   already within 
13e40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  a transaction, t
13e50 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hen a checkpoint
13e60 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68  .** is set if th
13e70 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70  e setStatement p
13e80 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
13e90 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  .  A checkpoint 
13ea0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74  should.** be set
13eb0 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   for operations 
13ec0 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20  that might fail 
13ed0 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72  (due to a constr
13ee0 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a  aint) part of.**
13ef0 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68   the way through
13f00 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20   and which will 
13f10 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d  need to undo som
13f20 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74  e writes without
13f30 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f   having to.** ro
13f40 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65  llback the whole
13f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46   transaction.  F
13f60 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68  or operations wh
13f70 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ere all constrai
13f80 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68  nts.** can be ch
13f90 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79  ecked before any
13fa0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
13fb0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
13fc0 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a  e, it is never.*
13fd0 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  * necessary to u
13fe0 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20  ndo a write and 
13ff0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73  the checkpoint s
14000 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74  hould not be set
14010 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74  ..**.** Only dat
14020 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68  abase iDb and th
14030 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
14040 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
14050 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a  e by this call..
14060 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68  ** If iDb==0, th
14070 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20  en the main and 
14080 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61  temp databases a
14090 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
140a0 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31  .   If.** iDb==1
140b0 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74   then only the t
140c0 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20  emp database is 
140d0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20  made writable.  
140e0 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68  If iDb>1 then th
140f0 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61  e.** specified a
14100 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
14110 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64  e and the temp d
14120 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65  atabase are made
14130 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f   writable..*/.vo
14140 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
14150 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
14160 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14170 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
14180 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
14190 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
141a0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
141b0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
141c0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
141d0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
141e0 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72  se, iDb);.  pPar
141f0 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d  se->writeMask |=
14200 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73   1<<iDb;.  if( s
14210 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  etStatement ){. 
14220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14230 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d  dOp(v, OP_Statem
14240 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ent, iDb, 0);.  
14250 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  }.  if( iDb!=1 )
14260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
14270 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
14280 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61 74  (pParse, setStat
14290 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d  ement, 1);.  }.}
142a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
142b0 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63 6c   code that concl
142c0 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69 6f  udes an operatio
142d0 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65 20  n that may have 
142e0 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20 64  changed.** the d
142f0 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20 73  atabase.  If a s
14300 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14310 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
14320 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20 61  , then emit.** a
14330 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61 74  n OP_Commit that
14340 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
14350 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63 6f  changes to be co
14360 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
14370 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
14380 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72 65   checkpoints are
14390 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
143a0 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65 20  ommitted at the 
143b0 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61 74  end of.** a stat
143c0 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c 73  ement.  Note als
143d0 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61 6e  o that there can
143e0 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c   be multiple cal
143f0 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
14400 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
14410 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72 65  tion() but there
14420 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
14430 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c 6c  a single.** call
14440 20 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57 72   to sqlite3EndWr
14450 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20 61  iteOperation() a
14460 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
14470 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
14480 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
14490 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
144a0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
144b0 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  e){.  /* Delete 
144c0 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  me! */.  return;
144d0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72  .}../* .** Retur
144e0 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  n the transient 
144f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62  sqlite3_value ob
14500 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e  ject used for en
14510 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f  coding conversio
14520 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c  ns.** during SQL
14530 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f   compilation..*/
14540 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
14550 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69  sqlite3GetTransi
14560 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 20  entValue(sqlite 
14570 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d  *db){.  if( !db-
14580 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64  >pValue ){.    d
14590 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69  b->pValue = sqli
145a0 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
145b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
145c0 70 56 61 6c 75 65 3b 0a 7d 0a                    pValue;.}.