/ Hex Artifact Content
Login

Artifact 73bd4219c1cb6fb09a05b7d4a6ed3ae1d0ecb8db:


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 35 36 20 32 30 30 34 2f 31 30 2f 30 35 20 30  256 2004/10/05 0
0300: 32 3a 34 31 3a 34 32 20 64 72 68 20 45 78 70 20  2:41:42 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 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
0640: 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71  be *v;..  if( sq
0650: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
0660: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  led ) return;.. 
0670: 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e   /* Begin by gen
0680: 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72  erating some ter
0690: 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74  mination code at
06a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
06b0: 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61    ** vdbe progra
06c0: 6d 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  m.  */.  db = pP
06d0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
06e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
06f0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
0700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
0710: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61  beAddOp(v, OP_Ha
0720: 6c 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  lt, 0, 0);..    
0730: 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61  /* The cookie ma
0740: 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  sk contains one 
0750: 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  bit for each dat
0760: 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e  abase file open.
0770: 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69  .    ** (Bit 0 i
0780: 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20  s for main, bit 
0790: 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61  1 is for temp, a
07a0: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42  nd so forth.)  B
07b0: 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73  its are.    ** s
07c0: 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  et for each data
07d0: 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65  base that is use
07e0: 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  d.  Generate cod
07f0: 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20  e to start a.   
0800: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
0810: 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74  on each used dat
0820: 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72  abase and to ver
0830: 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
0840: 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20  ookie.    ** on 
0850: 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61  each used databa
0860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
0870: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
0880: 65 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20  eGoto>0 ){.     
0890: 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20   u32 mask;.     
08a0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
08b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
08c0: 65 50 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  eP2(v, pParse->c
08d0: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 2c 20 73 71 6c  ookieGoto-1, sql
08e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
08f0: 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 66  ddr(v));.      f
0900: 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31  or(iDb=0, mask=1
0910: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d  ; iDb<db->nDb; m
0920: 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b  ask<<=1, iDb++){
0930: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 61  .        if( (ma
0940: 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f  sk & pParse->coo
0950: 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f  kieMask)==0 ) co
0960: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
0970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0980: 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
0990: 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26  on, iDb, (mask &
09a0: 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
09b0: 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  sk)!=0);.       
09c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
09d0: 70 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43 6f  p(v, OP_VerifyCo
09e0: 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61 72 73  okie, iDb, pPars
09f0: 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69  e->cookieValue[i
0a00: 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db]);.      }.  
0a10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0a20: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
0a30: 20 30 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b   0, pParse->cook
0a40: 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ieGoto);.    }..
0a50: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 4e 6f 2d      /* Add a No-
0a60: 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  op that contains
0a70: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
0a80: 78 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c  xt of the compil
0a90: 65 64 20 53 51 4c 0a 20 20 20 20 2a 2a 20 73 74  ed SQL.    ** st
0aa0: 61 74 65 6d 65 6e 74 20 61 73 20 69 74 73 20 50  atement as its P
0ab0: 33 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  3 argument.  Thi
0ac0: 73 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  s does not chang
0ad0: 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c  e the functional
0ae0: 69 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ity.    ** of th
0af0: 65 20 70 72 6f 67 72 61 6d 2e 20 0a 20 20 20 20  e program. .    
0b00: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
0b10: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
0b20: 65 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63  ent sqlite3_trac
0b30: 65 28 29 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  e() functionalit
0b40: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  y..    */.    sq
0b50: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
0b60: 4f 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 2c 20 70  OP_Noop, 0, 0, p
0b70: 50 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61  Parse->zSql, pPa
0b80: 72 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73  rse->zTail-pPars
0b90: 65 2d 3e 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 0a  e->zSql);.  }...
0ba0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42    /* Get the VDB
0bb0: 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20  E program ready 
0bc0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20  for execution.  
0bd0: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
0be0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
0bf0: 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65  .    FILE *trace
0c00: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
0c10: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
0c20: 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20  )!=0 ? stdout : 
0c30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
0c40: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
0c50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
0c60: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
0c70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61  Parse->nVar, pPa
0c80: 72 73 65 2d 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20  rse->nMem+3,.   
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
0cb0: 61 62 2b 33 2c 20 70 50 61 72 73 65 2d 3e 65 78  ab+3, pParse->ex
0cc0: 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61 72  plain);.    pPar
0cd0: 73 65 2d 3e 72 63 20 3d 20 70 50 61 72 73 65 2d  se->rc = pParse-
0ce0: 3e 6e 45 72 72 20 3f 20 53 51 4c 49 54 45 5f 45  >nErr ? SQLITE_E
0cf0: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
0d00: 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  NE;.    pParse->
0d10: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b  colNamesSet = 0;
0d20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
0d30: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
0d40: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  OK ){.    pParse
0d50: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0d60: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
0d70: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
0d80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
0d90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
0da0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
0db0: 41 67 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Agg = 0;.  pPars
0dc0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
0dd0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
0de0: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
0df0: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
0e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
0e10: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
0e20: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
0e30: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
0e40: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
0e50: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
0e60: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
0e70: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
0e80: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
0e90: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
0ea0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
0eb0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
0ec0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
0ee0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
0ef0: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
0f00: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
0f10: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
0f20: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
0f30: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
0f40: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
0f50: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
0f60: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
0f70: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
0f80: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
0f90: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
0fa0: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
0fb0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
0fc0: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
0fd0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
0fe0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
0ff0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
1000: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
1010: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
1020: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1030: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1040: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1050: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
1060: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
1070: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  i;.  assert( zNa
1080: 6d 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  me!=0 );.  asser
1090: 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  t( (db->flags & 
10a0: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
10b0: 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ed) || db->init.
10c0: 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d  busy );.  for(i=
10d0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
10e0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
10f0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1100: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
1110: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
1120: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
1130: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
1140: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
1150: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
1160: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1170: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1180: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1190: 62 5b 6a 5d 2e 74 62 6c 48 61 73 68 2c 20 7a 4e  b[j].tblHash, zN
11a0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
11b0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
11c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
11d0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
11e0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
11f0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1200: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1210: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1220: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1230: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1240: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1250: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1260: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1270: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1280: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1290: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
12a0: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
12b0: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
12c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
12d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
12e0: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
12f0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1300: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
1310: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
1320: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1330: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
1340: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1350: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
1360: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
1370: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
1380: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
1390: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
13a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13b0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
13c0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
13d0: 61 72 20 2a 7a 44 62 61 73 65 29 7b 0a 20 20 54  ar *zDbase){.  T
13e0: 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52  able *p;..  /* R
13f0: 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1400: 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1410: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1420: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1430: 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1440: 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1450: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1460: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1470: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1480: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1490: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14a0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
14b0: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
14c0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
14d0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
14e0: 7b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  {.    if( zDbase
14f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1510: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1520: 3a 20 25 73 2e 25 73 22 2c 20 7a 44 62 61 73 65  : %s.%s", zDbase
1530: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
1540: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 46  lse if( sqlite3F
1550: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
1560: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d  >db, zName, 0)!=
1570: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1580: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1590: 65 2c 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22  e, "table \"%s\"
15a0: 20 69 73 20 6e 6f 74 20 69 6e 20 64 61 74 61 62   is not in datab
15b0: 61 73 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ase \"%s\"",.   
15c0: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 44 62        zName, zDb
15d0: 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ase);.    }else{
15e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
15f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1600: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
1610: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1620: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1630: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1640: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
1650: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
1660: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
1670: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1680: 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74  ribes .** a part
1690: 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76  icular index giv
16a0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
16b0: 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64  hat index.** and
16c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
16d0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
16e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
16f0: 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c  x..** Return NUL
1700: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1710: 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61  **.** If zDataba
1720: 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74  se is 0, all dat
1730: 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63  abases are searc
1740: 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74  hed for the.** t
1750: 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72  able and the fir
1760: 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65  st matching inde
1770: 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  x is returned.  
1780: 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  (No checking.** 
1790: 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e  for duplicate in
17a0: 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e  dex names is don
17b0: 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20  e.)  The search 
17c0: 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50  order is.** TEMP
17d0: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49   first, then MAI
17e0: 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69  N, then any auxi
17f0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20  liary databases 
1800: 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74  added.** using t
1810: 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e  he ATTACH comman
1820: 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  d..*/.Index *sql
1830: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71  ite3FindIndex(sq
1840: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1850: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
1860: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
1870: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a    Index *p = 0;.
1880: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
1890: 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  t( (db->flags & 
18a0: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
18b0: 65 64 29 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ed) || db->init.
18c0: 62 75 73 79 20 29 3b 0a 20 20 66 6f 72 28 69 3d  busy );.  for(i=
18d0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
18e0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
18f0: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
1900: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
1910: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
1920: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73      if( zDb && s
1930: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1940: 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  b, db->aDb[j].zN
1950: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
1960: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1970: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
1980: 62 5b 6a 5d 2e 69 64 78 48 61 73 68 2c 20 7a 4e  b[j].idxHash, zN
1990: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
19a0: 65 29 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  e)+1);.    if( p
19b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
19c0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
19d0: 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  ** Reclaim the m
19e0: 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e  emory used by an
19f0: 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63   index.*/.static
1a00: 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28   void freeIndex(
1a10: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c  Index *p){.  sql
1a20: 69 74 65 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41  iteFree(p->zColA
1a30: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ff);.  sqliteFre
1a40: 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  e(p);.}../*.** R
1a50: 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20  emove the given 
1a60: 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69  index from the i
1a70: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c  ndex hash table,
1a80: 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73   and free.** its
1a90: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
1aa0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  es..**.** The in
1ab0: 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66  dex is removed f
1ac0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1ad0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 75 74   hash tables but
1ae0: 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e  .** it is not un
1af0: 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20  linked from the 
1b00: 54 61 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e  Table that it in
1b10: 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b  dexes..** Unlink
1b20: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62  ing from the Tab
1b30: 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  le must be done 
1b40: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1b50: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
1b60: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65  ic void sqliteDe
1b70: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
1b80: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  3 *db, Index *p)
1b90: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
1ba0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
1bb0: 30 20 26 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30  0 && p->zName!=0
1bc0: 20 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c   );.  pOld = sql
1bd0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1be0: 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e  db->aDb[p->iDb].
1bf0: 69 64 78 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  idxHash, p->zNam
1c00: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1c20: 6c 65 6e 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  len(p->zName)+1,
1c30: 20 30 29 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21   0);.  if( pOld!
1c40: 3d 30 20 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b  =0 && pOld!=p ){
1c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
1c60: 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b  Insert(&db->aDb[
1c70: 70 2d 3e 69 44 62 5d 2e 69 64 78 48 61 73 68 2c  p->iDb].idxHash,
1c80: 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pOld->zName,.  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e     strlen(pOld->
1cb0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b  zName)+1, pOld);
1cc0: 0a 20 20 7d 0a 20 20 66 72 65 65 49 6e 64 65 78  .  }.  freeIndex
1cd0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  (p);.}../*.** Un
1ce0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 69  link the given i
1cf0: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 74 61  ndex from its ta
1d00: 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f 76 65  ble, then remove
1d10: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 66 72  .** the index fr
1d20: 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  om the index has
1d30: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
1d40: 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73   its memory.** s
1d50: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
1d60: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
1d70: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
1d80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1d90: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
1da0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
1db0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69  dex *pIndex;.  i
1dc0: 6e 74 20 6c 65 6e 3b 0a 0a 20 20 6c 65 6e 20 3d  nt len;..  len =
1dd0: 20 73 74 72 6c 65 6e 28 7a 49 64 78 4e 61 6d 65   strlen(zIdxName
1de0: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
1df0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
1e00: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 69 64  &db->aDb[iDb].id
1e10: 78 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  xHash, zIdxName,
1e20: 20 6c 65 6e 2b 31 2c 20 30 29 3b 0a 20 20 69 66   len+1, 0);.  if
1e30: 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
1e40: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
1e50: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
1e60: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
1e70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
1e80: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
1e90: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1ea0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
1eb0: 20 20 20 20 20 66 6f 72 28 70 3d 70 49 6e 64 65       for(p=pInde
1ec0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
1ed0: 78 3b 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  x; p && p->pNext
1ee0: 21 3d 70 49 6e 64 65 78 3b 20 70 3d 70 2d 3e 70  !=pIndex; p=p->p
1ef0: 4e 65 78 74 29 7b 7d 0a 20 20 20 20 20 20 69 66  Next){}.      if
1f00: 28 20 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  ( p && p->pNext=
1f10: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
1f20: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
1f30: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
1f40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1f50: 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  reeIndex(pIndex)
1f60: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
1f70: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
1f80: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
1f90: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
1fa0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
1fb0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
1fc0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1fd0: 6f 66 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64  of.** a single d
1fe0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
1ff0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2000: 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65 6d 6f   to reclaim memo
2010: 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  ry.** before the
2020: 20 64 61 74 61 62 61 73 65 20 63 6c 6f 73 65 73   database closes
2030: 2e 20 20 49 74 20 69 73 20 61 6c 73 6f 20 63 61  .  It is also ca
2040: 6c 6c 65 64 20 64 75 72 69 6e 67 20 61 20 72 6f  lled during a ro
2050: 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 74 68 65  llback.** if the
2060: 72 65 20 77 65 72 65 20 73 63 68 65 6d 61 20 63  re were schema c
2070: 68 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68  hanges during th
2080: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2090: 20 69 66 20 61 0a 2a 2a 20 73 63 68 65 6d 61 2d   if a.** schema-
20a0: 63 6f 6f 6b 69 65 20 6d 69 73 6d 61 74 63 68 20  cookie mismatch 
20b0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
20c0: 20 69 44 62 3c 3d 30 20 74 68 65 6e 20 72 65 73   iDb<=0 then res
20d0: 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
20e0: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 66 6f  schema tables fo
20f0: 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a  r all database.*
2100: 2a 20 66 69 6c 65 73 2e 20 20 49 66 20 69 44 62  * files.  If iDb
2110: 3e 3d 32 20 74 68 65 6e 20 72 65 73 65 74 20 74  >=2 then reset t
2120: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
2130: 6d 61 20 66 6f 72 20 6f 6e 6c 79 20 74 68 65 0a  ma for only the.
2140: 2a 2a 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 69  ** single file i
2150: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ndicated..*/.voi
2160: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e  d sqlite3ResetIn
2170: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 73 71 6c  ternalSchema(sql
2180: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
2190: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
21a0: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74 65  pElem;.  Hash te
21b0: 6d 70 31 3b 0a 20 20 48 61 73 68 20 74 65 6d 70  mp1;.  Hash temp
21c0: 32 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a  2;.  int i, j;..
21d0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
21e0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
21f0: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  );.  db->flags &
2200: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69 61  = ~SQLITE_Initia
2210: 6c 69 7a 65 64 3b 0a 20 20 66 6f 72 28 69 3d 69  lized;.  for(i=i
2220: 44 62 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  Db; i<db->nDb; i
2230: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
2240: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
2250: 20 20 20 20 74 65 6d 70 31 20 3d 20 70 44 62 2d      temp1 = pDb-
2260: 3e 74 62 6c 48 61 73 68 3b 0a 20 20 20 20 74 65  >tblHash;.    te
2270: 6d 70 32 20 3d 20 70 44 62 2d 3e 74 72 69 67 48  mp2 = pDb->trigH
2280: 61 73 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ash;.    sqlite3
2290: 48 61 73 68 49 6e 69 74 28 26 70 44 62 2d 3e 74  HashInit(&pDb->t
22a0: 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  rigHash, SQLITE_
22b0: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
22c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68  .    sqlite3Hash
22d0: 43 6c 65 61 72 28 26 70 44 62 2d 3e 61 46 4b 65  Clear(&pDb->aFKe
22e0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48  y);.    sqlite3H
22f0: 61 73 68 43 6c 65 61 72 28 26 70 44 62 2d 3e 69  ashClear(&pDb->i
2300: 64 78 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72  dxHash);.    for
2310: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
2320: 68 46 69 72 73 74 28 26 74 65 6d 70 32 29 3b 20  hFirst(&temp2); 
2330: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
2340: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
2350: 6d 29 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67  m)){.      Trigg
2360: 65 72 20 2a 70 54 72 69 67 67 65 72 20 3d 20 73  er *pTrigger = s
2370: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2380: 6c 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lem);.      sqli
2390: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
23a0: 28 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20  (pTrigger);.    
23b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  }.    sqlite3Has
23c0: 68 43 6c 65 61 72 28 26 74 65 6d 70 32 29 3b 0a  hClear(&temp2);.
23d0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
23e0: 6e 69 74 28 26 70 44 62 2d 3e 74 62 6c 48 61 73  nit(&pDb->tblHas
23f0: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
2400: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 66  TRING, 0);.    f
2410: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
2420: 61 73 68 46 69 72 73 74 28 26 74 65 6d 70 31 29  ashFirst(&temp1)
2430: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
2440: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
2450: 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 54 61 62  lem)){.      Tab
2460: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
2470: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
2480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
2490: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
24a0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
24b0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
24c0: 28 26 74 65 6d 70 31 29 3b 0a 20 20 20 20 44 62  (&temp1);.    Db
24d0: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
24e0: 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , i, DB_SchemaLo
24f0: 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69  aded);.    if( i
2500: 44 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db>0 ) return;. 
2510: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62   }.  assert( iDb
2520: 3d 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  ==0 );.  db->fla
2530: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
2540: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 20 20  ternChanges;..  
2550: 2f 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  /* If one or mor
2560: 65 20 6f 66 20 74 68 65 20 61 75 78 69 6c 69 61  e of the auxilia
2570: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2580: 73 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  s has been close
2590: 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 6d  d,.  ** then rem
25a0: 6f 76 65 20 74 68 65 6e 20 66 72 6f 6d 20 74 68  ove then from th
25b0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
25c0: 62 61 73 65 20 6c 69 73 74 2e 20 20 57 65 20 74  base list.  We t
25d0: 61 6b 65 20 74 68 65 0a 20 20 2a 2a 20 6f 70 70  ake the.  ** opp
25e0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 64 6f 20 74  ortunity to do t
25f0: 68 69 73 20 68 65 72 65 20 73 69 6e 63 65 20 77  his here since w
2600: 65 20 68 61 76 65 20 6a 75 73 74 20 64 65 6c 65  e have just dele
2610: 74 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20  ted all of the. 
2620: 20 2a 2a 20 73 63 68 65 6d 61 20 68 61 73 68 20   ** schema hash 
2630: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 72 65  tables and there
2640: 66 6f 72 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  fore do not have
2650: 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 63 68 61   to make any cha
2660: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 61 6e 79  nges.  ** to any
2670: 20 6f 66 20 74 68 6f 73 65 20 74 61 62 6c 65 73   of those tables
2680: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
2690: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
26a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
26b0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
26c0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
26d0: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
26e0: 20 20 69 66 28 20 70 44 62 2d 3e 70 41 75 78 20    if( pDb->pAux 
26f0: 26 26 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78  && pDb->xFreeAux
2700: 20 29 20 70 44 62 2d 3e 78 46 72 65 65 41 75 78   ) pDb->xFreeAux
2710: 28 70 44 62 2d 3e 70 41 75 78 29 3b 0a 20 20 20  (pDb->pAux);.   
2720: 20 20 20 70 44 62 2d 3e 70 41 75 78 20 3d 20 30     pDb->pAux = 0
2730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2740: 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e  r(i=j=2; i<db->n
2750: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
2760: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
2770: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
2780: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
2790: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
27a0: 72 65 65 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  ree(pDb->zName);
27b0: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
27c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
27d0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
27e0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
27f0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
2800: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
2810: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
2820: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
2830: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
2840: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
2850: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
2860: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
2870: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
2880: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
2890: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
28a0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
28b0: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
28c0: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
28d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
28e0: 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e  ->aDb);.    db->
28f0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
2900: 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tic;.  }.}../*.*
2910: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2920: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
2930: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  r a rollback occ
2940: 75 72 73 2e 20 20 49 66 20 74 68 65 72 65 20 77  urs.  If there w
2950: 65 72 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 68  ere.** schema ch
2960: 61 6e 67 65 73 20 64 75 72 69 6e 67 20 74 68 65  anges during the
2970: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2980: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 72 65  en we have to re
2990: 73 65 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72  set the.** inter
29a0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 20  nal hash tables 
29b0: 61 6e 64 20 72 65 6c 6f 61 64 20 74 68 65 6d 20  and reload them 
29c0: 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2f 0a 76 6f  from disk..*/.vo
29d0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
29e0: 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  ckInternalChange
29f0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
2a00: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
2a10: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
2a20: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
2a30: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
2a40: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
2a50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a70: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
2a80: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
2a90: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
2aa0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
2ab0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
2ac0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
2ad0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
2ae0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  es;.}../*.** Cle
2af0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
2b00: 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  mes from a table
2b10: 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61   or view..*/.sta
2b20: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 52  tic void sqliteR
2b30: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
2b40: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
2b50: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
2b60: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
2b70: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
2b80: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
2b90: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 20 69 3c  pTable->aCol; i<
2ba0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b  pTable->nCol; i+
2bb0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2bc0: 73 71 6c 69 74 65 46 72 65 65 28 70 43 6f 6c 2d  sqliteFree(pCol-
2bd0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
2be0: 69 74 65 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 44  iteFree(pCol->zD
2bf0: 66 6c 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  flt);.    sqlite
2c00: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Free(pCol->zType
2c10: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
2c20: 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  ree(pTable->aCol
2c30: 29 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  );.  pTable->aCo
2c40: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
2c50: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nCol = 0;.}../*
2c60: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d  .** Remove the m
2c70: 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63  emory data struc
2c80: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
2c90: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a   with the given.
2ca0: 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68  ** Table.  No ch
2cb0: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
2cc0: 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72  o disk by this r
2cd0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
2ce0: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
2cf0: 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61  deletes the data
2d00: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20   structure.  It 
2d10: 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a  does not unlink.
2d20: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74  ** the table dat
2d30: 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  a structure from
2d40: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
2d50: 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65    Nor does it re
2d60: 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20  move.** foreign 
2d70: 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71  keys from the sq
2d80: 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20  lite.aFKey hash 
2d90: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
2da0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
2db0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2dc0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
2dd0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
2de0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2df0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
2e00: 2a 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73  **.** Indices as
2e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2e20: 65 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69  e table are unli
2e30: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64  nked from the "d
2e40: 62 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63  b".** data struc
2e50: 74 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c  ture if db!=NULL
2e60: 2e 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20  .  If db==NULL, 
2e70: 69 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64  indices attached
2e80: 20 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   to.** the table
2e90: 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75   are deleted, bu
2ea0: 74 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  t it is assumed 
2eb0: 74 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64  they have alread
2ec0: 79 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b  y been.** unlink
2ed0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2ee0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
2ef0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
2f00: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
2f10: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
2f20: 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  ext;.  FKey *pFK
2f30: 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a  ey, *pNextFKey;.
2f40: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
2f50: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
2f60: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
2f70: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
2f80: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20  ith this table. 
2f90: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
2fa0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
2fb0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
2fc0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
2fd0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
2fe0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
2ff0: 20 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 70 54   pIndex->iDb==pT
3000: 61 62 6c 65 2d 3e 69 44 62 20 7c 7c 20 28 70 54  able->iDb || (pT
3010: 61 62 6c 65 2d 3e 69 44 62 3d 3d 30 20 26 26 20  able->iDb==0 && 
3020: 70 49 6e 64 65 78 2d 3e 69 44 62 3d 3d 31 29 20  pIndex->iDb==1) 
3030: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c  );.    sqliteDel
3040: 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  eteIndex(db, pIn
3050: 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  dex);.  }..  /* 
3060: 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69  Delete all forei
3070: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
3080: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
3090: 6c 65 2e 20 20 54 68 65 20 6b 65 79 73 0a 20 20  le.  The keys.  
30a0: 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  ** should have a
30b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 75 6e 6c 69  lready been unli
30c0: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62  nked from the db
30d0: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
30e0: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
30f0: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3100: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3110: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3120: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3130: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3140: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
3150: 65 2d 3e 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  e->iDb<db->nDb )
3160: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3170: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
3180: 62 2d 3e 61 44 62 5b 70 54 61 62 6c 65 2d 3e 69  b->aDb[pTable->i
3190: 44 62 5d 2e 61 46 4b 65 79 2c 0a 20 20 20 20 20  Db].aFKey,.     
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
31c0: 2c 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  , strlen(pFKey->
31d0: 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20 29  zTo)+1)!=pFKey )
31e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
31f0: 28 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20  (pFKey);.  }..  
3200: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
3210: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
3220: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
3230: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
3240: 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73  mes(pTable);.  s
3250: 71 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65  qliteFree(pTable
3260: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
3270: 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 7a  teFree(pTable->z
3280: 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74  ColAff);.  sqlit
3290: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
32a0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
32b0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
32c0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
32d0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
32e0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
32f0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3300: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
3310: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
3320: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
3330: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3340: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
3350: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3360: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
3370: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3380: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3390: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
33a0: 65 20 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46  e *p;.  FKey *pF
33b0: 31 2c 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70  1, *pF2;.  Db *p
33c0: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  Db;..  assert( d
33d0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
33e0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
33f0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
3400: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26  ert( zTabName &&
3410: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a   zTabName[0] );.
3420: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3430: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
3440: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
3450: 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  pDb->tblHash, zT
3460: 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a  abName, strlen(z
3470: 54 61 62 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a  TabName)+1, 0);.
3480: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66    if( p ){.    f
3490: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
34a0: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
34b0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
34c0: 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65   int nTo = strle
34d0: 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  n(pF1->zTo) + 1;
34e0: 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c  .      pF2 = sql
34f0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44  ite3HashFind(&pD
3500: 62 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a  b->aFKey, pF1->z
3510: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
3520: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
3530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
3540: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
3550: 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c  aFKey, pF1->zTo,
3560: 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65 78 74   nTo, pF1->pNext
3570: 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  To);.      }else
3580: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
3590: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
35a0: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
35b0: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
35c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 32  .        if( pF2
35d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
35e0: 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 46 31  2->pNextTo = pF1
35f0: 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 20  ->pNextTo;.     
3600: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3610: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
3620: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29  leteTable(db, p)
3630: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
3640: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
3650: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
3660: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
3670: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
3680: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
3690: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
36a0: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 20 77 69  that.** token wi
36b0: 74 68 20 61 6e 79 20 71 75 6f 74 61 74 69 6f 6e  th any quotation
36c0: 73 20 72 65 6d 6f 76 65 64 2e 20 20 53 70 61 63  s removed.  Spac
36d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
36e0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
36f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3700: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
3710: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
3720: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
3730: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
3740: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
3750: 72 65 61 6c 6c 79 20 6a 75 73 74 20 70 6f 69 6e  really just poin
3760: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
3770: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
3780: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
3790: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
37a0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
37b0: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
37c0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
37d0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
37e0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
37f0: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
3800: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
3810: 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e 61  Token(Token *pNa
3820: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
3830: 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20  me;.  if( pName 
3840: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
3850: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4e 61  qliteStrNDup(pNa
3860: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
3870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
3880: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
3890: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
38a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
38b0: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
38c0: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
38d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
38e0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
38f0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
3900: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
3910: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
3920: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
3930: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3940: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
3950: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62  Vdbe *v, int iDb
3960: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
3970: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
3980: 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
3990: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
39a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
39b0: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
39c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
39d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
39e0: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29  umColumns, 0, 5)
39f0: 3b 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  ; /* sqlite_mast
3a00: 65 72 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73  er has 5 columns
3a10: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   */.}../*.** The
3a20: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
3a30: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
3a40: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
3a50: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
3a60: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
3a70: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
3a80: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
3a90: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
3aa0: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
3ab0: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
3ac0: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
3ad0: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
3ae0: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
3af0: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
3b00: 20 66 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20   findDb(sqlite3 
3b10: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
3b20: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 44  e){.  int i;.  D
3b30: 62 20 2a 70 44 62 3b 0a 20 20 66 6f 72 28 70 44  b *pDb;.  for(pD
3b40: 62 3d 64 62 2d 3e 61 44 62 2c 20 69 3d 30 3b 20  b=db->aDb, i=0; 
3b50: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 2c 20  i<db->nDb; i++, 
3b60: 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  pDb++){.    if( 
3b70: 70 4e 61 6d 65 2d 3e 6e 3d 3d 73 74 72 6c 65 6e  pName->n==strlen
3b80: 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20  (pDb->zName) && 
3b90: 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69  .        0==sqli
3ba0: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 44 62 2d  te3StrNICmp(pDb-
3bb0: 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a  >zName, pName->z
3bc0: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 20 29 7b 0a 20  , pName->n) ){. 
3bd0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20       return i;. 
3be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3bf0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  n -1;.}../* The 
3c00: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
3c10: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
3c20: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
3c30: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
3c40: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
3c50: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
3c60: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
3c70: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
3c80: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
3c90: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
3ca0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
3cb0: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
3cc0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
3cd0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
3ce0: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
3cf0: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
3d00: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
3d10: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
3d20: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
3d30: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
3d40: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
3d50: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
3d60: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
3d70: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
3d80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
3d90: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
3da0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
3db0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
3dc0: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
3dd0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
3de0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
3df0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
3e00: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
3e10: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
3e20: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
3e30: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
3e40: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
3e50: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
3e60: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
3e70: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
3e80: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
3e90: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
3ea0: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
3eb0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
3ec0: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
3ed0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
3ee0: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
3ef0: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
3f00: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
3f10: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
3f20: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
3f30: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
3f40: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
3f50: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f70: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
3f80: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
3f90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3fa0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
3fb0: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
3fc0: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61  e2->n>0 ){.    a
3fd0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
3fe0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55  .busy );.    *pU
3ff0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
4000: 20 20 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62      iDb = findDb
4010: 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  (db, pName1);.  
4020: 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
4030: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4040: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
4050: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25  known database %
4060: 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  T", pName1);.   
4070: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
4080: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
4090: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
40a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
40b0: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
40c0: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
40d0: 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  );.    iDb = db-
40e0: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a  >init.iDb;.    *
40f0: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31  pUnqual = pName1
4100: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
4110: 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Db;.}../*.** Thi
4120: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4130: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
4140: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
4150: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
4160: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
4170: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
4180: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
4190: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
41a0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
41b0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
41c0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
41d0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
41e0: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
41f0: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
4200: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
4210: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
4220: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
4230: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
4240: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4250: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
4260: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
4270: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
4280: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
4290: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
42a0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
42b0: 74 2e 62 75 73 79 20 26 26 20 30 3d 3d 73 71 6c  t.busy && 0==sql
42c0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
42d0: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
42e0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
42f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4300: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
4310: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
4320: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
4330: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4340: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4370: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
4380: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
4390: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
43a0: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
43b0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
43c0: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
43d0: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
43e0: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
43f0: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
4400: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
4410: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
4420: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
4430: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
4440: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
4450: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
4460: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
4470: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
4480: 65 0a 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65  e.** pStart toke
4490: 6e 20 69 73 20 74 68 65 20 43 52 45 41 54 45 20  n is the CREATE 
44a0: 61 6e 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65  and pName is the
44b0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68   table name.  Th
44c0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
44d0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
44e0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
44f0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
4500: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
4510: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
4520: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
4530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
4540: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
4550: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
4560: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
4570: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
4580: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
4590: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
45a0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
45b0: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
45c0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
45d0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
45e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
45f0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
4600: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
4610: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
4620: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
4630: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
4640: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
4650: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
4660: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
4670: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
4680: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
4690: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
46a0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
46b0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
46c0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
46d0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
46e0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
46f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
4700: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
4710: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
4720: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
4730: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
4740: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
4750: 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
4760: 2f 2a 20 54 68 65 20 22 43 52 45 41 54 45 22 20  /* The "CREATE" 
4770: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  token */.  Token
4780: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
4790: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
47a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
47b0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
47c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
47d0: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
47e0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
47f0: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
4800: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
4810: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
4820: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
4830: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4840: 69 73 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20  isView       /* 
4850: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
4860: 61 20 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54  a VIEW */.){.  T
4870: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
4880: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63  Index *pIdx;.  c
4890: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71  har *zName;.  sq
48a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
48b0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
48c0: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
48d0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
48e0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
48f0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
4900: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
4910: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
4920: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
4930: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
4940: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61   */..  /* The ta
4950: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
4960: 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61   to create is pa
4970: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
4980: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
4990: 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20    ** pName1 and 
49a0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
49b0: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
49c0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
49d0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  or example:.  **
49e0: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
49f0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
4a00: 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65  ;.  ** .  ** The
4a10: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4a20: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
4a30: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
4a40: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
4a50: 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e    ** the table n
4a60: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
4a70: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
4a80: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41  :.  **.  ** CREA
4a90: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
4aa0: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
4ab0: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
4ac0: 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61  to "yyy" and pNa
4ad0: 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a  me2 is ""..  **.
4ae0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65    ** The call be
4af0: 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61  low sets the pNa
4b00: 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  me pointer to po
4b10: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
4b20: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a   (pName1 or.  **
4b30: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
4b40: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
4b50: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
4b60: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44   The variable iD
4b70: 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f  b is.  ** set to
4b80: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
4b90: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
4ba0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
4bb0: 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20  w is to be.  ** 
4bc0: 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f  created in..  */
4bd0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
4be0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
4bf0: 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
4c00: 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69  e2, &pName);.  i
4c10: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
4c20: 6e 3b 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20  n;.  if( isTemp 
4c30: 26 26 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  && iDb>1 ){.    
4c40: 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61  /* If creating a
4c50: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65   temp table, the
4c60: 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65   name may not be
4c70: 20 71 75 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20   qualified */.  
4c80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4c90: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
4ca0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
4cb0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
4cc0: 69 65 64 22 29 3b 0a 20 20 20 20 70 50 61 72 73  ied");.    pPars
4cd0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
4ce0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
4cf0: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
4d00: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
4d10: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
4d20: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
4d30: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4d40: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(pName);.  if( 
4d50: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
4d60: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
4d70: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
4d80: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
4d90: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
4da0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4db0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
4dc0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
4dd0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
4de0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
4df0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
4e00: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
4e10: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
4e20: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
4e30: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
4e40: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
4e50: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
4e60: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
4e70: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
4e80: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
4e90: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
4ea0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
4eb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  ){.      sqliteF
4ec0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
4ed0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
4ee0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
4ef0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65  {.      if( isTe
4f00: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
4f10: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4f20: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
4f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f40: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4f50: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
4f60: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4f70: 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 65 6d  .      if( isTem
4f80: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
4f90: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
4fa0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
4fb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4fc0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
4fd0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
4fe0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4ff0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
5000: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
5010: 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  de, zName, 0, zD
5020: 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
5030: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
5040: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
5050: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
5060: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
5070: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
5080: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
5090: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
50a0: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
50b0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
50c0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
50d0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
50e0: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
50f0: 2a 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a  * it does..  */.
5100: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5110: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
5120: 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65 74  ma(pParse) ) ret
5130: 75 72 6e 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20  urn;.  pTable = 
5140: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
5150: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
5160: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
5170: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b  .  if( pTable ){
5180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5190: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
51a0: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
51b0: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
51c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
51d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
51e0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 49  n;.  }.  if( (pI
51f0: 64 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  dx = sqlite3Find
5200: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
5210: 20 30 29 29 21 3d 30 20 26 26 20 0a 20 20 20 20   0))!=0 && .    
5220: 20 20 28 20 69 44 62 3d 3d 30 20 7c 7c 20 21 64    ( iDb==0 || !d
5230: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
5240: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5250: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
5260: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
5270: 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73  n index named %s
5280: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  ", zName);.    s
5290: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
52a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
52b0: 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  }.  pTable = sql
52c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
52d0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
52e0: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
52f0: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
5300: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5310: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
5330: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
5340: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  urn;.  }.  pTabl
5350: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
5360: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
5370: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
5380: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62  aCol = 0;.  pTab
5390: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
53a0: 20 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78    pTable->pIndex
53b0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 0;.  pTable->
53c0: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28  iDb = iDb;.  if(
53d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
53e0: 6c 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65  le ) sqlite3Dele
53f0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72  teTable(db, pPar
5400: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
5410: 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
5420: 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20  ble = pTable;.. 
5430: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
5440: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
5450: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
5460: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
5470: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
5480: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
5490: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
54a0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
54b0: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
54c0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
54d0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
54e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
54f0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
5500: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
5510: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
5520: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
5530: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
5540: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
5550: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
5560: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
5570: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
5580: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
5590: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
55a0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
55b0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
55c0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
55d0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
55e0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
55f0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
5600: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
5610: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
5620: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
5630: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
5640: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
5650: 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 2f 2a 20  0, iDb);.    /* 
5660: 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e 65 77  Every time a new
5670: 20 74 61 62 6c 65 20 69 73 20 63 72 65 61 74 65   table is create
5680: 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72 6d 61  d the file-forma
5690: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e 63  t.    ** and enc
56a0: 6f 64 69 6e 67 20 6d 65 74 61 2d 76 61 6c 75 65  oding meta-value
56b0: 73 20 61 72 65 20 73 65 74 20 69 6e 20 74 68 65  s are set in the
56c0: 20 64 61 74 61 62 61 73 65 2c 20 69 6e 0a 20 20   database, in.  
56d0: 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 69    ** case this i
56e0: 73 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c  s the first tabl
56f0: 65 20 63 72 65 61 74 65 64 2e 0a 20 20 20 20 2a  e created..    *
5700: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
5710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5720: 65 67 65 72 2c 20 64 62 2d 3e 66 69 6c 65 5f 66  eger, db->file_f
5730: 6f 72 6d 61 74 2c 20 30 29 3b 0a 20 20 20 20 73  ormat, 0);.    s
5740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5750: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
5760: 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 73 71   iDb, 1);.    sq
5770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5780: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5790: 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73  ->enc, 0);.    s
57a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
57b0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
57c0: 20 69 44 62 2c 20 34 29 3b 0a 0a 20 20 20 20 73   iDb, 4);..    s
57d0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
57e0: 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a 20  Table(v, iDb);. 
57f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5800: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 65 63  dOp(v, OP_NewRec
5810: 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  no, 0, 0);.    s
5820: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5830: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
5840: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
5860: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
5870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5880: 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65  p(v, OP_PutIntKe
5890: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  y, 0, 0);.  }.}.
58a0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
58b0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
58c0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
58d0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
58e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
58f0: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
5900: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
5910: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
5920: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
5930: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5940: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
5950: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
5960: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
5970: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
5980: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
5990: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
59a0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
59b0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
59c0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
59d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
59e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
59f0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
5a00: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
5a10: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
5a20: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
5a30: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
5a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
5a50: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5a60: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
5a70: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
5a80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
5a90: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
5aa0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5ab0: 43 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  Cmp(z, p->aCol[i
5ac0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
5ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5ae0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
5af0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
5b00: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
5b10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5b20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
5b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5b40: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
5b50: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
5b60: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
5b70: 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  w = sqliteReallo
5b80: 63 28 20 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e  c( p->aCol, (p->
5b90: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
5ba0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
5bb0: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
5bc0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43  eturn;.    p->aC
5bd0: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
5be0: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
5bf0: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
5c00: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
5c10: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
5c20: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
5c30: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
5c40: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
5c50: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
5c60: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
5c70: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
5c80: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
5c90: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
5ca0: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
5cb0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
5cc0: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
5cd0: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
5ce0: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
5cf0: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
5d00: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
5d10: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
5d20: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70  _NONE;.  pCol->p
5d30: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
5d40: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5d50: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
5d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5d70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
5d80: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
5d90: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
5da0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
5db0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5dc0: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
5dd0: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
5de0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
5df0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
5e00: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5e10: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
5e20: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
5e30: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5e40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
5e50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
5e60: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
5e70: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
5e80: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
5e90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
5ea0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
5eb0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
5ec0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
5ed0: 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d  Col-1;.  if( i>=
5ee0: 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e  0 ) p->aCol[i].n
5ef0: 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72  otNull = onError
5f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5f10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5f20: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
5f30: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
5f40: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
5f50: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
5f60: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
5f70: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
5f80: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
5f90: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
5fa0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
5fb0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
5fc0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
5fd0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
5fe0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
5ff0: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
6000: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
6010: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
6020: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
6030: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
6040: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
6050: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6060: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
6070: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
6080: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
6090: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
60a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
60b0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
60c0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
60d0: 2a 70 46 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a  *pFirst, Token *
60e0: 70 4c 61 73 74 29 7b 0a 20 20 54 61 62 6c 65 20  pLast){.  Table 
60f0: 2a 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  *p;.  int i, j;.
6100: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
6110: 2a 7a 2c 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75  *z, **pz;.  Colu
6120: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20  mn *pCol;.  if( 
6130: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
6140: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
6150: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
6160: 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20  ol-1;.  if( i<0 
6170: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
6180: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a   = &p->aCol[i];.
6190: 20 20 70 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54    pz = &pCol->zT
61a0: 79 70 65 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74  ype;.  n = pLast
61b0: 2d 3e 6e 20 2b 20 28 70 4c 61 73 74 2d 3e 7a 20  ->n + (pLast->z 
61c0: 2d 20 70 46 69 72 73 74 2d 3e 7a 29 3b 0a 20 20  - pFirst->z);.  
61d0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54  assert( pCol->zT
61e0: 79 70 65 3d 3d 30 20 29 3b 0a 20 20 7a 20 3d 20  ype==0 );.  z = 
61f0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
6200: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 2e  lite3MPrintf("%.
6210: 2a 73 22 2c 20 6e 2c 20 70 46 69 72 73 74 2d 3e  *s", n, pFirst->
6220: 7a 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  z);.  if( z==0 )
6230: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
6240: 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  =j=0; z[i]; i++)
6250: 7b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 5b  {.    int c = z[
6260: 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70  i];.    if( issp
6270: 61 63 65 28 63 29 20 29 20 63 6f 6e 74 69 6e 75  ace(c) ) continu
6280: 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  e;.    z[j++] = 
6290: 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  c;.  }.  z[j] = 
62a0: 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  0;.  pCol->affin
62b0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66  ity = sqlite3Aff
62c0: 69 6e 69 74 79 54 79 70 65 28 7a 2c 20 6e 29 3b  inityType(z, n);
62d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 67 69  .}../*.** The gi
62e0: 76 65 6e 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  ven token is the
62f0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
6300: 6f 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  or the last colu
6310: 6d 6e 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  mn added to.** t
6320: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
6330: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
6340: 63 74 69 6f 6e 2e 20 20 49 66 20 22 6d 69 6e 75  ction.  If "minu
6350: 73 46 6c 61 67 22 20 69 73 20 74 72 75 65 2c 20  sFlag" is true, 
6360: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
6370: 76 61 6c 75 65 20 74 6f 6b 65 6e 20 77 61 73 20  value token was 
6380: 70 72 65 63 65 64 65 64 20 62 79 20 61 20 6d 69  preceded by a mi
6390: 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a 0a 2a 2a 20  nus sign..**.** 
63a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
63b0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
63c0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
63d0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
63e0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
63f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6400: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6410: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
6420: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
6430: 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20 69 6e 74 20  oken *pVal, int 
6440: 6d 69 6e 75 73 46 6c 61 67 29 7b 0a 20 20 54 61  minusFlag){.  Ta
6450: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
6460: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
6470: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
6480: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
6490: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
64a0: 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69 3c  nCol-1;.  if( i<
64b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
64c0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d  sert( p->aCol[i]
64d0: 2e 7a 44 66 6c 74 3d 3d 30 20 29 3b 0a 20 20 7a  .zDflt==0 );.  z
64e0: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 44   = p->aCol[i].zD
64f0: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  flt = sqlite3MPr
6500: 69 6e 74 66 28 22 25 73 25 54 22 2c 20 6d 69 6e  intf("%s%T", min
6510: 75 73 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22  usFlag ? "-" : "
6520: 22 2c 20 70 56 61 6c 29 3b 0a 20 20 73 71 6c 69  ", pVal);.  sqli
6530: 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 7d  te3Dequote(z);.}
6540: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
6550: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
6560: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
6570: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
6580: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
6590: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
65a0: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
65b0: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
65c0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
65d0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
65e0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
65f0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
6600: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
6610: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
6620: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
6630: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
6640: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
6650: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
6660: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
6670: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
6680: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
6690: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
66a0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
66b0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
66c0: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
66d0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
66e0: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
66f0: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
6700: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
6710: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
6720: 20 72 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70   row id.  (Excep
6730: 74 69 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63  tion:.** For bac
6740: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
6750: 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
6760: 64 61 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f  databases, do no
6770: 74 20 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20  t do this.** if 
6780: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
6790: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
67a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20  s less than 1.) 
67b0: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
67c0: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
67d0: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
67e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
67f0: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
6800: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
6810: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
6820: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
6830: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
6840: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
6850: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
6860: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
6870: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
6880: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
6890: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
68a0: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
68b0: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
68c0: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
68d0: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
68e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
68f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
6900: 64 50 72 69 6d 61 72 79 4b 65 79 28 50 61 72 73  dPrimaryKey(Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
6920: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
6930: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
6940: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
6950: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
6960: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
6970: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
6980: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
6990: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
69a0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
69b0: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
69c0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
69d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
69e0: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
69f0: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
6a00: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
6a10: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
6a20: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
6a30: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
6a40: 20 7d 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72   }.  pTab->hasPr
6a50: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28  imKey = 1;.  if(
6a60: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
6a70: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
6a80: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
6a90: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50  ->aCol[iCol].isP
6aa0: 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65  rimKey = 1;.  }e
6ab0: 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
6ac0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
6ad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
6ae0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
6af0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
6b00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
6b10: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
6b20: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
6b30: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
6b40: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
6b50: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6b60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6b70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
6b80: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70  l<pTab->nCol ) p
6b90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
6ba0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
6bb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
6bc0: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
6bd0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
6be0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
6bf0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
6c00: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
6c10: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
6c20: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
6c30: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
6c40: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
6c50: 4e 54 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20  NTEGER")==0 ){. 
6c60: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
6c70: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
6c80: 3e 6b 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72  >keyConf = onErr
6c90: 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  or;.  }else{.   
6ca0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
6cb0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
6cc0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
6cd0: 72 6f 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ror, 0, 0);.    
6ce0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
6cf0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
6d00: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
6d10: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
6d20: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
6d30: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
6d40: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
6d50: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
6d60: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
6d70: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
6d80: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
6d90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6da0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
6db0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
6dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6dd0: 2c 20 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20  , int nType){.  
6de0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65  Table *p;.  Inde
6df0: 78 20 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53  x *pIdx;.  CollS
6e00: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
6e10: 20 69 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20   i;..  if( (p = 
6e20: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6e30: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
6e40: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
6e50: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
6e60: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
6e70: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
6e80: 6e 54 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f  nType);.  p->aCo
6e90: 6c 5b 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f  l[i].pColl = pCo
6ea0: 6c 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ll;..  /* If the
6eb0: 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61   column is decla
6ec0: 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50  red as "<name> P
6ed0: 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41  RIMARY KEY COLLA
6ee0: 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a  TE <type>",.  **
6ef0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
6f00: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
6f10: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
6f20: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
6f30: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
6f40: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
6f50: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
6f60: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
6f70: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20  */.  for(pIdx = 
6f80: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
6f90: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
6fa0: 74 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t){.    assert( 
6fb0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31  pIdx->nColumn==1
6fc0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
6fd0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
6fe0: 20 29 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f   ) pIdx->keyInfo
6ff0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c  .aColl[0] = pCol
7000: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
7010: 4c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  Locate and retur
7020: 6e 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  n an entry from 
7030: 74 68 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20  the db.aCollSeq 
7040: 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74  hash table. If t
7050: 68 65 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63  he entry.** spec
7060: 69 66 69 65 64 20 62 79 20 7a 4e 61 6d 65 20 61  ified by zName a
7070: 6e 64 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20  nd nName is not 
7080: 66 6f 75 6e 64 20 61 6e 64 20 70 61 72 61 6d 65  found and parame
7090: 74 65 72 20 27 63 72 65 61 74 65 27 20 69 73 0a  ter 'create' is.
70a0: 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72  ** true, then cr
70b0: 65 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  eate a new entry
70c0: 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  . Otherwise retu
70d0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45  rn NULL..**.** E
70e0: 61 63 68 20 70 6f 69 6e 74 65 72 20 73 74 6f 72  ach pointer stor
70f0: 65 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ed in the sqlite
7100: 33 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20  3.aCollSeq hash 
7110: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61  table contains a
7120: 6e 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 74 68  n.** array of th
7130: 72 65 65 20 43 6f 6c 6c 53 65 71 20 73 74 72 75  ree CollSeq stru
7140: 63 74 75 72 65 73 2e 20 54 68 65 20 66 69 72 73  ctures. The firs
7150: 74 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  t is the collati
7160: 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 70  on sequence.** p
7170: 72 65 66 66 65 72 72 65 64 20 66 6f 72 20 55 54  refferred for UT
7180: 46 2d 38 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  F-8, the second 
7190: 55 54 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74 68  UTF-16le, and th
71a0: 65 20 74 68 69 72 64 20 55 54 46 2d 31 36 62 65  e third UTF-16be
71b0: 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20 69  ..**.** Stored i
71c0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
71d0: 20 74 68 65 20 74 68 72 65 65 20 63 6f 6c 6c 61   the three colla
71e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 69  tion sequences i
71f0: 73 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  s a copy of.** t
7200: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
7210: 75 65 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70 6f  uence name. A po
7220: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74  inter to this st
7230: 72 69 6e 67 20 69 73 20 73 74 6f 72 65 64 20 69  ring is stored i
7240: 6e 0a 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61 74  n.** each collat
7250: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 73 74 72  ion sequence str
7260: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
7270: 63 20 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e 64  c CollSeq * find
7280: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20  CollSeqEntry(.  
7290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
72a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
72b0: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
72c0: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
72d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
72e0: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
72f0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
7300: 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20  zName);.  pColl 
7310: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
7320: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
7330: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
7340: 0a 20 20 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20  .  if( 0==pColl 
7350: 26 26 20 63 72 65 61 74 65 20 29 7b 0a 20 20 20  && create ){.   
7360: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d   pColl = sqliteM
7370: 61 6c 6c 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28  alloc( 3*sizeof(
7380: 2a 70 43 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20  *pColl) + nName 
7390: 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 1 );.    if( p
73a0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
73b0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28  oll[0].zName = (
73c0: 63 68 61 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b  char*)&pColl[3];
73d0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e  .      pColl[0].
73e0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
73f0: 38 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31  8;.      pColl[1
7400: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
7410: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
7420: 20 20 70 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d    pColl[1].enc =
7430: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b   SQLITE_UTF16LE;
7440: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e  .      pColl[2].
7450: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
7460: 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20  pColl[3];.      
7470: 70 43 6f 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53  pColl[2].enc = S
7480: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
7490: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c       memcpy(pCol
74a0: 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[0].zName, zNam
74b0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
74c0: 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b   pColl[0].zName[
74d0: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
74e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
74f0: 65 72 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ert(&db->aCollSe
7500: 71 2c 20 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d  q, pColl[0].zNam
7510: 65 2c 20 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29  e, nName, pColl)
7520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7530: 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f  turn pColl;.}../
7540: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
7550: 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  Name points to a
7560: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73   UTF-8 encoded s
7570: 74 72 69 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65  tring nName byte
7580: 73 20 6c 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72  s long..** Retur
7590: 6e 20 74 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70  n the CollSeq* p
75a0: 6f 69 6e 74 65 72 20 66 6f 72 20 74 68 65 20 63  ointer for the c
75b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
75c0: 65 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a  e named zName.**
75d0: 20 66 6f 72 20 74 68 65 20 65 6e 63 6f 64 69 6e   for the encodin
75e0: 67 20 27 65 6e 63 27 20 66 72 6f 6d 20 74 68 65  g 'enc' from the
75f0: 20 64 61 74 61 62 61 73 65 20 27 64 62 27 2e 0a   database 'db'..
7600: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 6e 74  **.** If the ent
7610: 72 79 20 73 70 65 63 69 66 69 65 64 20 69 73 20  ry specified is 
7620: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 64 20 27 63  not found and 'c
7630: 72 65 61 74 65 27 20 69 73 20 74 72 75 65 2c 20  reate' is true, 
7640: 74 68 65 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a  then create a.**
7650: 20 6e 65 77 20 65 6e 74 72 79 2e 20 20 4f 74 68   new entry.  Oth
7660: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e 55  erwise return NU
7670: 4c 4c 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  LL..*/.CollSeq *
7680: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
7690: 65 71 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  eq(.  sqlite3 *d
76a0: 62 2c 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 63  b,.  u8 enc,.  c
76b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
76c0: 2c 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20  ,.  int nName,. 
76d0: 20 69 6e 74 20 63 72 65 61 74 65 0a 29 7b 0a 20   int create.){. 
76e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
76f0: 3d 20 66 69 6e 64 43 6f 6c 6c 53 65 71 45 6e 74  = findCollSeqEnt
7700: 72 79 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  ry(db, zName, nN
7710: 61 6d 65 2c 20 63 72 65 61 74 65 29 3b 0a 20 20  ame, create);.  
7720: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 55  assert( SQLITE_U
7730: 54 46 38 3d 3d 31 20 26 26 20 53 51 4c 49 54 45  TF8==1 && SQLITE
7740: 5f 55 54 46 31 36 4c 45 3d 3d 32 20 26 26 20 53  _UTF16LE==2 && S
7750: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3d 3d 33  QLITE_UTF16BE==3
7760: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 6e   );.  assert( en
7770: 63 3e 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 26  c>=SQLITE_UTF8 &
7780: 26 20 65 6e 63 3c 3d 53 51 4c 49 54 45 5f 55 54  & enc<=SQLITE_UT
7790: 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 70  F16BE );.  if( p
77a0: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 2b 3d 20  Coll ) pColl += 
77b0: 65 6e 63 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20  enc-1;.  return 
77c0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
77d0: 49 6e 76 6f 6b 65 20 74 68 65 20 27 63 6f 6c 6c  Invoke the 'coll
77e0: 61 74 69 6f 6e 20 6e 65 65 64 65 64 27 20 63 61  ation needed' ca
77f0: 6c 6c 62 61 63 6b 20 74 6f 20 72 65 71 75 65 73  llback to reques
7800: 74 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  t a collation se
7810: 71 75 65 6e 63 65 0a 2a 2a 20 69 6e 20 74 68 65  quence.** in the
7820: 20 64 61 74 61 62 61 73 65 20 74 65 78 74 20 65   database text e
7830: 6e 63 6f 64 69 6e 67 20 6f 66 20 6e 61 6d 65 20  ncoding of name 
7840: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
7850: 61 6d 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ame..** If the c
7860: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7870: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
7880: 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28   callCollNeeded(
7890: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
78a0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
78b0: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 61 73  int nName){.  as
78c0: 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c 6c  sert( !db->xColl
78d0: 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e 78  Needed || !db->x
78e0: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b 0a  CollNeeded16 );.
78f0: 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20    if( nName<0 ) 
7900: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
7910: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 2d  Name);.  if( db-
7920: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b 0a  >xCollNeeded ){.
7930: 20 20 20 20 63 68 61 72 20 2a 7a 45 78 74 65 72      char *zExter
7940: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  nal = sqliteStrN
7950: 44 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Dup(zName, nName
7960: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74  );.    if( !zExt
7970: 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a  ernal ) return;.
7980: 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65      db->xCollNee
7990: 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ded(db->pCollNee
79a0: 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74  dedArg, db, (int
79b0: 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72  )db->enc, zExter
79c0: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
79d0: 46 72 65 65 28 7a 45 78 74 65 72 6e 61 6c 29 3b  Free(zExternal);
79e0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 78  .  }.  if( db->x
79f0: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 7b 0a  CollNeeded16 ){.
7a00: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
7a10: 7a 45 78 74 65 72 6e 61 6c 3b 0a 20 20 20 20 73  zExternal;.    s
7a20: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 54  qlite3_value *pT
7a30: 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  mp = sqlite3GetT
7a40: 72 61 6e 73 69 65 6e 74 56 61 6c 75 65 28 64 62  ransientValue(db
7a50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
7a60: 6c 75 65 53 65 74 53 74 72 28 70 54 6d 70 2c 20  lueSetStr(pTmp, 
7a70: 2d 31 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  -1, zName, SQLIT
7a80: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7a90: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 45 78 74  TATIC);.    zExt
7aa0: 65 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 56  ernal = sqlite3V
7ab0: 61 6c 75 65 54 65 78 74 28 70 54 6d 70 2c 20 53  alueText(pTmp, S
7ac0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
7ad0: 45 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78  E);.    if( !zEx
7ae0: 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b  ternal ) return;
7af0: 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  .    db->xCollNe
7b00: 65 64 65 64 31 36 28 64 62 2d 3e 70 43 6f 6c 6c  eded16(db->pColl
7b10: 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28  NeededArg, db, (
7b20: 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78  int)db->enc, zEx
7b30: 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  ternal);.  }.}..
7b40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7b50: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  ne is called if 
7b60: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
7b70: 63 74 6f 72 79 20 66 61 69 6c 73 20 74 6f 20 64  ctory fails to d
7b80: 65 6c 69 76 65 72 20 61 0a 2a 2a 20 63 6f 6c 6c  eliver a.** coll
7b90: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69  ation function i
7ba0: 6e 20 74 68 65 20 62 65 73 74 20 65 6e 63 6f 64  n the best encod
7bb0: 69 6e 67 20 62 75 74 20 74 68 65 72 65 20 6d 61  ing but there ma
7bc0: 79 20 62 65 20 6f 74 68 65 72 20 76 65 72 73 69  y be other versi
7bd0: 6f 6e 73 0a 2a 2a 20 6f 66 20 74 68 69 73 20 63  ons.** of this c
7be0: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
7bf0: 6e 20 28 66 6f 72 20 6f 74 68 65 72 20 74 65 78  n (for other tex
7c00: 74 20 65 6e 63 6f 64 69 6e 67 73 29 20 61 76 61  t encodings) ava
7c10: 69 6c 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 0a  ilable. Use one.
7c20: 2a 2a 20 6f 66 20 74 68 65 73 65 20 69 6e 73 74  ** of these inst
7c30: 65 61 64 20 69 66 20 74 68 65 79 20 65 78 69 73  ead if they exis
7c40: 74 2e 20 41 76 6f 69 64 20 61 20 55 54 46 2d 38  t. Avoid a UTF-8
7c50: 20 3c 2d 3e 20 55 54 46 2d 31 36 20 63 6f 6e 76   <-> UTF-16 conv
7c60: 65 72 73 69 6f 6e 20 69 66 0a 2a 2a 20 70 6f 73  ersion if.** pos
7c70: 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  sible..*/.static
7c80: 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65   int synthCollSe
7c90: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
7ca0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
7cb0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
7cc0: 6c 6c 32 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  ll2;.  char *z =
7cd0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
7ce0: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
7cf0: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  z);.  sqlite3 *d
7d00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7d10: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
7d20: 63 20 63 6f 6e 73 74 20 75 38 20 61 45 6e 63 5b  c const u8 aEnc[
7d30: 5d 20 3d 20 7b 20 53 51 4c 49 54 45 5f 55 54 46  ] = { SQLITE_UTF
7d40: 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 55 54 46  16BE, SQLITE_UTF
7d50: 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 55 54 46  16LE, SQLITE_UTF
7d60: 38 20 7d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  8 };.  for(i=0; 
7d70: 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  i<3; i++){.    p
7d80: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
7d90: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 61  indCollSeq(db, a
7da0: 45 6e 63 5b 69 5d 2c 20 7a 2c 20 6e 2c 20 30 29  Enc[i], z, n, 0)
7db0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 32  ;.    if( pColl2
7dc0: 2d 3e 78 43 6d 70 21 3d 30 20 29 7b 0a 20 20 20  ->xCmp!=0 ){.   
7dd0: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c     memcpy(pColl,
7de0: 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28   pColl2, sizeof(
7df0: 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 20 20 20  CollSeq));.     
7e00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7e10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
7e20: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
7e30: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
7e40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7e50: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
7e60: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
7e70: 2e 2a 73 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20 7d  .*s", n, z);.  }
7e80: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b  .  pParse->nErr+
7e90: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  +;.  return SQLI
7ea0: 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
7eb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7ec0: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 63  is called on a c
7ed0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
7ee0: 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
7ef0: 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  sed to.** check 
7f00: 74 68 61 74 20 69 74 20 69 73 20 64 65 66 69 6e  that it is defin
7f10: 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e 65 64  ed. An undefined
7f20: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7f30: 6e 63 65 20 65 78 69 73 74 73 20 77 68 65 6e 0a  nce exists when.
7f40: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 69 73  ** a database is
7f50: 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63 6f 6e   loaded that con
7f60: 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
7f70: 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   to collation se
7f80: 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61 74 20  quences.** that 
7f90: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 64 65  have not been de
7fa0: 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  fined by sqlite3
7fb0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
7fc0: 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 49  n() etc..**.** I
7fd0: 66 20 72 65 71 75 69 72 65 64 2c 20 74 68 69 73  f required, this
7fe0: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74   routine calls t
7ff0: 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  he 'collation ne
8000: 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b 20 74  eded' callback t
8010: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61 20 64  o.** request a d
8020: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
8030: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8040: 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64 6f 65  nce. If this doe
8050: 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a 20 61  sn't work, .** a
8060: 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6c  n equivalent col
8070: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8080: 74 68 61 74 20 75 73 65 73 20 61 20 74 65 78 74  that uses a text
8090: 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66 65 72   encoding differ
80a0: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
80b0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
80c0: 20 73 75 62 73 74 69 74 75 74 65 64 2c 20 69 66   substituted, if
80d0: 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61 62 6c   one is availabl
80e0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
80f0: 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 50 61  3CheckCollSeq(Pa
8100: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43 6f 6c  rse *pParse, Col
8110: 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
8120: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70 43  if( pColl && !pC
8130: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
8140: 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e   /* No collation
8150: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69   sequence of thi
8160: 73 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  s type for this 
8170: 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 67 69  encoding is regi
8180: 73 74 65 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43  stered..    ** C
8190: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
81a0: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
81b0: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
81c0: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
81d0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f     */.    callCo
81e0: 6c 6c 4e 65 65 64 65 64 28 70 50 61 72 73 65 2d  llNeeded(pParse-
81f0: 3e 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >db, pColl->zNam
8200: 65 2c 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d  e, strlen(pColl-
8210: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 69 66  >zName));.    if
8220: 28 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 26  ( !pColl->xCmp &
8230: 26 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 70  & synthCollSeq(p
8240: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
8250: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8260: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
8270: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
8280: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8290: 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  ** Call sqlite3C
82a0: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 29 20 66 6f  heckCollSeq() fo
82b0: 72 20 61 6c 6c 20 63 6f 6c 6c 61 74 69 6e 67 20  r all collating 
82c0: 73 65 71 75 65 6e 63 65 73 20 69 6e 20 61 6e 20  sequences in an 
82d0: 69 6e 64 65 78 2c 0a 2a 2a 20 69 6e 20 6f 72 64  index,.** in ord
82e0: 65 72 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  er to verify tha
82f0: 74 20 61 6c 6c 20 74 68 65 20 6e 65 63 65 73 73  t all the necess
8300: 61 72 79 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ary collating se
8310: 71 75 65 6e 63 65 73 20 61 72 65 0a 2a 2a 20 6c  quences are.** l
8320: 6f 61 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oaded..*/.int sq
8330: 6c 69 74 65 33 43 68 65 63 6b 49 6e 64 65 78 43  lite3CheckIndexC
8340: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
8350: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
8360: 78 29 7b 0a 20 20 69 66 28 20 70 49 64 78 20 29  x){.  if( pIdx )
8370: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
8380: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
8390: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
83a0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
83b0: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
83c0: 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79  Parse, pIdx->key
83d0: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29  Info.aColl[i]) )
83e0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
83f0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
8400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8410: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8420: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
8430: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
8440: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
8450: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
8460: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
8470: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
8480: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
8490: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
84a0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
84b0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
84c0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
84d0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
84e0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
84f0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
8500: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
8510: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
8520: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
8530: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
8540: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
8550: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
8560: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
8570: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
8580: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
8590: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
85a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
85b0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
85c0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
85d0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
85e0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
85f0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
8600: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
8610: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
8620: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
8630: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
8640: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
8650: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
8660: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
8670: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
8680: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43  .** pParse..*/.C
8690: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
86a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
86b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
86c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
86d0: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20  nt nName){.  u8 
86e0: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
86f0: 2d 3e 65 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74  ->enc;.  u8 init
8700: 62 75 73 79 20 3d 20 70 50 61 72 73 65 2d 3e 64  busy = pParse->d
8710: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
8720: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8730: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
8740: 53 65 71 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Seq(pParse->db, 
8750: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  enc, zName, nNam
8760: 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20  e, initbusy);.  
8770: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e  if( nName<0 ) nN
8780: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
8790: 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  me);.  if( !init
87a0: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
87b0: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
87c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f   ){.    /* No co
87d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
87e0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 66 6f   of this type fo
87f0: 72 20 74 68 69 73 20 65 6e 63 6f 64 69 6e 67 20  r this encoding 
8800: 69 73 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20  is registered.. 
8810: 20 20 20 2a 2a 20 43 61 6c 6c 20 74 68 65 20 63     ** Call the c
8820: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8830: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
8840: 6e 20 73 75 70 70 6c 79 20 75 73 20 77 69 74 68  n supply us with
8850: 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
8860: 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65 64 28   callCollNeeded(
8870: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d  pParse->db, zNam
8880: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70  e, nName);.    p
8890: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
88a0: 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ndCollSeq(pParse
88b0: 2d 3e 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  ->db, enc, zName
88c0: 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , nName, 0);.   
88d0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21 70   if( pColl && !p
88e0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
88f0: 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 61 79      /* There may
8900: 20 62 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66   be a version of
8910: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
8920: 65 71 75 65 6e 63 65 20 74 68 61 74 20 72 65 71  equence that req
8930: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
8940: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 65 74 77 65  ranslation betwe
8950: 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2e 20 53 65  en encodings. Se
8960: 61 72 63 68 20 66 6f 72 20 69 74 20 77 69 74 68  arch for it with
8970: 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2e   synthCollSeq().
8980: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8990: 69 66 28 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71  if( synthCollSeq
89a0: 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20  (pParse, pColl) 
89b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
89c0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
89d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
89e0: 6e 6f 74 68 69 6e 67 20 68 61 73 20 62 65 65 6e  nothing has been
89f0: 20 66 6f 75 6e 64 2c 20 77 72 69 74 65 20 74 68   found, write th
8a00: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
8a10: 69 6e 74 6f 20 70 50 61 72 73 65 20 2a 2f 0a 20  into pParse */. 
8a20: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
8a30: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
8a40: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
8a50: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
8a60: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rr==0 ){.      s
8a70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8a80: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
8a90: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
8aa0: 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65  ce: %.*s", nName
8ab0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
8ac0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
8ad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
8ae0: 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 63  l;.}..../*.** Sc
8af0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8b00: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8b10: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8b20: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8b30: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8b40: 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68 61 72  ty type..*/.char
8b50: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8b60: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
8b70: 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54 79 70  *zType, int nTyp
8b80: 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a  e){.  int n, i;.
8b90: 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63    struct {.    c
8ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 3b  onst char *zSub;
8bb0: 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20 73 75    /* Keywords su
8bc0: 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63  bstring to searc
8bd0: 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61  h for */.    cha
8be0: 72 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20  r nSub;         
8bf0: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75  /* length of zSu
8c00: 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61 66  b */.    char af
8c10: 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a 20 41  finity;     /* A
8c20: 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74 75 72  ffinity to retur
8c30: 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65 73 20  n if it matches 
8c40: 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69 6e 67  */.  } substring
8c50: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e  s[] = {.    {"IN
8c60: 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45 5f 41  T",  3, SQLITE_A
8c70: 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20  FF_INTEGER},.   
8c80: 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53 51 4c   {"CHAR", 4, SQL
8c90: 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20  ITE_AFF_TEXT},. 
8ca0: 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53     {"CLOB", 4, S
8cb0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
8cc0: 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20 34 2c  .    {"TEXT", 4,
8cd0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8ce0: 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20  },.    {"BLOB", 
8cf0: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  4, SQLITE_AFF_NO
8d00: 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28  NE},.  };..  if(
8d10: 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   nType==0 ){.   
8d20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
8d30: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66  FF_NONE;.  }.  f
8d40: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
8d50: 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73 69 7a  (substrings)/siz
8d60: 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 5b 30  eof(substrings[0
8d70: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ]); i++){.    in
8d80: 74 20 63 31 20 3d 20 73 75 62 73 74 72 69 6e 67  t c1 = substring
8d90: 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20  s[i].zSub[0];.  
8da0: 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77    int c2 = tolow
8db0: 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e 74 20  er(c1);.    int 
8dc0: 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20 2d 20  limit = nType - 
8dd0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53  substrings[i].nS
8de0: 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ub;.    const ch
8df0: 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e  ar *z = substrin
8e00: 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20  gs[i].zSub;.    
8e10: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69  for(n=0; n<=limi
8e20: 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69  t; n++){.      i
8e30: 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b  nt c = zType[n];
8e40: 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63  .      if( (c==c
8e50: 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20  1 || c==c2).    
8e60: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
8e70: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
8e80: 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62  zType[n], z, sub
8e90: 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29  strings[i].nSub)
8ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8eb0: 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d  rn substrings[i]
8ec0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
8ed0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
8ee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
8ef0: 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a  _NUMERIC;.}../*.
8f00: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
8f10: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
8f20: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
8f30: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
8f40: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
8f50: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8f60: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
8f70: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
8f80: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
8f90: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
8fa0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
8fb0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
8fc0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
8fd0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
8fe0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
8ff0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
9000: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
9010: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
9020: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
9030: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
9040: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
9050: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
9060: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
9070: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
9080: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
9090: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
90a0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
90b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
90c0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
90d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
90e0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
90f0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
9100: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
9110: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
9120: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
9130: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
9140: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
9150: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
9160: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
9170: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
9180: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
9190: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
91a0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
91b0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
91c0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
91d0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
91e0: 43 6f 6f 6b 69 65 28 73 71 6c 69 74 65 33 20 2a  Cookie(sqlite3 *
91f0: 64 62 2c 20 56 64 62 65 20 2a 76 2c 20 69 6e 74  db, Vdbe *v, int
9200: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
9210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9220: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
9230: 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f  [iDb].schema_coo
9240: 6b 69 65 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c  kie+1, 0);.  sql
9250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9260: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
9270: 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Db, 0);.}../*.**
9280: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
9290: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
92a0: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
92b0: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
92c0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
92d0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
92e0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
92f0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
9300: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
9310: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
9320: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
9330: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
9340: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
9350: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
9360: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
9370: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
9380: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
9390: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
93a0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
93b0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
93c0: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
93d0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
93e0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
93f0: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
9400: 2a 20 57 72 69 74 65 20 61 6e 20 69 64 65 6e 74  * Write an ident
9410: 69 66 69 65 72 20 6f 6e 74 6f 20 74 68 65 20 65  ifier onto the e
9420: 6e 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  nd of the given 
9430: 73 74 72 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20  string.  Add.** 
9440: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
9450: 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   as needed..*/.s
9460: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
9470: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
9480: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
9490: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
94a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
94b0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
94c0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
94d0: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
94e0: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
94f0: 3d 20 2a 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a  = *pIdx;.  for(j
9500: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
9510: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
9520: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
9530: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
9540: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
9550: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 20 7a    needQuote =  z
9560: 49 64 65 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69  Ident[j]!=0 || i
9570: 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d  sdigit(zIdent[0]
9580: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
9590: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
95a0: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
95b0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69  , j)!=TK_ID;.  i
95c0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
95d0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
95e0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
95f0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
9600: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
9610: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
9620: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
9630: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
9640: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
9650: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
9660: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
9670: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
9680: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
9690: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
96a0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
96b0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
96c0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
96d0: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
96e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
96f0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
9700: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
9710: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
9720: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
9730: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
9740: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
9750: 74 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c  teTableStmt(Tabl
9760: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
9770: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
9780: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
9790: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
97a0: 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  , *z;.  Column *
97b0: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
97c0: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
97d0: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
97e0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
97f0: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
9800: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
9810: 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43  ame);.    z = pC
9820: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69  ol->zType;.    i
9830: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20  f( z ){.      n 
9840: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20  += (strlen(z) + 
9850: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
9860: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
9870: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
9880: 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<50 ){.    zS
9890: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
98a0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
98b0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
98c0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
98d0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
98e0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
98f0: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
9900: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
9910: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
9920: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
9930: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
9940: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
9950: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
9960: 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22  t, p->iDb==1 ? "
9970: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
9980: 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41  E " : "CREATE TA
9990: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
99a0: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
99b0: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
99c0: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
99d0: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
99e0: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
99f0: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
9a00: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
9a10: 2b 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 26  +){.    strcpy(&
9a20: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
9a30: 0a 20 20 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e  .    k += strlen
9a40: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
9a50: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
9a60: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
9a70: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
9a80: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 20  me);.    if( (z 
9a90: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d  = pCol->zType)!=
9aa0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  0 ){.      zStmt
9ab0: 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k++] = ' ';.   
9ac0: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9ad0: 5b 6b 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b  [k], z);.      k
9ae0: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20   += strlen(z);. 
9af0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70     }.  }.  strcp
9b00: 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e  y(&zStmt[k], zEn
9b10: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74  d);.  return zSt
9b20: 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  mt;.}../*.** Thi
9b30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9b40: 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  led to report th
9b50: 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74  e final ")" that
9b60: 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61   terminates.** a
9b70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9b80: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
9b90: 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  he table structu
9ba0: 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63  re that other ac
9bb0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61  tion routines ha
9bc0: 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67  ve been building
9bd0: 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20  .** is added to 
9be0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73  the internal has
9bf0: 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69  h tables, assumi
9c00: 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76  ng no errors hav
9c10: 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a  e.** occurred..*
9c20: 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f  *.** An entry fo
9c30: 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d  r the table is m
9c40: 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65  ade in the maste
9c50: 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c  r table on disk,
9c60: 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20   unless.** this 
9c70: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  is a temporary t
9c80: 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74  able or db->init
9c90: 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20  .busy==1.  When 
9ca0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
9cb0: 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20  .** it means we 
9cc0: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
9cd0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9ce0: 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a  ble because we j
9cf0: 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  ust.** connected
9d00: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9d10: 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
9d20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
9d30: 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e  ble has.** recen
9d40: 74 6c 79 20 63 68 61 6e 67 65 73 2c 20 73 6f 20  tly changes, so 
9d50: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
9d60: 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  is table already
9d70: 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68   exists in.** th
9d80: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
9d90: 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f  table.  We do no
9da0: 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65  t want to create
9db0: 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a   it again..**.**
9dc0: 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20   If the pSelect 
9dd0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
9de0: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
9df0: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
9e00: 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74  .** was called t
9e10: 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  o create a table
9e20: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
9e30: 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41  a .** "CREATE TA
9e40: 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  BLE ... AS SELEC
9e50: 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74  T ..." statement
9e60: 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  .  The column na
9e70: 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  mes of.** the ne
9e80: 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74  w table will mat
9e90: 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ch the result se
9ea0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  t of the SELECT.
9eb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9ec0: 45 6e 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  EndTable(Parse *
9ed0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9ee0: 45 6e 64 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  End, Select *pSe
9ef0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
9f00: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
9f10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9f20: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
9f30: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
9f40: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
9f50: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
9f60: 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
9f70: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
9f80: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
9f90: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
9fa0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
9fb0: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
9fc0: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
9fd0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
9fe0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
9ff0: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
a000: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
a010: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
a020: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
a030: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
a040: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
a050: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
a060: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
a070: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
a080: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
a090: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
a0a0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
a0b0: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
a0c0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
a0d0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
a0e0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
a0f0: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
a100: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
a110: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
a120: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
a130: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
a140: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
a150: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
a160: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
a170: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
a180: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
a190: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
a1a0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
a1b0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
a1c0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
a1d0: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a  e record number.
a1e0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
a1f0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68 6f   table entry sho
a200: 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 6f  uld already be o
a210: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a  n the stack..  *
a220: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
a230: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
a240: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
a250: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
a260: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
a270: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
a280: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
a290: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
a2a0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
a2b0: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
a2c0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a  ;.    Vdbe *v;..
a2d0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
a2e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a2f0: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a300: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20  eturn;..    if( 
a310: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
a320: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
a330: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
a340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a350: 64 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  dOp(v, OP_Create
a360: 54 61 62 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30  Table, p->iDb, 0
a370: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a380: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
a390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a3a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
a3b0: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
a3c0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
a3d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a3e0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
a3f0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
a400: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a410: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
a420: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
a430: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
a440: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
a450: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
a460: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
a470: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
a480: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
a490: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
a4a0: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
a4b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
a4c0: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
a4d0: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
a4e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
a4f0: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
a500: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
a510: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
a520: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
a530: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
a540: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
a550: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
a560: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
a570: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61  lect ){.      Ta
a580: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
a590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a5a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a5b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a5c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a5d0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
a5e0: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
a5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a600: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
a610: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
a620: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
a630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
a640: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
a650: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
a660: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
a670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a680: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a690: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
a6a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
a6b0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
a6c0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
a6d0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
a6e0: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
a6f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
a700: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
a710: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a720: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
a730: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
a740: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
a750: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
a760: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
a770: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
a780: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
a790: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
a7a0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
a7b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
a7c0: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
a7d0: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
a7e0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 73 71 6c 69     }.  .    sqli
a7f0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
a800: 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a  le(v, p->iDb);..
a810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
a820: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
a830: 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65  , 0, 0, p->pSele
a840: 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76  ct==0?"table":"v
a850: 69 65 77 22 2c 50 33 5f 53 54 41 54 49 43 29 3b  iew",P3_STATIC);
a860: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a870: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
a880: 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d  8, 0, 0, p->zNam
a890: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
a8a0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a8b0: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
a8c0: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
a8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8e0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 33 2c  p(v, OP_Pull, 3,
a8f0: 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53   0);..    if( pS
a900: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
a910: 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54  har *z = createT
a920: 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20  ableStmt(p);.   
a930: 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65     n = z ? strle
a940: 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  n(z) : 0;.      
a950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a960: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a970: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a980: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
a990: 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  (v, -1, z, n);. 
a9a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
a9b0: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
a9c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c       if( p->pSel
a9d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
a9e0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a9f0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
aa00: 30 2c 20 22 43 52 45 41 54 45 20 56 49 45 57 20  0, "CREATE VIEW 
aa10: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
aa20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
aa40: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
aa50: 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20  , 0, 0, "CREATE 
aa60: 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54 41 54  TABLE ", P3_STAT
aa70: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
aa80: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
aa90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
aaa0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
aab0: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 4e 61  Addr(pParse->sNa
aac0: 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  meToken.z) + 1;.
aad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aae0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
aaf0: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
ab00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ab10: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50  angeP3(v, -1, pP
ab20: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
ab30: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71  .z, n);.      sq
ab40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ab50: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 30 2c 20  , OP_Concat, 0, 
ab60: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
ab70: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
ab80: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
ab90: 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33  , 0, "tttit", P3
aba0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
abb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
abc0: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
abd0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
abe0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64  e3ChangeCookie(d
abf0: 62 2c 20 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 20  b, v, p->iDb);. 
ac00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ac10: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
ac20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
ac30: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ac40: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 70 2d  _ParseSchema, p-
ac50: 3e 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20  >iDb, 0,.       
ac60: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
ac70: 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c  "tbl_name='%q'",
ac80: 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59  p->zName), P3_DY
ac90: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 20 20 2f  NAMIC);.  }..  /
aca0: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
acb0: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
acc0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
acd0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
ace0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
acf0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61  init.busy && pPa
ad00: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
ad10: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
ad20: 0a 20 20 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  .    FKey *pFKey
ad30: 3b 20 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ; .    Db *pDb =
ad40: 20 26 64 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62   &db->aDb[p->iDb
ad50: 5d 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  ];.    pOld = sq
ad60: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
ad70: 26 70 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70  &pDb->tblHash, p
ad80: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
ad90: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
ada0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
adb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
adc0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
add0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
ade0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
adf0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
ae00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
ae10: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
ae20: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
ae30: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
ae40: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
ae50: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
ae60: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
ae70: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
ae80: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48  extTo = sqlite3H
ae90: 61 73 68 46 69 6e 64 28 26 70 44 62 2d 3e 61 46  ashFind(&pDb->aF
aea0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
aeb0: 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c   nTo);.      sql
aec0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
aed0: 70 44 62 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65  pDb->aFKey, pFKe
aee0: 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b  y->zTo, nTo, pFK
aef0: 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ey);.    }.    p
af00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
af10: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
af20: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
af30: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
af40: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
af50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
af60: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
af70: 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  s routine in ord
af80: 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  er to create a n
af90: 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20  ew VIEW.*/.void 
afa0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
afb0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
afc0: 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70  se,     /* The p
afd0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
afe0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69  /.  Token *pBegi
aff0: 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  n,     /* The CR
b000: 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
b010: 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65  begins the state
b020: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
b030: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
b040: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
b050: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
b060: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54   the view */.  T
b070: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
b080: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
b090: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
b0a0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
b0b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
b0c0: 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45  ect,   /* A SELE
b0d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
b0e0: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
b0f0: 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20  e new view */.  
b100: 69 6e 74 20 69 73 54 65 6d 70 20 20 20 20 20 20  int isTemp      
b110: 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61     /* TRUE for a
b120: 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20   TEMPORARY view 
b130: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
b140: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
b150: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b160: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
b170: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
b180: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
b190: 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61  e;..  sqlite3Sta
b1a0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
b1b0: 70 42 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20  pBegin, pName1, 
b1c0: 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
b1d0: 31 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  1);.  p = pParse
b1e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
b1f0: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
b200: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73  e->nErr ){.    s
b210: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
b220: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
b230: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
b240: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
b250: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
b260: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
b270: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
b280: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
b290: 50 61 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22  Parse, p->iDb, "
b2a0: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20  view", pName).  
b2b0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53    && sqlite3FixS
b2c0: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
b2d0: 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73  lect).  ){.    s
b2e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
b2f0: 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  te(pSelect);.   
b300: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
b310: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
b320: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
b330: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
b340: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
b350: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
b360: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
b370: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
b380: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
b390: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
b3a0: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
b3b0: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
b3c0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
b3d0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
b3e0: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
b3f0: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
b400: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
b410: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
b420: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
b430: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
b440: 33 53 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65  3SelectDup(pSele
b450: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ct);.  sqlite3Se
b460: 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65  lectDelete(pSele
b470: 63 74 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72  ct);.  if( !pPar
b480: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
b490: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
b4a0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
b4b0: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
b4c0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
b4d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
b4e0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
b4f0: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
b500: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
b510: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
b520: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
b530: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
b540: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
b550: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
b560: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
b570: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
b580: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
b590: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
b5a0: 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74  >z;.  z = (const
b5b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
b5c0: 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69  pBegin->z;.  whi
b5d0: 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d  le( n>0 && (z[n-
b5e0: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
b5f0: 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e  ce(z[n-1])) ){ n
b600: 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d  --; }.  sEnd.z =
b610: 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64   &z[n-1];.  sEnd
b620: 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73  .n = 1;..  /* Us
b630: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
b640: 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76  e() to add the v
b650: 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54  iew to the SQLIT
b660: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a  E_MASTER table *
b670: 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  /.  sqlite3EndTa
b680: 62 6c 65 28 70 50 61 72 73 65 2c 20 26 73 45 6e  ble(pParse, &sEn
b690: 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  d, 0);.  return;
b6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  .}../*.** The Ta
b6b0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
b6c0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
b6d0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
b6e0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
b6f0: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
b700: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
b710: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
b720: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
b730: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
b740: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
b750: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
b760: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
b770: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
b780: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b790: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
b7a0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
b7b0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
b7c0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
b7d0: 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  List;.  Select *
b7e0: 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70  pSel;.  Table *p
b7f0: 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45  SelTab;.  int nE
b800: 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  rr = 0;..  asser
b810: 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20  t( pTable );..  
b820: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
b830: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
b840: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
b850: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
b860: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
b870: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
b880: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
b890: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
b8a0: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
b8b0: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
b8c0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
b8d0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
b8e0: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
b8f0: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
b900: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
b910: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
b920: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
b930: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
b940: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
b950: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
b960: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
b970: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
b980: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
b990: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
b9a0: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
b9b0: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
b9c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
b9d0: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
b9e0: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
b9f0: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
ba00: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
ba10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
ba20: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
ba30: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
ba40: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
ba50: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
ba60: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
ba70: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
ba80: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
ba90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
baa0: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
bab0: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
bac0: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
bad0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
bae0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  ;.  }..  /* If w
baf0: 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
bb00: 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
bb10: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
bb20: 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
bb30: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
bb40: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f  le->pSelect ); /
bb50: 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68  * If nCol==0, th
bb60: 65 6e 20 70 54 61 62 6c 65 20 6d 75 73 74 20 62  en pTable must b
bb70: 65 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 70 53  e a VIEW */.  pS
bb80: 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65  el = pTable->pSe
bb90: 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65  lect;..  /* Note
bba0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
bbb0: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
bbc0: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
bbd0: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
bbe0: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
bbf0: 6e 20 74 68 69 73 20 6c 69 73 74 2e 20 20 42 75  n this list.  Bu
bc00: 74 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  t we will need t
bc10: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6c 69  o restore the li
bc20: 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20  st.  ** back to 
bc30: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
bc40: 66 69 67 75 72 61 74 69 6f 6e 20 61 66 74 65 72  figuration after
bc50: 77 61 72 64 73 2c 20 73 6f 20 77 65 20 73 61 76  wards, so we sav
bc60: 65 20 61 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a  e a copy of.  **
bc70: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e   the original in
bc80: 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20   pEList..  */.  
bc90: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70  pEList = pSel->p
bca0: 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70  EList;.  pSel->p
bcb0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
bcc0: 78 70 72 4c 69 73 74 44 75 70 28 70 45 4c 69 73  xprListDup(pELis
bcd0: 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e  t);.  if( pSel->
bce0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
bcf0: 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20   pSel->pEList = 
bd00: 70 45 4c 69 73 74 3b 0a 20 20 20 20 72 65 74 75  pEList;.    retu
bd10: 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  rn 1;  /* Malloc
bd20: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
bd30: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
bd40: 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62 20 3d 20  -1;.  pSelTab = 
bd50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
bd60: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
bd70: 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20 69 66 28   0, pSel);.  if(
bd80: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
bd90: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
bda0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  aCol==0 );.    p
bdb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
bdc0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
bdd0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
bde0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
bdf0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
be00: 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61   = 0;.    pSelTa
be10: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
be20: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
be30: 62 6c 65 28 30 2c 20 70 53 65 6c 54 61 62 29 3b  ble(0, pSelTab);
be40: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
be50: 74 79 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ty(pParse->db, p
be60: 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55  Table->iDb, DB_U
be70: 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 20 20  nresetViews);.  
be80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 62 6c  }else{.    pTabl
be90: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
bea0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73   nErr++;.  }.  s
beb0: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
bec0: 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69  nd(pSel);.  sqli
bed0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
bee0: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
bef0: 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20  .  pSel->pEList 
bf00: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72 65 74 75  = pEList;.  retu
bf10: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 0a 2f 2a  rn nErr;  .}../*
bf20: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
bf30: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
bf40: 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
bf50: 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
bf60: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
bf70: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
bf80: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
bf90: 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
bfa0: 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73  *i;.  if( !DbHas
bfb0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
bfc0: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
bfd0: 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
bfe0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
bff0: 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
c000: 78 5d 2e 74 62 6c 48 61 73 68 29 3b 20 69 3b 20  x].tblHash); i; 
c010: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
c020: 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  (i)){.    Table 
c030: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
c040: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
c050: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
c060: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c070: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
c080: 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTab);.    }.  
c090: 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
c0a0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
c0b0: 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
c0c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c0d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
c0e0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
c0f0: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
c100: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
c110: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
c120: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
c130: 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
c140: 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
c150: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
c160: 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
c170: 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
c180: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
c190: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62  Vdbe *v;.  int b
c1a0: 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ase;.  sqlite3 *
c1b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c1c0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
c1d0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
c1e0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
c1f0: 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  c_failed ) goto 
c200: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
c210: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
c220: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
c230: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
c240: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
c250: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
c260: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
c270: 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69  zDatabase);..  i
c280: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
c290: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c2a0: 65 3b 0a 20 20 69 44 62 20 3d 20 70 54 61 62 2d  e;.  iDb = pTab-
c2b0: 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  >iDb;.  assert( 
c2c0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
c2d0: 2d 3e 6e 44 62 20 29 3b 0a 23 69 66 6e 64 65 66  ->nDb );.#ifndef
c2e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
c2f0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
c300: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
c310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
c320: 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
c330: 28 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20  (pTab->iDb);.   
c340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
c350: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
c360: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
c370: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
c380: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
c390: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
c3a0: 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
c3b0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
c3c0: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
c3d0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
c3e0: 0a 20 20 20 20 20 20 69 66 28 20 69 44 62 3d 3d  .      if( iDb==
c3f0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
c400: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
c410: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
c420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c430: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
c440: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
c450: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c460: 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
c470: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
c480: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
c490: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
c4a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
c4b0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
c4c0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
c4d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
c4e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
c4f0: 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
c500: 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20  >zName, 0, zDb) 
c510: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
c520: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
c530: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
c540: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
c550: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
c560: 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
c570: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
c580: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
c590: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
c5a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
c5b0: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  pTab->readOnly )
c5c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c5d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
c5e0: 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
c5f0: 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
c600: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b->zName);.    p
c610: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
c620: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
c630: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
c640: 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61  f( isView && pTa
c650: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  b->pSelect==0 ){
c660: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c670: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
c680: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20  e DROP TABLE to 
c690: 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22  delete table %s"
c6a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
c6b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
c6c0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
c6d0: 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70  if( !isView && p
c6e0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
c6f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c700: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
c710: 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65   DROP VIEW to de
c720: 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70  lete view %s", p
c730: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
c740: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c750: 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  table;.  }..  /*
c760: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
c770: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
c780: 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
c790: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
c7a0: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
c7b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c7c0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
c7d0: 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
c7e0: 56 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54  VdbeOpList dropT
c7f0: 61 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  able[] = {.     
c800: 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20   { OP_Rewind,   
c810: 20 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30    0, ADDR(13), 0
c820: 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74  },.      { OP_St
c830: 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20  ring8,    0, 0, 
c840: 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20         0}, /* 1 
c850: 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65  */.      { OP_Me
c860: 6d 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20  mStore,   1, 1, 
c870: 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
c880: 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20   { OP_MemLoad,  
c890: 20 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30    1, 0,        0
c8a0: 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20  }, /* 3 */.     
c8b0: 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20   { OP_Column,   
c8c0: 20 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30    0, 2,        0
c8d0: 7d 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73  }, /* sqlite_mas
c8e0: 74 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a  ter.tbl_name */.
c8f0: 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20        { OP_Ne,  
c900: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 31         0, ADDR(1
c910: 32 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  2), 0},.      { 
c920: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30  OP_String8,    0
c930: 2c 20 30 2c 20 20 20 20 20 20 20 20 22 74 72 69  , 0,        "tri
c940: 67 67 65 72 22 7d 2c 0a 20 20 20 20 20 20 7b 20  gger"},.      { 
c950: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
c960: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 2,        0}, 
c970: 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  /* sqlite_master
c980: 2e 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 7b  .type */.      {
c990: 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20   OP_Eq,         
c9a0: 30 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d 2c  0, ADDR(12), 0},
c9b0: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
c9c0: 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
c9d0: 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b       0},.      {
c9e0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
c9f0: 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c  0, ADDR(13), 0},
ca00: 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f  .      { OP_Goto
ca10: 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
ca20: 33 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b  3),  0},.      {
ca30: 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20   OP_Next,       
ca40: 30 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c  0, ADDR(3),  0},
ca50: 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7d 3b   /* 12 */.    };
ca60: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
ca70: 3b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70  ;.    Trigger *p
ca80: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c  Trigger;.    sql
ca90: 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
caa0: 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
cab0: 30 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a  0, pTab->iDb);..
cac0: 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
cad0: 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
cae0: 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
caf0: 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
cb00: 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
cb10: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
cb20: 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
cb30: 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
cb40: 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
cb50: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
cb60: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
cb70: 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
cb80: 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67  r = pTab->pTrigg
cb90: 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  er;.    while( p
cba0: 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20  Trigger ){.     
cbb0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
cbc0: 72 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44  r->iDb==pTab->iD
cbd0: 62 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69  b || pTrigger->i
cbe0: 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  Db==1 );.      s
cbf0: 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
cc00: 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
cc10: 69 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  igger, 1);.     
cc20: 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
cc30: 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  gger->pNext;.   
cc40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
cc50: 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
cc60: 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
cc70: 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
cc80: 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20  efer to the.    
cc90: 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72  ** table. The pr
cca0: 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73  ogram name loops
ccb0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73   through the mas
ccc0: 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65  ter table and de
ccd0: 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65  letes.    ** eve
cce0: 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65  ry row that refe
ccf0: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66  rs to a table of
cd00: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
cd10: 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a  s the one being.
cd20: 20 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20      ** dropped. 
cd30: 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
cd40: 64 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20  dled seperately 
cd50: 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
cd60: 72 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20  r can be.    ** 
cd70: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
cd80: 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
cd90: 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
cda0: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
cdb0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
cdc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
cdd0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
cde0: 65 28 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b  e(v, pTab->iDb);
cdf0: 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69  .    base = sqli
ce00: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
ce10: 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72  (v, ArraySize(dr
ce20: 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61  opTable), dropTa
ce30: 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ble);.    sqlite
ce40: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
ce50: 20 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a   base+1, pTab->z
ce60: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
ce70: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
ce80: 65 28 64 62 2c 20 76 2c 20 70 54 61 62 2d 3e 69  e(db, v, pTab->i
ce90: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
cea0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ceb0: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Close, 0, 0);.  
cec0: 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
ced0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cee0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
cef0: 73 74 72 6f 79 2c 20 70 54 61 62 2d 3e 74 6e 75  stroy, pTab->tnu
cf00: 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20  m, pTab->iDb);. 
cf10: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
cf20: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
cf30: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
cf40: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  xt){.        sql
cf50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cf60: 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64   OP_Destroy, pId
cf70: 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69  x->tnum, pIdx->i
cf80: 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Db);.      }.   
cf90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
cfa0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70  beOp3(v, OP_Drop
cfb0: 54 61 62 6c 65 2c 20 70 54 61 62 2d 3e 69 44 62  Table, pTab->iDb
cfc0: 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
cfd0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
cfe0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
cff0: 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64  b, iDb);..exit_d
d000: 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  rop_table:.  sql
d010: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
d020: 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
d030: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d040: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
d050: 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
d060: 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
d070: 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
d080: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
d090: 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
d0a0: 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
d0b0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
d0c0: 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
d0d0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
d0e0: 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
d0f0: 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
d100: 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
d110: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
d120: 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
d130: 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
d140: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
d150: 65 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f  eferred to.  pTo
d160: 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66  Col is a list of
d170: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f   tables in the o
d180: 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c  ther.** pTo tabl
d190: 65 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69  e that the forei
d1a0: 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f  gn key points to
d1b0: 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
d1c0: 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
d1d0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
d1e0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
d1f0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
d200: 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
d210: 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
d220: 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
d230: 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
d240: 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
d250: 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
d260: 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
d270: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
d280: 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
d290: 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
d2a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
d2b0: 20 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77   field.  The new
d2c0: 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20   FKey.** is not 
d2d0: 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e  linked into db->
d2e0: 61 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f  aFKey at this po
d2f0: 69 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20  int - that does 
d300: 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e  not happen.** un
d310: 74 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61  til sqlite3EndTa
d320: 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble()..**.** The
d330: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
d340: 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
d350: 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
d360: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
d370: 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
d380: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
d390: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
d3a0: 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
d3b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
d3c0: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
d3d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d3e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
d3f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
d400: 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
d410: 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
d420: 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
d430: 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
d440: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
d450: 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
d460: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
d470: 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
d480: 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
d490: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
d4a0: 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
d4b0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
d4c0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
d4d0: 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
d4e0: 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
d4f0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
d500: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
d510: 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
d520: 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
d530: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
d540: 2a 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  *z;.  FKey *pFKe
d550: 79 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  y = 0;..  assert
d560: 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
d570: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
d580: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b  ->nErr ) goto fk
d590: 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
d5a0: 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
d5b0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
d5c0: 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  l-1;.    if( iCo
d5d0: 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  l<0 ) goto fk_en
d5e0: 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f  d;.    if( pToCo
d5f0: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
d600: 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  pr!=1 ){.      s
d610: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d620: 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20  Parse, "foreign 
d630: 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20  key on %s".     
d640: 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66      " should ref
d650: 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20  erence only one 
d660: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
d670: 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  %T",.         p-
d680: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
d690: 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67  e, pTo);.      g
d6a0: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
d6b0: 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a  }.    nCol = 1;.
d6c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43    }else if( pToC
d6d0: 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
d6e0: 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  xpr!=pFromCol->n
d6f0: 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
d700: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d710: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d  se,.        "num
d720: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
d730: 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f  n foreign key do
d740: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
d750: 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20   number of ".   
d760: 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e       "columns in
d770: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
d780: 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74  table");.    got
d790: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73  o fk_end;.  }els
d7a0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46  e{.    nCol = pF
d7b0: 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20  romCol->nExpr;. 
d7c0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a   }.  nByte = siz
d7d0: 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43  eof(*pFKey) + nC
d7e0: 6f 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  ol*sizeof(pFKey-
d7f0: 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
d800: 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
d810: 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
d820: 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
d830: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
d840: 20 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65    nByte += strle
d850: 6e 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  n(pToCol->a[i].z
d860: 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
d870: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
d880: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
d890: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65  te );.  if( pFKe
d8a0: 79 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65  y==0 ) goto fk_e
d8b0: 6e 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72  nd;.  pFKey->pFr
d8c0: 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
d8d0: 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
d8e0: 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
d8f0: 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20  ar*)&pFKey[1];. 
d900: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28   pFKey->aCol = (
d910: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29  struct sColMap*)
d920: 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66  z;.  z += sizeof
d930: 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29  (struct sColMap)
d940: 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e  *nCol;.  pFKey->
d950: 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
d960: 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
d970: 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
d980: 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54  ] = 0;.  z += pT
d990: 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
d9a0: 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20  >pNextTo = 0;.  
d9b0: 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43  pFKey->nCol = nC
d9c0: 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  ol;.  if( pFromC
d9d0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b  ol==0 ){.    pFK
d9e0: 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f  ey->aCol[0].iFro
d9f0: 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  m = p->nCol-1;. 
da00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
da10: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
da20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  ){.      int j;.
da30: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
da40: 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  <p->nCol; j++){.
da50: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
da60: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43  te3StrICmp(p->aC
da70: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72  ol[j].zName, pFr
da80: 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
da90: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
daa0: 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
dab0: 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20  ].iFrom = j;.   
dac0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dae0: 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e        if( j>=p->
daf0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
db00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
db10: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
db20: 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75     "unknown colu
db30: 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72  mn \"%s\" in for
db40: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
db50: 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ion", .         
db60: 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
db70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
db80: 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
db90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dba0: 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
dbb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
dbc0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
dbd0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
dbe0: 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
dbf0: 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
dc00: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
dc10: 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
dc20: 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
dc30: 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
dc40: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
dc50: 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
dc60: 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
dc70: 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
dc80: 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e  pFKey->deleteCon
dc90: 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66  f = flags & 0xff
dca0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74  ;.  pFKey->updat
dcb0: 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e  eConf = (flags >
dcc0: 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20  > 8 ) & 0xff;.  
dcd0: 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
dce0: 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36  f = (flags >> 16
dcf0: 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a   ) & 0xff;..  /*
dd00: 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
dd10: 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
dd20: 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
dd30: 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
dd40: 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
dd50: 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
dd60: 6e 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  nd:.  sqliteFree
dd70: 28 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  (pFKey);.  sqlit
dd80: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
dd90: 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71  (pFromCol);.  sq
dda0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ddb0: 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  ete(pToCol);.}..
ddc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ddd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
dde0: 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
ddf0: 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
de00: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
de10: 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
de20: 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
de30: 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
de40: 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
de50: 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
de60: 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
de70: 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
de80: 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
de90: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
dea0: 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
deb0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
dec0: 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
ded0: 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
dee0: 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
def0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
df00: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
df10: 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
df20: 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
df30: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
df40: 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
df50: 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
df60: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
df70: 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
df80: 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
df90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65  ) return;.  pFKe
dfa0: 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
dfb0: 69 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f  isDeferred;.}../
dfc0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
dfd0: 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
dfe0: 51 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65  QL table.  pInde
dff0: 78 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  x is the name of
e000: 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
e010: 6e 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65  nd pTable is the
e020: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
e030: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
e040: 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20   indexed.  Both 
e050: 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c  will .** be NULL
e060: 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b   for a primary k
e070: 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74  ey or an index t
e080: 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74  hat is created t
e090: 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55  o satisfy a.** U
e0a0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
e0b0: 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64  .  If pTable and
e0c0: 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c   pIndex are NULL
e0d0: 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  , use pParse->pN
e0e0: 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68  ewTable.** as th
e0f0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
e100: 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e  dexed.  pParse->
e110: 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74  pNewTable is a t
e120: 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  able that is.** 
e130: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
e140: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61  constructed by a
e150: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
e160: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70  atement..**.** p
e170: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
e180: 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
e190: 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20  indexed.  pList 
e1a0: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
e1b0: 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69  this.** is a pri
e1c0: 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71  mary key or uniq
e1d0: 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  ue-constraint on
e1e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e1f0: 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a   column added.**
e200: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
e210: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
e220: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
e230: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
e240: 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
e250: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
e260: 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
e270: 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
e280: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
e290: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
e2a0: 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
e2b0: 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
e2c0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
e2d0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
e2e0: 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
e2f0: 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
e300: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
e310: 62 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62 6c  blName,  /* Tabl
e320: 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
e330: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e340: 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
e350: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
e360: 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
e370: 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
e380: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
e390: 6f 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  or,     /* OE_Ab
e3a0: 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
e3b0: 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
e3c0: 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
e3d0: 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20  n *pStart,   /* 
e3e0: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
e3f0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43   that begins a C
e400: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e410: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
e420: 20 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54   *pEnd      /* T
e430: 68 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73  he ")" that clos
e440: 65 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  es the CREATE IN
e450: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
e460: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
e470: 62 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65 20  b = 0; /* Table 
e480: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
e490: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
e4a0: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64   = 0; /* The ind
e4b0: 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
e4c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
e4d0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
e4e0: 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49  j;.  Token nullI
e4f0: 64 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f  d;    /* Fake to
e500: 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
e510: 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62   ID list */.  Db
e520: 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f  Fixer sFix;    /
e530: 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
e540: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
e550: 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
e560: 74 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f  t isTemp;      /
e570: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d  * True for a tem
e580: 70 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a  porary index */.
e590: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e5a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
e5b0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
e5c0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
e5d0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
e5e0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
e5f0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
e600: 65 20 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c  e = 0; /* Unqual
e610: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
e620: 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
e630: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72  e */..  if( pPar
e640: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
e650: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
e660: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  d ) goto exit_cr
e670: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f  eate_index;..  /
e680: 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
e690: 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
e6a0: 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
e6b0: 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
e6c0: 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
e6d0: 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
e6e0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
e6f0: 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
e700: 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
e710: 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
e720: 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
e730: 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
e740: 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
e750: 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
e760: 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
e770: 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
e780: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
e790: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
e7a0: 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
e7b0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
e7c0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
e7d0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
e7e0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
e7f0: 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
e800: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e810: 78 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  x;..    /* If th
e820: 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
e830: 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
e840: 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20 74  eck if the the t
e850: 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
e860: 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
e870: 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
e880: 62 61 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a  base to 1..    *
e890: 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  /.    pTab = sql
e8a0: 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
e8b0: 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
e8c0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61  me);.    if( pNa
e8d0: 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
e8e0: 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
e8f0: 54 61 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20  Tab->iDb==1 ){. 
e900: 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
e910: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c    }..    if( sql
e920: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
e930: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
e940: 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
e950: 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
e960: 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
e970: 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
e980: 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
e990: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
e9a0: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  x;.    }.    pTa
e9b0: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
e9c0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
e9d0: 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  TblName->a[0].zN
e9e0: 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54  ame, .        pT
e9f0: 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61  blName->a[0].zDa
ea00: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28  tabase);.    if(
ea10: 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
ea20: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ea30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
ea40: 3d 3d 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20  ==pTab->iDb );. 
ea50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
ea60: 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
ea70: 20 20 20 20 70 54 61 62 20 3d 20 20 70 50 61 72      pTab =  pPar
ea80: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ea90: 20 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69     iDb = pTab->i
eaa0: 44 62 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  Db;.  }..  if( p
eab0: 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  Tab==0 || pParse
eac0: 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
ead0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
eae0: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61  .  if( pTab->rea
eaf0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c  dOnly ){.    sql
eb00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
eb10: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
eb20: 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
eb30: 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
eb40: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
eb50: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
eb60: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  }.  if( pTab->pS
eb70: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
eb80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
eb90: 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
eba0: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
ebb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
ebc0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ebd0: 7d 0a 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61  }.  isTemp = pTa
ebe0: 62 2d 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a  b->iDb==1;..  /*
ebf0: 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
ec00: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
ec10: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
ec20: 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
ec30: 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
ec40: 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
ec50: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
ec60: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
ec70: 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
ec80: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
ec90: 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
eca0: 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
ecb0: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
ecc0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
ecd0: 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
ece0: 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
ecf0: 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
ed00: 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
ed10: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
ed20: 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
ed30: 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
ed40: 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
ed50: 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
ed60: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
ed70: 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
ed80: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
ed90: 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
eda0: 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
edb0: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
edc0: 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
edd0: 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
ede0: 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
edf0: 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
ee00: 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
ee10: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
ee20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
ee30: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
ee40: 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  (pName);.    if(
ee50: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
ee60: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
ee70: 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
ee80: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ee90: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
eea0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
eeb0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
eec0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
eed0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
eee0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
eef0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
ef00: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
ef10: 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
ef20: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
ef30: 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  y ){.      Index
ef40: 20 2a 70 49 53 61 6d 65 4e 61 6d 65 3b 20 20 20   *pISameName;   
ef50: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 69 6e 64 65   /* Another inde
ef60: 78 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  x with the same 
ef70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61  name */.      Ta
ef80: 62 6c 65 20 2a 70 54 53 61 6d 65 4e 61 6d 65 3b  ble *pTSameName;
ef90: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 77      /* A table w
efa0: 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  ith same name as
efb0: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
efc0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
efd0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
efe0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
eff0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f000: 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28  index;.      if(
f010: 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d 20 73   (pISameName = s
f020: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
f030: 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e 61  db, zName, db->a
f040: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 29 21  Db[iDb].zName))!
f050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
f060: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f070: 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
f080: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
f090: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
f0a0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
f0b0: 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
f0c0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 53 61  .      if( (pTSa
f0d0: 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  meName = sqlite3
f0e0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
f0f0: 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20  ame, 0))!=0 ){. 
f100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
f110: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f120: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
f130: 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25   a table named %
f140: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
f150: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f160: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f170: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
f180: 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30 20 29  e if( pName==0 )
f190: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
f1a0: 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  30];.    int n;.
f1b0: 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
f1c0: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
f1d0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
f1e0: 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
f1f0: 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
f200: 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e 74 66  +){}.    sprintf
f210: 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29 3b 0a  (zBuf,"_%d",n);.
f220: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
f230: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
f240: 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73 71 6c  ing(&zName, "sql
f250: 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c  ite_autoindex_",
f260: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 42   pTab->zName, zB
f270: 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
f280: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
f290: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
f2a0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
f2b0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
f2c0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
f2d0: 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
f2e0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
f2f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
f300: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
f310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
f320: 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69   db->aDb[pTab->i
f330: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
f340: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
f350: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
f360: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
f370: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
f380: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
f390: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
f3a0: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
f3b0: 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
f3c0: 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
f3d0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 20 69 20   if( isTemp ) i 
f3e0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
f3f0: 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
f400: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
f410: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
f420: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
f430: 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
f440: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
f450: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
f460: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
f470: 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
f480: 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
f490: 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
f4a0: 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
f4b0: 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
f4c0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
f4d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
f4e0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
f4f0: 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
f500: 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
f510: 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
f520: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
f530: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
f540: 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d  nullId.z = pTab-
f550: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
f560: 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e  -1].zName;.    n
f570: 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c 65 6e  ullId.n = strlen
f580: 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20  (nullId.z);.    
f590: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
f5a0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
f5b0: 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20   0, &nullId);.  
f5c0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f5d0: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
f5e0: 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
f5f0: 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
f600: 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
f610: 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 70  cture. .  */.  p
f620: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 4d 61  Index = sqliteMa
f630: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49 6e 64  lloc( sizeof(Ind
f640: 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a 4e 61  ex) + strlen(zNa
f650: 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20  me) + 1 +.      
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b    (sizeof(int) +
f680: 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a   sizeof(CollSeq*
f690: 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ))*pList->nExpr 
f6a0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
f6b0: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
f6c0: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 70  reate_index;.  p
f6d0: 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
f6e0: 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65 78 2d  = (int*)&pIndex-
f6f0: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 70  >keyInfo.aColl[p
f700: 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20  List->nExpr];.  
f710: 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
f720: 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d 3e  (char*)&pIndex->
f730: 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74 2d 3e  aiColumn[pList->
f740: 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63 70 79  nExpr];.  strcpy
f750: 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
f760: 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  zName);.  pIndex
f770: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
f780: 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
f790: 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  mn = pList->nExp
f7a0: 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  r;.  pIndex->onE
f7b0: 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  rror = onError;.
f7c0: 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
f7d0: 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a  dex = pName==0;.
f7e0: 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 3d 20    pIndex->iDb = 
f7f0: 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  iDb;..  /* Scan 
f800: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
f810: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
f820: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
f830: 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
f840: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
f850: 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
f860: 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
f870: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
f880: 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
f890: 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
f8a0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
f8b0: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
f8c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 6a   i++){.    for(j
f8d0: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
f8e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
f8f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
f900: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
f910: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  me, pTab->aCol[j
f920: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
f930: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
f940: 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
f950: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f970: 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
f980: 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
f990: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
f9a0: 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73 74 2d  b->zName, pList-
f9b0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
f9c0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f9d0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f9e0: 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  }.    pIndex->ai
f9f0: 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
fa00: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
fa10: 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20  i].pExpr ){.    
fa20: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
fa30: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
fa40: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 64  ll );.      pInd
fa50: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
fa60: 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  l[i] = pList->a[
fa70: 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b  i].pExpr->pColl;
fa80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fa90: 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66    pIndex->keyInf
faa0: 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 54 61  o.aColl[i] = pTa
fab0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c  b->aCol[j].pColl
fac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
fad0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  rt( pIndex->keyI
fae0: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 3b 0a  nfo.aColl[i] );.
faf0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
fb00: 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20 20 20  t.busy && .     
fb10: 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43     sqlite3CheckC
fb20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fb30: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
fb40: 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20 29 7b  Coll[i]) .    ){
fb50: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
fb60: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
fb70: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e 64 65     }.  }.  pInde
fb80: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c  x->keyInfo.nFiel
fb90: 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  d = pList->nExpr
fba0: 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  ;..  if( pTab==p
fbb0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fbc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
fbd0: 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
fbe0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
fbf0: 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
fc00: 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
fc10: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
fc20: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
fc30: 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
fc40: 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
fc50: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
fc60: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
fc70: 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
fc80: 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
fc90: 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
fca0: 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
fcb0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
fcc0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
fcd0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
fce0: 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
fcf0: 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
fd00: 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
fd10: 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
fd20: 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
fd30: 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
fd40: 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
fd50: 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
fd60: 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
fd70: 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
fd80: 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
fd90: 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
fda0: 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
fdb0: 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
fdc0: 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
fdd0: 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
fde0: 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
fdf0: 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
fe00: 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
fe10: 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
fe20: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
fe30: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
fe40: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
fe50: 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
fe60: 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
fe70: 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
fe80: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
fe90: 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
fea0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
feb0: 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
fec0: 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
fed0: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
fee0: 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  !=pIndex->nColum
fef0: 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
ff00: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
ff10: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b  Idx->nColumn; k+
ff20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ff30: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
ff40: 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
ff50: 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
ff60: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
ff70: 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b  ->keyInfo.aColl[
ff80: 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65 79 49  k]!=pIndex->keyI
ff90: 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 62  nfo.aColl[k] ) b
ffa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ffb0: 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
ffc0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
ffd0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
ffe0: 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
fff0: 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
10000 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
10010 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
10020 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
10030 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
10040 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
10050 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
10060 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
10070 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
10080 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
10090 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
100a0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
100b0 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
100c0 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
100d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
100e0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
100f0 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
10100 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
10110 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
10120 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
10130 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
10140 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
10150 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
10160 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
10170 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
10180 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20  ified behaviour 
10190 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
101a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
101b0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
101c0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
101d0 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
101e0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
101f0 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
10200 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10210 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
10230 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
10240 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
10250 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
10260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10270 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
10280 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
10290 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
102a0 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
102b0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
102c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
102d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
102e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
102f0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
10300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10310 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
10320 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
10330 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
10340 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
10350 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10360 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
10370 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10380 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10390 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
103a0 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
103b0 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 49  sert(&db->aDb[pI
103c0 6e 64 65 78 2d 3e 69 44 62 5d 2e 69 64 78 48 61  ndex->iDb].idxHa
103d0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
103f0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  ndex->zName, str
10400 6c 65 6e 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  len(pIndex->zNam
10410 65 29 2b 31 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e)+1, pIndex);. 
10420 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
10430 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
10440 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
10450 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
10460 65 64 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  ed */.      goto
10470 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10480 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
10490 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
104a0 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
104b0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
104c0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
104d0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
104e0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
104f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
10500 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
10510 75 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72  usy is 0 then cr
10520 65 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  eate the index o
10530 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20  n disk.  This.  
10540 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74  ** involves writ
10550 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ing the index in
10560 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  to the master ta
10570 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20  ble and filling 
10580 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  in the.  ** inde
10590 78 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  x with the curre
105a0 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74  nt table content
105b0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
105c0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
105d0 73 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65  s 0 when the use
105e0 72 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61  r first enters a
105f0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20   CREATE INDEX . 
10600 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62   ** command.  db
10610 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
10620 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
10630 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a   is opened and .
10640 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
10650 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  X statements are
10660 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65   read out of the
10670 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20   master table.  
10680 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74  In.  ** the latt
10690 65 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65  er case the inde
106a0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
106b0 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20   on disk, which 
106c0 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64  is why.  ** we d
106d0 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63  on't want to rec
106e0 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20  reate it..  **. 
106f0 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
10700 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
10710 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
10720 74 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79  ted as a primary
10730 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49   key.  ** or UNI
10740 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
10750 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  f a CREATE TABLE
10760 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
10770 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
10780 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
10790 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
107a0 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
107b0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
107c0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
107d0 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
107e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
107f0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
10800 79 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  y==0 ){.    int 
10810 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
10820 20 20 20 20 69 6e 74 20 6c 62 6c 31 2c 20 6c 62      int lbl1, lb
10830 6c 32 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  l2;..    v = sql
10840 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
10850 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
10860 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
10870 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
10880 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
10890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
108a0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
108b0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
108c0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
108d0 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
108e0 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 7d  e(v, iDb);.    }
108f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10900 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52  AddOp(v, OP_NewR
10910 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ecno, 0, 0);.   
10920 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10930 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
10940 2c 20 30 2c 20 22 69 6e 64 65 78 22 2c 20 50 33  , 0, "index", P3
10950 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
10960 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10970 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
10980 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
10990 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
109a0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
109b0 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 54 61  ring8, 0, 0, pTa
109c0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
109d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
109e0 4f 70 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49  Op(v, OP_CreateI
109f0 6e 64 65 78 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ndex, iDb, 0);. 
10a00 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
10a10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10a20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10a30 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
10a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a50 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
10a60 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20  , iDb, 0);.     
10a70 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10a80 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
10a90 20 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   1, 0,.         
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
10ab0 72 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49  r*)&pIndex->keyI
10ac0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
10ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10ae0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10af0 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
10b00 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  );.    if( pStar
10b10 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20  t && pEnd ){.   
10b20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d     if( onError==
10b30 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20  OE_None ){.     
10b40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10b50 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43  angeP3(v, -1, "C
10b60 52 45 41 54 45 20 49 4e 44 45 58 20 22 2c 20 50  REATE INDEX ", P
10b70 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10b90 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10ba0 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41  eP3(v, -1, "CREA
10bb0 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
10bc0 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
10bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10bf0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
10c00 30 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64  0);.      n = Ad
10c10 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64  dr(pEnd->z) - Ad
10c20 64 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31  dr(pName->z) + 1
10c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10c40 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
10c50 31 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b  1, pName->z, n);
10c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
10c80 6e 63 61 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ncat, 0, 0);.   
10c90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
10ca0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
10cb0 52 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74  Record, 5, 0, "t
10cc0 74 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43  ttit", P3_STATIC
10cd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10ce0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
10cf0 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a  tIntKey, 0, 0);.
10d00 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
10d10 20 29 7b 0a 20 20 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 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e  _Integer, pTab->
10d40 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
10d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10d60 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
10d70 32 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a  2, pTab->tnum);.
10d80 20 20 20 20 20 20 2f 2a 20 56 64 62 65 43 6f 6d        /* VdbeCom
10d90 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
10da0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f  Tab->zName)); */
10db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10dc0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
10dd0 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20  tNumColumns, 2, 
10de0 70 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20  pTab->nCol);.   
10df0 20 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65     lbl2 = sqlite
10e00 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
10e10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10e30 52 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29  Rewind, 2, lbl2)
10e40 3b 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73  ;.      lbl1 = s
10e50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10e60 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
10e70 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
10e80 6e 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65  ndexKey(v, pInde
10e90 78 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 2);.      sql
10ea0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10eb0 50 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e  P_IdxPut, 1, pIn
10ec0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
10ed0 5f 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  _None,.         
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
10ef0 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72  dexed columns ar
10f00 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50  e not unique", P
10f10 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
10f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10f30 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c  p(v, OP_Next, 2,
10f40 20 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71   lbl1);.      sq
10f50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10f60 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a  Label(v, lbl2);.
10f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
10f90 73 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  se, 2, 0);.     
10fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10fb0 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  p(v, OP_Close, 1
10fc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10fd0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
10fe0 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20 20  db, v, iDb);.   
10ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11000 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11010 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
11020 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11030 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20  OP_ParseSchema, 
11040 69 44 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  iDb, 0,.        
11050 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11060 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e  "name='%q'", pIn
11070 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50 33 5f  dex->zName), P3_
11080 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
11090 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
110a0 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
110b0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
110c0 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
110d0 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
110e0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
110f0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
11100 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
11110 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
11120 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
11130 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
11140 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
11150 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
11160 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
11170 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
11180 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
11190 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
111a0 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
111b0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
111c0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
111d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
111e0 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
111f0 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
11200 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
11210 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
11220 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
11230 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
11240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11250 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
11260 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
11270 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
11280 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
11290 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
112a0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
112b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
112c0 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
112d0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
112e0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
112f0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
11300 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
11310 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
11320 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
11330 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
11340 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
11350 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
11360 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
11370 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
11380 20 66 72 65 65 49 6e 64 65 78 28 70 49 6e 64 65   freeIndex(pInde
11390 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
113a0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
113b0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
113c0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
113d0 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
113e0 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
113f0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
11400 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
11410 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
11420 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
11430 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
11440 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
11450 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
11460 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
11470 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
11480 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11490 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 29 7b  SrcList *pName){
114a0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
114b0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
114c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
114d0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
114e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
114f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
11500 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
11510 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
11520 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
11530 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
11540 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
11550 50 61 72 73 65 29 20 29 20 72 65 74 75 72 6e 3b  Parse) ) return;
11560 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
11570 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
11580 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
11590 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
115a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
115b0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
115c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
115d0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
115e0 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
115f0 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70  pName, 0);.    p
11600 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
11610 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
11620 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
11630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
11640 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
11650 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11660 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
11670 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
11680 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
11690 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
116a0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
116b0 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
116c0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
116d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
116e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
116f0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11700 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
11710 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
11720 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
11730 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
11740 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
11750 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11760 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e 64  b = db->aDb[pInd
11770 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ex->iDb].zName;.
11780 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11790 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
117a0 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62 29  BLE(pIndex->iDb)
117b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
117c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
117d0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
117e0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20  , zTab, 0, zDb) 
117f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
11800 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
11810 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
11820 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65 20  dex->iDb ) code 
11830 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
11840 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
11850 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11860 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
11870 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
11880 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
11890 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
118a0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
118b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
118c0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
118d0 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
118e0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
118f0 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
11900 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
11910 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11920 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
11930 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65 4f      static VdbeO
11940 70 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78 5b  pList dropIndex[
11950 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f 50  ] = {.      { OP
11960 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
11970 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20 20  ADDR(9), 0}, .  
11980 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 38      { OP_String8
11990 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20  ,    0, 0,      
119a0 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20   0}, /* 1 */.   
119b0 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f 72 65     { OP_MemStore
119c0 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20 20 20  ,   1, 1,       
119d0 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d  0},.      { OP_M
119e0 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20 30 2c  emLoad,    1, 0,
119f0 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 33 20         0}, /* 3 
11a00 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43 6f  */.      { OP_Co
11a10 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20  lumn,     0, 1, 
11a20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
11a30 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20  { OP_Eq,        
11a40 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30 7d 2c   0, ADDR(8), 0},
11a50 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  .      { OP_Next
11a60 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28  ,       0, ADDR(
11a70 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  3), 0},.      { 
11a80 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20 20 30  OP_Goto,       0
11a90 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 0a 20  , ADDR(9), 0},. 
11aa0 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65       { OP_Delete
11ab0 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  ,     0, 0,     
11ac0 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a 20 20    0}, /* 8 */.  
11ad0 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62 61 73    };.    int bas
11ae0 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e;..    sqlite3B
11af0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
11b00 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70 49  on(pParse, 0, pI
11b10 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
11b20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
11b30 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64 65 78  rTable(v, pIndex
11b40 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61 73 65  ->iDb);.    base
11b50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11b60 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72 61 79  dOpList(v, Array
11b70 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78 29 2c  Size(dropIndex),
11b80 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20 20 20   dropIndex);.   
11b90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11ba0 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31 2c 20  geP3(v, base+1, 
11bb0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
11bc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
11bd0 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
11be0 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
11bf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11c00 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
11c10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11c30 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 6e   OP_Destroy, pIn
11c40 64 65 78 2d 3e 74 6e 75 6d 2c 20 70 49 6e 64 65  dex->tnum, pInde
11c50 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  x->iDb);.    sql
11c60 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
11c70 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 70 49 6e  P_DropIndex, pIn
11c80 64 65 78 2d 3e 69 44 62 2c 20 30 2c 20 70 49 6e  dex->iDb, 0, pIn
11c90 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
11ca0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
11cb0 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
11cc0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
11cd0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  me);.}../*.** Ap
11ce0 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
11cf0 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
11d00 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
11d10 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
11d20 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
11d30 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
11d40 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
11d50 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
11d60 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
11d70 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
11d80 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c  ppend(IdList *pL
11d90 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
11da0 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
11db0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
11dc0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
11dd0 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
11de0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
11df0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
11e00 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
11e10 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 0;.  }.  if(
11e20 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69   pList->nId>=pLi
11e30 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
11e40 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
11e50 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69  item *a;.    pLi
11e60 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69  st->nAlloc = pLi
11e70 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35  st->nAlloc*2 + 5
11e80 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
11e90 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
11ea0 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  , pList->nAlloc*
11eb0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
11ec0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  0]) );.    if( a
11ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
11ee0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
11ef0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
11f00 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
11f10 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
11f20 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
11f30 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
11f40 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Id], 0, sizeof(p
11f50 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
11f60 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
11f70 6e 49 64 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  nId].zName = sql
11f80 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
11f90 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 70 4c 69  n(pToken);.  pLi
11fa0 73 74 2d 3e 6e 49 64 2b 2b 3b 0a 20 20 72 65 74  st->nId++;.  ret
11fb0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
11fc0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
11fd0 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
11fe0 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74  he given SrcList
11ff0 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
12000 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65  SrcList if.** ne
12010 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e  ed be.  A new en
12020 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69  try is created i
12030 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76  n the SrcList ev
12040 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20  en if pToken is 
12050 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  NULL..**.** A ne
12060 77 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74  w SrcList is ret
12070 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
12080 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
12090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
120a0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
120b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
120c0 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
120d0 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
120e0 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
120f0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
12100 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
12110 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
12120 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
12130 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
12140 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
12150 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
12160 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
12170 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
12180 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
12190 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
121a0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
121b0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
121c0 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
121d0 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
121e0 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
121f0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
12200 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
12210 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
12220 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
12230 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
12240 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
12250 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
12260 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
12270 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
12280 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
12290 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
122a0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
122b0 64 28 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20  d(A,B,0);.**.** 
122c0 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c  Then B is a tabl
122d0 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  e name and the d
122e0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
122f0 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66  unspecified.  If
12300 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20   called.** like 
12310 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
12320 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
12330 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 43 29 3b  stAppend(A,B,C);
12340 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
12350 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
12360 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
12370 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53  abase name..*/.S
12380 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
12390 72 63 4c 69 73 74 41 70 70 65 6e 64 28 53 72 63  rcListAppend(Src
123a0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
123b0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 54 6f 6b 65  en *pTable, Toke
123c0 6e 20 2a 70 44 61 74 61 62 61 73 65 29 7b 0a 20  n *pDatabase){. 
123d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
123e0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
123f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
12400 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
12410 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
12420 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
12430 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
12440 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
12450 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
12460 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
12470 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
12480 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
12490 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
124a0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
124b0 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
124c0 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
124d0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
124e0 20 20 73 69 7a 65 6f 66 28 2a 70 4c 69 73 74 29    sizeof(*pList)
124f0 20 2b 20 28 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   + (pList->nAllo
12500 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4c 69 73  c-1)*sizeof(pLis
12510 74 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20  t->a[0]) );.    
12520 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
12530 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
12540 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
12550 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
12560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
12570 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  t = pNew;.  }.  
12580 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
12590 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 3b 0a  a[pList->nSrc];.
125a0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
125b0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
125c0 3e 61 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  >a[0]));.  if( p
125d0 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
125e0 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
125f0 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
12600 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
12610 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65 20  abase && pTable 
12620 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
12630 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
12640 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
12650 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
12660 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
12670 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
12680 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
12690 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 29 3b 0a  mToken(pTable);.
126a0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
126b0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
126c0 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 61 74 61 62  FromToken(pDatab
126d0 61 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69  ase);.  pItem->i
126e0 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
126f0 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
12700 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
12710 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
12720 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
12730 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
12740 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12750 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
12760 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
12770 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
12780 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
12790 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
127a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
127b0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
127c0 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
127d0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
127e0 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
127f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
12800 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
12810 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
12820 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
12830 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
12840 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
12850 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
12860 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
12870 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
12880 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
12890 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
128a0 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
128b0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73     pList->a[pLis
128c0 74 2d 3e 6e 53 72 63 2d 31 5d 2e 7a 41 6c 69 61  t->nSrc-1].zAlia
128d0 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
128e0 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 65 6e 29  romToken(pToken)
128f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
12900 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
12910 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12920 49 64 4c 69 73 74 44 65 6c 65 74 65 28 49 64 4c  IdListDelete(IdL
12930 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
12940 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
12950 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
12960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
12970 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
12980 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
12990 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
129a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
129b0 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
129c0 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
129d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
129e0 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
129f0 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
12a00 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
12a10 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
12a20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
12a30 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
12a40 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
12a50 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
12a60 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
12a70 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
12a80 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
12a90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
12aa0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
12ab0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
12ac0 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
12ad0 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
12ae0 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
12af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
12b00 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
12b10 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
12b20 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
12b30 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
12b40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12b50 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 53  3SrcListDelete(S
12b60 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
12b70 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12b80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
12b90 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
12ba0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
12bb0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
12bc0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
12bd0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
12be0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
12bf0 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
12c00 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
12c10 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d  qliteFree(pItem-
12c20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
12c30 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a  iteFree(pItem->z
12c40 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
12c50 70 49 74 65 6d 2d 3e 70 54 61 62 20 26 26 20 70  pItem->pTab && p
12c60 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72  Item->pTab->isTr
12c70 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20 20 20 20  ansient ){.     
12c80 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
12c90 62 6c 65 28 30 2c 20 70 49 74 65 6d 2d 3e 70 54  ble(0, pItem->pT
12ca0 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ab);.    }.    s
12cb0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
12cc0 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  te(pItem->pSelec
12cd0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
12ce0 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  xprDelete(pItem-
12cf0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
12d00 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
12d10 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
12d20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
12d30 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
12d40 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
12d50 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
12d60 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
12d70 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
12d80 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
12d90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
12da0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
12db0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
12dc0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
12dd0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
12de0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
12df0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
12e00 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
12e10 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
12e20 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
12e30 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
12e40 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
12e50 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
12e60 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
12e70 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
12e80 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12e90 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
12ea0 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
12eb0 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
12ec0 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
12ed0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
12ee0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
12ef0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12f00 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
12f10 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
12f20 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 7d  USIVE)+1);.    }
12f30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
12f40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
12f50 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
12f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
12f70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
12f80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
12f90 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
12fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
12fb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
12fc0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
12fd0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
12fe0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
12ff0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
13000 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
13010 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13020 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
13030 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
13040 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
13050 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13060 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
13070 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54  SACTION, "COMMIT
13080 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
13090 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
130a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
130b0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
130c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130d0 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
130e0 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
130f0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
13100 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
13110 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
13120 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
13130 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
13140 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
13150 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
13160 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
13170 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
13180 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
13190 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
131a0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
131b0 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f  nErr || sqlite3_
131c0 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
131d0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
131e0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
131f0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
13200 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
13210 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72  BACK", 0, 0) ) r
13220 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71  eturn;..  v = sq
13230 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13240 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
13250 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13260 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
13270 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
13280 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
13290 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
132a0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
132b0 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
132c0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
132d0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
132e0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
132f0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13300 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
13310 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
13320 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
13330 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
13340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
13350 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13360 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
13370 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
13380 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
13390 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
133a0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
133b0 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
133c0 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53   0, 0, MAX_PAGES
133d0 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  , &db->aDb[1].pB
133e0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
133f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13400 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13410 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
13420 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
13430 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
13440 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
13450 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
13460 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
13470 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
13480 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
13490 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
134a0 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
134b0 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
134c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
134d0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
134e0 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 31 5d  Trans(db->aDb[1]
134f0 2e 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  .pBt, 1);.      
13500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13510 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
13520 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13530 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
13540 67 65 74 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  get a write lock
13550 20 6f 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20   on ".          
13560 22 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64  "the temporary d
13570 61 74 61 62 61 73 65 20 66 69 6c 65 22 29 3b 0a  atabase file");.
13580 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
13590 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
135a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
135b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
135c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
135d0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
135e0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
135f0 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
13600 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72   cookie and star
13610 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e  t.** a read-tran
13620 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20  saction for all 
13630 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  named database f
13640 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  iles..**.** It i
13650 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
13660 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b   all schema cook
13670 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20  ies be verified 
13680 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20  and all.** read 
13690 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20  transactions be 
136a0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
136b0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70  nything else hap
136c0 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56  pens in.** the V
136d0 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75  DBE program.  Bu
136e0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  t this routine c
136f0 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  an be called aft
13700 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a  er much other.**
13710 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67   code has been g
13720 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65  enerated.  So he
13730 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f  re is what we do
13740 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  :.**.** The firs
13750 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
13760 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
13770 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74  e code an OP_Got
13780 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a  o that.** will j
13790 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74  ump to a subrout
137a0 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ine at the end o
137b0 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
137c0 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72  Then we.** recor
137d0 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  d every database
137e0 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20   that needs its 
137f0 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20  schema verified 
13800 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  in the.** pParse
13810 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65  ->cookieMask fie
13820 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65  ld.  Later, afte
13830 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65  r all other code
13840 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e   has been.** gen
13850 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72  erated, the subr
13860 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
13870 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
13880 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  fications and.**
13890 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e   starts the tran
138a0 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
138b0 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f   coded and the O
138c0 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a  P_Goto P2 value.
138d0 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  ** will be made 
138e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
138f0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
13900 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
13910 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65  the.** cookie ve
13920 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f  rification subro
13930 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65  utine code happe
13940 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e  ns in sqlite3Fin
13950 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a  ishCoding()..**.
13960 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e  ** If iDb<0 then
13970 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74   code the OP_Got
13980 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73  o only - don't s
13990 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66  et flag to verif
139a0 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  y the.** schema 
139b0 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73  on any databases
139c0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
139d0 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  sed to position 
139e0 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65  the OP_Goto.** e
139f0 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65  arly in the code
13a00 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77  , before we know
13a10 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   if any database
13a20 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20   tables will be 
13a30 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
13a40 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
13a50 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
13a60 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
13a70 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
13a80 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d  Vdbe *v;.  int m
13a90 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ask;..  v = sqli
13aa0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13ab0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
13ac0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
13ad0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
13ae0 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
13af0 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64  ior error */.  d
13b00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13b10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
13b20 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20  okieGoto==0 ){. 
13b30 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
13b40 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
13b50 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
13b60 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
13b70 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
13b80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  {.    assert( iD
13b90 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
13ba0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
13bb0 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
13bc0 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
13bd0 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a  sert( iDb<32 );.
13be0 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44      mask = 1<<iD
13bf0 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72  b;.    if( (pPar
13c00 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26  se->cookieMask &
13c10 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
13c20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
13c30 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  eMask |= mask;. 
13c40 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f       pParse->coo
13c50 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
13c60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68  db->aDb[iDb].sch
13c70 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
13c80 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a    if( iDb==1 ){.
13c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
13ca0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
13cb0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
13cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13cd0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
13ce0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
13cf0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
13d00 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
13d10 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
13d20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
13d30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13d40 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
13d50 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
13d60 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
13d70 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
13d80 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
13d90 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
13da0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
13db0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
13dc0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
13dd0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
13de0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
13df0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
13e00 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
13e10 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
13e20 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
13e30 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
13e40 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
13e50 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
13e60 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
13e70 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
13e80 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
13e90 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
13ea0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
13eb0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
13ec0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
13ed0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
13ee0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
13ef0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
13f00 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
13f10 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
13f20 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
13f30 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
13f40 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
13f50 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
13f60 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
13f70 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79   set..**.** Only
13f80 20 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e   database iDb an
13f90 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
13fa0 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
13fb0 74 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61  table by this ca
13fc0 6c 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30  ll..** If iDb==0
13fd0 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20  , then the main 
13fe0 61 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73  and temp databas
13ff0 65 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  es are made writ
14000 61 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44  able.   If.** iD
14010 62 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74  b==1 then only t
14020 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
14030 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
14040 65 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65  e.  If iDb>1 the
14050 6e 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  n the.** specifi
14060 65 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ed auxiliary dat
14070 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65  abase and the te
14080 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
14090 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a  made writable..*
140a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
140b0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
140c0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
140d0 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
140e0 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  t, int iDb){.  V
140f0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
14100 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
14110 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
14120 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43  turn;.  sqlite3C
14130 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
14140 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
14150 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
14160 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69  k |= 1<<iDb;.  i
14170 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  f( setStatement 
14180 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14190 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
141a0 61 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29  atement, iDb, 0)
141b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 21  ;.  }.  if( iDb!
141c0 3d 31 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  =1 && pParse->db
141d0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 21 3d 30 20  ->aDb[1].pBt!=0 
141e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
141f0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
14200 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
14210 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
14220 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  }../* .** Return
14230 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 73   the transient s
14240 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f 62 6a  qlite3_value obj
14250 65 63 74 20 75 73 65 64 20 66 6f 72 20 65 6e 63  ect used for enc
14260 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69 6f 6e  oding conversion
14270 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 20  s.** during SQL 
14280 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  compilation..*/.
14290 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
142a0 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69 65  qlite3GetTransie
142b0 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 20  ntValue(sqlite3 
142c0 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62 2d  *db){.  if( !db-
142d0 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 64  >pValue ){.    d
142e0 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c 69  b->pValue = sqli
142f0 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20  te3ValueNew();. 
14300 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
14310 70 56 61 6c 75 65 3b 0a 7d 0a                    pValue;.}.