/ Hex Artifact Content
Login

Artifact bb896c5f85ab749d17ae5d730235134c12c08033:


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 38 20 32 30 30 34 2f 31 30 2f 33 31 20 30  258 2004/10/31 0
0300: 32 3a 32 32 3a 34 39 20 64 72 68 20 45 78 70 20  2:22:49 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 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
8ba0: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
8bb0: 74 20 63 68 61 72 20 2a 7a 53 75 62 3b 20 20 2f  t char *zSub;  /
8bc0: 2a 20 4b 65 79 77 6f 72 64 73 20 73 75 62 73 74  * Keywords subst
8bd0: 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68 20 66  ring to search f
8be0: 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 6e  or */.    char n
8bf0: 53 75 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Sub;         /* 
8c00: 6c 65 6e 67 74 68 20 6f 66 20 7a 53 75 62 20 2a  length of zSub *
8c10: 2f 0a 20 20 20 20 63 68 61 72 20 61 66 66 69 6e  /.    char affin
8c20: 69 74 79 3b 20 20 20 20 20 2f 2a 20 41 66 66 69  ity;     /* Affi
8c30: 6e 69 74 79 20 74 6f 20 72 65 74 75 72 6e 20 69  nity to return i
8c40: 66 20 69 74 20 6d 61 74 63 68 65 73 20 2a 2f 0a  f it matches */.
8c50: 20 20 7d 20 73 75 62 73 74 72 69 6e 67 73 5b 5d    } substrings[]
8c60: 20 3d 20 7b 0a 20 20 20 20 7b 22 49 4e 54 22 2c   = {.    {"INT",
8c70: 20 20 33 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f    3, SQLITE_AFF_
8c80: 49 4e 54 45 47 45 52 7d 2c 0a 20 20 20 20 7b 22  INTEGER},.    {"
8c90: 43 48 41 52 22 2c 20 34 2c 20 53 51 4c 49 54 45  CHAR", 4, SQLITE
8ca0: 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20 20 20  _AFF_TEXT},.    
8cb0: 7b 22 43 4c 4f 42 22 2c 20 34 2c 20 53 51 4c 49  {"CLOB", 4, SQLI
8cc0: 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a 20 20  TE_AFF_TEXT},.  
8cd0: 20 20 7b 22 54 45 58 54 22 2c 20 34 2c 20 53 51    {"TEXT", 4, SQ
8ce0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c 0a  LITE_AFF_TEXT},.
8cf0: 20 20 20 20 7b 22 42 4c 4f 42 22 2c 20 34 2c 20      {"BLOB", 4, 
8d00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 7d  SQLITE_AFF_NONE}
8d10: 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6e 54  ,.  };..  if( nT
8d20: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ype==0 ){.    re
8d30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
8d40: 4e 4f 4e 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  NONE;.  }.  for(
8d50: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 73 75  i=0; i<sizeof(su
8d60: 62 73 74 72 69 6e 67 73 29 2f 73 69 7a 65 6f 66  bstrings)/sizeof
8d70: 28 73 75 62 73 74 72 69 6e 67 73 5b 30 5d 29 3b  (substrings[0]);
8d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63   i++){.    int c
8d90: 31 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b 69  1 = substrings[i
8da0: 5d 2e 7a 53 75 62 5b 30 5d 3b 0a 20 20 20 20 69  ].zSub[0];.    i
8db0: 6e 74 20 63 32 20 3d 20 74 6f 6c 6f 77 65 72 28  nt c2 = tolower(
8dc0: 63 31 29 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  c1);.    int lim
8dd0: 69 74 20 3d 20 6e 54 79 70 65 20 2d 20 73 75 62  it = nType - sub
8de0: 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 3b  strings[i].nSub;
8df0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8e00: 2a 7a 20 3d 20 73 75 62 73 74 72 69 6e 67 73 5b  *z = substrings[
8e10: 69 5d 2e 7a 53 75 62 3b 0a 20 20 20 20 66 6f 72  i].zSub;.    for
8e20: 28 6e 3d 30 3b 20 6e 3c 3d 6c 69 6d 69 74 3b 20  (n=0; n<=limit; 
8e30: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
8e40: 63 20 3d 20 7a 54 79 70 65 5b 6e 5d 3b 0a 20 20  c = zType[n];.  
8e50: 20 20 20 20 69 66 28 20 28 63 3d 3d 63 31 20 7c      if( (c==c1 |
8e60: 7c 20 63 3d 3d 63 32 29 0a 20 20 20 20 20 20 20  | c==c2).       
8e70: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
8e80: 74 65 33 53 74 72 4e 49 43 6d 70 28 26 7a 54 79  te3StrNICmp(&zTy
8e90: 70 65 5b 6e 5d 2c 20 7a 2c 20 73 75 62 73 74 72  pe[n], z, substr
8ea0: 69 6e 67 73 5b 69 5d 2e 6e 53 75 62 29 20 29 7b  ings[i].nSub) ){
8eb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8ec0: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 61 66  substrings[i].af
8ed0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a  finity;.      }.
8ee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8ef0: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
8f00: 4d 45 52 49 43 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MERIC;.}../*.** 
8f10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
8f20: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
8f30: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
8f40: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
8f50: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
8f60: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
8f70: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
8f80: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
8f90: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
8fa0: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
8fb0: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
8fc0: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
8fd0: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
8fe0: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
8ff0: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
9000: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
9010: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
9020: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
9030: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
9040: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
9050: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
9060: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
9070: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
9080: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
9090: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
90a0: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
90b0: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
90c0: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
90d0: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
90e0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
90f0: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
9100: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
9110: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
9120: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
9130: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
9140: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
9150: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
9160: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
9170: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
9180: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
9190: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
91a0: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
91b0: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
91c0: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
91d0: 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20  enough..*/.void 
91e0: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
91f0: 6b 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  kie(sqlite3 *db,
9200: 20 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44   Vdbe *v, int iD
9210: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b){.  sqlite3Vdb
9220: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
9230: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
9240: 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  b].schema_cookie
9250: 2b 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  +1, 0);.  sqlite
9260: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9270: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
9280: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   0);.}../*.** Me
9290: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
92a0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
92b0: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
92c0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
92d0: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
92e0: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
92f0: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
9300: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
9310: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
9320: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
9330: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
9340: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
9350: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
9360: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
9370: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
9380: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
9390: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
93a0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
93b0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
93c0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
93d0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
93e0: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
93f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
9400: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   + 2;.}../*.** W
9410: 72 69 74 65 20 61 6e 20 69 64 65 6e 74 69 66 69  rite an identifi
9420: 65 72 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  er onto the end 
9430: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  of the given str
9440: 69 6e 67 2e 20 20 41 64 64 0a 2a 2a 20 71 75 6f  ing.  Add.** quo
9450: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 61 73  te characters as
9460: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
9470: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
9480: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
9490: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
94a0: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
94b0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
94c0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
94d0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
94e0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
94f0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
9500: 70 49 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  pIdx;.  for(j=0;
9510: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
9520: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
9530: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
9540: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
9550: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
9560: 65 65 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65  eedQuote =  zIde
9570: 6e 74 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69  nt[j]!=0 || isdi
9580: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
95b0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
95c0: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
95d0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
95e0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
95f0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
9600: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
9610: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
9620: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
9630: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
9640: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
9650: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
9660: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
9670: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
9680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
9690: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
96a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
96b0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
96c0: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
96d0: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
96e0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
96f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
9700: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
9710: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
9720: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
9730: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
9740: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9750: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
9760: 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20 2a  ableStmt(Table *
9770: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
9780: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
9790: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
97a0: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a  *zSep2, *zEnd, *
97b0: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
97c0: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
97d0: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
97e0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
97f0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
9800: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
9810: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
9820: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d  );.    z = pCol-
9830: 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20  >zType;.    if( 
9840: 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  z ){.      n += 
9850: 28 73 74 72 6c 65 6e 28 7a 29 20 2b 20 31 29 3b  (strlen(z) + 1);
9860: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b  .    }.  }.  n +
9870: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
9880: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
9890: 3c 35 30 20 29 7b 0a 20 20 20 20 7a 53 65 70 20  <50 ){.    zSep 
98a0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
98b0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
98c0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
98d0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
98e0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
98f0: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
9900: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
9910: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
9920: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
9930: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
9940: 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74  n );.  if( zStmt
9950: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9960: 20 20 73 74 72 63 70 79 28 7a 53 74 6d 74 2c 20    strcpy(zStmt, 
9970: 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22 43 52 45  p->iDb==1 ? "CRE
9980: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22  ATE TEMP TABLE "
9990: 20 3a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   : "CREATE TABLE
99a0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65   ");.  k = strle
99b0: 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  n(zStmt);.  iden
99c0: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
99d0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
99e0: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
99f0: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
9a00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
9a10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
9a20: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 53 74  .    strcpy(&zSt
9a30: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
9a40: 20 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    k += strlen(&z
9a50: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
9a60: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
9a70: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
9a80: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
9a90: 3b 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70  ;.    if( (z = p
9aa0: 43 6f 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29  Col->zType)!=0 )
9ab0: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b  {.      zStmt[k+
9ac0: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
9ad0: 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  strcpy(&zStmt[k]
9ae0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d  , z);.      k +=
9af0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
9b00: 7d 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 26  }.  }.  strcpy(&
9b10: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b  zStmt[k], zEnd);
9b20: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
9b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9b40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9b50: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
9b60: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
9b70: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
9b80: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9b90: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
9ba0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9bb0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
9bc0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
9bd0: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
9be0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
9bf0: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
9c00: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
9c10: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
9c20: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
9c30: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
9c40: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
9c50: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
9c60: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
9c70: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
9c80: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
9c90: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
9ca0: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
9cb0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
9cc0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
9cd0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
9ce0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9cf0: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
9d00: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
9d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
9d20: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
9d30: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
9d40: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
9d50: 20 63 68 61 6e 67 65 73 2c 20 73 6f 20 74 68 65   changes, so the
9d60: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
9d70: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
9d80: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
9d90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
9da0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
9db0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
9dc0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
9dd0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
9de0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
9df0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
9e00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
9e10: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
9e20: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
9e30: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
9e40: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
9e50: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
9e60: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
9e70: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
9e80: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
9e90: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
9ea0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
9eb0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
9ec0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
9ed0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
9ee0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  rse, Token *pEnd
9ef0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
9f00: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  t){.  Table *p;.
9f10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9f20: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
9f30: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
9f40: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
9f50: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71  arse->nErr || sq
9f60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
9f70: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
9f80: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9f90: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
9fa0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
9fb0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
9fc0: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
9fd0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
9fe0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
9ff0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
a000: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
a010: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
a020: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
a030: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
a040: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
a050: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
a060: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
a070: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
a080: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
a090: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
a0a0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
a0b0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
a0c0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
a0d0: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
a0e0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
a0f0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
a100: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
a110: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
a120: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
a130: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
a140: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
a150: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
a160: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
a170: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
a180: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
a190: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
a1a0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
a1b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
a1c0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
a1d0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
a1e0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 0a 20 20 2a  ecord number.  *
a1f0: 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  * for the new ta
a200: 62 6c 65 20 65 6e 74 72 79 20 73 68 6f 75 6c 64  ble entry should
a210: 20 61 6c 72 65 61 64 79 20 62 65 20 6f 6e 20 74   already be on t
a220: 68 65 20 73 74 61 63 6b 2e 0a 20 20 2a 2a 0a 20  he stack..  **. 
a230: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
a240: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
a250: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
a260: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
a270: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
a280: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
a290: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
a2a0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
a2b0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
a2c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
a2d0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 20     Vdbe *v;..   
a2e0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
a2f0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
a300: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
a310: 72 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  rn;..    if( p->
a320: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
a330: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
a340: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
a350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a360: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
a370: 6c 65 2c 20 70 2d 3e 69 44 62 2c 20 30 29 3b 0a  le, p->iDb, 0);.
a380: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a390: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
a3a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a3b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
a3c0: 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
a3d0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
a3e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a3f0: 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  se, 0, 0);..    
a400: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
a410: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20  CREATE TABLE xx 
a420: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65  AS SELECT ..., e
a430: 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43  xecute the SELEC
a440: 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  T.    ** stateme
a450: 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  nt to populate t
a460: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68  he new table. Th
a470: 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  e root-page numb
a480: 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  er for the.    *
a490: 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6f  * new table is o
a4a0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
a4b0: 20 76 64 62 65 20 73 74 61 63 6b 2e 0a 20 20 20   vdbe stack..   
a4c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
a4d0: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
a4e0: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
a4f0: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
a500: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
a510: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
a520: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
a530: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
a540: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
a550: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
a560: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
a570: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
a580: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
a590: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 20 20 20   *pSelTab;.     
a5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a5b0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
a5c0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a5d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a5e0: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 69 44 62  _Integer, p->iDb
a5f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a600: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a610: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
a620: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
a630: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
a640: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
a650: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
a660: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 2c 20  , SRT_Table, 1, 
a670: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
a680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a690: 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
a6a0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
a6b0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
a6c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  0 ){.        pSe
a6d0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
a6e0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
a6f0: 70 50 61 72 73 65 2c 20 30 2c 20 70 53 65 6c 65  pParse, 0, pSele
a700: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
a710: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
a720: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
a730: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
a740: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
a750: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
a760: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
a770: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
a780: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
a790: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
a7a0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
a7b0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
a7c0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
a7d0: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
a7e0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
a7f0: 7d 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  }.  .    sqlite3
a800: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
a810: 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a 20 20 20  v, p->iDb);..   
a820: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a830: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a840: 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65 63 74 3d  , 0, p->pSelect=
a850: 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76 69 65 77  =0?"table":"view
a860: 22 2c 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  ",P3_STATIC);.  
a870: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
a880: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a890: 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  0, 0, p->zName, 
a8a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
a8b0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
a8c0: 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a  ing8, 0, 0, p->z
a8d0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
a8e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a8f0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 33 2c 20 30 29  , OP_Pull, 3, 0)
a900: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  ;..    if( pSele
a910: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ct ){.      char
a920: 20 2a 7a 20 3d 20 63 72 65 61 74 65 54 61 62 6c   *z = createTabl
a930: 65 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20  eStmt(p);.      
a940: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
a950: 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ) : 0;.      sql
a960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a970: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
a980: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a990: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
a9a0: 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
a9b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
a9c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a9d0: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
a9e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a9f0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
aa00: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
aa10: 22 43 52 45 41 54 45 20 56 49 45 57 20 22 2c 20  "CREATE VIEW ", 
aa20: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
aa30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aa40: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
aa50: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
aa60: 2c 20 30 2c 20 22 43 52 45 41 54 45 20 54 41 42  , 0, "CREATE TAB
aa70: 4c 45 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29  LE ", P3_STATIC)
aa80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa90: 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20  assert( pEnd!=0 
aaa0: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  );.      n = Add
aab0: 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
aac0: 72 28 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  r(pParse->sNameT
aad0: 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20  oken.z) + 1;.   
aae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aaf0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
ab00: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
ab10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ab20: 65 50 33 28 76 2c 20 2d 31 2c 20 70 50 61 72 73  eP3(v, -1, pPars
ab30: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 2c  e->sNameToken.z,
ab40: 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
ab50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ab60: 50 5f 43 6f 6e 63 61 74 2c 20 30 2c 20 30 29 3b  P_Concat, 0, 0);
ab70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ab80: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
ab90: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20 30  MakeRecord, 5, 0
aba0: 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53 54  , "tttit", P3_ST
abb0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
abc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
abd0: 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20  P_PutIntKey, 0, 
abe0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  0);.    sqlite3C
abf0: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20  hangeCookie(db, 
ac00: 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 20 20 20 20  v, p->iDb);.    
ac10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac20: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
ac30: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
ac40: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 50 61  VdbeOp3(v, OP_Pa
ac50: 72 73 65 53 63 68 65 6d 61 2c 20 70 2d 3e 69 44  rseSchema, p->iD
ac60: 62 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71  b, 0,.        sq
ac70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 74 62  lite3MPrintf("tb
ac80: 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e  l_name='%q'",p->
ac90: 7a 4e 61 6d 65 29 2c 20 50 33 5f 44 59 4e 41 4d  zName), P3_DYNAM
aca0: 49 43 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  IC);.  }..  /* A
acb0: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
acc0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
acd0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ace0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
acf0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
ad00: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
ad10: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
ad20: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
ad30: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a    FKey *pFKey; .
ad40: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
ad50: 62 2d 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 3b 0a  b->aDb[p->iDb];.
ad60: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
ad70: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
ad80: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  b->tblHash, p->z
ad90: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e  Name, strlen(p->
ada0: 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b 0a 20 20  zName)+1, p);.  
adb0: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
adc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
add0: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
ade0: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
adf0: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
ae00: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
ae10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
ae20: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d 3e 70    for(pFKey=p->p
ae30: 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b  FKey; pFKey; pFK
ae40: 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46  ey=pFKey->pNextF
ae50: 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rom){.      int 
ae60: 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28 70 46 4b  nTo = strlen(pFK
ae70: 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20  ey->zTo) + 1;.  
ae80: 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
ae90: 54 6f 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  To = sqlite3Hash
aea0: 46 69 6e 64 28 26 70 44 62 2d 3e 61 46 4b 65 79  Find(&pDb->aFKey
aeb0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
aec0: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
aed0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
aee0: 2d 3e 61 46 4b 65 79 2c 20 70 46 4b 65 79 2d 3e  ->aFKey, pFKey->
aef0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 4b 65 79 29  zTo, nTo, pFKey)
af00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
af10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
af20: 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c  0;.    db->nTabl
af30: 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  e++;.    db->fla
af40: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
af50: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d 0a  ernChanges;.  }.
af60: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
af70: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
af80: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
af90: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
afa0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
afb0: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
afc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
afd0: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
afe0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
aff0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
b000: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
b010: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
b020: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
b030: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
b040: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b050: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
b060: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
b070: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
b080: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
b090: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
b0a0: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
b0b0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
b0c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b0d0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
b0e0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
b0f0: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
b100: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
b110: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
b120: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
b130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
b140: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
b150: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
b160: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
b170: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
b180: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  d char *z;.  Tok
b190: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
b1a0: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
b1b0: 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 73 71 6c 69   *pName;..  sqli
b1c0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
b1d0: 61 72 73 65 2c 20 70 42 65 67 69 6e 2c 20 70 4e  arse, pBegin, pN
b1e0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73  ame1, pName2, is
b1f0: 54 65 6d 70 2c 20 31 29 3b 0a 20 20 70 20 3d 20  Temp, 1);.  p = 
b200: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b210: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
b220: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
b230: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b240: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b260: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
b270: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
b280: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
b290: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73  &pName);.  if( s
b2a0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
b2b0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 70 2d 3e  Fix, pParse, p->
b2c0: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
b2d0: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
b2e0: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
b2f0: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
b300: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
b310: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b320: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
b330: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
b340: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
b350: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
b360: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
b370: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
b380: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
b390: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
b3a0: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
b3b0: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
b3c0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
b3d0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
b3e0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
b3f0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
b400: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
b410: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
b420: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
b430: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
b440: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
b450: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
b460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
b470: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  (pSelect);.  sql
b480: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
b490: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
b4a0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
b4b0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
b4c0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
b4d0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
b4e0: 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
b4f0: 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
b500: 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
b510: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
b520: 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
b530: 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
b540: 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
b550: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
b560: 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21    if( sEnd.z[0]!
b570: 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  =0 && sEnd.z[0]!
b580: 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
b590: 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
b5a0: 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
b5b0: 20 20 6e 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70    n = sEnd.z - p
b5c0: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20  Begin->z;.  z = 
b5d0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
b5e0: 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b  char*)pBegin->z;
b5f0: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
b600: 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c   (z[n-1]==';' ||
b610: 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29   isspace(z[n-1])
b620: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
b630: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
b640: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
b650: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
b660: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
b670: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
b680: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
b690: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
b6a0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
b6b0: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
b6c0: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
b6d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
b6e0: 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  IEW */..#ifndef 
b6f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
b700: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65  ./*.** The Table
b710: 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c   structure pTabl
b720: 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49  e is really a VI
b730: 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  EW.  Fill in the
b740: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
b750: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
b760: 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62  view in the pTab
b770: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  le structure.  R
b780: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
b790: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  .** of errors.  
b7a0: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
b7b0: 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72  een leave an err
b7c0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
b7d0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
b7e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65  /.int sqlite3Vie
b7f0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
b800: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b810: 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20  able *pTable){. 
b820: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b830: 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t;.  Select *pSe
b840: 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  l;.  Table *pSel
b850: 54 61 62 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20  Tab;.  int nErr 
b860: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
b870: 70 54 61 62 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20  pTable );..  /* 
b880: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
b890: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
b8a0: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
b8b0: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
b8c0: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
b8d0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
b8e0: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
b8f0: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
b900: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
b910: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
b920: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
b930: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
b940: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
b950: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
b960: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
b970: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
b980: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
b990: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
b9a0: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
b9b0: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
b9c0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
b9d0: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
b9e0: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
b9f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
ba00: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
ba10: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
ba20: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
ba30: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
ba40: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
ba50: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
ba60: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
ba70: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
ba80: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
ba90: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
baa0: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
bab0: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
bac0: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
bad0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
bae0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
baf0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
bb00: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
bb10: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
bb20: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
bb30: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
bb40: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67   }..  /* If we g
bb50: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
bb60: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
bb70: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
bb80: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  le names..  */. 
bb90: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
bba0: 3e 70 53 65 6c 65 63 74 20 29 3b 20 2f 2a 20 49  >pSelect ); /* I
bbb0: 66 20 6e 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20  f nCol==0, then 
bbc0: 70 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  pTable must be a
bbd0: 20 56 49 45 57 20 2a 2f 0a 20 20 70 53 65 6c 20   VIEW */.  pSel 
bbe0: 3d 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  = pTable->pSelec
bbf0: 74 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68  t;..  /* Note th
bc00: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
bc10: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
bc20: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
bc30: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
bc40: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
bc50: 68 69 73 20 6c 69 73 74 2e 20 20 42 75 74 20 77  his list.  But w
bc60: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 72  e will need to r
bc70: 65 73 74 6f 72 65 20 74 68 65 20 6c 69 73 74 0a  estore the list.
bc80: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
bc90: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67   original config
bca0: 75 72 61 74 69 6f 6e 20 61 66 74 65 72 77 61 72  uration afterwar
bcb0: 64 73 2c 20 73 6f 20 77 65 20 73 61 76 65 20 61  ds, so we save a
bcc0: 20 63 6f 70 79 20 6f 66 0a 20 20 2a 2a 20 74 68   copy of.  ** th
bcd0: 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 20 70 45  e original in pE
bce0: 4c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 45 4c  List..  */.  pEL
bcf0: 69 73 74 20 3d 20 70 53 65 6c 2d 3e 70 45 4c 69  ist = pSel->pELi
bd00: 73 74 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  st;.  pSel->pELi
bd10: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
bd20: 4c 69 73 74 44 75 70 28 70 45 4c 69 73 74 29 3b  ListDup(pEList);
bd30: 0a 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 45 4c  .  if( pSel->pEL
bd40: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53  ist==0 ){.    pS
bd50: 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  el->pEList = pEL
bd60: 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
bd70: 31 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61  1;  /* Malloc fa
bd80: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  iled */.  }.  pT
bd90: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
bda0: 0a 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c  .  pSelTab = sql
bdb0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
bdc0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c  elect(pParse, 0,
bdd0: 20 70 53 65 6c 29 3b 0a 20 20 69 66 28 20 70 53   pSel);.  if( pS
bde0: 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  elTab ){.    ass
bdf0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ert( pTable->aCo
be00: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  l==0 );.    pTab
be10: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
be20: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 70 54  ab->nCol;.    pT
be30: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65  able->aCol = pSe
be40: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
be50: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
be60: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  0;.    pSelTab->
be70: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71  aCol = 0;.    sq
be80: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
be90: 28 30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  (0, pSelTab);.  
bea0: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
beb0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
bec0: 6c 65 2d 3e 69 44 62 2c 20 44 42 5f 55 6e 72 65  le->iDb, DB_Unre
bed0: 73 65 74 56 69 65 77 73 29 3b 0a 20 20 7d 65 6c  setViews);.  }el
bee0: 73 65 7b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  se{.    pTable->
bef0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 6e 45  nCol = 0;.    nE
bf00: 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rr++;.  }.  sqli
bf10: 74 65 33 53 65 6c 65 63 74 55 6e 62 69 6e 64 28  te3SelectUnbind(
bf20: 70 53 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pSel);.  sqlite3
bf30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
bf40: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
bf50: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pSel->pEList = p
bf60: 45 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  EList;.  return 
bf70: 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
bf80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bf90: 56 49 45 57 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  VIEW */..#ifndef
bfa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
bfb0: 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
bfc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
bfd0: 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
bfe0: 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
bff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c000: 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
c010: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
c020: 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
c030: 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20 21 44  lem *i;.  if( !D
c040: 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
c050: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
c060: 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
c070: 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
c080: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
c090: 62 5b 69 64 78 5d 2e 74 62 6c 48 61 73 68 29 3b  b[idx].tblHash);
c0a0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
c0b0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61  Next(i)){.    Ta
c0c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
c0d0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
c0e0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
c0f0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71  lect ){.      sq
c100: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
c110: 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20  ames(pTab);.    
c120: 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
c130: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
c140: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
c150: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
c160: 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
c170: 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
c180: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c190: 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
c1a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c1b0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
c1c0: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
c1d0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
c1e0: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
c1f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
c200: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
c210: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
c220: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
c230: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
c240: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
c250: 73 56 69 65 77 29 7b 0a 20 20 54 61 62 6c 65 20  sView){.  Table 
c260: 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
c270: 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
c280: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c290: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
c2a0: 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  iDb;..  if( pPar
c2b0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69  se->nErr || sqli
c2c0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
c2d0: 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  d ) goto exit_dr
c2e0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65  op_table;.  asse
c2f0: 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
c300: 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73  =1 );.  pTab = s
c310: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
c320: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  e(pParse, pName-
c330: 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
c340: 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
c350: 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  se);..  if( pTab
c360: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
c370: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 44  drop_table;.  iD
c380: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
c390: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
c3a0: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
c3b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c3c0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
c3d0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
c3e0: 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
c3f0: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
c400: 45 4d 41 5f 54 41 42 4c 45 28 70 54 61 62 2d 3e  EMA_TABLE(pTab->
c410: 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
c420: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
c430: 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a  aDb[pTab->iDb].z
c440: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
c450: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
c460: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
c470: 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
c480: 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
c490: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
c4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c4b0: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
c4c0: 69 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20  if( iDb==1 ){.  
c4d0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
c4e0: 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
c4f0: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
c500: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
c510: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
c520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c530: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69  lse{.      if( i
c540: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
c550: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
c560: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
c570: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c580: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
c590: 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
c5a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c5b0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
c5c0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
c5d0: 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
c5e0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
c5f0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
c600: 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
c610: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
c620: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
c630: 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
c640: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
c650: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
c660: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
c670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
c680: 69 66 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 72  if.  if( pTab->r
c690: 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73  eadOnly ){.    s
c6a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c6b0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
c6c0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
c6d0: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
c6e0: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
c6f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
c700: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
c710: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 56 69  ;.  }.  if( isVi
c720: 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
c730: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
c740: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c750: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
c760: 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
c770: 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
c780: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
c790: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c7a0: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
c7b0: 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
c7c0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
c7d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c7e0: 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
c7f0: 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
c800: 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
c810: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
c820: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
c830: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
c840: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
c850: 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
c860: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
c870: 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
c880: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
c890: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
c8a0: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
c8b0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 56    static const V
c8c0: 64 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 54 61  dbeOpList dropTa
c8d0: 62 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ble[] = {.      
c8e0: 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20  { OP_Rewind,    
c8f0: 20 30 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d   0, ADDR(13), 0}
c900: 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72  ,.      { OP_Str
c910: 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20  ing8,    0, 0,  
c920: 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a        0}, /* 1 *
c930: 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d  /.      { OP_Mem
c940: 53 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20  Store,   1, 1,  
c950: 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20        0},.      
c960: 7b 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20  { OP_MemLoad,   
c970: 20 31 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d   1, 0,        0}
c980: 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20  , /* 3 */.      
c990: 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20  { OP_Column,    
c9a0: 20 30 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d   0, 2,        0}
c9b0: 2c 20 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  , /* sqlite_mast
c9c0: 65 72 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20  er.tbl_name */. 
c9d0: 20 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20       { OP_Ne,   
c9e0: 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 31 32        0, ADDR(12
c9f0: 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ), 0},.      { O
ca00: 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c  P_String8,    0,
ca10: 20 30 2c 20 20 20 20 20 20 20 20 22 74 72 69 67   0,        "trig
ca20: 67 65 72 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f  ger"},.      { O
ca30: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
ca40: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   2,        0}, /
ca50: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  * sqlite_master.
ca60: 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20  type */.      { 
ca70: 4f 50 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30  OP_Eq,         0
ca80: 2c 20 41 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a  , ADDR(12), 0},.
ca90: 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74        { OP_Delet
caa0: 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  e,     0, 0,    
cab0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
cac0: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
cad0: 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a  , ADDR(13), 0},.
cae0: 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c        { OP_Goto,
caf0: 20 20 20 20 20 20 20 30 2c 20 41 44 44 52 28 33         0, ADDR(3
cb00: 29 2c 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20  ),  0},.      { 
cb10: 4f 50 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30  OP_Next,       0
cb20: 2c 20 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20  , ADDR(3),  0}, 
cb30: 2f 2a 20 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a  /* 12 */.    };.
cb40: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
cb50: 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54  .    Trigger *pT
cb60: 72 69 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  rigger;.    sqli
cb70: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
cb80: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
cb90: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20  , pTab->iDb);.. 
cba0: 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
cbb0: 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
cbc0: 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
cbd0: 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
cbe0: 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
cbf0: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
cc00: 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
cc10: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
cc20: 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
cc30: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
cc40: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
cc50: 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
cc60: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
cc70: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  r;.    while( pT
cc80: 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
cc90: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
cca0: 2d 3e 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62  ->iDb==pTab->iDb
ccb0: 20 7c 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44   || pTrigger->iD
ccc0: 62 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  b==1 );.      sq
ccd0: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
cce0: 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
ccf0: 67 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  gger, 1);.      
cd00: 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
cd10: 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
cd20: 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  }..    /* Drop a
cd30: 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
cd40: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
cd50: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
cd60: 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
cd70: 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
cd80: 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
cd90: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
cda0: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
cdb0: 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
cdc0: 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
cdd0: 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
cde0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
cdf0: 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
ce00: 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
ce10: 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
ce20: 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
ce30: 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
ce40: 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
ce50: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
ce60: 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
ce70: 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
ce80: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
ce90: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
cea0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
ceb0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
cec0: 28 76 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  (v, pTab->iDb);.
ced0: 20 20 20 20 62 61 73 65 20 3d 20 73 71 6c 69 74      base = sqlit
cee0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
cef0: 76 2c 20 41 72 72 61 79 53 69 7a 65 28 64 72 6f  v, ArraySize(dro
cf00: 70 54 61 62 6c 65 29 2c 20 64 72 6f 70 54 61 62  pTable), dropTab
cf10: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
cf20: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
cf30: 62 61 73 65 2b 31 2c 20 70 54 61 62 2d 3e 7a 4e  base+1, pTab->zN
cf40: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ame, 0);.    sql
cf50: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
cf60: 28 64 62 2c 20 76 2c 20 70 54 61 62 2d 3e 69 44  (db, v, pTab->iD
cf70: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
cf80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
cf90: 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
cfa0: 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b 0a   if( !isView ){.
cfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cfc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73  eAddOp(v, OP_Des
cfd0: 74 72 6f 79 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  troy, pTab->tnum
cfe0: 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
cff0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
d000: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d010: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d020: 74 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t){.        sqli
d030: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d040: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 70 49 64 78  OP_Destroy, pIdx
d050: 2d 3e 74 6e 75 6d 2c 20 70 49 64 78 2d 3e 69 44  ->tnum, pIdx->iD
d060: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
d070: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
d080: 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f 70 54  eOp3(v, OP_DropT
d090: 61 62 6c 65 2c 20 70 54 61 62 2d 3e 69 44 62 2c  able, pTab->iDb,
d0a0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
d0b0: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
d0c0: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
d0d0: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
d0e0: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
d0f0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
d100: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
d110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d120: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
d130: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
d140: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
d150: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
d160: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
d170: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
d180: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
d190: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d1a0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
d1b0: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
d1c0: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
d1d0: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
d1e0: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
d1f0: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
d200: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
d210: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
d220: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
d230: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
d240: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
d250: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
d260: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
d270: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
d280: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
d290: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
d2a0: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
d2b0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
d2c0: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
d2d0: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
d2e0: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
d2f0: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
d300: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
d310: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
d320: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
d330: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
d340: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
d350: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
d360: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
d370: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
d380: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
d390: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
d3a0: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
d3b0: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
d3c0: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
d3d0: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
d3e0: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
d3f0: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
d400: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
d410: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
d420: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
d430: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
d440: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
d450: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
d460: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
d470: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
d480: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
d490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
d4a0: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
d4b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d4c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d4d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d4e0: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
d4f0: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
d500: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
d510: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
d520: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
d530: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
d540: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
d550: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
d560: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
d570: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
d580: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
d590: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
d5a0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
d5b0: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
d5c0: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
d5d0: 2a 2f 0a 29 7b 0a 20 20 46 4b 65 79 20 2a 70 46  */.){.  FKey *pF
d5e0: 4b 65 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Key = 0;.#ifndef
d5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
d600: 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65  EIGN_KEY.  Table
d610: 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   *p = pParse->pN
d620: 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e  ewTable;.  int n
d630: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
d640: 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
d650: 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *z;..  assert(
d660: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
d670: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
d680: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
d690: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
d6a0: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
d6b0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
d6c0: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
d6d0: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
d6e0: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
d6f0: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
d700: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
d710: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d720: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
d730: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
d740: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
d750: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
d760: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
d770: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
d780: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
d790: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
d7a0: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
d7b0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
d7c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
d7d0: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
d7e0: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
d7f0: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
d800: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d810: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
d820: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d830: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
d840: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
d850: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
d860: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
d870: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
d880: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
d890: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
d8a0: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
d8b0: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
d8c0: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
d8d0: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
d8e0: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
d8f0: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
d900: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
d910: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
d920: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
d930: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
d940: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
d950: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
d960: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
d970: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
d980: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
d990: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
d9a0: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
d9b0: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
d9c0: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
d9d0: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
d9e0: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
d9f0: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
da00: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
da10: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
da20: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
da30: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
da40: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
da50: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
da60: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
da70: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
da80: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
da90: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
daa0: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
dab0: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
dac0: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
dad0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
dae0: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
daf0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
db00: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
db10: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
db20: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
db30: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
db40: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
db50: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
db60: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
db70: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
db80: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
db90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
dba0: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
dbb0: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
dbc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dbd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dbe0: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
dbf0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
dc00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
dc10: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
dc20: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
dc30: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
dc40: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
dc50: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
dc60: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
dc70: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
dc80: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
dc90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
dca0: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
dcb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
dcc0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
dcd0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
dce0: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
dcf0: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
dd00: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
dd10: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
dd20: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
dd30: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
dd40: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
dd50: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
dd60: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
dd70: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
dd80: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
dd90: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
dda0: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
ddb0: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
ddc0: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
ddd0: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
dde0: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
ddf0: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
de00: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
de10: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
de20: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
de30: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
de40: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
de50: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
de60: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
de70: 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
de80: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
de90: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
dea0: 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
deb0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
dec0: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
ded0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dee0: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
def0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
df00: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
df10: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
df20: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
df30: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
df40: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
df50: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
df60: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
df70: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
df80: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
df90: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
dfa0: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
dfb0: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
dfc0: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
dfd0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
dfe0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
dff0: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
e000: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
e010: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
e020: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e030: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
e040: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e050: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
e060: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e070: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
e080: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
e090: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
e0a0: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
e0b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
e0c0: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
e0d0: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
e0e0: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
e0f0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
e100: 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
e110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
e120: 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
e130: 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
e140: 70 49 6e 64 65 78 20 69 73 20 74 68 65 20 6e 61  pIndex is the na
e150: 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
e160: 0a 2a 2a 20 61 6e 64 20 70 54 61 62 6c 65 20 69  .** and pTable i
e170: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
e180: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
e190: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
e1a0: 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
e1b0: 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
e1c0: 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
e1d0: 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
e1e0: 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
e1f0: 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
e200: 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
e210: 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
e220: 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
e230: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
e240: 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
e250: 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
e260: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
e270: 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
e280: 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
e290: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
e2a0: 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
e2b0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
e2c0: 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
e2d0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
e2e0: 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
e2f0: 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
e300: 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
e310: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
e320: 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
e330: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
e340: 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
e350: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
e360: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
e370: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
e380: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
e390: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
e3a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e3b0: 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
e3c0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
e3d0: 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
e3e0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
e3f0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
e400: 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
e410: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
e420: 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65  *pName2,   /* Se
e430: 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
e440: 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
e450: 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
e460: 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 20 2f 2a  t *pTblName,  /*
e470: 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
e480: 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
e490: 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
e4a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e4b0: 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
e4c0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
e4d0: 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
e4e0: 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20  onError,     /* 
e4f0: 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
e500: 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
e510: 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
e520: 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
e530: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
e540: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
e550: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
e560: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
e570: 54 6f 6b 65 6e 20 2a 70 45 6e 64 20 20 20 20 20  Token *pEnd     
e580: 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74   /* The ")" that
e590: 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41   closes the CREA
e5a0: 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
e5b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  nt */.){.  Table
e5c0: 20 2a 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 54   *pTab = 0; /* T
e5d0: 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
e5e0: 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
e5f0: 49 6e 64 65 78 20 3d 20 30 3b 20 2f 2a 20 54 68  Index = 0; /* Th
e600: 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
e610: 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
e620: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
e630: 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
e640: 6e 75 6c 6c 49 64 3b 20 20 20 20 2f 2a 20 46 61  nullId;    /* Fa
e650: 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20  ke token for an 
e660: 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f  empty ID list */
e670: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
e680: 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
e690: 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
e6a0: 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
e6b0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 3b 20 20  .  int isTemp;  
e6c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
e6d0: 61 20 74 65 6d 70 6f 72 61 72 79 20 69 6e 64 65  a temporary inde
e6e0: 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  x */.  sqlite3 *
e6f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
e700: 0a 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ..  int iDb;    
e710: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
e730: 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
e740: 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
e750: 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 55  *pName = 0; /* U
e760: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
e770: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  of the index to 
e780: 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66 28  create */..  if(
e790: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
e7a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
e7b0: 66 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  failed ) goto ex
e7c0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
e7d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
e7e0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
e7f0: 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  is to be indexed
e800: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20  .  Return early 
e810: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
e820: 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  */.  if( pTblNam
e830: 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e!=0 ){..    /* 
e840: 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74  Use the two-part
e850: 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64   index name to d
e860: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74  etermine the dat
e870: 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f  abase .    ** to
e880: 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
e890: 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65  table. 'Fix' the
e8a0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74   table name to t
e8b0: 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65  his db.    ** be
e8c0: 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20  fore looking up 
e8d0: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
e8e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
e8f0: 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29  ame1 && pName2 )
e900: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
e910: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
e920: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
e930: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
e940: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20      if( iDb<0 ) 
e950: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
e960: 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 20  _index;..    /* 
e970: 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
e980: 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
e990: 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
e9a0: 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
e9b0: 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
e9c0: 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
e9d0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 0a   database to 1..
e9e0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 61 62 20      */.    pTab 
e9f0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
ea00: 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
ea10: 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  TblName);.    if
ea20: 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d  ( pName2 && pNam
ea30: 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
ea40: 20 26 26 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31   && pTab->iDb==1
ea50: 20 29 7b 0a 20 20 20 20 20 20 69 44 62 20 3d 20   ){.      iDb = 
ea60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
ea70: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
ea80: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
ea90: 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
eaa0: 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20 20  ame) &&.        
eab0: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
eac0: 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
ead0: 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
eae0: 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
eaf0: 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
eb00: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
eb10: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
eb20: 73 65 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  se, pTblName->a[
eb30: 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
eb40: 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
eb50: 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
eb60: 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
eb70: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
eb80: 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
eb90: 28 20 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62  ( iDb==pTab->iDb
eba0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
ebb0: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
ebc0: 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
ebd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ebe0: 6c 65 3b 0a 20 20 20 20 69 44 62 20 3d 20 70 54  le;.    iDb = pT
ebf0: 61 62 2d 3e 69 44 62 3b 0a 20 20 7d 0a 0a 20 20  ab->iDb;.  }..  
ec00: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70  if( pTab==0 || p
ec10: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
ec20: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
ec30: 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61 62  ndex;.  if( pTab
ec40: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
ec50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ec60: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
ec70: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
ec80: 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
ec90: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
eca0: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ecb0: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  x;.  }.  if( pTa
ecc0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
ecd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ece0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
ecf0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
ed00: 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
ed10: 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
ed20: 78 3b 0a 20 20 7d 0a 20 20 69 73 54 65 6d 70 20  x;.  }.  isTemp 
ed30: 3d 20 70 54 61 62 2d 3e 69 44 62 3d 3d 31 3b 0a  = pTab->iDb==1;.
ed40: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
ed50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
ed60: 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
ed70: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
ed80: 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
ed90: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
eda0: 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
edb0: 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
edc0: 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
edd0: 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
ede0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
edf0: 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
ee00: 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
ee10: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ee20: 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
ee30: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
ee40: 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
ee50: 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
ee60: 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
ee70: 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
ee80: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
ee90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
eea0: 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
eeb0: 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
eec0: 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
eed0: 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
eee0: 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
eef0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
ef00: 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
ef10: 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
ef20: 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
ef30: 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
ef40: 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
ef50: 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
ef60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
ef70: 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
ef80: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
ef90: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
efa0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
efb0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
efc0: 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
efd0: 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
efe0: 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  dex;.    if( zNa
eff0: 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
f000: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f010: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
f020: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
f030: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
f040: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
f050: 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
f060: 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
f070: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
f080: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
f090: 49 6e 64 65 78 20 2a 70 49 53 61 6d 65 4e 61 6d  Index *pISameNam
f0a0: 65 3b 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72  e;    /* Another
f0b0: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
f0c0: 73 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  same name */.   
f0d0: 20 20 20 54 61 62 6c 65 20 2a 70 54 53 61 6d 65     Table *pTSame
f0e0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41 20 74 61  Name;    /* A ta
f0f0: 62 6c 65 20 77 69 74 68 20 73 61 6d 65 20 6e 61  ble with same na
f100: 6d 65 20 61 73 20 74 68 65 20 69 6e 64 65 78 20  me as the index 
f110: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  */.      if( SQL
f120: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
f130: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
f140: 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  ) ) goto exit_cr
f150: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f160: 20 20 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d    if( (pISameNam
f170: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
f180: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
f190: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
f1a0: 6d 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  me))!=0 ){.     
f1b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f1c0: 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
f1d0: 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
f1e0: 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
f1f0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f200: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f210: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f220: 28 70 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71  (pTSameName = sq
f230: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
f240: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30  b, zName, 0))!=0
f250: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f260: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
f270: 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
f280: 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
f290: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
f2a0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
f2b0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f2c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f2d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
f2e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
f2f0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e  zBuf[30];.    in
f300: 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  t n;.    Index *
f310: 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70  pLoop;.    for(p
f320: 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65  Loop=pTab->pInde
f330: 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70  x, n=1; pLoop; p
f340: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78  Loop=pLoop->pNex
f350: 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70  t, n++){}.    sp
f360: 72 69 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22  rintf(zBuf,"_%d"
f370: 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  ,n);.    zName =
f380: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
f390: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
f3a0: 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
f3b0: 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ex_", pTab->zNam
f3c0: 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  e, zBuf, (char*)
f3d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  0);.    if( zNam
f3e0: 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
f3f0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f400: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
f410: 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
f420: 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
f430: 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
f440: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f450: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
f460: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f470: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54  zDb = db->aDb[pT
f480: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  ab->iDb].zName;.
f490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
f4a0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f4b0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
f4c0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
f4d0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
f4e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f4f0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f500: 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
f510: 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
f520: 3b 0a 20 20 20 20 69 66 28 20 69 73 54 65 6d 70  ;.    if( isTemp
f530: 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
f540: 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
f550: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f560: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f570: 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
f580: 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
f590: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f5a0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f5b0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f5c0: 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
f5d0: 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
f5e0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
f5f0: 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
f600: 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
f610: 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
f620: 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
f630: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
f640: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
f650: 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
f660: 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
f670: 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
f680: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
f690: 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20  .    nullId.z = 
f6a0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
f6b0: 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
f6c0: 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
f6d0: 74 72 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b  trlen(nullId.z);
f6e0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
f6f0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
f700: 6e 64 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64  nd(0, 0, &nullId
f710: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
f720: 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
f730: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f740: 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
f750: 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
f760: 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
f770: 2f 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  /.  pIndex = sql
f780: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
f790: 66 28 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65  f(Index) + strle
f7a0: 6e 28 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20  n(zName) + 1 +. 
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69         (sizeof(i
f7d0: 6e 74 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c  nt) + sizeof(Col
f7e0: 6c 53 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e  lSeq*))*pList->n
f7f0: 45 78 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49  Expr );.  if( pI
f800: 6e 64 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  ndex==0 ) goto e
f810: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
f820: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  ;.  pIndex->aiCo
f830: 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49  lumn = (int*)&pI
f840: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
f850: 6f 6c 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oll[pList->nExpr
f860: 5d 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ];.  pIndex->zNa
f870: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  me = (char*)&pIn
f880: 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c  dex->aiColumn[pL
f890: 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73  ist->nExpr];.  s
f8a0: 74 72 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  trcpy(pIndex->zN
f8b0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70  ame, zName);.  p
f8c0: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
f8d0: 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
f8e0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
f8f0: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
f900: 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72  ->onError = onEr
f910: 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
f920: 75 74 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65  utoIndex = pName
f930: 3d 3d 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  ==0;.  pIndex->i
f940: 44 62 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20  Db = iDb;..  /* 
f950: 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
f960: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
f970: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
f980: 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
f990: 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
f9a0: 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
f9b0: 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
f9c0: 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
f9d0: 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
f9e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
f9f0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ound..  */.  for
fa00: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
fa10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fa20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
fa30: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
fa40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
fa50: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
fa60: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
fa70: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  Col[j].zName)==0
fa80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
fa90: 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
faa0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
fab0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fac0: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
fad0: 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
fae0: 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
faf0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70    pTab->zName, p
fb00: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
fb10: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
fb20: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
fb30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
fb40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
fb50: 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   j;.    if( pLis
fb60: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b  t->a[i].pExpr ){
fb70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fb80: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
fb90: 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  ->pColl );.     
fba0: 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
fbb0: 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73  .aColl[i] = pLis
fbc0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
fbd0: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
fbe0: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b  .      pIndex->k
fbf0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
fc00: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
fc10: 70 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  pColl;.    }.   
fc20: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
fc30: 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69  >keyInfo.aColl[i
fc40: 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ] );.    if( !db
fc50: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a  ->init.busy && .
fc60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
fc70: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
fc80: 73 65 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49  se, pIndex->keyI
fc90: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20  nfo.aColl[i]) . 
fca0: 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
fcb0: 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
fcc0: 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ex;.    }.  }.  
fcd0: 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e  pIndex->keyInfo.
fce0: 6e 46 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e  nField = pList->
fcf0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54  nExpr;..  if( pT
fd00: 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
fd10: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
fd20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
fd30: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
fd40: 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
fd50: 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
fd60: 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
fd70: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
fd80: 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
fd90: 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
fda0: 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
fdb0: 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
fdc0: 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
fdd0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
fde0: 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
fdf0: 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
fe00: 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
fe10: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
fe20: 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
fe30: 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
fe40: 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
fe50: 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
fe60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
fe70: 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
fe80: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
fe90: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
fea0: 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
feb0: 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
fec0: 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
fed0: 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
fee0: 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
fef0: 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
ff00: 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
ff10: 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
ff20: 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
ff30: 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
ff40: 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
ff50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
ff60: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
ff70: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ff80: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ff90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ffa0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
ffb0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
ffc0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
ffd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ffe0: 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
fff0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10000 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
10010 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
10020 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
10030 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
10040 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
10050 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
10060 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
10070 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
10080 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
10090 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
100a0 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
100b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
100c0 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
100d0 43 6f 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  Coll[k]!=pIndex-
100e0 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b  >keyInfo.aColl[k
100f0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
10100 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
10110 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
10120 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
10130 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
10140 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
10150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
10160 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
10170 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
10180 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
10190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
101a0 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
101b0 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
101c0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
101d0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
101e0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
101f0 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
10200 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
10210 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
10220 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
10230 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
10240 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
10250 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
10260 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
10270 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
10280 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
10290 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
102a0 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
102b0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
102c0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
102d0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
102e0 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
102f0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
10300 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
10310 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
10320 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
10330 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
10340 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
10350 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10360 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10370 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10380 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
10390 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
103a0 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
103b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
103c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
103d0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
103e0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
103f0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
10400 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
10410 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
10420 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
10430 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
10440 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
10450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10460 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
10470 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
10480 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
10490 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
104a0 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
104b0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
104c0 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
104d0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
104e0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
104f0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
10500 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
10510 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e  Db[pIndex->iDb].
10520 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
10550 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d  , strlen(pIndex-
10560 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65  >zName)+1, pInde
10570 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  x);.    if( p ){
10580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10590 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20  ==pIndex );  /* 
105a0 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
105b0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
105c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
105d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
105e0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
105f0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
10600 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
10610 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
10620 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
10630 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
10640 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
10650 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
10660 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
10670 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
10680 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
10690 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
106a0 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
106b0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
106c0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
106d0 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
106e0 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
106f0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
10700 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
10710 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
10720 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
10730 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
10740 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
10750 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
10760 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
10770 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
10780 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
10790 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
107a0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
107b0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
107c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
107d0 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
107e0 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
107f0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
10800 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
10810 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
10820 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
10830 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
10840 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
10850 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
10860 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
10870 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
10880 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
10890 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
108a0 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
108b0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
108c0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
108d0 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
108e0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
108f0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
10900 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
10910 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
10920 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
10930 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
10940 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
10950 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
10960 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
10970 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c   *v;.    int lbl
10980 31 2c 20 6c 62 6c 32 3b 0a 0a 20 20 20 20 76 20  1, lbl2;..    v 
10990 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
109a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
109b0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
109c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
109d0 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
109e0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e!=0 ){.      sq
109f0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10a00 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
10a10 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
10a20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
10a30 72 54 61 62 6c 65 28 76 2c 20 69 44 62 29 3b 0a  rTable(v, iDb);.
10a40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10a50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10a60 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
10a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10a80 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
10a90 67 38 2c 20 30 2c 20 30 2c 20 22 69 6e 64 65 78  g8, 0, 0, "index
10aa0 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
10ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10ac0 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
10ad0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
10ae0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  Name, 0);.    sq
10af0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10b00 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
10b10 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10b30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 72  beAddOp(v, OP_Cr
10b40 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
10b50 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  0);.    if( pTbl
10b60 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
10b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10b80 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
10b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ba0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10bb0 74 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a  teger, iDb, 0);.
10bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10bd0 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  eOp3(v, OP_OpenW
10be0 72 69 74 65 2c 20 31 2c 20 30 2c 0a 20 20 20 20  rite, 1, 0,.    
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78 2d   (char*)&pIndex-
10c10 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
10c20 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  INFO);.    }.   
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c40 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
10c50 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
10c60 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
10c70 7b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 45 72  {.      if( onEr
10c80 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror==OE_None ){.
10c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10ca0 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
10cb0 31 2c 20 22 43 52 45 41 54 45 20 49 4e 44 45 58  1, "CREATE INDEX
10cc0 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a   ", P3_STATIC);.
10cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10ce0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10cf0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10d00 22 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49  "CREATE UNIQUE I
10d10 4e 44 45 58 20 22 2c 20 50 33 5f 53 54 41 54 49  NDEX ", P3_STATI
10d20 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
10d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10d40 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
10d50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 6e  , 0, 0);.      n
10d60 20 3d 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29   = Addr(pEnd->z)
10d70 20 2d 20 41 64 64 72 28 70 4e 61 6d 65 2d 3e 7a   - Addr(pName->z
10d80 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 1;.      sql
10d90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
10da0 28 76 2c 20 2d 31 2c 20 70 4e 61 6d 65 2d 3e 7a  (v, -1, pName->z
10db0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
10dc0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10dd0 4f 50 5f 43 6f 6e 63 61 74 2c 20 30 2c 20 30 29  OP_Concat, 0, 0)
10de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10df0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10e00 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35 2c 20  _MakeRecord, 5, 
10e10 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33 5f 53  0, "tttit", P3_S
10e20 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
10e30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10e40 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20 30 2c  OP_PutIntKey, 0,
10e50 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 62   0);.    if( pTb
10e60 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
10e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10e80 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
10e90 54 61 62 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Tab->iDb, 0);.  
10ea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10eb0 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  ddOp(v, OP_OpenR
10ec0 65 61 64 2c 20 32 2c 20 70 54 61 62 2d 3e 74 6e  ead, 2, pTab->tn
10ed0 75 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 56 64  um);.      /* Vd
10ee0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
10ef0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
10f00 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
10f10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10f20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10f30 2c 20 32 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  , 2, pTab->nCol)
10f40 3b 0a 20 20 20 20 20 20 6c 62 6c 32 20 3d 20 73  ;.      lbl2 = s
10f50 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
10f60 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
10f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10f80 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 32 2c 20  , OP_Rewind, 2, 
10f90 6c 62 6c 32 29 3b 0a 20 20 20 20 20 20 6c 62 6c  lbl2);.      lbl
10fa0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
10fb0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
10fc0 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 6e 65       sqlite3Gene
10fd0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 76 2c 20  rateIndexKey(v, 
10fe0 70 49 6e 64 65 78 2c 20 32 29 3b 0a 20 20 20 20  pIndex, 2);.    
10ff0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
11000 28 76 2c 20 4f 50 5f 49 64 78 50 75 74 2c 20 31  (v, OP_IdxPut, 1
11010 2c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  , pIndex->onErro
11020 72 21 3d 4f 45 5f 4e 6f 6e 65 2c 0a 20 20 20 20  r!=OE_None,.    
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d    "indexed colum
11050 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75  ns are not uniqu
11060 65 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  e", P3_STATIC);.
11070 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11080 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
11090 74 2c 20 32 2c 20 6c 62 6c 31 29 3b 0a 20 20 20  t, 2, lbl1);.   
110a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
110b0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
110c0 6c 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l2);.      sqlit
110d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
110e0 50 5f 43 6c 6f 73 65 2c 20 32 2c 20 30 29 3b 0a  P_Close, 2, 0);.
110f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11100 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
11110 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
11120 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
11130 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
11140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11150 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11160 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
11170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
11180 33 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(v, OP_ParseSch
11190 65 6d 61 2c 20 69 44 62 2c 20 30 2c 0a 20 20 20  ema, iDb, 0,.   
111a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
111b0 69 6e 74 66 28 22 6e 61 6d 65 3d 27 25 71 27 22  intf("name='%q'"
111c0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
111d0 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
111e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
111f0 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e  hen adding an in
11200 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20  dex to the list 
11210 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61  of indices for a
11220 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a   table, make.  *
11230 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63  * sure all indic
11240 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65  es labeled OE_Re
11250 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72  place come after
11260 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c   all those label
11270 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72  ed.  ** OE_Ignor
11280 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
11290 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f  ssary for the co
112a0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
112b0 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61  of UPDATE.  ** a
112c0 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a  nd INSERT..  */.
112d0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
112e0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
112f0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
11300 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
11310 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
11320 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
11330 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
11340 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
11350 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
11360 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
11370 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
11380 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
11390 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
113a0 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
113b0 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
113c0 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
113d0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
113e0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
113f0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
11400 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
11410 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
11420 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
11430 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
11440 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
11450 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
11460 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
11470 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
11480 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
11490 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
114a0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
114b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
114c0 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
114d0 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  {.    freeIndex(
114e0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73  pIndex);.  }.  s
114f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11500 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
11510 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
11520 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
11530 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
11540 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
11550 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11560 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
11570 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
11580 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
11590 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
115a0 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
115b0 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
115c0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
115d0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
115e0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
115f0 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
11600 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
11610 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
11620 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
11630 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
11640 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
11650 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
11660 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
11670 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
11680 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11690 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
116a0 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 72 65  ema(pParse) ) re
116b0 74 75 72 6e 3b 0a 20 20 70 49 6e 64 65 78 20 3d  turn;.  pIndex =
116c0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
116d0 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
116e0 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
116f0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
11700 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
11710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11720 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11730 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
11740 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
11750 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
11760 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
11770 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11780 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
11790 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
117a0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
117b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
117c0 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
117d0 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
117e0 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
117f0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
11800 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
11810 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
11820 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
11830 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
11840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11850 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
11860 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
11870 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
11880 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
11890 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
118a0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
118b0 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
118c0 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e  [pIndex->iDb].zN
118d0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
118e0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
118f0 4d 41 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d  MA_TABLE(pIndex-
11900 3e 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  >iDb);.    if( s
11910 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
11920 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
11930 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
11940 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
11950 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
11960 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
11970 28 20 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20  ( pIndex->iDb ) 
11980 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
11990 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
119a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
119b0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
119c0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
119d0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
119e0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
119f0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
11a00 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
11a10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
11a20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
11a30 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
11a40 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
11a50 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
11a60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11a70 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
11a80 76 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  v ){.    static 
11a90 63 6f 6e 73 74 20 56 64 62 65 4f 70 4c 69 73 74  const VdbeOpList
11aa0 20 64 72 6f 70 49 6e 64 65 78 5b 5d 20 3d 20 7b   dropIndex[] = {
11ab0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 52 65 77 69  .      { OP_Rewi
11ac0 6e 64 2c 20 20 20 20 20 30 2c 20 41 44 44 52 28  nd,     0, ADDR(
11ad0 39 29 2c 20 30 7d 2c 20 0a 20 20 20 20 20 20 7b  9), 0}, .      {
11ae0 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 20 20 20   OP_String8,    
11af0 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20  0, 0,       0}, 
11b00 2f 2a 20 31 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 1 */.      { 
11b10 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 20 20 31  OP_MemStore,   1
11b20 2c 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20  , 1,       0},. 
11b30 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 4c 6f 61       { OP_MemLoa
11b40 64 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 20 20  d,    1, 0,     
11b50 20 20 30 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20 20    0}, /* 3 */.  
11b60 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d 6e 2c      { OP_Column,
11b70 20 20 20 20 20 30 2c 20 31 2c 20 20 20 20 20 20       0, 1,      
11b80 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11b90 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
11ba0 44 44 52 28 38 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(8), 0},.    
11bb0 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20 20 20    { OP_Next,    
11bc0 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20 30     0, ADDR(3), 0
11bd0 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 47 6f  },.      { OP_Go
11be0 74 6f 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  to,       0, ADD
11bf0 52 28 39 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(9), 0},.      
11c00 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20 20 20 20  { OP_Delete,    
11c10 20 30 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c   0, 0,       0},
11c20 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 7d 3b 0a   /* 8 */.    };.
11c30 20 20 20 20 69 6e 74 20 62 61 73 65 3b 0a 0a 20      int base;.. 
11c40 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
11c50 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
11c60 61 72 73 65 2c 20 30 2c 20 70 49 6e 64 65 78 2d  arse, 0, pIndex-
11c70 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  >iDb);.    sqlit
11c80 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
11c90 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62  e(v, pIndex->iDb
11ca0 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73 71  );.    base = sq
11cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
11cc0 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65 28  st(v, ArraySize(
11cd0 64 72 6f 70 49 6e 64 65 78 29 2c 20 64 72 6f 70  dropIndex), drop
11ce0 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
11cf0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
11d00 76 2c 20 62 61 73 65 2b 31 2c 20 70 49 6e 64 65  v, base+1, pInde
11d10 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
11d20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
11d30 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 49 6e  ookie(db, v, pIn
11d40 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73  dex->iDb);.    s
11d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
11d60 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20  v, OP_Close, 0, 
11d70 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
11d80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
11d90 65 73 74 72 6f 79 2c 20 70 49 6e 64 65 78 2d 3e  estroy, pIndex->
11da0 74 6e 75 6d 2c 20 70 49 6e 64 65 78 2d 3e 69 44  tnum, pIndex->iD
11db0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
11dc0 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44 72 6f  dbeOp3(v, OP_Dro
11dd0 70 49 6e 64 65 78 2c 20 70 49 6e 64 65 78 2d 3e  pIndex, pIndex->
11de0 69 44 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  iDb, 0, pIndex->
11df0 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
11e00 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
11e10 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
11e20 74 44 65 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a  tDelete(pName);.
11e30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
11e40 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
11e50 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
11e60 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
11e70 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
11e80 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
11e90 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
11ea0 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
11eb0 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
11ec0 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
11ed0 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
11ee0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
11ef0 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
11f00 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
11f10 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
11f20 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
11f30 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
11f40 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
11f50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
11f60 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
11f70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73  ;.  }.  if( pLis
11f80 74 2d 3e 6e 49 64 3e 3d 70 4c 69 73 74 2d 3e 6e  t->nId>=pList->n
11f90 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  Alloc ){.    str
11fa0 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
11fb0 2a 61 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e  *a;.    pList->n
11fc0 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
11fd0 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20  Alloc*2 + 5;.   
11fe0 20 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c   a = sqliteReall
11ff0 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  oc(pList->a, pLi
12000 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  st->nAlloc*sizeo
12010 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20 29  f(pList->a[0]) )
12020 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
12030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
12040 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  dListDelete(pLis
12050 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
12060 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c   0;.    }.    pL
12070 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a  ist->a = a;.  }.
12080 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 2d    memset(&pList-
12090 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2c 20  >a[pList->nId], 
120a0 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  0, sizeof(pList-
120b0 3e 61 5b 30 5d 29 29 3b 0a 20 20 70 4c 69 73 74  >a[0]));.  pList
120c0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 5d 2e  ->a[pList->nId].
120d0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
120e0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f  ameFromToken(pTo
120f0 6b 65 6e 29 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e  ken);.  pList->n
12100 49 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70  Id++;.  return p
12110 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
12120 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
12130 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
12140 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
12150 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
12160 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
12170 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
12180 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
12190 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
121a0 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e   pToken is NULL.
121b0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63  .**.** A new Src
121c0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
121d0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
121e0 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a  loc() fails..**.
121f0 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
12200 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
12210 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
12220 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
12230 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
12240 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
12250 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
12260 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
12270 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
12280 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
12290 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
122a0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
122b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
122c0 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
122d0 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
122e0 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
122f0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
12300 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
12310 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
12320 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
12330 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
12340 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
12350 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
12360 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
12370 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
12380 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
12390 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
123a0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
123b0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
123c0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
123d0 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
123e0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
123f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
12400 72 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42  rcListAppend(A,B
12410 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
12420 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
12430 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
12440 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
12450 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
12460 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
12470 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
12480 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
12490 65 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a  end(A,B,C);.**.*
124a0 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20  * Then C is the 
124b0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42  table name and B
124c0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
124d0 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   name..*/.SrcLis
124e0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
124f0 74 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20  tAppend(SrcList 
12500 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
12510 54 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44  Table, Token *pD
12520 61 74 61 62 61 73 65 29 7b 0a 20 20 73 74 72 75  atabase){.  stru
12530 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12540 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
12550 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
12560 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
12570 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  oc( sizeof(SrcLi
12580 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
12590 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
125a0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
125b0 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
125c0 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63   if( pList->nSrc
125d0 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  >=pList->nAlloc 
125e0 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
125f0 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d  pNew;.    pList-
12600 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20  >nAlloc *= 2;.  
12610 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    pNew = sqliteR
12620 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20  ealloc(pList,.  
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
12640 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70  eof(*pList) + (p
12650 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a  List->nAlloc-1)*
12660 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
12670 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
12680 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
12690 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
126a0 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20  lete(pList);.   
126b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
126c0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
126d0 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  New;.  }.  pItem
126e0 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
126f0 73 74 2d 3e 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d  st->nSrc];.  mem
12700 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
12710 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
12720 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
12730 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
12740 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
12750 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
12760 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
12770 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
12780 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
12790 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
127a0 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
127b0 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
127c0 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49   pTemp;.  }.  pI
127d0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
127e0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
127f0 6e 28 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  n(pTable);.  pIt
12800 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
12810 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
12820 6f 6b 65 6e 28 70 44 61 74 61 62 61 73 65 29 3b  oken(pDatabase);
12830 0a 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  .  pItem->iCurso
12840 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69 73 74 2d  r = -1;.  pList-
12850 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72  >nSrc++;.  retur
12860 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
12870 2a 20 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73  * Assign cursors
12880 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
12890 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
128a0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
128b0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
128c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
128d0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
128e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
128f0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
12900 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
12910 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75   pList->a[i].iCu
12920 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  rsor<0 ){.      
12930 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  pList->a[i].iCur
12940 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
12950 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ab++;.    }.  }.
12960 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
12970 61 6c 69 61 73 20 74 6f 20 74 68 65 20 6c 61 73  alias to the las
12980 74 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e 20  t identifier on 
12990 74 68 65 20 67 69 76 65 6e 20 69 64 65 6e 74 69  the given identi
129a0 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  fier list..*/.vo
129b0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
129c0 74 41 64 64 41 6c 69 61 73 28 53 72 63 4c 69 73  tAddAlias(SrcLis
129d0 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
129e0 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20  *pToken){.  if( 
129f0 70 4c 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e  pList && pList->
12a00 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 70 4c  nSrc>0 ){.    pL
12a10 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
12a20 72 63 2d 31 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  rc-1].zAlias = s
12a30 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
12a40 6b 65 6e 28 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  ken(pToken);.  }
12a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
12a60 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
12a70 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
12a80 74 44 65 6c 65 74 65 28 49 64 4c 69 73 74 20 2a  tDelete(IdList *
12a90 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
12aa0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
12ab0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
12ac0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
12ad0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
12ae0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
12af0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
12b00 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
12b10 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
12b20 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
12b30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12b40 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
12b50 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
12b60 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
12b70 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
12b80 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
12b90 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
12ba0 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
12bb0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
12bc0 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
12bd0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
12be0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
12bf0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
12c00 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
12c10 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
12c20 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
12c30 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
12c40 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
12c50 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
12c60 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
12c70 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
12c80 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
12c90 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
12ca0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
12cb0 69 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73  istDelete(SrcLis
12cc0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
12cd0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
12ce0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
12cf0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
12d00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
12d10 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
12d20 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
12d30 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
12d40 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  +){.    sqliteFr
12d50 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  ee(pItem->zDatab
12d60 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
12d70 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  Free(pItem->zNam
12d80 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
12d90 65 65 28 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ee(pItem->zAlias
12da0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
12db0 2d 3e 70 54 61 62 20 26 26 20 70 49 74 65 6d 2d  ->pTab && pItem-
12dc0 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65  >pTab->isTransie
12dd0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
12de0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
12df0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
12e00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12e10 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 49  3SelectDelete(pI
12e20 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
12e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
12e40 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 4f 6e 29  lete(pItem->pOn)
12e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
12e60 69 73 74 44 65 6c 65 74 65 28 70 49 74 65 6d 2d  istDelete(pItem-
12e70 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  >pUsing);.  }.  
12e80 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
12e90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  );.}../*.** Begi
12ea0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
12eb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
12ec0 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
12ed0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
12ee0 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
12ef0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
12f00 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
12f10 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
12f20 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
12f30 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
12f40 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
12f50 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
12f60 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
12f70 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
12f80 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
12f90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12fa0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
12fb0 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
12fc0 49 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  IN", 0, 0) ) ret
12fd0 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
12fe0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12ff0 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
13000 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
13010 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
13020 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
13030 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
13040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13050 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 54 72 61  eAddOp(v, OP_Tra
13060 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
13070 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
13080 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
13090 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
130a0 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  Op(v, OP_AutoCom
130b0 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  mit, 0, 0);.}../
130c0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72  *.** Commit a tr
130d0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
130e0 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54  d sqlite3CommitT
130f0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
13100 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
13110 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
13120 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72   *v;..  if( pPar
13130 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
13140 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
13150 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
13160 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
13170 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
13180 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
13190 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  failed ) return;
131a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
131b0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
131c0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
131d0 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
131e0 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
131f0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
13200 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13210 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
13220 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13230 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
13240 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
13250 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
13260 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
13270 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
13280 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
13290 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
132a0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
132b0 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
132c0 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
132d0 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
132e0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
132f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
13300 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
13310 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
13320 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
13330 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
13340 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13350 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
13360 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
13370 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
13380 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
13390 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
133a0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
133b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
133c0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
133d0 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 1);.  }.}.
133e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
133f0 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
13400 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
13410 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
13420 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
13430 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
13440 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
13450 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
13460 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
13470 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
13480 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
13490 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
134a0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
134b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
134c0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
134d0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
134e0 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
134f0 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
13500 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13510 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
13520 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
13530 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
13540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13560 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13570 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
13580 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
13590 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
135a0 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
135b0 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
135c0 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
135d0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
135e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
135f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13600 64 62 2d 3e 66 6c 61 67 73 20 26 20 21 64 62 2d  db->flags & !db-
13610 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
13620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13630 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
13640 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c  (db->aDb[1].pBt,
13650 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
13660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13680 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13690 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
136a0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
136b0 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
136c0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
136d0 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
136e0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
136f0 72 63 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  rc;.        retu
13700 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
13710 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13720 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
13730 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
13740 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
13750 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
13760 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20  ie and start.** 
13770 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
13780 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64  on for all named
13790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
137a0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
137b0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
137c0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62  schema cookies b
137d0 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61  e verified and a
137e0 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73  ll.** read trans
137f0 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74  actions be start
13800 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  ed before anythi
13810 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20  ng else happens 
13820 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70  in.** the VDBE p
13830 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69  rogram.  But thi
13840 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
13850 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75   called after mu
13860 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65  ch other.** code
13870 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61   has been genera
13880 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73  ted.  So here is
13890 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a   what we do:.**.
138a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
138b0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
138c0 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64  s called, we cod
138d0 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61  e an OP_Goto tha
138e0 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74  t.** will jump t
138f0 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61  o a subroutine a
13900 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
13910 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20   program.  Then 
13920 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65  we.** record eve
13930 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
13940 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d   needs its schem
13950 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68  a verified in th
13960 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e.** pParse->coo
13970 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20  kieMask field.  
13980 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c  Later, after all
13990 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
139a0 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65  been.** generate
139b0 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  d, the subroutin
139c0 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20  e that does the 
139d0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
139e0 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72  ions and.** star
139f0 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
13a00 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65  ons will be code
13a10 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74  d and the OP_Got
13a20 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69  o P2 value.** wi
13a30 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f  ll be made to po
13a40 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72  int to that subr
13a50 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e  outine.  The gen
13a60 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  eration of the.*
13a70 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  * cookie verific
13a80 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  ation subroutine
13a90 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e   code happens in
13aa0 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
13ab0 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ding()..**.** If
13ac0 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65   iDb<0 then code
13ad0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c   the OP_Goto onl
13ae0 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c  y - don't set fl
13af0 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  ag to verify the
13b00 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e  .** schema on an
13b10 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54 68  y databases.  Th
13b20 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
13b30 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f  o position the O
13b40 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20  P_Goto.** early 
13b50 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66  in the code, bef
13b60 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61  ore we know if a
13b70 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ny database tabl
13b80 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  es will be used.
13b90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13ba0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
13bb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13bc0 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
13bd0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
13be0 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  *v;.  int mask;.
13bf0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13c00 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13c10 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
13c20 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
13c30 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
13c40 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
13c50 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70  rror */.  db = p
13c60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
13c70 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
13c80 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  oto==0 ){.    pP
13c90 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
13ca0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13cb0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
13cc0 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
13cd0 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
13ce0 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
13cf0 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65  >nDb );.    asse
13d00 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
13d10 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
13d20 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
13d30 20 69 44 62 3c 33 32 20 29 3b 0a 20 20 20 20 6d   iDb<32 );.    m
13d40 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
13d50 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
13d60 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
13d70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
13d80 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
13d90 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
13da0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
13db0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
13dc0 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63  Db[iDb].schema_c
13dd0 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28  ookie;.      if(
13de0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
13df0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
13e00 6d 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73  mpDatabase(pPars
13e10 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
13e20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
13e30 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
13e40 65 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20  e that prepares 
13e50 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65  for doing an ope
13e60 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d  ration that.** m
13e70 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20  ight change the 
13e80 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
13e90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  This routine sta
13ea0 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61  rts a new transa
13eb0 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20  ction if we are 
13ec0 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68  not already with
13ed0 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  in.** a transact
13ee0 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20  ion.  If we are 
13ef0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61  already within a
13f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
13f10 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a  en a checkpoint.
13f20 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65  ** is set if the
13f30 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61   setStatement pa
13f40 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e  rameter is true.
13f50 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73    A checkpoint s
13f60 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20  hould.** be set 
13f70 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  for operations t
13f80 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28  hat might fail (
13f90 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61  due to a constra
13fa0 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20  int) part of.** 
13fb0 74 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20  the way through 
13fc0 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e  and which will n
13fd0 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65  eed to undo some
13fe0 20 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20   writes without 
13ff0 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c  having to.** rol
14000 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20  lback the whole 
14010 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f  transaction.  Fo
14020 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65  r operations whe
14030 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  re all constrain
14040 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65  ts.** can be che
14050 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  cked before any 
14060 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
14070 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14080 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a  , it is never.**
14090 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e   necessary to un
140a0 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74  do a write and t
140b0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68  he checkpoint sh
140c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e  ould not be set.
140d0 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61  .**.** Only data
140e0 62 61 73 65 20 69 44 62 20 61 6e 64 20 74 68 65  base iDb and the
140f0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 61   temp database a
14100 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  re made writable
14110 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a   by this call..*
14120 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74 68 65  * If iDb==0, the
14130 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64 20 74  n the main and t
14140 65 6d 70 20 64 61 74 61 62 61 73 65 73 20 61 72  emp databases ar
14150 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e  e made writable.
14160 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20     If.** iDb==1 
14170 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65  then only the te
14180 6d 70 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  mp database is m
14190 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 49  ade writable.  I
141a0 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74 68 65  f iDb>1 then the
141b0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 61 75  .** specified au
141c0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
141d0 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20 64 61   and the temp da
141e0 74 61 62 61 73 65 20 61 72 65 20 6d 61 64 65 20  tabase are made 
141f0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  writable..*/.voi
14200 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
14210 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
14220 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14230 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
14240 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
14250 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14260 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
14270 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
14280 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
14290 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
142a0 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73  e, iDb);.  pPars
142b0 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  e->writeMask |= 
142c0 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65  1<<iDb;.  if( se
142d0 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  tStatement ){.  
142e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
142f0 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65 6d 65  Op(v, OP_Stateme
14300 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 7d  nt, iDb, 0);.  }
14310 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 26 26  .  if( iDb!=1 &&
14320 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
14330 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20 20  [1].pBt!=0 ){.  
14340 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14350 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14360 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65 6e  rse, setStatemen
14370 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
14380 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20   .** Return the 
14390 74 72 61 6e 73 69 65 6e 74 20 73 71 6c 69 74 65  transient sqlite
143a0 33 5f 76 61 6c 75 65 20 6f 62 6a 65 63 74 20 75  3_value object u
143b0 73 65 64 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67  sed for encoding
143c0 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20   conversions.** 
143d0 64 75 72 69 6e 67 20 53 51 4c 20 63 6f 6d 70 69  during SQL compi
143e0 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  lation..*/.sqlit
143f0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
14400 33 47 65 74 54 72 61 6e 73 69 65 6e 74 56 61 6c  3GetTransientVal
14410 75 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ue(sqlite3 *db){
14420 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 61 6c  .  if( !db->pVal
14430 75 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  ue ){.    db->pV
14440 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 56 61  alue = sqlite3Va
14450 6c 75 65 4e 65 77 28 29 3b 0a 20 20 7d 0a 20 20  lueNew();.  }.  
14460 72 65 74 75 72 6e 20 64 62 2d 3e 70 56 61 6c 75  return db->pValu
14470 65 3b 0a 7d 0a                                   e;.}.