/ Hex Artifact Content
Login

Artifact 916a84fa5f8bfd44dbe14c3d7c923dd07ee7373f:


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 31 38 20 32 30 30 34 2f 30 36 2f 31 32 20 30  218 2004/06/12 0
0300: 39 3a 32 35 3a 31 32 20 64 61 6e 69 65 6c 6b 31  9:25:12 danielk1
0310: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  977 Exp $.*/.#in
0320: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0330: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0340: 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype.h>../*.** Th
0350: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0360: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
0370: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
0380: 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
0390: 20 62 65 20 70 61 72 73 65 64 2e 20 20 43 68 65   be parsed.  Che
03a0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
03b0: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
03c0: 64 61 74 61 62 61 73 65 20 6e 65 65 64 73 0a 2a  database needs.*
03d0: 2a 20 74 6f 20 62 65 20 72 65 61 64 20 66 72 6f  * to be read fro
03e0: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
03f0: 54 45 52 20 61 6e 64 20 53 51 4c 49 54 45 5f 54  TER and SQLITE_T
0400: 45 4d 50 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  EMP_MASTER table
0410: 73 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  s..** If it does
0420: 2c 20 74 68 65 6e 20 72 65 61 64 20 69 74 2e 0a  , then read it..
0430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
0440: 65 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20  eginParse(Parse 
0450: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70  *pParse, int exp
0460: 6c 61 69 6e 46 6c 61 67 29 7b 0a 20 20 73 71 6c  lainFlag){.  sql
0470: 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65  ite *db = pParse
0480: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
0490: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
04a0: 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a   = explainFlag;.
04b0: 23 69 66 20 30 0a 20 20 69 66 28 28 64 62 2d 3e  #if 0.  if((db->
04c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49  flags & SQLITE_I
04d0: 6e 69 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 26  nitialized)==0 &
04e0: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
04f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
0500: 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
0510: 62 2c 20 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  b, &pParse->zErr
0520: 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Msg);.    if( rc
0530: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
0540: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
0550: 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 72  = rc;.      pPar
0560: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
0570: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  }.  }.#endif.  f
0580: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0590: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 43  b; i++){.    DbC
05a0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
05b0: 20 69 2c 20 44 42 5f 4c 6f 63 6b 65 64 29 3b 0a   i, DB_Locked);.
05c0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 61 44 62      if( !db->aDb
05d0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 29 7b 0a 20  [i].inTrans ){. 
05e0: 20 20 20 20 20 44 62 43 6c 65 61 72 50 72 6f 70       DbClearProp
05f0: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 43  erty(db, i, DB_C
0600: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ookie);.    }.  
0610: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  }.  pParse->nVar
0620: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
0630: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0640: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0650: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0660: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0670: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0680: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0690: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
06a0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
06b0: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
06c0: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
06d0: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
06e0: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
06f0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0700: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0710: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0720: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0730: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0740: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0750: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0760: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0770: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0780: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0790: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
07a0: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
07b0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
07c0: 69 74 65 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  ite *db;.  Vdbe 
07d0: 2a 76 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  *v;..  if( sqlit
07e0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
07f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
0800: 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65 72 61   Begin by genera
0810: 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e  ting some termin
0820: 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20 74 68  ation code at th
0830: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a  e end of the.  *
0840: 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d 0a 20  * vdbe program. 
0850: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
0860: 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
0870: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
0880: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
0890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
08a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  ddOp(v, OP_Halt,
08b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
08c0: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
08d0: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  sk!=0 ){.      u
08e0: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
08f0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
0900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0910: 32 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  2(v, pParse->coo
0920: 6b 69 65 47 6f 74 6f 2c 20 73 71 6c 69 74 65 33  kieGoto, sqlite3
0930: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
0940: 76 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  v));.      for(i
0950: 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44  Db=0, mask=1; iD
0960: 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c  b<db->nDb; mask<
0970: 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20  <=1, iDb++){.   
0980: 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26       if( (mask &
0990: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
09a0: 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ask)==0 ) contin
09b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
09c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
09d0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
09e0: 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61  iDb, (mask & pPa
09f0: 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21  rse->writeMask)!
0a00: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  =0);.        if(
0a10: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20   iDb!=1 ){.     
0a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
0a30: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 65 72 69  AddOp(v, OP_Veri
0a40: 66 79 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70  fyCookie, iDb, p
0a50: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
0a60: 75 65 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20  ue[iDb]);.      
0a70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0a90: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
0aa0: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
0ab0: 47 6f 74 6f 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  Goto+1);.    }. 
0ac0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
0ad0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65   VDBE program re
0ae0: 61 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ady for executio
0af0: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26  n.  */.  if( v &
0b00: 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  & pParse->nErr==
0b10: 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 74  0 ){.    FILE *t
0b20: 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  race = (db->flag
0b30: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
0b40: 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75  race)!=0 ? stdou
0b50: 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t : 0;.    sqlit
0b60: 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74  e3VdbeTrace(v, t
0b70: 72 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  race);.    sqlit
0b80: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
0b90: 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  v, pParse->nVar,
0ba0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
0bb0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
0bc0: 63 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  c = pParse->nErr
0bd0: 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20   ? SQLITE_ERROR 
0be0: 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  : SQLITE_DONE;. 
0bf0: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
0c00: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
0c10: 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
0c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
0c30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
0c40: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0c50: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54    }.  pParse->nT
0c60: 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ab = 0;.  pParse
0c70: 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50  ->nMem = 0;.  pP
0c80: 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a  arse->nSet = 0;.
0c90: 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 3d    pParse->nAgg =
0ca0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
0cb0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
0cc0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
0cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
0ce0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
0cf0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
0d00: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
0d10: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
0d20: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
0d30: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
0d40: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
0d50: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
0d60: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
0d70: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
0d80: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
0d90: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
0da0: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
0db0: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
0dc0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
0dd0: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
0de0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  he.** table and 
0df0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69  the first matchi
0e00: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
0e10: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
0e20: 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69  ing.** for dupli
0e30: 63 61 74 65 20 74 61 62 6c 65 20 6e 61 6d 65 73  cate table names
0e40: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
0e50: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a  search order is.
0e60: 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  ** TEMP first, t
0e70: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
0e80: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
0e90: 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20  abases added.** 
0ea0: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
0eb0: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
0ec0: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
0ed0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
0ee0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
0ef0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
0f00: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
0f10: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
0f20: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
0f30: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
0f40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
0f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 61 64  rc = sqlite3Read
0f60: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
0f70: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
0f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
0f90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
0fa0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
0fb0: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
0fc0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
0fd0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
0fe0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
0ff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1000: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
1010: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
1020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20 3d  ontinue;.    p =
1030: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
1040: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 74 62 6c  (&db->aDb[j].tbl
1050: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  Hash, zName, str
1060: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1070: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
1080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
10a0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
10b0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
10c0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
10d0: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
10e0: 73 65 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  se table given t
10f0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 74 68  he name.** of th
1100: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
1110: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
1120: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1130: 73 65 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  se.** containing
1140: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1150: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1160: 66 6f 75 6e 64 2e 0a 2a 2a 20 41 6c 73 6f 20 6c  found..** Also l
1170: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1180: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
1190: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
11a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
11b0: 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
11c0: 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46  ine and sqlite3F
11d0: 69 6e 64 54 61 62 6c 65 28 29 0a 2a 2a 20 69 73  indTable().** is
11e0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
11f0: 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  ne leaves an err
1200: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
1210: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
1220: 20 77 68 65 72 65 20 73 71 6c 69 74 65 33 46 69   where sqlite3Fi
1230: 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e  ndTable() does n
1240: 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ot..*/.Table *sq
1250: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
1260: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1280: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1290: 44 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20  Dbase){.  Table 
12a0: 2a 70 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74  *p;..  p = sqlit
12b0: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
12c0: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
12d0: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
12e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
12f0: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
1300: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1310: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
1320: 61 62 6c 65 3a 20 25 73 2e 25 73 22 2c 20 7a 44  able: %s.%s", zD
1330: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
1340: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1350: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
1360: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
1370: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)!=0 ){.      s
1380: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1390: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 5c 22  Parse, "table \"
13a0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 69 6e 20 64  %s\" is not in d
13b0: 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 22 2c  atabase \"%s\"",
13c0: 0a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  .         zName,
13d0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 20 20 7d 65   zDbase);.    }e
13e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
13f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1400: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1410: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
1420: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1430: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1440: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1450: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
1460: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1480: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
1490: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
14a0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
14b0: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
14c0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
14d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
14e0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
14f0: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
1500: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
1510: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
1520: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
1530: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
1540: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
1550: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
1560: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
1570: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
1580: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
1590: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
15a0: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
15b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
15c0: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
15d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
15e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
15f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
1600: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
1610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
1620: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
1630: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
1640: 78 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f  x(sqlite *db, co
1650: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1670: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
1680: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
1690: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65  t rc = sqlite3Re
16a0: 61 64 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  adSchema(db, 0);
16b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
16c0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
16d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
16e0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
16f0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53  ? i^1 : i;  /* S
1700: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
1710: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
1720: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
1730: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
1740: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
1750: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
1760: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
1770: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 69  nd(&db->aDb[j].i
1780: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73  dxHash, zName, s
1790: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b  trlen(zName)+1);
17a0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
17b0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
17c0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d   p;.}../*.** Rem
17d0: 6f 76 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e  ove the given in
17e0: 64 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  dex from the ind
17f0: 65 78 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61  ex hash table, a
1800: 6e 64 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d  nd free.** its m
1810: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
1820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
1830: 78 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  x is removed fro
1840: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  m the database h
1850: 61 73 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a  ash tables but.*
1860: 2a 20 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69  * it is not unli
1870: 6e 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61  nked from the Ta
1880: 62 6c 65 20 74 68 61 74 20 69 74 20 69 6e 64 65  ble that it inde
1890: 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e  xes..** Unlinkin
18a0: 67 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65  g from the Table
18b0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79   must be done by
18c0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
18d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
18e0: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
18f0: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 20 2a  teIndex(sqlite *
1900: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 20  db, Index *p){. 
1910: 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 0a 20   Index *pOld;.. 
1920: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 26   assert( db!=0 &
1930: 26 20 70 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  & p->zName!=0 );
1940: 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65  .  pOld = sqlite
1950: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
1960: 3e 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 69 64 78  >aDb[p->iDb].idx
1970: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65 6e            strlen
19a0: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 30 29  (p->zName)+1, 0)
19b0: 3b 0a 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20  ;.  if( pOld!=0 
19c0: 26 26 20 70 4f 6c 64 21 3d 70 20 29 7b 0a 20 20  && pOld!=p ){.  
19d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
19e0: 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 70 2d 3e  ert(&db->aDb[p->
19f0: 69 44 62 5d 2e 69 64 78 48 61 73 68 2c 20 70 4f  iDb].idxHash, pO
1a00: 6c 64 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ld->zName,.     
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 73 74 72 6c 65 6e 28 70 4f 6c 64 2d 3e 7a 4e 61  strlen(pOld->zNa
1a30: 6d 65 29 2b 31 2c 20 70 4f 6c 64 29 3b 0a 20 20  me)+1, pOld);.  
1a40: 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6c 41  }.  if( p->zColA
1a50: 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
1a60: 46 72 65 65 28 70 2d 3e 7a 43 6f 6c 41 66 66 29  Free(p->zColAff)
1a70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
1a80: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
1a90: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
1aa0: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
1ab0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 6d 6f  table, then remo
1ac0: 76 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  ve.** the index 
1ad0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
1ae0: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
1af0: 65 65 20 69 74 73 20 6d 65 6d 6f 72 79 0a 2a 2a  ee its memory.**
1b00: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
1b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
1b20: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
1b30: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 49 6e 64  (sqlite *db, Ind
1b40: 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
1b50: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
1b60: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
1b70: 78 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  x ){.    pIndex-
1b80: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20  >pTable->pIndex 
1b90: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
1ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
1bb0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  dex *p;.    for(
1bc0: 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  p=pIndex->pTable
1bd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
1be0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b  ->pNext!=pIndex;
1bf0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
1c00: 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70     if( p && p->p
1c10: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  Next==pIndex ){.
1c20: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
1c30: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
1c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1c50: 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  teDeleteIndex(db
1c60: 2c 20 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  , pIndex);.}../*
1c70: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
1c80: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
1c90: 20 66 72 6f 6d 20 74 68 65 20 69 6e 2d 6d 65 6d   from the in-mem
1ca0: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1cb0: 6f 66 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  of.** database c
1cc0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 69 73  onnection.  This
1cd0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ce0: 65 64 20 74 6f 20 72 65 63 6c 61 69 6d 20 6d 65  ed to reclaim me
1cf0: 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f 72 65 20 74  mory.** before t
1d00: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c  he connection cl
1d10: 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61 6c 73  oses.  It is als
1d20: 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  o called during 
1d30: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66  a rollback.** if
1d40: 20 74 68 65 72 65 20 77 65 72 65 20 73 63 68 65   there were sche
1d50: 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72 69 6e  ma changes durin
1d60: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
1d70: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  n..**.** If iDb<
1d80: 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  =0 then reset th
1d90: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
1da0: 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c  a tables for all
1db0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1dc0: 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74  es.  If iDb>=2 t
1dd0: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e  hen reset the in
1de0: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f  ternal schema fo
1df0: 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69  r only the.** si
1e00: 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61  ngle file indica
1e10: 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1e20: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
1e30: 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 20 2a  lSchema(sqlite *
1e40: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
1e50: 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
1e60: 0a 20 20 48 61 73 68 20 74 65 6d 70 31 3b 0a 20  .  Hash temp1;. 
1e70: 20 48 61 73 68 20 74 65 6d 70 32 3b 0a 20 20 69   Hash temp2;.  i
1e80: 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 61 73 73 65  nt i, j;..  asse
1e90: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
1ea0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 64  b<db->nDb );.  d
1eb0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
1ec0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b  ITE_Initialized;
1ed0: 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c  .  for(i=iDb; i<
1ee0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1ef0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
1f00: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 74 65  ->aDb[i];.    te
1f10: 6d 70 31 20 3d 20 70 44 62 2d 3e 74 62 6c 48 61  mp1 = pDb->tblHa
1f20: 73 68 3b 0a 20 20 20 20 74 65 6d 70 32 20 3d 20  sh;.    temp2 = 
1f30: 70 44 62 2d 3e 74 72 69 67 48 61 73 68 3b 0a 20  pDb->trigHash;. 
1f40: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
1f50: 69 74 28 26 70 44 62 2d 3e 74 72 69 67 48 61 73  it(&pDb->trigHas
1f60: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
1f70: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
1f80: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
1f90: 26 70 44 62 2d 3e 61 46 4b 65 79 29 3b 0a 20 20  &pDb->aFKey);.  
1fa0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
1fb0: 61 72 28 26 70 44 62 2d 3e 69 64 78 48 61 73 68  ar(&pDb->idxHash
1fc0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d  );.    for(pElem
1fd0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1fe0: 28 26 74 65 6d 70 32 29 3b 20 70 45 6c 65 6d 3b  (&temp2); pElem;
1ff0: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
2000: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
2010: 20 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54       Trigger *pT
2020: 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 48  rigger = sqliteH
2030: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
2040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
2050: 65 74 65 54 72 69 67 67 65 72 28 70 54 72 69 67  eteTrigger(pTrig
2060: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
2070: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
2080: 28 26 74 65 6d 70 32 29 3b 0a 20 20 20 20 73 71  (&temp2);.    sq
2090: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 70  lite3HashInit(&p
20a0: 44 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c  Db->tblHash, SQL
20b0: 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c  ITE_HASH_STRING,
20c0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c   0);.    for(pEl
20d0: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
20e0: 73 74 28 26 74 65 6d 70 31 29 3b 20 70 45 6c 65  st(&temp1); pEle
20f0: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
2100: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
2110: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
2120: 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
2130: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
2140: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
2150: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
2160: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2170: 33 48 61 73 68 43 6c 65 61 72 28 26 74 65 6d 70  3HashClear(&temp
2180: 31 29 3b 0a 20 20 20 20 44 62 43 6c 65 61 72 50  1);.    DbClearP
2190: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44  roperty(db, i, D
21a0: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b  B_SchemaLoaded);
21b0: 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29  .    if( iDb>0 )
21c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
21d0: 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b  ssert( iDb==0 );
21e0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
21f0: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
2200: 61 6e 67 65 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  anges;..  /* If 
2210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
2220: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2230: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20  abase files has 
2240: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a  been closed,.  *
2250: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  * then remove th
2260: 65 6e 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69  en from the auxi
2270: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c  liary database l
2280: 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68  ist.  We take th
2290: 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69  e.  ** opportuni
22a0: 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65  ty to do this he
22b0: 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  re since we have
22c0: 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c   just deleted al
22d0: 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63  l of the.  ** sc
22e0: 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73  hema hash tables
22f0: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64   and therefore d
2300: 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61  o not have to ma
2310: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20  ke any changes. 
2320: 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68   ** to any of th
2330: 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
2340: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
2350: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2360: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
2370: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
2380: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
2390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
23a0: 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62  pDb->pAux && pDb
23b0: 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62  ->xFreeAux ) pDb
23c0: 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e  ->xFreeAux(pDb->
23d0: 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62  pAux);.      pDb
23e0: 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20  ->pAux = 0;.    
23f0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d  }.  }.  for(i=j=
2400: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
2410: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
2420: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
2430: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
2440: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
2450: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 44     sqliteFree(pD
2460: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
2470: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
2480: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2490: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
24a0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
24b0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
24c0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
24d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
24e0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
24f0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
2500: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
2510: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
2520: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
2530: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
2540: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
2550: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
2560: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
2570: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
2580: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
2590: 69 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 29  iteFree(db->aDb)
25a0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
25b0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
25c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
25d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25e0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  ed whenever a ro
25f0: 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 20  llback occurs.  
2600: 49 66 20 74 68 65 72 65 20 77 65 72 65 0a 2a 2a  If there were.**
2610: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
2620: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
2630: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 77 65 20  action, then we 
2640: 68 61 76 65 20 74 6f 20 72 65 73 65 74 20 74 68  have to reset th
2650: 65 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 68 61  e.** internal ha
2660: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 72 65  sh tables and re
2670: 6c 6f 61 64 20 74 68 65 6d 20 66 72 6f 6d 20 64  load them from d
2680: 69 73 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  isk..*/.void sql
2690: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65  ite3RollbackInte
26a0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
26b0: 74 65 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  te *db){.  if( d
26c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
26d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
26e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
26f0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2700: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  a(db, 0);.  }.}.
2710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2720: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2730: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
2740: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
2750: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
2760: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 20  lChanges(sqlite 
2770: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 61 44 62 5b  *db){.  db->aDb[
2780: 30 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  0].schema_cookie
2790: 20 3d 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b   = db->next_cook
27a0: 69 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ie;.  db->flags 
27b0: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
27c0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
27d0: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
27e0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
27f0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
2800: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
2810: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
2820: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
2830: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
2840: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
2850: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
2860: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
2870: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
2880: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
2890: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
28a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
28b0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
28c0: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d   Nor does it rem
28d0: 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b  ove.** foreign k
28e0: 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  eys from the sql
28f0: 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74  ite.aFKey hash t
2900: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
2910: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
2920: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2930: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
2940: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
2950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2960: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
2970: 2a 0a 2a 2a 20 49 6e 64 69 63 65 73 20 61 73 73  *.** Indices ass
2980: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2990: 20 74 61 62 6c 65 20 61 72 65 20 75 6e 6c 69 6e   table are unlin
29a0: 6b 65 64 20 66 72 6f 6d 20 74 68 65 20 22 64 62  ked from the "db
29b0: 22 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  ".** data struct
29c0: 75 72 65 20 69 66 20 64 62 21 3d 4e 55 4c 4c 2e  ure if db!=NULL.
29d0: 20 20 49 66 20 64 62 3d 3d 4e 55 4c 4c 2c 20 69    If db==NULL, i
29e0: 6e 64 69 63 65 73 20 61 74 74 61 63 68 65 64 20  ndices attached 
29f0: 74 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  to.** the table 
2a00: 61 72 65 20 64 65 6c 65 74 65 64 2c 20 62 75 74  are deleted, but
2a10: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
2a20: 68 65 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  hey have already
2a30: 20 62 65 65 6e 0a 2a 2a 20 75 6e 6c 69 6e 6b 65   been.** unlinke
2a40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2a50: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
2a60: 6c 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20  lite *db, Table 
2a70: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
2a80: 69 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  i;.  Index *pInd
2a90: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b  ex, *pNext;.  FK
2aa0: 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78  ey *pFKey, *pNex
2ab0: 74 46 4b 65 79 3b 0a 0a 20 20 69 66 28 20 70 54  tFKey;..  if( pT
2ac0: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
2ad0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  ;..  /* Delete a
2ae0: 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63  ll indices assoc
2af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
2b00: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72  table.  */.  for
2b10: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
2b20: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
2b30: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
2b40: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
2b50: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
2b60: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
2b70: 69 44 62 3d 3d 70 54 61 62 6c 65 2d 3e 69 44 62  iDb==pTable->iDb
2b80: 20 7c 7c 20 28 70 54 61 62 6c 65 2d 3e 69 44 62   || (pTable->iDb
2b90: 3d 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  ==0 && pIndex->i
2ba0: 44 62 3d 3d 31 29 20 29 3b 0a 20 20 20 20 73 71  Db==1) );.    sq
2bb0: 6c 69 74 65 44 65 6c 65 74 65 49 6e 64 65 78 28  liteDeleteIndex(
2bc0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
2bd0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
2be0: 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  l foreign keys a
2bf0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c00: 68 69 73 20 74 61 62 6c 65 2e 20 20 54 68 65 20  his table.  The 
2c10: 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  keys.  ** should
2c20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
2c30: 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d  en unlinked from
2c40: 20 74 68 65 20 64 62 2d 3e 61 46 4b 65 79 20 68   the db->aFKey h
2c50: 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a 2f 0a  ash table .  */.
2c60: 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62    for(pFKey=pTab
2c70: 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  le->pFKey; pFKey
2c80: 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65  ; pFKey=pNextFKe
2c90: 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65  y){.    pNextFKe
2ca0: 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  y = pFKey->pNext
2cb0: 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  From;.    assert
2cc0: 28 20 70 54 61 62 6c 65 2d 3e 69 44 62 3c 64 62  ( pTable->iDb<db
2cd0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
2ce0: 65 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68  ert( sqlite3Hash
2cf0: 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 70 54  Find(&db->aDb[pT
2d00: 61 62 6c 65 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  able->iDb].aFKey
2d10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 4b               pFK
2d30: 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65 6e 28  ey->zTo, strlen(
2d40: 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29 21 3d  pFKey->zTo)+1)!=
2d50: 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73 71 6c  pFKey );.    sql
2d60: 69 74 65 46 72 65 65 28 70 46 4b 65 79 29 3b 0a  iteFree(pFKey);.
2d70: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
2d80: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
2d90: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
2da0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2db0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
2dc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2dd0: 65 28 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  e(pTable->aCol[i
2de0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ].zName);.    sq
2df0: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e00: 3e 61 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 29 3b  >aCol[i].zDflt);
2e10: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2e20: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 5d 2e  pTable->aCol[i].
2e30: 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zType);.  }.  sq
2e40: 6c 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 2d  liteFree(pTable-
2e50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
2e60: 65 46 72 65 65 28 70 54 61 62 6c 65 2d 3e 61 43  eFree(pTable->aC
2e70: 6f 6c 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  ol);.  if( pTabl
2e80: 65 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a 20 20  e->zColAff ){.  
2e90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
2ea0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
2eb0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2ec0: 63 74 44 65 6c 65 74 65 28 70 54 61 62 6c 65 2d  ctDelete(pTable-
2ed0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
2ee0: 69 74 65 46 72 65 65 28 70 54 61 62 6c 65 29 3b  iteFree(pTable);
2ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
2f00: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
2f10: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
2f20: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
2f30: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
2f40: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
2f50: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
2f60: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
2f70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2f80: 64 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e  d sqliteUnlinkAn
2f90: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
2fa0: 69 74 65 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  ite *db, Table *
2fb0: 70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 4f 6c  p){.  Table *pOl
2fc0: 64 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c 20  d;.  FKey *pF1, 
2fd0: 2a 70 46 32 3b 0a 20 20 69 6e 74 20 69 20 3d 20  *pF2;.  int i = 
2fe0: 70 2d 3e 69 44 62 3b 0a 20 20 61 73 73 65 72 74  p->iDb;.  assert
2ff0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 70 4f 6c  ( db!=0 );.  pOl
3000: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
3010: 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62 5b 69  nsert(&db->aDb[i
3020: 5d 2e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ].tblHash, p->zN
3030: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
3040: 4e 61 6d 65 29 2b 31 2c 20 30 29 3b 0a 20 20 61  Name)+1, 0);.  a
3050: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c  ssert( pOld==0 |
3060: 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66  | pOld==p );.  f
3070: 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b  or(pF1=p->pFKey;
3080: 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70   pF1; pF1=pF1->p
3090: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 69  NextFrom){.    i
30a0: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
30b0: 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20  pF1->zTo) + 1;. 
30c0: 20 20 20 70 46 32 20 3d 20 73 71 6c 69 74 65 33     pF2 = sqlite3
30d0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
30e0: 62 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d  b[i].aFKey, pF1-
30f0: 3e 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20  >zTo, nTo);.    
3100: 69 66 28 20 70 46 32 3d 3d 70 46 31 20 29 7b 0a  if( pF2==pF1 ){.
3110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 73        sqlite3Has
3120: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
3130: 5b 69 5d 2e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  [i].aFKey, pF1->
3140: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
3150: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 7d 65 6c  NextTo);.    }el
3160: 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
3170: 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70 4e 65   pF2 && pF2->pNe
3180: 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70 46 32  xtTo!=pF1 ){ pF2
3190: 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b 20 7d  =pF2->pNextTo; }
31a0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 32 20 29  .      if( pF2 )
31b0: 7b 0a 20 20 20 20 20 20 20 20 70 46 32 2d 3e 70  {.        pF2->p
31c0: 4e 65 78 74 54 6f 20 3d 20 70 46 31 2d 3e 70 4e  NextTo = pF1->pN
31d0: 65 78 74 54 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  extTo;.      }. 
31e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
31f0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
3200: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , p);.}../*.** C
3210: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6e 61 6d  onstruct the nam
3220: 65 20 6f 66 20 61 20 75 73 65 72 20 74 61 62 6c  e of a user tabl
3230: 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d 20  e or index from 
3240: 61 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53  a token..**.** S
3250: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3260: 20 6e 61 6d 65 20 69 73 20 6f 62 74 61 69 6e 65   name is obtaine
3270: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
3280: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a  loc() and must.*
3290: 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  * be freed by th
32a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
32b0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
32c0: 69 74 65 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f  ite3TableNameFro
32d0: 6d 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 4e  mToken(Token *pN
32e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
32f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ame = sqliteStrN
3300: 44 75 70 28 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  Dup(pName->z, pN
3310: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74  ame->n);.  sqlit
3320: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
3330: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
3340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
3350: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3360: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
3370: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
3380: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
3390: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
33a0: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
33b0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
33c0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
33d0: 74 65 72 54 61 62 6c 65 28 56 64 62 65 20 2a 76  terTable(Vdbe *v
33e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
33f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3400: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
3410: 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 0);.  sqlite3
3420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3430: 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41  OpenWrite, 0, MA
3440: 53 54 45 52 5f 52 4f 4f 54 29 3b 0a 20 20 73 71  STER_ROOT);.  sq
3450: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3460: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
3470: 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a 20 73 71  ns, 0, 5); /* sq
3480: 6c 69 74 65 5f 6d 61 73 74 65 72 20 68 61 73 20  lite_master has 
3490: 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 0a 0a  5 columns */.}..
34a0: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
34b0: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
34c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
34d0: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
34e0: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
34f0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
3500: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
3510: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
3520: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
3530: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
3540: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
3550: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
3560: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
3570: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
3580: 74 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e 64 44 62  t..*/.int findDb
3590: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
35a0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
35b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
35c0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
35d0: 7b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d  {.    if( pName-
35e0: 3e 6e 3d 3d 73 74 72 6c 65 6e 28 64 62 2d 3e 61  >n==strlen(db->a
35f0: 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 20 26 26 20  Db[i].zName) && 
3600: 0a 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69  .        0==sqli
3610: 74 65 33 53 74 72 4e 49 43 6d 70 28 64 62 2d 3e  te3StrNICmp(db->
3620: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  aDb[i].zName, pN
3630: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
3640: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3650: 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n i;.    }.  }. 
3660: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 69   return -1;.}..i
3670: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
3680: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
3690: 70 50 61 72 73 65 2c 20 0a 20 20 54 6f 6b 65 6e  pParse, .  Token
36a0: 20 2a 70 4e 61 6d 65 31 2c 20 0a 20 20 54 6f 6b   *pName1, .  Tok
36b0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 0a 20 20 54  en *pName2, .  T
36c0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 0a 29  oken **pUnqual.)
36d0: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  {.  int iDb;.  s
36e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
36f0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
3700: 70 4e 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32  pName2 && pName2
3710: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ->n>0 ){.    ass
3720: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
3730: 75 73 79 20 29 3b 0a 20 20 20 20 2a 70 55 6e 71  usy );.    *pUnq
3740: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
3750: 20 20 69 44 62 20 3d 20 66 69 6e 64 44 62 28 64    iDb = findDb(d
3760: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
3770: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
3780: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3790: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
37a0: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
37b0: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
37c0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
37d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
37e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
37f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
3800: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
3810: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
3820: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
3830: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
3840: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
3850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
3860: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3870: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3880: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
3890: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
38a0: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
38b0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
38c0: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
38d0: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
38e0: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
38f0: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
3900: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
3910: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
3920: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
3930: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
3940: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
3950: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
3960: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
3970: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
3980: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
3990: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
39a0: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
39b0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
39c0: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
39d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
39e0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
39f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
3a00: 62 75 73 79 20 26 26 20 30 3d 3d 73 71 6c 69 74  busy && 0==sqlit
3a10: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
3a20: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
3a30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
3a40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3a50: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
3a60: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
3a70: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
3a80: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
3a90: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
3aa0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3ab0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
3ac0: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
3ad0: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
3ae0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
3af0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
3b00: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
3b10: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
3b20: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
3b30: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
3b40: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
3b50: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
3b60: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
3b70: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
3b80: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
3b90: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
3ba0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
3bb0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
3bc0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 0a  able name.  The.
3bd0: 2a 2a 20 70 53 74 61 72 74 20 74 6f 6b 65 6e 20  ** pStart token 
3be0: 69 73 20 74 68 65 20 43 52 45 41 54 45 20 61 6e  is the CREATE an
3bf0: 64 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 74  d pName is the t
3c00: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
3c10: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
3c20: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
3c30: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
3c40: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
3c50: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
3c60: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
3c70: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
3c80: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
3c90: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
3ca0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
3cb0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
3cc0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
3cd0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
3ce0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
3cf0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
3d00: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
3d10: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
3d20: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
3d30: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
3d40: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
3d50: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
3d60: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
3d70: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
3d80: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
3d90: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
3da0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
3db0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
3dc0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
3dd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
3de0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
3df0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
3e00: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
3e10: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
3e20: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
3e30: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
3e40: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
3e50: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
3e60: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
3e70: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
3e80: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
3e90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
3ea0: 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a  en *pStart,   /*
3eb0: 20 54 68 65 20 22 43 52 45 41 54 45 22 20 74 6f   The "CREATE" to
3ec0: 6b 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ken */.  Token *
3ed0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
3ee0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
3ef0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
3f00: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
3f10: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
3f20: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
3f30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3f40: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
3f50: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
3f60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3f70: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
3f80: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
3f90: 56 69 65 77 20 20 20 20 20 20 20 2f 2a 20 54 72  View       /* Tr
3fa0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
3fb0: 56 49 45 57 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  VIEW */.){.  Tab
3fc0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 49 6e  le *pTable;.  In
3fd0: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 63 68 61  dex *pIdx;.  cha
3fe0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
3ff0: 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  te *db = pParse-
4000: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
4010: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
4020: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
4030: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
4040: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
4050: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
4060: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
4070: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
4080: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
4090: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
40a0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
40b0: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
40c0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
40d0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
40e0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
40f0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
4100: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
4110: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
4120: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
4130: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4140: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
4150: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
4160: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4170: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4180: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4190: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
41a0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
41b0: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
41c0: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
41d0: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
41e0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
41f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
4200: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4210: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
4220: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
4230: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
4240: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
4250: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
4260: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
4270: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
4280: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
4290: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
42a0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
42b0: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
42c0: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
42d0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
42e0: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
42f0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
4300: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
4310: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
4320: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
4330: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
4340: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
4350: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
4360: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
4370: 20 20 69 66 28 20 69 73 54 65 6d 70 20 26 26 20    if( isTemp && 
4380: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
4390: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
43a0: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
43b0: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
43c0: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
43d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
43e0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
43f0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
4400: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
4410: 22 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ");.    pParse->
4420: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75  nErr++;.    retu
4430: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  rn;.  }.  if( is
4440: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
4450: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
4460: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
4470: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4480: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
4490: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 69 66  ken(pName);.  if
44a0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
44b0: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
44c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
44d0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
44e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  ;.  }.  if( zNam
44f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
4500: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44   if( db->init.iD
4510: 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20  b==1 ) isTemp = 
4520: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
4530: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
4540: 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28  TION.  assert( (
4550: 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54  isTemp & 1)==isT
4560: 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69  emp );.  {.    i
4570: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61  nt code;.    cha
4580: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
4590: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
45a0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
45b0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
45c0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
45d0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
45e0: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
45f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
4600: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
4610: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
4620: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
4630: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b     if( isTemp ){
4640: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
4650: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
4660: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
4670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
4680: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4690: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
46a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
46b0: 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
46c0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
46d0: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
46e0: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
46f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
4700: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
4710: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
4720: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4730: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
4740: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
4750: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
4760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
4770: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
4780: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
4790: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  }.#endif..  /* B
47a0: 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 6f 20  efore trying to 
47b0: 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  create a tempora
47c0: 72 79 20 74 61 62 6c 65 2c 20 6d 61 6b 65 20 73  ry table, make s
47d0: 75 72 65 20 74 68 65 20 42 74 72 65 65 20 66 6f  ure the Btree fo
47e0: 72 0a 20 20 2a 2a 20 68 6f 6c 64 69 6e 67 20 74  r.  ** holding t
47f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
4800: 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  is open..  */.  
4810: 69 66 28 20 69 73 54 65 6d 70 20 26 26 20 64 62  if( isTemp && db
4820: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
4830: 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
4840: 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
4850: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
4860: 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
4870: 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20 26 64 62  , MAX_PAGES, &db
4880: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
4890: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
48a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
48b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
48c0: 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
48d0: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
48e0: 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
48f0: 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
4900: 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
4910: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
4920: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
4930: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4940: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
4950: 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
4960: 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
4970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
4980: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
4990: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 2c  ->aDb[1].pBt, 1,
49a0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
49b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
49c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
49d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
49e0: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
49f0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
4a00: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
4a10: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
4a20: 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
4a30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
4a40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
4a50: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
4a60: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
4a70: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
4a80: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
4a90: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
4aa0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
4ab0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
4ac0: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
4ad0: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
4ae0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
4af0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
4b00: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
4b10: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
4b20: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b].zName);.  if(
4b30: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73   pTable ){.    s
4b40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4b50: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
4b60: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
4b70: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  , pName);.    sq
4b80: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4b90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4ba0: 0a 20 20 69 66 28 20 28 70 49 64 78 20 3d 20 73  .  if( (pIdx = s
4bb0: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
4bc0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d  db, zName, 0))!=
4bd0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28  0 &&.          (
4be0: 70 49 64 78 2d 3e 69 44 62 3d 3d 30 20 7c 7c 20  pIdx->iDb==0 || 
4bf0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20  !db->init.busy) 
4c00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4c10: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4c20: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
4c30: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
4c40: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
4c50: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
4c60: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
4c70: 20 20 7d 0a 20 20 70 54 61 62 6c 65 20 3d 20 73    }.  pTable = s
4c80: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
4c90: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
4ca0: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b  if( pTable==0 ){
4cb0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4cc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
4cd0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  rn;.  }.  pTable
4ce0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
4cf0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
4d00: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61  = 0;.  pTable->a
4d10: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
4d20: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
4d30: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20   pTable->pIndex 
4d40: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  = 0;.  pTable->i
4d50: 44 62 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20  Db = iDb;.  if( 
4d60: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
4d70: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
4d80: 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73  eTable(db, pPars
4d90: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20  e->pNewTable);. 
4da0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
4db0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
4dc0: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
4dd0: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
4de0: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
4df0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
4e00: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
4e10: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
4e20: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
4e30: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
4e40: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
4e50: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
4e60: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
4e70: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
4e80: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
4e90: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
4ea0: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
4eb0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
4ec0: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
4ed0: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
4ee0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
4ef0: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
4f00: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
4f10: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
4f20: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
4f30: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
4f40: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
4f50: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
4f60: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
4f70: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
4f80: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
4f90: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
4fa0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
4fb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4fc0: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
4fd0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
4fe0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , iDb);.    if( 
4ff0: 21 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  !isTemp ){.     
5000: 20 2f 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61   /* Every time a
5010: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 63 72   new table is cr
5020: 65 61 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66  eated the file-f
5030: 6f 72 6d 61 74 0a 20 20 20 20 20 20 2a 2a 20 61  ormat.      ** a
5040: 6e 64 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61  nd encoding meta
5050: 2d 76 61 6c 75 65 73 20 61 72 65 20 73 65 74 20  -values are set 
5060: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
5070: 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 63 61 73   in.      ** cas
5080: 65 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  e this is the fi
5090: 72 73 74 20 74 61 62 6c 65 20 63 72 65 61 74 65  rst table create
50a0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
50b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
50c0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
50d0: 2c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  , db->file_forma
50e0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
50f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5100: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
5110: 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Db, 1);.      sq
5120: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5130: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
5140: 2d 3e 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  ->enc, 0);.     
5150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5160: 70 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  p(v, OP_SetCooki
5170: 65 2c 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20  e, iDb, 4);.    
5180: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
5190: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20  nMasterTable(v, 
51a0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
51b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
51c0: 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29  _NewRecno, 0, 0)
51d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
51e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
51f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
5200: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5210: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
5220: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
5230: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
5240: 75 74 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b  utIntKey, 0, 0);
5250: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
5260: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
5270: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
5280: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
5290: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
52a0: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
52b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
52c0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
52d0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
52e0: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
52f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
5300: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5310: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
5320: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
5330: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
5340: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5350: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
5360: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
5370: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
5380: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
5390: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
53a0: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
53b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
53c0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d   *z = 0;.  Colum
53d0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28  n *pCol;.  if( (
53e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
53f0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
5400: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74  rn;.  sqlite3Set
5410: 4e 53 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d  NString(&z, pNam
5420: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
5430: 30 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  0);.  if( z==0 )
5440: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
5450: 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
5460: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
5470: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
5480: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5490: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
54a0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
54b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
54c0: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
54d0: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
54e0: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
54f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
5500: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5510: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
5520: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
5530: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
5540: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
5550: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
5560: 70 2d 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f  p->aCol, (p->nCo
5570: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
5580: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
5590: 28 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( aNew==0 ) retu
55a0: 72 6e 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20  rn;.    p->aCol 
55b0: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
55c0: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
55d0: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
55e0: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
55f0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
5600: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
5610: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
5620: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
5630: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
5640: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
5650: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
5660: 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20  NONE'. If there 
5670: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
5680: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
5690: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
56a0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
56b0: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
56c0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
56d0: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
56e0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
56f0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
5700: 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c  NE;.  pCol->pCol
5710: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
5720: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e  pDfltColl;.  p->
5730: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
5740: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5750: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
5760: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
5770: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
5780: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
5790: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
57a0: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
57b0: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
57c0: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
57d0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
57e0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
57f0: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
5800: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
5810: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
5820: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
5840: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
5850: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
5860: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
5870: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70   int i;.  if( (p
5880: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
5890: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
58a0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
58b0: 2d 31 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  -1;.  if( i>=0 )
58c0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e   p->aCol[i].notN
58d0: 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d  ull = onError;.}
58e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
58f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
5900: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
5910: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
5920: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
5930: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
5940: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
5950: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
5960: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
5970: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
5980: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
5990: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
59a0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
59b0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
59c0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
59d0: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
59e0: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
59f0: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
5a00: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
5a10: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
5a20: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
5a30: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
5a40: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
5a50: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
5a60: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
5a70: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
5a80: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
5a90: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
5aa0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46  Parse, Token *pF
5ab0: 69 72 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61  irst, Token *pLa
5ac0: 73 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  st){.  Table *p;
5ad0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
5ae0: 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c  nt n;.  char *z,
5af0: 20 2a 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20   **pz;.  Column 
5b00: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
5b10: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5b20: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
5b30: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
5b40: 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72  1;.  if( i<0 ) r
5b50: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
5b60: 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70  &p->aCol[i];.  p
5b70: 7a 20 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65  z = &pCol->zType
5b80: 3b 0a 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e  ;.  n = pLast->n
5b90: 20 2b 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a   + Addr(pLast->z
5ba0: 29 20 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d  ) - Addr(pFirst-
5bb0: 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  >z);.  sqlite3Se
5bc0: 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69  tNString(pz, pFi
5bd0: 72 73 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20  rst->z, n, 0);. 
5be0: 20 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20   z = *pz;.  if( 
5bf0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
5c00: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d   for(i=j=0; z[i]
5c10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
5c20: 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66  c = z[i];.    if
5c30: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
5c40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a  ontinue;.    z[j
5c50: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
5c60: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d  [j] = 0;.  pCol-
5c70: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
5c80: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
5c90: 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  z, n);.}../*.** 
5ca0: 54 68 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20  The given token 
5cb0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
5cc0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73  alue for the las
5cd0: 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
5ce0: 6f 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63  o.** the table c
5cf0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
5d00: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  onstruction.  If
5d10: 20 22 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20   "minusFlag" is 
5d20: 74 72 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  true, it.** mean
5d30: 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65  s the value toke
5d40: 6e 20 77 61 73 20 70 72 65 63 65 64 65 64 20 62  n was preceded b
5d50: 79 20 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a  y a minus sign..
5d60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5d70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
5d80: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
5d90: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
5da0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
5db0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5dc0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
5dd0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
5de0: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
5df0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c  rse, Token *pVal
5e00: 2c 20 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29  , int minusFlag)
5e10: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
5e20: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a  int i;.  char **
5e30: 70 7a 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  pz;.  if( (p = p
5e40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5e50: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
5e60: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
5e70: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
5e80: 72 6e 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61  rn;.  pz = &p->a
5e90: 43 6f 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20  Col[i].zDflt;.  
5ea0: 69 66 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b  if( minusFlag ){
5eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e  .    sqlite3SetN
5ec0: 53 74 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20  String(pz, "-", 
5ed0: 31 2c 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c  1, pVal->z, pVal
5ee0: 2d 3e 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ->n, 0);.  }else
5ef0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
5f00: 4e 53 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c  NString(pz, pVal
5f10: 2d 3e 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29  ->z, pVal->n, 0)
5f20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
5f30: 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a  equote(*pz);.}..
5f40: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
5f50: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
5f60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
5f70: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
5f80: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
5f90: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
5fa0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
5fb0: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
5fc0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
5fd0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
5fe0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
5ff0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
6000: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
6010: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
6020: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
6030: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
6040: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
6050: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
6060: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
6070: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
6080: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
6090: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
60a0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
60b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
60c0: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
60d0: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
60e0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
60f0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
6100: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
6110: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
6120: 6f 77 20 69 64 2e 20 20 28 45 78 63 65 70 74 69  ow id.  (Excepti
6130: 6f 6e 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77  on:.** For backw
6140: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
6150: 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61  ty with older da
6160: 74 61 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20  tabases, do not 
6170: 64 6f 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68  do this.** if th
6180: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65  e file format ve
6190: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20  rsion number is 
61a0: 6c 65 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53  less than 1.)  S
61b0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
61c0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
61d0: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
61e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
61f0: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
6200: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
6210: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
6220: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
6230: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
6240: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
6250: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6260: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
6270: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
6280: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6290: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
62a0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
62b0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
62c0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
62d0: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
62e0: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
62f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
6300: 72 69 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20  rimaryKey(Parse 
6310: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
6320: 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e  t *pList, int on
6330: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
6340: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
6350: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
6360: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
6370: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
6380: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
6390: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
63a0: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
63b0: 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20  Tab->hasPrimKey 
63c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
63d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
63e0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
63f0: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
6400: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
6410: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
6420: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
6430: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
6440: 0a 20 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d  .  pTab->hasPrim
6450: 4b 65 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  Key = 1;.  if( p
6460: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
6470: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
6480: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
6490: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
64a0: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  mKey = 1;.  }els
64b0: 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
64c0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
64d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
64e0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
64f0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
6500: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
6510: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
6520: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
6530: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
6540: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
6550: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6570: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
6580: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61  pTab->nCol ) pTa
6590: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
65a0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
65b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
65c0: 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c  ->nExpr>1 ) iCol
65d0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
65e0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
65f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
6600: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
6610: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
6620: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79  e;.  }.  if( zTy
6630: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
6640: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
6650: 45 47 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20  EGER")==0 ){.   
6660: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
6670: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
6680: 65 79 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72  eyConf = onError
6690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
66a0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
66b0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
66c0: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
66d0: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c  r, 0, 0);.    pL
66e0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
66f0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
6700: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6710: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
6720: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
6730: 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61  ** Set the colla
6740: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66  tion function of
6750: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6760: 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20  ly parsed table 
6770: 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65  column.** to the
6780: 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a   CollSeq given..
6790: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
67a0: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61  ddCollateType(Pa
67b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
67c0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20  st char *zType, 
67d0: 69 6e 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61  int nType){.  Ta
67e0: 62 6c 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20  ble *p;.  Index 
67f0: 2a 70 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pIdx;.  CollSeq
6800: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
6810: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
6820: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6840: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a  i = p->nCol-1;..
6850: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
6860: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
6870: 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54  Parse, zType, nT
6880: 79 70 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b  ype);.  p->aCol[
6890: 69 5d 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  i].pColl = pColl
68a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
68b0: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
68c0: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
68d0: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
68e0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74   <type>",.  ** t
68f0: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
6900: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
6910: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
6920: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a  n before the.  *
6930: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
6940: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
6950: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
6960: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f  s the case..  */
6970: 0a 20 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d  .  for(pIdx = p-
6980: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
6990: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
69a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
69b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  dx->nColumn==1 )
69c0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
69d0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
69e0: 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
69f0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[0] = pColl;
6a00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
6a10: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
6a20: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6a30: 65 20 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61  e db.aCollSeq ha
6a40: 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
6a50: 20 65 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66   entry.** specif
6a60: 69 65 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64  ied by zName and
6a70: 20 6e 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f   nName is not fo
6a80: 75 6e 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65  und and paramete
6a90: 72 20 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a  r 'create' is.**
6aa0: 20 74 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61   true, then crea
6ab0: 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20  te a new entry. 
6ac0: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
6ad0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63   NULL..**.** Eac
6ae0: 68 20 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64  h pointer stored
6af0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e   in the sqlite3.
6b00: 61 43 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61  aCollSeq hash ta
6b10: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a  ble contains an.
6b20: 2a 2a 20 61 72 72 61 79 20 6f 66 20 74 68 72 65  ** array of thre
6b30: 65 20 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74  e CollSeq struct
6b40: 75 72 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  ures. The first 
6b50: 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  is the collation
6b60: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65   sequence.** pre
6b70: 66 66 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d  fferred for UTF-
6b80: 38 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54  8, the second UT
6b90: 46 2d 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20  F-16le, and the 
6ba0: 74 68 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a  third UTF-16be..
6bb0: 2a 2a 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d  **.** Stored imm
6bc0: 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 74  ediately after t
6bd0: 68 65 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69  he three collati
6be0: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 69 73 20  on sequences is 
6bf0: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
6c00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
6c10: 6e 63 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e  nce name. A poin
6c20: 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72 69  ter to this stri
6c30: 6e 67 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a  ng is stored in.
6c40: 2a 2a 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f  ** each collatio
6c50: 6e 20 73 65 71 75 65 6e 63 65 20 73 74 72 75 63  n sequence struc
6c60: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
6c70: 43 6f 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f  CollSeq * findCo
6c80: 6c 6c 53 65 71 45 6e 74 72 79 28 0a 20 20 73 71  llSeqEntry(.  sq
6c90: 6c 69 74 65 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  lite *db,.  cons
6ca0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20  t char *zName,. 
6cb0: 20 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e   int nName,.  in
6cc0: 74 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f  t create.){.  Co
6cd0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
6ce0: 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e  if( nName<0 ) nN
6cf0: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
6d00: 6d 65 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  me);.  pColl = s
6d10: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
6d20: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
6d30: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20  ame, nName);..  
6d40: 69 66 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20  if( 0==pColl && 
6d50: 63 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43  create ){.    pC
6d60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  oll = sqliteMall
6d70: 6f 63 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43  oc( 3*sizeof(*pC
6d80: 6f 6c 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  oll) + nName + 1
6d90: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   );.    if( pCol
6da0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  l ){.      pColl
6db0: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  [0].zName = (cha
6dc0: 72 2a 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20  r*)&pColl[3];.  
6dd0: 20 20 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63      pColl[0].enc
6de0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
6df0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a        pColl[1].z
6e00: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
6e10: 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70  Coll[3];.      p
6e20: 43 6f 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51  Coll[1].enc = SQ
6e30: 4c 49 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20  LITE_UTF16LE;.  
6e40: 20 20 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61      pColl[2].zNa
6e50: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  me = (char*)&pCo
6e60: 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f  ll[3];.      pCo
6e70: 6c 6c 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49  ll[2].enc = SQLI
6e80: 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20  TE_UTF16BE;.    
6e90: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30    memcpy(pColl[0
6ea0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ].zName, zName, 
6eb0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  nName);.      pC
6ec0: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61  oll[0].zName[nNa
6ed0: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  me] = 0;.      s
6ee0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
6ef0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
6f00: 70 43 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  pColl[0].zName, 
6f10: 6e 4e 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20  nName, pColl);. 
6f20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6f30: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
6f40: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
6f50: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54  e points to a UT
6f60: 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69  F-8 encoded stri
6f70: 6e 67 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c  ng nName bytes l
6f80: 6f 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ong..** Return t
6f90: 68 65 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e  he CollSeq* poin
6fa0: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c  ter for the coll
6fb0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
6fc0: 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f  amed zName.** fo
6fd0: 72 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27  r the encoding '
6fe0: 65 6e 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61  enc' from the da
6ff0: 74 61 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a  tabase 'db'..**.
7000: 2a 2a 20 49 66 20 74 68 65 20 65 6e 74 72 79 20  ** If the entry 
7010: 73 70 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74  specified is not
7020: 20 66 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61   found and 'crea
7030: 74 65 27 20 69 73 20 74 72 75 65 2c 20 74 68 65  te' is true, the
7040: 6e 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65  n create a.** ne
7050: 77 20 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77  w entry.  Otherw
7060: 69 73 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  ise return NULL.
7070: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
7080: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
7090: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20  .  sqlite *db,. 
70a0: 20 75 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74   u8 enc,.  const
70b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
70c0: 69 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  int nName,.  int
70d0: 20 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c   create.){.  Col
70e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69  lSeq *pColl = fi
70f0: 6e 64 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64  ndCollSeqEntry(d
7100: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
7110: 20 63 72 65 61 74 65 29 3b 0a 20 20 69 66 28 20   create);.  if( 
7120: 70 43 6f 6c 6c 20 29 20 73 77 69 74 63 68 28 20  pColl ) switch( 
7130: 65 6e 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20  enc ){.    case 
7140: 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20  SQLITE_UTF8:.   
7150: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7160: 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  se SQLITE_UTF16L
7170: 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  E:.      pColl =
7180: 20 26 70 43 6f 6c 6c 5b 31 5d 3b 0a 20 20 20 20   &pColl[1];.    
7190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
71a0: 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  e SQLITE_UTF16BE
71b0: 3a 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  :.      pColl = 
71c0: 26 70 43 6f 6c 6c 5b 32 5d 3b 0a 20 20 20 20 20  &pColl[2];.     
71d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
71e0: 75 6c 74 3a 20 0a 20 20 20 20 20 20 61 73 73 65  ult: .      asse
71f0: 72 74 28 21 22 43 61 6e 6e 6f 74 20 68 61 70 70  rt(!"Cannot happ
7200: 65 6e 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  en");.  }.  retu
7210: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 73 74 61  rn pColl;.}..sta
7220: 74 69 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c  tic void callCol
7230: 6c 4e 65 65 64 65 64 28 73 71 6c 69 74 65 20 2a  lNeeded(sqlite *
7240: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
7250: 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65  zName, int nName
7260: 29 7b 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61  ){.  /* No colla
7270: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
7280: 20 74 68 69 73 20 74 79 70 65 20 66 6f 72 20 74   this type for t
7290: 68 69 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  his encoding is 
72a0: 72 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2a  registered..  **
72b0: 20 43 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74   Call the collat
72c0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73  ion factory to s
72d0: 65 65 20 69 66 20 69 74 20 63 61 6e 20 73 75 70  ee if it can sup
72e0: 70 6c 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e  ply us with one.
72f0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  .  */.  char *zE
7300: 78 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 61  xternal = 0;.  a
7310: 73 73 65 72 74 28 20 21 64 62 2d 3e 78 43 6f 6c  ssert( !db->xCol
7320: 6c 4e 65 65 64 65 64 20 7c 7c 20 21 64 62 2d 3e  lNeeded || !db->
7330: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29 3b  xCollNeeded16 );
7340: 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29  .  if( nName<0 )
7350: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
7360: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62  zName);.  if( db
7370: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 29 7b  ->xCollNeeded ){
7380: 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d  .    zExternal =
7390: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 7a   sqliteStrNDup(z
73a0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
73b0: 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61 6c    if( !zExternal
73c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
73d0: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
73e0: 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64  (db->pCollNeeded
73f0: 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64 62  Arg, db, (int)db
7400: 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61 6c  ->enc, zExternal
7410: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  );.  }.  if( db-
7420: 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 29  >xCollNeeded16 )
7430: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
7440: 5f 42 49 47 45 4e 44 49 41 4e 20 29 7b 0a 20 20  _BIGENDIAN ){.  
7450: 20 20 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20      zExternal = 
7460: 73 71 6c 69 74 65 33 75 74 66 38 74 6f 31 36 62  sqlite3utf8to16b
7470: 65 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  e(zName, nName);
7480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7490: 20 20 7a 45 78 74 65 72 6e 61 6c 20 3d 20 73 71    zExternal = sq
74a0: 6c 69 74 65 33 75 74 66 38 74 6f 31 36 6c 65 28  lite3utf8to16le(
74b0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
74c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 45     }.    if( !zE
74d0: 78 74 65 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  xternal ) return
74e0: 3b 0a 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ;.    db->xCollN
74f0: 65 65 64 65 64 31 36 28 64 62 2d 3e 70 43 6f 6c  eeded16(db->pCol
7500: 6c 4e 65 65 64 65 64 41 72 67 2c 20 64 62 2c 20  lNeededArg, db, 
7510: 28 69 6e 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45  (int)db->enc, zE
7520: 78 74 65 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20  xternal);.  }.  
7530: 69 66 28 20 7a 45 78 74 65 72 6e 61 6c 20 29 20  if( zExternal ) 
7540: 73 71 6c 69 74 65 46 72 65 65 28 7a 45 78 74 65  sqliteFree(zExte
7550: 72 6e 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rnal);.}..static
7560: 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53 65   int synthCollSe
7570: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
7580: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
7590: 7b 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61  {.  /* The colla
75a0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 66 61 69  tion factory fai
75b0: 6c 65 64 20 74 6f 20 64 65 6c 69 76 65 72 20 61  led to deliver a
75c0: 20 66 75 6e 63 74 69 6f 6e 20 62 75 74 20 74 68   function but th
75d0: 65 72 65 20 6d 61 79 20 62 65 0a 20 20 2a 2a 20  ere may be.  ** 
75e0: 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  other versions o
75f0: 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  f this collation
7600: 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20 6f   function (for o
7610: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
7620: 6e 67 73 29 0a 20 20 2a 2a 20 61 76 61 69 6c 61  ngs).  ** availa
7630: 62 6c 65 2e 20 55 73 65 20 6f 6e 65 20 6f 66 20  ble. Use one of 
7640: 74 68 65 73 65 20 69 6e 73 74 65 61 64 2e 20 41  these instead. A
7650: 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d 3e  void a UTF-8 <->
7660: 20 55 54 46 2d 31 36 0a 20 20 2a 2a 20 63 6f 6e   UTF-16.  ** con
7670: 76 65 72 73 69 6f 6e 20 69 66 20 70 6f 73 73 69  version if possi
7680: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 43 6f 6c 6c  ble..  */.  Coll
7690: 53 65 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 30 3b  Seq *pColl2 = 0;
76a0: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43 6f  .  char *z = pCo
76b0: 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74  ll->zName;.  int
76c0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
76d0: 20 20 73 77 69 74 63 68 28 20 70 50 61 72 73 65    switch( pParse
76e0: 2d 3e 64 62 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  ->db->enc ){.   
76f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
7700: 31 36 4c 45 3a 0a 20 20 20 20 20 20 70 43 6f 6c  16LE:.      pCol
7710: 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  l2 = sqlite3Find
7720: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e  CollSeq(pParse->
7730: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  db, SQLITE_UTF16
7740: 42 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  BE, z, n, 0);.  
7750: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
7760: 6c 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l2 );.      if( 
7770: 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 20 62  pColl2->xCmp ) b
7780: 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 6f 6c  reak;.      pCol
7790: 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  l2 = sqlite3Find
77a0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d 3e  CollSeq(pParse->
77b0: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
77c0: 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20   z, n, 0);.     
77d0: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 32 20   assert( pColl2 
77e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
77f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
7800: 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20 20  _UTF16BE:.      
7810: 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33  pColl2 = sqlite3
7820: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72  FindCollSeq(pPar
7830: 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54  se->db,SQLITE_UT
7840: 46 31 36 4c 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b  F16LE, z, n, 0);
7850: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7860: 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 69  Coll2 );.      i
7870: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20  f( pColl2->xCmp 
7880: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
7890: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
78a0: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
78b0: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54 46  e->db,SQLITE_UTF
78c0: 38 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20  8, z, n, 0);.   
78d0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c     assert( pColl
78e0: 32 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2 );.      break
78f0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ;..    case SQLI
7900: 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 70  TE_UTF8:.      p
7910: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
7920: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
7930: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54 46  e->db,SQLITE_UTF
7940: 31 36 42 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a  16BE, z, n, 0);.
7950: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
7960: 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 69 66  oll2 );.      if
7970: 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29  ( pColl2->xCmp )
7980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43   break;.      pC
7990: 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69  oll2 = sqlite3Fi
79a0: 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ndCollSeq(pParse
79b0: 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54 46 31  ->db,SQLITE_UTF1
79c0: 36 4c 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20  6LE, z, n, 0);. 
79d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
79e0: 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ll2 );.      bre
79f0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  ak;.  }.  if( pC
7a00: 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  oll2->xCmp ){.  
7a10: 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c 20    memcpy(pColl, 
7a20: 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28 43  pColl2, sizeof(C
7a30: 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 7d 65 6c 73  ollSeq));.  }els
7a40: 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  e{.    if( pPars
7a50: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
7a60: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
7a70: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
7a80: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
7a90: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7aa0: 6e 63 65 3a 20 22 2c 20 0a 20 20 20 20 20 20 20  nce: ", .       
7ab0: 20 20 20 2d 31 2c 20 7a 2c 20 6e 2c 20 30 29 3b     -1, z, n, 0);
7ac0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
7ad0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  e->nErr++;.    r
7ae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
7af0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
7b00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7b10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7b20: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e is called on a
7b30: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
7b40: 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  nce before it is
7b50: 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63   used to.** chec
7b60: 6b 20 74 68 61 74 20 69 74 20 69 73 20 64 65 66  k that it is def
7b70: 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69 6e  ined. An undefin
7b80: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
7b90: 75 65 6e 63 65 20 65 78 69 73 74 73 20 77 68 65  uence exists whe
7ba0: 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  n.** a database 
7bb0: 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20 63  is loaded that c
7bc0: 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63  ontains referenc
7bd0: 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20  es to collation 
7be0: 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68 61  sequences.** tha
7bf0: 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  t have not been 
7c00: 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69 74  defined by sqlit
7c10: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
7c20: 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a 2a  ion() etc..**.**
7c30: 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 74 68   If required, th
7c40: 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  is routine calls
7c50: 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 20   the 'collation 
7c60: 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63 6b  needed' callback
7c70: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 61   to.** request a
7c80: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74   definition of t
7c90: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
7ca0: 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20 64  uence. If this d
7cb0: 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a 2a  oesn't work, .**
7cc0: 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 63   an equivalent c
7cd0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7ce0: 65 20 74 68 61 74 20 75 73 65 73 20 61 20 74 65  e that uses a te
7cf0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66 66  xt encoding diff
7d00: 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68  erent.** from th
7d10: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7d20: 69 73 20 73 75 62 73 74 69 74 75 74 65 64 2c 20  is substituted, 
7d30: 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c 61  if one is availa
7d40: 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
7d50: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
7d60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 43  Parse *pParse, C
7d70: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
7d80: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 21    if( pColl && !
7d90: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
7da0: 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64 65     callCollNeede
7db0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  d(pParse->db, pC
7dc0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c  oll->zName, strl
7dd0: 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  en(pColl->zName)
7de0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
7df0: 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74 68  l->xCmp && synth
7e00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7e10: 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  pColl) ){.      
7e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
7e30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ROR;.    }.  }. 
7e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7e50: 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  K;.}..int sqlite
7e60: 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c 53  3CheckIndexCollS
7e70: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
7e80: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
7e90: 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
7ea0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
7eb0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
7ec0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
7ed0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68     if( sqlite3Ch
7ee0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
7ef0: 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  e, pIdx->keyInfo
7f00: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20  .aColl[i]) ){.  
7f10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7f20: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
7f30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7f40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
7f60: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
7f70: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
7f80: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
7f90: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
7fa0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
7fb0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
7fc0: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
7fd0: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
7fe0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
7ff0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
8000: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
8010: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
8020: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
8030: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
8040: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
8050: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
8060: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
8070: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
8080: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
8090: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
80a0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
80b0: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
80c0: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
80d0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
80e0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
80f0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
8100: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
8110: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
8120: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
8130: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
8140: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
8150: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
8160: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
8170: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
8180: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
8190: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
81a0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
81b0: 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53  pParse..*/.CollS
81c0: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
81d0: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
81e0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
81f0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e  ar *zName, int n
8200: 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63 20  Name){.  u8 enc 
8210: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
8220: 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  c;.  u8 initbusy
8230: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69   = pParse->db->i
8240: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
8250: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
8260: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
8270: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
8280: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 69   zName, nName, i
8290: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
82a0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
82b0: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
82c0: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a 20  xCmp) ){.    /* 
82d0: 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  No collation seq
82e0: 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79  uence of this ty
82f0: 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63 6f  pe for this enco
8300: 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65 72  ding is register
8310: 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 20  ed..    ** Call 
8320: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
8330: 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66 20  ctory to see if 
8340: 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75 73  it can supply us
8350: 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20 2a   with one..    *
8360: 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65  /.    callCollNe
8370: 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  eded(pParse->db,
8380: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
8390: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
83a0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70  te3FindCollSeq(p
83b0: 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c 20  Parse->db, enc, 
83c0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29  zName, nName, 0)
83d0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
83e0: 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  && !pColl->xCmp 
83f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
8400: 65 20 6d 61 79 20 62 65 20 61 20 76 65 72 73 69  e may be a versi
8410: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74  on of the collat
8420: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
8430: 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
8440: 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20   ** translation 
8450: 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e 67  between encoding
8460: 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69 74  s. Search for it
8470: 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c 53   with synthCollS
8480: 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eq()..      */. 
8490: 20 20 20 20 20 69 66 28 20 73 79 6e 74 68 43 6f       if( synthCo
84a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43  llSeq(pParse, pC
84b0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
84c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
84d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
84e0: 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61 73  * If nothing has
84f0: 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72 69   been found, wri
8500: 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  te the error mes
8510: 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65  sage into pParse
8520: 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74 62   */.  if( !initb
8530: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
8540: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
8550: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
8560: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
8570: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
8580: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
8590: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
85a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
85b0: 6e 63 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20  nce: ", -1,.    
85c0: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 6e 4e 61        zName, nNa
85d0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
85e0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
85f0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b  ;.    pColl = 0;
8600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
8610: 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  oll;.}..../*.** 
8620: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
8630: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
8640: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
8650: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
8660: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
8670: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63 68  nity type..*/.ch
8680: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
8690: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
86a0: 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e 54  r *zType, int nT
86b0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20 69  ype){.  int n, i
86c0: 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a 20 20 20  ;.  struct {.   
86d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
86e0: 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73 20  b;  /* Keywords 
86f0: 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65 61  substring to sea
8700: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20 69  rch for */.    i
8710: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
8720: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 7a    /* length of z
8730: 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  Sub */.    char 
8740: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f 2a  affinity;     /*
8750: 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65 74   Affinity to ret
8760: 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68 65  urn if it matche
8770: 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72 69  s */.  } substri
8780: 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22  ngs[] = {.    {"
8790: 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54 45  INT",  3, SQLITE
87a0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a 20  _AFF_INTEGER},. 
87b0: 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20 53     {"CHAR", 4, S
87c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d 2c  QLITE_AFF_TEXT},
87d0: 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34 2c  .    {"CLOB", 4,
87e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
87f0: 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c 20  },.    {"TEXT", 
8800: 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  4, SQLITE_AFF_TE
8810: 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42 22  XT},.    {"BLOB"
8820: 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  , 4, SQLITE_AFF_
8830: 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69  NONE},.  };..  i
8840: 66 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( nType==0 ){. 
8850: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8860: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a 20  _AFF_NONE;.  }. 
8870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
8880: 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29 2f 73  of(substrings)/s
8890: 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73  izeof(substrings
88a0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
88b0: 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74 72 69  int c1 = substri
88c0: 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b 0a  ngs[i].zSub[0];.
88d0: 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74 6f 6c      int c2 = tol
88e0: 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20 69 6e  ower(c1);.    in
88f0: 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65 20  t limit = nType 
8900: 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e  - substrings[i].
8910: 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nSub;.    const 
8920: 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73 74 72  char *z = substr
8930: 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20 20  ings[i].zSub;.  
8940: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c 69    for(n=0; n<=li
8950: 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  mit; n++){.     
8960: 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b 6e   int c = zType[n
8970: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d  ];.      if( (c=
8980: 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20 20  =c1 || c==c2).  
8990: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d             && 0=
89a0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
89b0: 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20 73  (&zType[n], z, s
89c0: 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53 75  ubstrings[i].nSu
89d0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
89e0: 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67 73 5b  turn substrings[
89f0: 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  i].affinity;.   
8a00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8a10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
8a20: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a 2f  FF_NUMERIC;.}../
8a30: 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69 74  *.** Come up wit
8a40: 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20 76  h a new random v
8a50: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63 68  alue for the sch
8a60: 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61 6b  ema cookie.  Mak
8a70: 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e 65  e sure.** the ne
8a80: 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66 65  w value is diffe
8a90: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 6c  rent from the ol
8aa0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  d..**.** The sch
8ab0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
8ac0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
8ad0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
8ae0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
8af0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
8b00: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
8b10: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
8b20: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
8b30: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
8b40: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
8b50: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
8b60: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
8b70: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
8b80: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
8b90: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
8ba0: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
8bb0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
8bc0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
8bd0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
8be0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
8bf0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
8c00: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
8c10: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
8c20: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
8c30: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
8c40: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
8c50: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
8c60: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
8c70: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
8c80: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
8c90: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
8ca0: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
8cb0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
8cc0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
8cd0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
8ce0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
8cf0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
8d00: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
8d10: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
8d20: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
8d30: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
8d40: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
8d50: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 56 64  e(sqlite *db, Vd
8d60: 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29 7b  be *v, int iDb){
8d70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8d80: 20 72 3b 0a 20 20 69 6e 74 20 2a 70 53 63 68 65   r;.  int *pSche
8d90: 6d 61 43 6f 6f 6b 69 65 20 3d 20 26 28 64 62 2d  maCookie = &(db-
8da0: 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61  >aDb[iDb].schema
8db0: 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20 20 73 71 6c  _cookie);..  sql
8dc0: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31  ite3Randomness(1
8dd0: 2c 20 26 72 29 3b 0a 20 20 2a 70 53 63 68 65 6d  , &r);.  *pSchem
8de0: 61 43 6f 6f 6b 69 65 20 3d 20 2a 70 53 63 68 65  aCookie = *pSche
8df0: 6d 61 43 6f 6f 6b 69 65 20 2b 20 72 20 2b 20 31  maCookie + r + 1
8e00: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
8e10: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
8e20: 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  anges;.  sqlite3
8e30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8e40: 49 6e 74 65 67 65 72 2c 20 2a 70 53 63 68 65 6d  Integer, *pSchem
8e50: 61 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20 73  aCookie, 0);.  s
8e60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
8e70: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8e80: 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a   iDb, 0);.}../*.
8e90: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
8ea0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
8eb0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
8ec0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
8ed0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
8ee0: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
8ef0: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
8f00: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
8f10: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
8f20: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
8f30: 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  minator..*/.stat
8f40: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
8f50: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
8f60: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  ){.  int n;.  in
8f70: 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30 3b  t needQuote = 0;
8f80: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
8f90: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
8fa0: 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20 6e  f( *z=='\'' ){ n
8fb0: 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31 3b  ++; needQuote=1;
8fc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8fd0: 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 3b  n + needQuote*2;
8fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
8ff0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f 6e  an identifier on
9000: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9010: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20  e given string. 
9020: 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63 68   Add.** quote ch
9030: 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65 64  aracters as need
9040: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
9050: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
9060: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
9070: 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a 20  char *zIdent){. 
9080: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
9090: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
90a0: 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  x;.  for(j=0; zI
90b0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
90c0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
90d0: 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49  zIdent[j]) && zI
90e0: 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62  dent[j]!='_' ) b
90f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64  reak;.  }.  need
9100: 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b  Quote =  zIdent[
9110: 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74  j]!=0 || isdigit
9120: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
9140: 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43   sqlite3KeywordC
9150: 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d  ode(zIdent, j)!=
9160: 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65  TK_ID;.  if( nee
9170: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
9180: 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a 3d  = '\'';.  for(j=
9190: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
91a0: 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d  +){.    z[i++] =
91b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20   zIdent[j];.    
91c0: 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27  if( zIdent[j]=='
91d0: 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  \'' ) z[i++] = '
91e0: 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  \'';.  }.  if( n
91f0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
9200: 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69 5d  ] = '\'';.  z[i]
9210: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
9220: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
9230: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
9240: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
9250: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
9260: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
9270: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
9280: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
9290: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
92a0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
92b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
92c0: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
92d0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
92e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
92f0: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
9300: 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65 20  TableStmt(Table 
9310: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
9320: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
9330: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
9340: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
9350: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    n = 0;.  for(i
9360: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
9370: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
9380: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43 6f  entLength(p->aCo
9390: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[i].zName);.   
93a0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e   if( p->aCol[i].
93b0: 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6e  zType ){.      n
93c0: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 70 2d 3e 61   += (strlen(p->a
93d0: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 20 2b 20  Col[i].zType) + 
93e0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
93f0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
9400: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
9410: 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a 53  ( n<40 ){.    zS
9420: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
9430: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
9440: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
9450: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
9460: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
9470: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
9480: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
9490: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
94a0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
94b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
94c0: 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53  w( n );.  if( zS
94d0: 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tmt==0 ) return 
94e0: 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74 6d  0;.  strcpy(zStm
94f0: 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20 22  t, p->iDb==1 ? "
9500: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
9510: 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54 41  E " : "CREATE TA
9520: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 74  BLE ");.  k = st
9530: 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20 69  rlen(zStmt);.  i
9540: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
9550: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
9560: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
9570: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9580: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
9590: 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74 5b    strcpy(&zStmt[
95a0: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
95b0: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74 6d   += strlen(&zStm
95c0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
95d0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
95e0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
95f0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
9600: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  e);.    if( p->a
9610: 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b 0a  Col[i].zType ){.
9620: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
9630: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73 74   = ' ';.      st
9640: 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  rcpy(&zStmt[k], 
9650: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65  p->aCol[i].zType
9660: 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73 74  );.      k += st
9670: 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  rlen(p->aCol[i].
9680: 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zType);.    }.  
9690: 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d  }.  strcpy(&zStm
96a0: 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  t[k], zEnd);.  r
96b0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
96c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
96d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
96e0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
96f0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
9700: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
9710: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
9730: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
9740: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
9750: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
9760: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
9770: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
9780: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
9790: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
97a0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
97b0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
97c0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
97d0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
97e0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
97f0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
9800: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
9810: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
9820: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9830: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
9840: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
9850: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
9860: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
9870: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
9880: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
9890: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
98a0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
98b0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
98c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
98d0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
98e0: 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e 74  nges, so the ent
98f0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
9900: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
9910: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
9920: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
9930: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
9940: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
9950: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
9960: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
9970: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
9980: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
9990: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
99a0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
99b0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
99c0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
99d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
99e0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
99f0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
9a00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
9a10: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
9a20: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
9a30: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
9a40: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
9a50: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
9a60: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9a70: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53 65   Token *pEnd, Se
9a80: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
9a90: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
9aa0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
9ab0: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  e->db;..  if( (p
9ac0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
9ad0: 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d  t==0) || pParse-
9ae0: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
9af0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
9b00: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 70   return;.  p = p
9b10: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9b20: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
9b30: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
9b40: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
9b50: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
9b60: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62  .  /* If the tab
9b70: 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  le is generated 
9b80: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20 74  from a SELECT, t
9b90: 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74 68  hen construct th
9ba0: 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 63  e.  ** list of c
9bb0: 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 74  olumns and the t
9bc0: 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ext of the table
9bd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65  ..  */.  if( pSe
9be0: 6c 65 63 74 20 29 7b 0a 20 20 7d 0a 0a 20 20 2f  lect ){.  }..  /
9bf0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
9c00: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
9c10: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
9c20: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
9c30: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
9c40: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
9c50: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
9c60: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
9c70: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
9c80: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
9c90: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
9ca0: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
9cb0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
9cc0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
9cd0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
9ce0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
9cf0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
9d00: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
9d10: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
9d20: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
9d30: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
9d40: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
9d50: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d  t.busy ){.    p-
9d60: 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
9d70: 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20  .newTnum;.  }.. 
9d80: 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69   /* If not initi
9d90: 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72  alizing, then cr
9da0: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
9db0: 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a  r the new table.
9dc0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49    ** in the SQLI
9dd0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
9de0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
9df0: 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d    The record num
9e00: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
9e10: 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79   new table entry
9e20: 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
9e30: 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  be on the stack.
9e40: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
9e50: 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52  is is a TEMPORAR
9e60: 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74  Y table, write t
9e70: 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  he entry into th
9e80: 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
9e90: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
9ea0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
9eb0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
9ec0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
9ed0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69  it.busy ){.    i
9ee0: 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a  nt n;.    Vdbe *
9ef0: 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  v;..    v = sqli
9f00: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9f10: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
9f20: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20   ) return;..    
9f30: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
9f40: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
9f50: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
9f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f70: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61  beOp3(v, OP_Crea
9f80: 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e 69  teTable, 0, p->i
9f90: 44 62 2c 20 28 63 68 61 72 2a 29 26 70 2d 3e 74  Db, (char*)&p->t
9fa0: 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29  num, P3_POINTER)
9fb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9fc0: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
9fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9fe0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
9ff0: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
a000: 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d   }.    p->tnum =
a010: 20 30 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   0;..    sqlite3
a020: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a030: 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a 20  Close, 0, 0);.. 
a040: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
a050: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
a060: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
a070: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
a080: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
a090: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
a0a0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
a0b0: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
a0c0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
a0d0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
a0e0: 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  s on the top of 
a0f0: 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e 0a  the vdbe stack..
a100: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
a110: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
a120: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
a130: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
a140: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
a150: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
a160: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
a170: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
a180: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
a190: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
a1a0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
a1b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
a1c0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54 61  lect ){.      Ta
a1d0: 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20  ble *pSelTab;.  
a1e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a1f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a200: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a210: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a220: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
a230: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  iDb, 0);.      s
a240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a250: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
a260: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50   1, 0);.      pP
a270: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
a280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
a290: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
a2a0: 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  ect, SRT_Table, 
a2b0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
a2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a2d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
a2e0: 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  se, 1, 0);.     
a2f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
a300: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
a310: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
a320: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
a330: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
a340: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
a350: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
a360: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a370: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
a380: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
a390: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
a3a0: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
a3b0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
a3c0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
a3d0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
a3e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
a3f0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
a400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
a410: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65  leteTable(0, pSe
a420: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
a430: 20 20 20 7d 0a 20 20 0a 20 20 20 20 73 71 6c 69     }.  .    sqli
a440: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
a450: 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29 3b 0a 0a  le(v, p->iDb);..
a460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
a470: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
a480: 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65 6c 65  , 0, 0, p->pSele
a490: 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a 22 76  ct==0?"table":"v
a4a0: 69 65 77 22 2c 50 33 5f 53 54 41 54 49 43 29 3b  iew",P3_STATIC);
a4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a4c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
a4d0: 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d  8, 0, 0, p->zNam
a4e0: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
a4f0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a500: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70  String8, 0, 0, p
a510: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
a520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a530: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 33 2c  p(v, OP_Pull, 3,
a540: 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53   0);..    if( pS
a550: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
a560: 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65 54  har *z = createT
a570: 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20 20  ableStmt(p);.   
a580: 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65     n = z ? strle
a590: 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20 20  n(z) : 0;.      
a5a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a5b0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a5c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a5d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
a5e0: 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  (v, -1, z, n);. 
a5f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
a600: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
a610: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c       if( p->pSel
a620: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
a630: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a640: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
a650: 30 2c 20 22 43 52 45 41 54 45 20 56 49 45 57 20  0, "CREATE VIEW 
a660: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
a670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
a690: 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p3(v, OP_String8
a6a0: 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45 20  , 0, 0, "CREATE 
a6b0: 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54 41 54  TABLE ", P3_STAT
a6c0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
a6d0: 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 21     assert( pEnd!
a6e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
a6f0: 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20  Addr(pEnd->z) - 
a700: 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 4e 61  Addr(pParse->sNa
a710: 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a  meToken.z) + 1;.
a720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a730: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
a740: 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ing8, 0, 0);.   
a750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a760: 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 50  angeP3(v, -1, pP
a770: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
a780: 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71  .z, n);.      sq
a790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a7a0: 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c 20  , OP_Concat, 2, 
a7b0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
a7c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a7d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 35  OP_MakeRecord, 5
a7e0: 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50 33  , 0, "tttit", P3
a7f0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
a800: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a810: 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c 20  , OP_PutIntKey, 
a820: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
a830: 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ->iDb!=1 ){.    
a840: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
a850: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d 3e  ookie(db, v, p->
a860: 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iDb);.    }.    
a870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a880: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c  (v, OP_Close, 0,
a890: 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65   0);..    sqlite
a8a0: 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
a8b0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
a8c0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
a8d0: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
a8e0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
a8f0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
a900: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
a910: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
a920: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  =0 && pParse->nE
a930: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62  rr==0 ){.    Tab
a940: 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b  le *pOld;.    FK
a950: 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20 70  ey *pFKey;.    p
a960: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
a970: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44 62  hInsert(&db->aDb
a980: 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73 68  [p->iDb].tblHash
a990: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
a9b0: 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
a9c0: 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29 3b  p->zName)+1, p);
a9d0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
a9e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a9f0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
aa00: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
aa10: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
aa20: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
aa30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
aa40: 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70  .    for(pFKey=p
aa50: 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20  ->pFKey; pFKey; 
aa60: 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65  pFKey=pFKey->pNe
aa70: 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69  xtFrom){.      i
aa80: 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e 28  nt nTo = strlen(
aa90: 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31 3b  pFKey->zTo) + 1;
aaa0: 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  .      pFKey->pN
aab0: 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33 48  extTo = sqlite3H
aac0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
aad0: 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c 20  [p->iDb].aFKey, 
aae0: 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f 29  pFKey->zTo, nTo)
aaf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 48  ;.      sqlite3H
ab00: 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61  ashInsert(&db->a
ab10: 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79  Db[p->iDb].aFKey
ab20: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
ab30: 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20 7d  o, pFKey);.    }
ab40: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
ab50: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
ab60: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
ab70: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
ab80: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
ab90: 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ges;.  }.}../*.*
aba0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
abb0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
abc0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
abd0: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
abe0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
abf0: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
ac00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
ac10: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
ac20: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
ac30: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
ac40: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
ac50: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
ac60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
ac70: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
ac80: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
ac90: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
aca0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
acb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
acc0: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
acd0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
ace0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
acf0: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
ad00: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
ad10: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
ad20: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
ad30: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
ad40: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
ad60: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
ad70: 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54 61   view */.){.  Ta
ad80: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
ad90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ada0: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
adb0: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
adc0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a    Token *pName;.
add0: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
ade0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42 65  able(pParse, pBe
adf0: 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  gin, pName1, pNa
ae00: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29 3b  me2, isTemp, 1);
ae10: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
ae20: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
ae30: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
ae40: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
ae50: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
ae60: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
ae70: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
ae80: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
ae90: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
aea0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
aeb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
aec0: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
aed0: 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69 65  se, p->iDb, "vie
aee0: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
aef0: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
af00: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
af10: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
af20: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
af30: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
af40: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
af50: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
af60: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
af70: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
af80: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
af90: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
afa0: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
afb0: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
afc0: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
afd0: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
afe0: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
aff0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
b000: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
b010: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
b020: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
b030: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
b040: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
b050: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
b060: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
b070: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
b080: 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74 29  lectDup(pSelect)
b090: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
b0a0: 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74 29  tDelete(pSelect)
b0b0: 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  ;.  if( !pParse-
b0c0: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  >db->init.busy )
b0d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
b0e0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
b0f0: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
b100: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
b110: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
b120: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
b130: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
b140: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
b150: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
b160: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
b170: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e  Token;.  if( sEn
b180: 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e  d.z[0]!=0 && sEn
b190: 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20  d.z[0]!=';' ){. 
b1a0: 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e     sEnd.z += sEn
b1b0: 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e  d.n;.  }.  sEnd.
b1c0: 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28 69  n = 0;.  n = ((i
b1d0: 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69 6e  nt)sEnd.z) - (in
b1e0: 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 7a  t)pBegin->z;.  z
b1f0: 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20   = pBegin->z;.  
b200: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
b210: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
b220: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
b230: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
b240: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
b250: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
b260: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
b270: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
b280: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
b290: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
b2a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
b2b0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26  dTable(pParse, &
b2c0: 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75  sEnd, 0);.  retu
b2d0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
b2e0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b2f0: 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
b300: 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
b310: 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
b320: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
b330: 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
b340: 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
b350: 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
b360: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
b370: 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
b380: 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
b390: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b3a0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
b3b0: 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
b3c0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
b3d0: 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
b3e0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
b3f0: 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  le){.  ExprList 
b400: 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65 63  *pEList;.  Selec
b410: 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c 65  t *pSel;.  Table
b420: 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e 74   *pSelTab;.  int
b430: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61 73   nErr = 0;..  as
b440: 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a  sert( pTable );.
b450: 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
b460: 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
b470: 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
b480: 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
b490: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
b4a0: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
b4b0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
b4c0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
b4d0: 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
b4e0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
b4f0: 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
b500: 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
b510: 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
b520: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
b530: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
b540: 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
b550: 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
b560: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
b570: 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
b580: 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
b590: 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
b5a0: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
b5b0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
b5c0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
b5d0: 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
b5e0: 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
b5f0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
b600: 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
b610: 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20 65  Actually, this e
b620: 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20 70  rror is caught p
b630: 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f  reviously and so
b640: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
b650: 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  est.  ** should 
b660: 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42 75  always fail.  Bu
b670: 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  t we will leave 
b680: 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73 74  it in place just
b690: 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20 2a   to be safe..  *
b6a0: 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
b6b0: 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
b6c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b6d0: 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
b6e0: 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
b6f0: 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
b700: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
b710: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
b720: 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
b730: 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e  r, it means we n
b740: 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
b750: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a  he table names..
b760: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b770: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
b780: 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30 2c  ; /* If nCol==0,
b790: 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75 73   then pTable mus
b7a0: 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a 20  t be a VIEW */. 
b7b0: 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d 3e   pSel = pTable->
b7c0: 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 4e  pSelect;..  /* N
b7d0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
b7e0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
b7f0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
b800: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
b810: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
b820: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e 20  s in this list. 
b830: 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65 65   But we will nee
b840: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
b850: 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b 20   list.  ** back 
b860: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
b870: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 66  configuration af
b880: 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65 20  terwards, so we 
b890: 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a 20  save a copy of. 
b8a0: 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
b8b0: 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a 2f   in pEList..  */
b8c0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
b8d0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65 6c  ->pEList;.  pSel
b8e0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
b8f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 45  e3ExprListDup(pE
b900: 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53 65  List);.  if( pSe
b910: 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a  l->pEList==0 ){.
b920: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
b930: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 72   = pEList;.    r
b940: 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61 6c  eturn 1;  /* Mal
b950: 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
b960: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  }.  pTable->nCol
b970: 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61 62   = -1;.  pSelTab
b980: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
b990: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
b9a0: 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20 20  se, 0, pSel);.  
b9b0: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
b9c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c     assert( pTabl
b9d0: 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e->aCol==0 );.  
b9e0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
b9f0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
ba00: 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
ba10: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
ba20: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e  ;.    pSelTab->n
ba30: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 65  Col = 0;.    pSe
ba40: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
ba50: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
ba60: 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54 61  eTable(0, pSelTa
ba70: 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f  b);.    DbSetPro
ba80: 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64 62  perty(pParse->db
ba90: 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20 44  , pTable->iDb, D
baa0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
bab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
bac0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
bad0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
bae0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 55    sqlite3SelectU
baf0: 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20 73  nbind(pSel);.  s
bb00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
bb10: 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73  lete(pSel->pELis
bb20: 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c 69  t);.  pSel->pELi
bb30: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 72  st = pEList;.  r
bb40: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
bb50: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
bb60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
bb70: 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61 62  om the VIEW pTab
bb80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
bb90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bba0: 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f 74   whenever any ot
bbb0: 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69 65  her table or vie
bbc0: 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  w is modified..*
bbd0: 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73 65  * The view passe
bbe0: 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74  d into this rout
bbf0: 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e 64  ine might depend
bc00: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
bc10: 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74 68  irectly.** on th
bc20: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64 65  e modified or de
bc30: 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20 77  leted table so w
bc40: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20  e need to clear 
bc50: 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a 2a  the old column.*
bc60: 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74 20  * names so that 
bc70: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65 63  they will be rec
bc80: 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
bc90: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
bca0: 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ewResetColumnNam
bcb0: 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  es(Table *pTable
bcc0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
bcd0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
bce0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
bcf0: 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  && pTable->pSele
bd00: 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ct!=0 );.  for(i
bd10: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65 2d  =0, pCol=pTable-
bd20: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65 2d  >aCol; i<pTable-
bd30: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
bd40: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
bd50: 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  ree(pCol->zName)
bd60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
bd70: 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20  (pCol->zDflt);. 
bd80: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43     sqliteFree(pC
bd90: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d 0a  ol->zType);.  }.
bda0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54 61    sqliteFree(pTa
bdb0: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  ble->aCol);.  pT
bdc0: 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  able->aCol = 0;.
bdd0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
bde0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
bdf0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
be00: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
be10: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
be20: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
be30: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
be40: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  setAll(sqlite *d
be50: 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48  b, int idx){.  H
be60: 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66  ashElem *i;.  if
be70: 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  ( !DbHasProperty
be80: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
be90: 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74  esetViews) ) ret
bea0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  urn;.  for(i=sql
beb0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
bec0: 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48 61  ->aDb[idx].tblHa
bed0: 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  sh); i; i=sqlite
bee0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
bef0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
bf00: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
bf10: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
bf20: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
bf30: 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
bf40: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61  tColumnNames(pTa
bf50: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
bf60: 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
bf70: 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
bf80: 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f 2a  setViews);.}../*
bf90: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
bfa0: 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61 62  n, look up a tab
bfb0: 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  le with that nam
bfc0: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
bfd0: 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65 72  , leave.** an er
bfe0: 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72 73  ror for the pars
bff0: 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20 72  er to find and r
c000: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 54  eturn NULL..*/.T
c010: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 54 61 62  able *sqlite3Tab
c020: 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72 73  leFromToken(Pars
c030: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
c040: 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72 20   *pTok){.  char 
c050: 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65 20  *zName;.  Table 
c060: 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20 3d  *pTab;.  zName =
c070: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4e 61 6d   sqlite3TableNam
c080: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b 29  eFromToken(pTok)
c090: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
c0a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
c0b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
c0c0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64  dTable(pParse->d
c0d0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b, zName, 0);.  
c0e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
c0f0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
c100: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
c110: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
c120: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
c130: 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20 20 20 20  %T", pTok);.    
c140: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
c150: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
c160: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
c170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c180: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
c190: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
c1a0: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
c1b0: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
c1c0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
c1d0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
c1e0: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
c1f0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
c200: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
c210: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
c220: 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54 61  nt isView){.  Ta
c230: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
c240: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73 65  e *v;.  int base
c250: 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
c260: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
c270: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
c280: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 73  Parse->nErr || s
c290: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
c2a0: 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74  iled ) goto exit
c2b0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 61  _drop_table;.  a
c2c0: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
c2d0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
c2e0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
c2f0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
c300: 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
c310: 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
c320: 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  abase);..  if( p
c330: 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  Tab==0 ) goto ex
c340: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
c350: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
c360: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
c370: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
c380: 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  b );.#ifndef SQL
c390: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
c3a0: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
c3b0: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
c3c0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
c3d0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54 61  SCHEMA_TABLE(pTa
c3e0: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  b->iDb);.    con
c3f0: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
c400: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
c410: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
c420: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
c430: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
c440: 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
c450: 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
c460: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c470: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
c480: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
c490: 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29 7b     if( iDb==1 ){
c4a0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
c4b0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
c4c0: 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
c4d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
c4e0: 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
c4f0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
c500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
c510: 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ( iDb==1 ){.    
c520: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
c530: 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
c540: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
c550: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
c560: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
c570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
c590: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
c5a0: 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
c5b0: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
c5c0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
c5d0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
c5e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c5f0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c600: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
c610: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c   pTab->zName, 0,
c620: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
c630: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c640: 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ble;.    }.  }.#
c650: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61 62  endif.  if( pTab
c660: 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
c670: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c680: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
c690: 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64   %s may not be d
c6a0: 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ropped", pTab->z
c6b0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72 73  Name);.    pPars
c6c0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
c6d0: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
c6e0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ble;.  }.  if( i
c6f0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
c700: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
c710: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c720: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
c730: 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65  OP TABLE to dele
c740: 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54  te table %s", pT
c750: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
c760: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
c770: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
c780: 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d  !isView && pTab-
c790: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
c7a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c7b0: 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
c7c0: 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65  P VIEW to delete
c7d0: 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d   view %s", pTab-
c7e0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
c7f0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
c800: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  e;.  }..  /* Gen
c810: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
c820: 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
c830: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
c840: 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
c850: 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
c860: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c870: 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
c880: 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
c890: 4f 70 4c 69 73 74 20 64 72 6f 70 54 61 62 6c 65  OpList dropTable
c8a0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
c8b0: 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
c8c0: 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20   ADDR(13), 0},. 
c8d0: 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
c8e0: 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20  8,    0, 0,     
c8f0: 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
c900: 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
c910: 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
c920: 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f     0},.      { O
c930: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c  P_MemLoad,    1,
c940: 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   0,        0}, /
c950: 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
c960: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
c970: 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f   2,        0}, /
c980: 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e  * sqlite_master.
c990: 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  tbl_name */.    
c9a0: 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20 20    { OP_Ne,      
c9b0: 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c 20     0, ADDR(12), 
c9c0: 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53  0},.      { OP_S
c9d0: 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30 2c  tring8,    0, 0,
c9e0: 20 20 20 20 20 20 20 20 22 74 72 69 67 67 65 72          "trigger
c9f0: 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 43  "},.      { OP_C
ca00: 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32 2c  olumn,     0, 2,
ca10: 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 73          0}, /* s
ca20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74 79 70  qlite_master.typ
ca30: 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  e */.      { OP_
ca40: 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20 41  Eq,         0, A
ca50: 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20 20  DDR(12), 0},.   
ca60: 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c 20     { OP_Delete, 
ca70: 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20 20      0, 0,       
ca80: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ca90: 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 41  Rewind,     0, A
caa0: 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20 20 20  DDR(13), 0},.   
cab0: 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20     { OP_Goto,   
cac0: 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c 20      0, ADDR(3), 
cad0: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
cae0: 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
caf0: 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a 20  DDR(3),  0}, /* 
cb00: 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20  12 */.    };.   
cb10: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
cb20: 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
cb30: 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
cb40: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
cb50: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ion(pParse, 0, p
cb60: 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20 20  Tab->iDb);..    
cb70: 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
cb80: 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
cb90: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
cba0: 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
cbb0: 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65 6e  de.    ** is gen
cbc0: 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
cbd0: 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
cbe0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
cbf0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
cc00: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
cc10: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
cc20: 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
cc30: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a  pTab->pTrigger;.
cc40: 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69 67      while( pTrig
cc50: 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ger ){.      ass
cc60: 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 69  ert( pTrigger->i
cc70: 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c 7c  Db==pTab->iDb ||
cc80: 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d 3d   pTrigger->iDb==
cc90: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
cca0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
ccb0: 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
ccc0: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 1);.      if(
ccd0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
cce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 69   ){.        pTri
ccf0: 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
cd00: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
cd10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 72  lse{.        pTr
cd20: 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70 54  igger = pTab->pT
cd30: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 0a  rigger;.      }.
cd40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
cd50: 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
cd60: 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
cd70: 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
cd80: 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
cd90: 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65     ** table. The
cda0: 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
cdb0: 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
cdc0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
cdd0: 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a 20   deletes.    ** 
cde0: 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
cdf0: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
ce00: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
ce10: 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
ce20: 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70 65  ng.    ** droppe
ce30: 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
ce40: 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74 65  handled seperate
ce50: 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
ce60: 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20 20  gger can be.    
ce70: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
ce80: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
ce90: 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
cea0: 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
ceb0: 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  r.    ** databas
cec0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
ced0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
cee0: 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69 44  able(v, pTab->iD
cef0: 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 73  b);.    base = s
cf00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
cf10: 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a 65  ist(v, ArraySize
cf20: 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72 6f  (dropTable), dro
cf30: 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  pTable);.    sql
cf40: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
cf50: 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61 62  (v, base+1, pTab
cf60: 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
cf70: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
cf80: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 54 61 62  okie(db, v, pTab
cf90: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  ->iDb);.    sqli
cfa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cfb0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
cfc0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
cfd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cfe0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cff0: 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 2d 3e  _Destroy, pTab->
d000: 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62 29  tnum, pTab->iDb)
d010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ;.      for(pIdx
d020: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
d030: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
d040: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d060: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
d070: 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64 78  pIdx->tnum, pIdx
d080: 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  ->iDb);.      }.
d090: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d0a0: 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69  3EndWriteOperati
d0b0: 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  on(pParse);.  }.
d0c0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
d0d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63 72   in-memory descr
d0e0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
d0f0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ble..  **.  ** E
d100: 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68 65  xception: if the
d110: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
d120: 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45 58  egan with the EX
d130: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a 20  PLAIN keyword,. 
d140: 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61 6e   ** then no chan
d150: 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ges should be ma
d160: 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  de..  */.  if( !
d170: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
d180: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e 6c  ){.    sqliteUnl
d190: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
d1a0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
d1b0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
d1c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
d1d0: 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  es;.  }.  sqlite
d1e0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
d1f0: 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f   iDb);..exit_dro
d200: 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
d210: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
d220: 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
d230: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d240: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
d250: 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
d260: 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
d270: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
d280: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
d290: 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
d2a0: 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
d2b0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
d2c0: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
d2d0: 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
d2e0: 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
d2f0: 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
d300: 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
d310: 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
d320: 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
d330: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
d340: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
d350: 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f  erred to.  pToCo
d360: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  l is a list of t
d370: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74 68  ables in the oth
d380: 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20  er.** pTo table 
d390: 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
d3a0: 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20   key points to. 
d3b0: 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
d3c0: 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
d3d0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
d3e0: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
d3f0: 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
d400: 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
d410: 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
d420: 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
d430: 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
d440: 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
d450: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
d460: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
d470: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
d480: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
d490: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
d4a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
d4b0: 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20 46  ield.  The new F
d4c0: 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 69  Key.** is not li
d4d0: 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61 46  nked into db->aF
d4e0: 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Key at this poin
d4f0: 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  t - that does no
d500: 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74 69  t happen.** unti
d510: 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  l sqlite3EndTabl
d520: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  e()..**.** The f
d530: 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
d540: 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
d550: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
d560: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
d570: 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
d580: 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
d590: 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
d5a0: 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
d5b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
d5c0: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
d5d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d5e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d5f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
d600: 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
d610: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
d620: 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
d630: 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
d640: 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
d650: 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
d660: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
d670: 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
d680: 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
d690: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
d6a0: 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
d6b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d6d0: 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
d6e0: 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
d6f0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  /.){.  Table *p 
d700: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
d710: 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
d720: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
d730: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
d740: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  ;.  FKey *pFKey 
d750: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d760: 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
d770: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
d780: 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f 65  nErr ) goto fk_e
d790: 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
d7a0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
d7b0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
d7c0: 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  1;.    if( iCol<
d7d0: 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  0 ) goto fk_end;
d7e0: 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
d7f0: 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
d800: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
d810: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d820: 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
d830: 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
d840: 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
d850: 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
d860: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
d870: 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
d880: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
d890: 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
d8a0: 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
d8b0: 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
d8c0: 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
d8d0: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
d8e0: 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
d8f0: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
d900: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d910: 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
d920: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
d930: 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
d940: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
d950: 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
d960: 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
d970: 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
d980: 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
d990: 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
d9a0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
d9b0: 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
d9c0: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
d9d0: 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f 6c  f(*pFKey) + nCol
d9e0: 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
d9f0: 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
da00: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
da10: 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
da20: 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
da30: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
da40: 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28  nByte += strlen(
da50: 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
da60: 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
da70: 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
da80: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  iteMalloc( nByte
da90: 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
daa0: 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  =0 ) goto fk_end
dab0: 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  ;.  pFKey->pFrom
dac0: 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
dad0: 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
dae0: 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
daf0: 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20 70  *)&pFKey[1];.  p
db00: 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73 74  FKey->aCol = (st
db10: 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a 3b  ruct sColMap*)z;
db20: 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28 73  .  z += sizeof(s
db30: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a 6e  truct sColMap)*n
db40: 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54  Col;.  pFKey->zT
db50: 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28  o = z;.  memcpy(
db60: 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e  z, pTo->z, pTo->
db70: 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20  n);.  z[pTo->n] 
db80: 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  = 0;.  z += pTo-
db90: 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 70  >n+1;.  pFKey->p
dba0: 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70 46  NextTo = 0;.  pF
dbb0: 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
dbc0: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
dbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
dbe0: 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
dbf0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
dc00: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
dc10: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
dc20: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
dc30: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
dc40: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
dc50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
dc60: 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
dc70: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
dc80: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
dc90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
dca0: 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
dcb0: 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
dcc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dcd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dce0: 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
dcf0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
dd00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
dd10: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
dd20: 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
dd30: 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
dd40: 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
dd50: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
dd60: 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
dd70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
dd80: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
dd90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
dda0: 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
ddb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
ddc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
ddd0: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54 6f  t n = strlen(pTo
dde0: 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
ddf0: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
de00: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
de10: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
de20: 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
de30: 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
de40: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
de50: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
de60: 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
de70: 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
de80: 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20  Key->deleteConf 
de90: 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b 0a  = flags & 0xff;.
dea0: 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65 43    pFKey->updateC
deb0: 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20  onf = (flags >> 
dec0: 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70 46  8 ) & 0xff;.  pF
ded0: 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66 20  Key->insertConf 
dee0: 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29  = (flags >> 16 )
def0: 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20 4c   & 0xff;..  /* L
df00: 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
df10: 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
df20: 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
df30: 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
df40: 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
df50: 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
df60: 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
df70: 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  FKey);.  sqlite3
df80: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
df90: 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
dfa0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
dfb0: 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  e(pToCol);.}../*
dfc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
dfd0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
dfe0: 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
dff0: 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
e000: 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
e010: 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
e020: 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
e030: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
e040: 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
e050: 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
e060: 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
e070: 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
e080: 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
e090: 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
e0a0: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
e0b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
e0c0: 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
e0d0: 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
e0e0: 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
e0f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e100: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
e110: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
e120: 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
e130: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
e140: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
e150: 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
e160: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
e170: 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
e180: 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
e190: 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79 2d  return;.  pFKey-
e1a0: 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69 73  >isDeferred = is
e1b0: 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a 0a  Deferred;.}../*.
e1c0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e1d0: 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
e1e0: 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78 20   table.  pIndex 
e1f0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
e200: 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64  he index .** and
e210: 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e   pTable is the n
e220: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
e230: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
e240: 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
e250: 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
e260: 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
e270: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
e280: 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
e290: 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
e2a0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
e2b0: 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
e2c0: 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
e2d0: 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
e2e0: 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
e2f0: 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
e300: 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
e310: 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
e320: 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
e330: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
e340: 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
e350: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e360: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
e370: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
e380: 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
e390: 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
e3a0: 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
e3b0: 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
e3c0: 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
e3d0: 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
e3e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
e3f0: 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
e400: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
e410: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
e420: 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76  truction.  .*/.v
e430: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
e440: 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
e450: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41 6c  *pParse,   /* Al
e460: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
e470: 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
e480: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
e490: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
e4a0: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
e4b0: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
e4c0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
e4d0: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
e4e0: 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
e4f0: 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
e500: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
e510: 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62 6c 65 20  Name,  /* Table 
e520: 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
e530: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
e540: 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
e550: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
e560: 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
e570: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
e580: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
e590: 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72  ,     /* OE_Abor
e5a0: 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
e5b0: 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
e5c0: 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
e5d0: 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54 68  *pStart,   /* Th
e5e0: 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
e5f0: 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52 45  hat begins a CRE
e600: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e610: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
e620: 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68 65  pEnd      /* The
e630: 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73   ")" that closes
e640: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
e650: 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  X statement */.)
e660: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
e670: 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65 20 74 6f  = 0; /* Table to
e680: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
e690: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
e6a0: 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65 78   0; /* The index
e6b0: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
e6c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
e6d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  = 0;.  int i, j;
e6e0: 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b  .  Token nullId;
e6f0: 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65      /* Fake toke
e700: 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49  n for an empty I
e710: 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69  D list */.  DbFi
e720: 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a 20  xer sFix;    /* 
e730: 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
e740: 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
e750: 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
e760: 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a 20  isTemp;      /* 
e770: 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70 6f  True for a tempo
e780: 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rary index */.  
e790: 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61  sqlite *db = pPa
e7a0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74 20  rse->db;..  int 
e7b0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  iDb;          /*
e7c0: 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
e7d0: 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
e7e0: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
e7f0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
e800: 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69   0; /* Unqualifi
e810: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
e820: 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
e830: 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  /..  if( pParse-
e840: 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33  >nErr || sqlite3
e850: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
e860: 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
e870: 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a 20  e_index;..  /*. 
e880: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
e890: 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
e8a0: 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
e8b0: 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
e8c0: 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
e8d0: 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
e8e0: 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
e8f0: 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
e900: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
e910: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
e920: 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
e930: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
e940: 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
e950: 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
e960: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
e970: 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
e980: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
e990: 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
e9a0: 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
e9b0: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
e9c0: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
e9d0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
e9e0: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
e9f0: 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
ea00: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
ea10: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
ea20: 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
ea30: 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
ea40: 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
ea50: 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
ea60: 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
ea70: 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
ea80: 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  e to 1..    */. 
ea90: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
eaa0: 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
eab0: 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
eac0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32  ;.    if( pName2
ead0: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   && pName2->n==0
eae0: 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
eaf0: 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  ->iDb==1 ){.    
eb00: 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7d    iDb = 1;.    }
eb10: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
eb20: 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
eb30: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
eb40: 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a  dex", pName) &&.
eb50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
eb60: 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
eb70: 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29   pTblName).    )
eb80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
eb90: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
eba0: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
ebb0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
ebc0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62 6c  ble(pParse, pTbl
ebd0: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
ebe0: 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
ebf0: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
ec00: 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
ec10: 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
ec20: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ec30: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 70    assert( iDb==p
ec40: 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d 65  Tab->iDb );.  }e
ec50: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
ec60: 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
ec70: 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65 2d   pTab =  pParse-
ec80: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
ec90: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
eca0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62  .  }..  if( pTab
ecb0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
ecc0: 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Err ) goto exit_
ecd0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
ece0: 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e  if( pTab->readOn
ecf0: 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ly ){.    sqlite
ed00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ed10: 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
ed20: 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
ed30: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
ed40: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
ed50: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
ed60: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
ed70: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
ed80: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ed90: 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
eda0: 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
edb0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
edc0: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
edd0: 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d 3e   isTemp = pTab->
ede0: 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20 20  iDb==1;..  /*.  
edf0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
ee00: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
ee10: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
ee20: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
ee30: 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
ee40: 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
ee50: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
ee60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
ee70: 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
ee80: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
ee90: 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
eea0: 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
eeb0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
eec0: 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
eed0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
eee0: 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
eef0: 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
ef00: 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
ef10: 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
ef20: 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
ef30: 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
ef40: 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
ef50: 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
ef60: 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
ef70: 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
ef80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
ef90: 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
efa0: 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
efb0: 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
efc0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
efd0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
efe0: 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
eff0: 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
f000: 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
f010: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
f020: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f030: 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f 6b  TableNameFromTok
f040: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  en(pName);.    i
f050: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
f060: 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
f070: 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51  ndex;.    if( SQ
f080: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
f090: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
f0a0: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
f0b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
f0c0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f0d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
f0e0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
f0f0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 53        Index *pIS
f100: 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 41  ameName;    /* A
f110: 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69 74  nother index wit
f120: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
f130: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
f140: 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f  pTSameName;    /
f150: 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20 73  * A table with s
f160: 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
f170: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
f180: 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20 3d  f( (pISameName =
f190: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
f1a0: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d  x(db, zName, db-
f1b0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
f1c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
f1d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f1e0: 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25  pParse, "index %
f1f0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
f200: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
f210: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
f220: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
f230: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 54   }.      if( (pT
f240: 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74  SameName = sqlit
f250: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
f260: 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29 7b  zName, 0))!=0 ){
f270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f280: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f290: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
f2a0: 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
f2b0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
f2c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f2d0: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
f2e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
f2f0: 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d 30  lse if( pName==0
f300: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
f310: 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  f[30];.    int n
f320: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f  ;.    Index *pLo
f330: 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f  op;.    for(pLoo
f340: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20  p=pTab->pIndex, 
f350: 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  n=1; pLoop; pLoo
f360: 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20  p=pLoop->pNext, 
f370: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69 6e  n++){}.    sprin
f380: 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e 29  tf(zBuf,"_%d",n)
f390: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  ;.    zName = 0;
f3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
f3b0: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22 73  tring(&zName, "s
f3c0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
f3d0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
f3e0: 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
f3f0: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
f400: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
f410: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
f420: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
f430: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
f440: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
f450: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
f460: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
f470: 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
f480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
f490: 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d   = db->aDb[pTab-
f4a0: 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >iDb].zName;.   
f4b0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
f4c0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
f4d0: 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
f4e0: 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70  EMA_TABLE(isTemp
f4f0: 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
f500: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f510: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f520: 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
f530: 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
f540: 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 20     if( isTemp ) 
f550: 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
f560: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
f570: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f580: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
f590: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
f5a0: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
f5b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f5c0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f5d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
f5e0: 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
f5f0: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
f600: 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
f610: 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
f620: 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
f630: 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
f640: 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
f650: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
f660: 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
f670: 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
f680: 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
f690: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
f6a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
f6b0: 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61    nullId.z = pTa
f6c0: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
f6d0: 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
f6e0: 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72 6c   nullId.n = strl
f6f0: 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  en(nullId.z);.  
f700: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
f710: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
f720: 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a  0, 0, &nullId);.
f730: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f740: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
f750: 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
f760: 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
f770: 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
f780: 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
f790: 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
f7a0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 49  Malloc( sizeof(I
f7b0: 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28 7a  ndex) + strlen(z
f7c0: 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20 20  Name) + 1 +.    
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74 29      (sizeof(int)
f7f0: 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65   + sizeof(CollSe
f800: 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78 70  q*))*pList->nExp
f810: 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  r );.  if( pInde
f820: 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  x==0 ) goto exit
f830: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f840: 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
f850: 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64 65  n = (int*)&pInde
f860: 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
f870: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b 0a  [pList->nExpr];.
f880: 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
f890: 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65 78  = (char*)&pIndex
f8a0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73 74  ->aiColumn[pList
f8b0: 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72 63  ->nExpr];.  strc
f8c0: 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
f8d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64  , zName);.  pInd
f8e0: 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61  ex->pTable = pTa
f8f0: 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  b;.  pIndex->nCo
f900: 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  lumn = pList->nE
f910: 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  xpr;.  pIndex->o
f920: 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f 72  nError = onError
f930: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
f940: 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d 30  Index = pName==0
f950: 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62 20  ;.  pIndex->iDb 
f960: 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63 61  = iDb;..  /* Sca
f970: 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
f980: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
f990: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
f9a0: 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
f9b0: 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
f9c0: 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
f9d0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
f9e0: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
f9f0: 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
fa00: 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
fa10: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
fa20: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
fa30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  r; i++){.    for
fa40: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
fa50: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
fa60: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
fa70: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
fa80: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
fa90: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [j].zName)==0 ) 
faa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fab0: 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
fac0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
fad0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fae0: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
faf0: 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
fb00: 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
fb10: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69 73  Tab->zName, pLis
fb20: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
fb30: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
fb40: 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
fb50: 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
fb60: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b  aiColumn[i] = j;
fb70: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
fb80: 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20 20  a[i].pExpr ){.  
fb90: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
fba0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  t->a[i].pExpr->p
fbb0: 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 49  Coll );.      pI
fbc0: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43  ndex->keyInfo.aC
fbd0: 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d 3e  oll[i] = pList->
fbe0: 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f 6c  a[i].pExpr->pCol
fbf0: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
fc00: 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49      pIndex->keyI
fc10: 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  nfo.aColl[i] = p
fc20: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
fc30: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ll;.    }.    as
fc40: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b 65  sert( pIndex->ke
fc50: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
fc60: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
fc70: 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20 20  nit.busy && .   
fc80: 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
fc90: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
fca0: 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f   pIndex->keyInfo
fcb0: 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20 20  .aColl[i]) .    
fcc0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
fcd0: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
fce0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
fcf0: 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46 69  dex->keyInfo.nFi
fd00: 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  eld = pList->nEx
fd10: 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  pr;..  if( pTab=
fd20: 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
fd30: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
fd40: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
fd50: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
fd60: 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
fd70: 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
fd80: 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
fd90: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
fda0: 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
fdb0: 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
fdc0: 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
fdd0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
fde0: 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
fdf0: 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
fe00: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
fe10: 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
fe20: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
fe30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
fe40: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
fe50: 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
fe60: 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
fe70: 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
fe80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
fe90: 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
fea0: 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
feb0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
fec0: 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
fed0: 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
fee0: 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
fef0: 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
ff00: 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
ff10: 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
ff20: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
ff30: 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
ff40: 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
ff50: 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
ff60: 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
ff70: 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
ff80: 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
ff90: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
ffa0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
ffb0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
ffc0: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
ffd0: 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
ffe0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
fff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
10000 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
10010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10020 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
10030 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
10040 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
10050 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
10060 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
10070 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
10080 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
10090 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  k++){.        if
100a0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
100b0 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
100c0 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
100d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
100e0 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
100f0 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b 65  l[k]!=pIndex->ke
10100 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29  yInfo.aColl[k] )
10110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10120 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
10130 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  x->nColumn ){.  
10140 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
10150 20 49 74 27 73 20 70 6f 73 73 69 62 6c 65 20 74   It's possible t
10160 68 65 20 6f 6e 45 72 72 6f 72 20 6f 66 20 74 68  he onError of th
10170 65 20 6f 6c 64 20 69 6e 64 65 78 20 73 68 6f 75  e old index shou
10180 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ld be.        **
10190 20 61 64 6a 75 73 74 65 64 2e 20 46 6f 72 20 65   adjusted. For e
101a0 78 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 73 74  xample in the st
101b0 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20  atement:.       
101c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 43   **.        ** C
101d0 52 45 41 54 45 20 54 41 42 4c 45 20 74 20 28 78  REATE TABLE t (x
101e0 20 55 4e 49 51 55 45 2c 20 55 4e 49 51 55 45 28   UNIQUE, UNIQUE(
101f0 78 29 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  x) ON CONFLICT R
10200 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
10210 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
10220 54 68 65 20 49 6e 64 65 78 2e 6f 6e 45 72 72 6f  The Index.onErro
10230 72 20 73 68 6f 75 6c 64 20 62 65 20 75 70 67 72  r should be upgr
10240 61 64 65 64 20 66 72 6f 6d 20 4f 45 5f 41 62 6f  aded from OE_Abo
10250 72 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  rt to.        **
10260 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 77 68 65   OE_Rollback whe
10270 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 55 4e 49  n the second UNI
10280 51 55 45 20 69 73 20 70 61 72 73 65 64 2e 0a 20  QUE is parsed.. 
10290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
102a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
102b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
102c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
102d0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
102e0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
102f0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
10300 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
10310 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
10320 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
10330 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50   .  */.  if( !pP
10340 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
10350 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
10360 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
10370 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
10380 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 69  b[pIndex->iDb].i
10390 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c    pIndex->zName,
103c0 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78 2d 3e   strlen(pIndex->
103d0 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64 65 78  zName)+1, pIndex
103e0 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
103f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
10400 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
10410 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
10420 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
10430 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
10440 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
10450 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
10460 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
10470 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ges;.  }..  /* I
10480 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
10490 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
104a0 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
104b0 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
104c0 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
104d0 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
104e0 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64 6f 20  he disk.  So do 
104f0 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
10500 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61 69 6e   disk.  ** again
10510 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 74  .  Extract the t
10520 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72 6f 6d  able number from
10530 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
10540 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20 20 2a  wTnum field..  *
10550 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
10560 2e 62 75 73 79 20 26 26 20 70 54 62 6c 4e 61 6d  .busy && pTblNam
10570 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 64  e!=0 ){.    pInd
10580 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69  ex->tnum = db->i
10590 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
105a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
105b0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
105c0 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
105d0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
105e0 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
105f0 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
10600 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
10610 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
10620 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
10630 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
10640 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
10650 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
10660 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
10670 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
10680 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
10690 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
106a0 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
106b0 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
106c0 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
106d0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
106e0 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
106f0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
10700 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
10710 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
10720 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
10730 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
10740 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
10750 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
10760 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
10770 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
10780 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
10790 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
107a0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
107b0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
107c0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
107d0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
107e0 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
107f0 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
10800 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
10810 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
10820 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
10830 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
10840 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
10850 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
10860 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
10870 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
10880 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
10890 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
108a0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
108b0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56      int n;.    V
108c0 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e 74 20  dbe *v;.    int 
108d0 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 0a 20 20 20  lbl1, lbl2;..   
108e0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
108f0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10900 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
10910 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
10920 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  ex;.    if( pTbl
10930 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
10940 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
10950 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
10960 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
10970 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
10980 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44 62  sterTable(v, iDb
10990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
109a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
109b0 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 30 2c   OP_NewRecno, 0,
109c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
109d0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74  VdbeOp3(v, OP_St
109e0 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22 69 6e  ring8, 0, 0, "in
109f0 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49 43 29  dex", P3_STATIC)
10a00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10a10 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
10a20 67 38 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  g8, 0, 0, pIndex
10a30 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ->zName, 0);.   
10a40 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10a50 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
10a60 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
10a70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10a80 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
10a90 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c 20 69  reateIndex, 0, i
10aa0 44 62 2c 28 63 68 61 72 2a 29 26 70 49 6e 64 65  Db,(char*)&pInde
10ab0 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50 4f 49 4e 54  x->tnum,P3_POINT
10ac0 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ER);.    pIndex-
10ad0 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69  >tnum = 0;.    i
10ae0 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20  f( pTblName ){. 
10af0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10b00 43 6f 64 65 28 76 2c 0a 20 20 20 20 20 20 20 20  Code(v,.        
10b10 20 20 4f 50 5f 44 75 70 2c 20 20 20 20 20 20 20    OP_Dup,       
10b20 30 2c 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,      0,.     
10b30 20 20 20 20 20 4f 50 5f 49 6e 74 65 67 65 72 2c       OP_Integer,
10b40 20 20 20 69 44 62 2c 20 20 20 20 30 2c 0a 20 20     iDb,    0,.  
10b50 20 20 20 20 30 29 3b 0a 20 20 20 20 20 20 73 71      0);.      sq
10b60 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
10b70 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
10b80 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
10b90 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
10ba0 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f  &pIndex->keyInfo
10bb0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
10bc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10bd0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
10be0 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
10bf0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26      if( pStart &
10c00 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  & pEnd ){.      
10c10 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
10c20 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  None ){.        
10c30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
10c40 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41  eP3(v, -1, "CREA
10c50 54 45 20 49 4e 44 45 58 20 22 2c 20 50 33 5f 53  TE INDEX ", P3_S
10c60 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  TATIC);.      }e
10c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10c80 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
10c90 28 76 2c 20 2d 31 2c 20 22 43 52 45 41 54 45 20  (v, -1, "CREATE 
10ca0 55 4e 49 51 55 45 20 49 4e 44 45 58 20 22 2c 20  UNIQUE INDEX ", 
10cb0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
10cc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10cd0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
10ce0 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
10cf0 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64 72 28  .      n = Addr(
10d00 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64 72 28  pEnd->z) - Addr(
10d10 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 3b 0a 20  pName->z) + 1;. 
10d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d30 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
10d40 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a 20 20  pName->z, n);.  
10d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10d60 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  ddOp(v, OP_Conca
10d70 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 2, 0);.    }.
10d80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
10d90 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
10da0 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74 74 69  ord, 5, 0, "ttti
10db0 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  t", P3_STATIC);.
10dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10dd0 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 49 6e  ddOp(v, OP_PutIn
10de0 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tKey, 0, 0);.   
10df0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
10e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10e10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
10e20 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69 44 62  teger, pTab->iDb
10e30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10e40 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10e50 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32 2c 20  OP_OpenRead, 2, 
10e60 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20  pTab->tnum);.   
10e70 20 20 20 2f 2a 20 56 64 62 65 43 6f 6d 6d 65 6e     /* VdbeCommen
10e80 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54 61 62  t((v, "%s", pTab
10e90 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f 0a 20 20  ->zName)); */.  
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 53 65 74 4e 75  ddOp(v, OP_SetNu
10ec0 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20 70 54 61  mColumns, 2, pTa
10ed0 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->nCol);.      
10ee0 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 33 56 64  lbl2 = sqlite3Vd
10ef0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
10f20 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b 0a 20  ind, 2, lbl2);. 
10f30 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69       lbl1 = sqli
10f40 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10f50 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
10f60 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
10f70 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78 2c 20  xKey(v, pIndex, 
10f80 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
10f90 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49  3VdbeOp3(v, OP_I
10fa0 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64 65 78  dxPut, 1, pIndex
10fb0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
10fc0 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne,.            
10fd0 20 20 20 20 20 20 20 20 20 20 22 69 6e 64 65 78            "index
10fe0 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e  ed columns are n
10ff0 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33 5f 53  ot unique", P3_S
11000 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
11010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11020 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20 6c 62  , OP_Next, 2, lb
11030 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l1);.      sqlit
11040 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11050 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20 20 20  el(v, lbl2);.   
11060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11070 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
11080 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
11090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
110a0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c 20 30  , OP_Close, 1, 0
110b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
110c0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
110d0 20 20 20 20 20 20 69 66 28 20 21 69 73 54 65 6d        if( !isTem
110e0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  p ){.        sql
110f0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
11100 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 20 20  (db, v, iDb);.  
11110 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11120 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11130 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b  OP_Close, 0, 0);
11140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
11150 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
11160 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
11170 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64   }..  /* When ad
11180 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  ding an index to
11190 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64   the list of ind
111a0 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ices for a table
111b0 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  , make.  ** sure
111c0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62   all indices lab
111d0 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20  eled OE_Replace 
111e0 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74  come after all t
111f0 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a  hose labeled.  *
11200 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68  * OE_Ignore.  Th
11210 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
11220 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20  for the correct 
11230 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50 44  operation of UPD
11240 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53  ATE.  ** and INS
11250 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ERT..  */.  if( 
11260 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
11270 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
11280 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  dex==0.       ||
11290 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
112a0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
112b0 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ce){.    pIndex-
112c0 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
112d0 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62 2d  Index;.    pTab-
112e0 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
112f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  ;.  }else{.    I
11300 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
11310 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
11320 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
11330 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
11340 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
11350 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
11360 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
11370 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
11380 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70   }.    pIndex->p
11390 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
113a0 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68 65 72  Next;.    pOther
113b0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
113c0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
113d0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20   0;..  /* Clean 
113e0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
113f0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
11400 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
11410 6e 64 65 78 20 29 20 73 71 6c 69 74 65 46 72 65  ndex ) sqliteFre
11420 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  e(pIndex);.  sql
11430 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11440 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 2f 2a 20  te(pList);.  /* 
11450 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
11460 6c 65 74 65 28 70 54 61 62 6c 65 29 3b 20 2a 2f  lete(pTable); */
11470 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e  .  sqliteFree(zN
11480 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
11490 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
114a0 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
114b0 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
114c0 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
114d0 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
114e0 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
114f0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
11500 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
11510 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
11520 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
11530 70 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  pName){.  Index 
11540 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
11550 2a 76 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  *v;.  sqlite *db
11560 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
11570 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
11580 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
11590 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
115a0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
115b0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
115c0 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
115d0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
115e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
115f0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
11600 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
11610 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
11620 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
11630 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
11640 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
11650 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
11660 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
11670 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
11680 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
11690 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
116a0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
116b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
116c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
116d0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
116e0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
116f0 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
11700 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
11710 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
11720 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
11730 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
11740 0a 20 20 7d 0a 2f 2a 0a 20 20 69 66 28 20 70 49  .  }./*.  if( pI
11750 6e 64 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20  ndex->iDb>1 ){. 
11760 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11770 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
11780 6f 74 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20  ot alter schema 
11790 6f 66 20 61 74 74 61 63 68 65 64 20 22 0a 20 20  of attached ".  
117a0 20 20 20 20 20 22 64 61 74 61 62 61 73 65 73 22       "databases"
117b0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
117c0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
117d0 20 20 7d 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53    }.*/.#ifndef S
117e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
117f0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
11800 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
11810 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
11820 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
11830 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
11840 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11850 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70  *zDb = db->aDb[p
11860 49 6e 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Index->iDb].zNam
11870 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
11880 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
11890 5f 54 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69  _TABLE(pIndex->i
118a0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
118b0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
118c0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
118d0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
118e0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
118f0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
11900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11910 70 49 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f  pIndex->iDb ) co
11920 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
11930 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
11940 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11950 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
11960 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
11970 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
11980 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
11990 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
119a0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
119b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
119c0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
119d0 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
119e0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
119f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
11a00 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11a10 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
11a20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64  ){.    static Vd
11a30 62 65 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e 64  beOpList dropInd
11a40 65 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ex[] = {.      {
11a50 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20   OP_Rewind,     
11a60 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20  0, ADDR(9), 0}, 
11a70 0a 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69  .      { OP_Stri
11a80 6e 67 38 2c 20 20 20 20 20 30 2c 20 30 2c 20 20  ng8,     0, 0,  
11a90 20 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f       0}, /* 1 */
11aa0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53  .      { OP_MemS
11ab0 74 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20  tore,   1, 1,   
11ac0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
11ad0 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
11ae0 2c 20 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f  , 0,       0}, /
11af0 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f  * 3 */.      { O
11b00 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
11b10 20 31 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20   1,       0},.  
11b20 20 20 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20      { OP_Eq,    
11b30 20 20 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c       0, ADDR(8),
11b40 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
11b50 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41  Next,       0, A
11b60 44 44 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20  DDR(3), 0},.    
11b70 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20    { OP_Goto,    
11b80 20 20 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30     0, ADDR(9), 0
11b90 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65  },.      { OP_De
11ba0 6c 65 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20  lete,     0, 0, 
11bb0 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a        0}, /* 8 *
11bc0 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  /.    };.    int
11bd0 20 62 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69   base;..    sqli
11be0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
11bf0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
11c00 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
11c10 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
11c20 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 70 49  asterTable(v, pI
11c30 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20  ndex->iDb);.    
11c40 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  base = sqlite3Vd
11c50 62 65 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41  beAddOpList(v, A
11c60 72 72 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64  rraySize(dropInd
11c70 65 78 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b  ex), dropIndex);
11c80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11c90 43 68 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65  ChangeP3(v, base
11ca0 2b 31 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  +1, pIndex->zNam
11cb0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
11cc0 49 6e 64 65 78 2d 3e 69 44 62 21 3d 31 20 29 7b  Index->iDb!=1 ){
11cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
11ce0 61 6e 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76  angeCookie(db, v
11cf0 2c 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a  , pIndex->iDb);.
11d00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11d10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11d20 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20  _Close, 0, 0);. 
11d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11d40 64 4f 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  dOp(v, OP_Destro
11d50 79 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  y, pIndex->tnum,
11d60 20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20   pIndex->iDb);. 
11d70 20 20 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69     sqlite3EndWri
11d80 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
11d90 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  se);.  }..  /* D
11da0 65 6c 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  elete the in-mem
11db0 6f 72 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ory description 
11dc0 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  of this index.. 
11dd0 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73   */.  if( !pPars
11de0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
11df0 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
11e00 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62  ndDeleteIndex(db
11e10 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64  , pIndex);.    d
11e20 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
11e30 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
11e40 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
11e50 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
11e60 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
11e70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
11e80 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
11e90 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
11ea0 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
11eb0 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
11ec0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
11ed0 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
11ee0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
11ef0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
11f00 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
11f10 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
11f20 74 41 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a  tAppend(IdList *
11f30 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
11f40 6f 6b 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69  oken){.  if( pLi
11f50 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
11f60 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
11f70 63 28 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  c( sizeof(IdList
11f80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
11f90 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
11fa0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
11fb0 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  loc = 0;.  }.  i
11fc0 66 28 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70  f( pList->nId>=p
11fd0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  List->nAlloc ){.
11fe0 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
11ff0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70  t_item *a;.    p
12000 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  List->nAlloc = p
12010 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
12020 20 35 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   5;.    a = sqli
12030 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
12040 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
12050 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
12060 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
12070 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   a==0 ){.      s
12080 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
12090 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
120a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
120b0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
120c0 61 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  a;.  }.  memset(
120d0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
120e0 3e 6e 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >nId], 0, sizeof
120f0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
12100 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
12110 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
12120 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
12130 3e 6e 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >nId].zName;.   
12140 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69   sqlite3SetNStri
12150 6e 67 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  ng(pz, pToken->z
12160 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
12170 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20  .    if( *pz==0 
12180 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12190 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  IdListDelete(pLi
121a0 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
121b0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
121c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
121d0 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
121e0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49  .  }.  pList->nI
121f0 64 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  d++;.  return pL
12200 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ist;.}../*.** Ap
12210 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
12220 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
12230 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
12240 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
12250 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
12260 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
12270 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
12280 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
12290 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
122a0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c  **.** A new SrcL
122b0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
122c0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
122d0 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a  oc() fails..**.*
122e0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
122f0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
12300 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
12310 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
12320 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
12330 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
12340 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
12350 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
12360 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
12370 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
12380 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
12390 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
123a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
123b0 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
123c0 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
123d0 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
123e0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
123f0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
12400 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
12410 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
12420 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
12430 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
12440 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
12450 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
12460 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
12470 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
12480 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
12490 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
124a0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
124b0 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
124c0 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
124d0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
124e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
124f0 63 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c  cListAppend(A,B,
12500 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
12510 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
12520 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
12530 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
12540 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
12550 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
12560 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
12570 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
12580 6e 64 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  nd(A,B,C);.**.**
12590 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
125a0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
125b0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
125c0 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  name..*/.SrcList
125d0 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
125e0 41 70 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a  Append(SrcList *
125f0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
12600 61 62 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61  able, Token *pDa
12610 74 61 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70  tabase){.  if( p
12620 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
12630 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  List = sqliteMal
12640 6c 6f 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c  loc( sizeof(SrcL
12650 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
12660 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
12670 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
12680 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
12690 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72    if( pList->nSr
126a0 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  c>=pList->nAlloc
126b0 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
126c0 2a 70 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74  *pNew;.    pList
126d0 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20  ->nAlloc *= 2;. 
126e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
126f0 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20  Realloc(pList,. 
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
12710 7a 65 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28  zeof(*pList) + (
12720 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29  pList->nAlloc-1)
12730 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
12740 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
12750 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
12760 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
12770 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
12780 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12790 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
127a0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  pNew;.  }.  mems
127b0 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69  et(&pList->a[pLi
127c0 73 74 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69  st->nSrc], 0, si
127d0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
127e0 29 29 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  ));.  if( pDatab
127f0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
12800 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
12810 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
12820 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
12830 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20   && pTable ){.  
12840 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d    Token *pTemp =
12850 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20   pDatabase;.    
12860 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61 62  pDatabase = pTab
12870 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d  le;.    pTable =
12880 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66   pTemp;.  }.  if
12890 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
128a0 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69  char **pz = &pLi
128b0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
128c0 63 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71  c].zName;.    sq
128d0 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
128e0 70 7a 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70  pz, pTable->z, p
128f0 54 61 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20  Table->n, 0);.  
12900 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a    if( *pz==0 ){.
12910 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
12920 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
12930 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12940 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
12950 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
12960 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
12970 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
12980 73 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  se ){.    char *
12990 2a 70 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  *pz = &pList->a[
129a0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61  pList->nSrc].zDa
129b0 74 61 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69  tabase;.    sqli
129c0 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
129d0 2c 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20  , pDatabase->z, 
129e0 70 44 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29  pDatabase->n, 0)
129f0 3b 0a 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30  ;.    if( *pz==0
12a00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12a10 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
12a20 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
12a30 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
12a40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12a50 65 71 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20  equote(*pz);.   
12a60 20 7d 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e   }.  }.  pList->
12a70 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69  a[pList->nSrc].i
12a80 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70  Cursor = -1;.  p
12a90 4c 69 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20  List->nSrc++;.  
12aa0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
12ab0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75  ./*.** Assign cu
12ac0 72 73 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62  rsors to all tab
12ad0 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74  les in a SrcList
12ae0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12af0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
12b00 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  sors(Parse *pPar
12b10 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  se, SrcList *pLi
12b20 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
12b30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
12b40 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
12b50 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
12b60 5d 2e 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20  ].iCursor<0 ){. 
12b70 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
12b80 2e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  .iCursor = pPars
12b90 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d  e->nTab++;.    }
12ba0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
12bb0 64 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  d an alias to th
12bc0 65 20 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65  e last identifie
12bd0 72 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69  r on the given i
12be0 64 65 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a  dentifier list..
12bf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
12c00 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53  rcListAddAlias(S
12c10 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  rcList *pList, T
12c20 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
12c30 20 69 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c   if( pList && pL
12c40 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20  ist->nSrc>0 ){. 
12c50 20 20 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74     int i = pList
12c60 2d 3e 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20  ->nSrc - 1;.    
12c70 73 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e  sqlite3SetNStrin
12c80 67 28 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  g(&pList->a[i].z
12c90 41 6c 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a  Alias, pToken->z
12ca0 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b  , pToken->n, 0);
12cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
12cc0 6f 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ote(pList->a[i].
12cd0 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  zAlias);.  }.}..
12ce0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
12cf0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
12d00 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
12d10 65 74 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  ete(IdList *pLis
12d20 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
12d30 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
12d40 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
12d50 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
12d60 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ++){.    sqliteF
12d70 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
12d80 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
12d90 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
12da0 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
12db0 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
12dc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
12dd0 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74  ex in pList of t
12de0 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
12df0 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e  med zId.  Return
12e00 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f   -1.** if not fo
12e10 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
12e20 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49  te3IdListIndex(I
12e30 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f  dList *pList, co
12e40 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12e50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
12e60 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
12e70 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30  rn -1;.  for(i=0
12e80 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
12e90 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
12ea0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
12eb0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
12ec0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
12ed0 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
12ee0 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
12ef0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
12f00 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
12f10 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
12f20 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
12f30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
12f40 65 6c 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70  elete(SrcList *p
12f50 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
12f60 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
12f70 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
12f80 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
12f90 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  c; i++){.    sql
12fa0 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61  iteFree(pList->a
12fb0 5b 69 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [i].zDatabase);.
12fc0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
12fd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
12fe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12ff0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
13000 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lias);.    if( p
13010 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20  List->a[i].pTab 
13020 26 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  && pList->a[i].p
13030 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
13040 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13050 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
13060 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  pList->a[i].pTab
13070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
13080 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
13090 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65  (pList->a[i].pSe
130a0 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
130b0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69  e3ExprDelete(pLi
130c0 73 74 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20  st->a[i].pOn);. 
130d0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
130e0 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b  Delete(pList->a[
130f0 69 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  i].pUsing);.  }.
13100 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
13110 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  st);.}../*.** Be
13120 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
13130 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
13140 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
13150 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
13160 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
13170 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66    Vdbe *v;..  if
13180 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28  ( pParse==0 || (
13190 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d  db=pParse->db)==
131a0 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  0 || db->aDb[0].
131b0 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
131c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
131d0 45 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  Err || sqlite3_m
131e0 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72  alloc_failed ) r
131f0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
13200 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13210 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
13220 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
13230 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
13240 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
13250 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13260 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
13270 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  urn;.  sqlite3Vd
13280 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75  beAddOp(v, OP_Au
13290 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
132a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
132b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
132c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
132d0 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
132e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
132f0 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
13300 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
13310 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
13320 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
13330 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
13340 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
13350 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13360 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
13370 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
13380 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
13390 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
133a0 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
133b0 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
133c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
133d0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
133e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
133f0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
13400 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13410 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
13420 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
13430 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
13440 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
13450 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
13460 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
13470 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
13480 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20  .  sqlite *db;. 
13490 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
134a0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
134b0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
134c0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
134d0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
134e0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
134f0 72 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  rr || sqlite3_ma
13500 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
13510 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
13520 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13530 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
13540 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
13550 43 4b 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74  CK", 0, 0) ) ret
13560 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  urn;..  v = sqli
13570 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13580 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
13590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
135a0 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  dOp(v, OP_AutoCo
135b0 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d  mmit, 1, 1);.  }
135c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
135d0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
135e0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
135f0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
13600 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
13610 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
13620 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
13630 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
13640 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
13650 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
13660 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
13670 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
13680 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
13690 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
136a0 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
136b0 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
136c0 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
136d0 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
136e0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
136f0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
13700 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
13710 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
13720 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
13730 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
13740 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
13750 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13760 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
13770 6e 20 4f 50 5f 47 6f 73 75 62 20 74 68 61 74 0a  n OP_Gosub that.
13780 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20  ** will jump to 
13790 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20  a subroutine at 
137a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
137b0 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65  rogram.  Then we
137c0 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79  .** record every
137d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e   database that n
137e0 65 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20  eeds its schema 
137f0 76 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a  verified in the.
13800 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ** pParse->cooki
13810 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61  eMask field.  La
13820 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  ter, after all o
13830 74 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65  ther code has be
13840 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c  en.** generated,
13850 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
13860 74 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f  that does the co
13870 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
13880 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73  ns and.** starts
13890 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
138a0 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20  s will be coded 
138b0 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 73 75 62  and the OP_Gosub
138c0 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c   P2 value.** wil
138d0 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69  l be made to poi
138e0 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f  nt to that subro
138f0 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65  utine.  The gene
13900 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
13910 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61   cookie verifica
13920 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20  tion subroutine 
13930 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20  code happens in 
13940 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
13950 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
13960 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
13970 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
13980 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
13990 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
139a0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d  Vdbe *v;.  int m
139b0 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ask;..  v = sqli
139c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
139d0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
139e0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
139f0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
13a00 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
13a10 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64  ior error */.  d
13a20 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13a30 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
13a40 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
13a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
13a60 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
13a70 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
13a80 61 73 73 65 72 74 28 20 69 44 62 3c 33 32 20 29  assert( iDb<32 )
13a90 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
13aa0 63 6f 6f 6b 69 65 4d 61 73 6b 3d 3d 30 20 29 7b  cookieMask==0 ){
13ab0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  .    pParse->coo
13ac0 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  kieGoto = sqlite
13ad0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13ae0 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
13af0 7d 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44  }.  mask = 1<<iD
13b00 62 3b 0a 20 20 69 66 28 20 28 70 50 61 72 73 65  b;.  if( (pParse
13b10 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d  ->cookieMask & m
13b20 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ask)==0 ){.    p
13b30 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
13b40 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 70  k |= mask;.    p
13b50 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
13b60 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
13b70 62 5b 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f  b[iDb].schema_co
13b80 6f 6b 69 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  okie;.  }.}../*.
13b90 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
13ba0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
13bb0 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
13bc0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
13bd0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
13be0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
13bf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13c00 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
13c10 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
13c20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
13c30 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
13c40 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
13c50 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
13c60 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
13c70 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
13c80 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
13c90 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
13ca0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
13cb0 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
13cc0 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
13cd0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
13ce0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
13cf0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
13d00 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
13d10 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
13d20 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
13d30 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
13d40 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
13d50 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
13d60 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
13d70 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
13d80 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
13d90 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
13da0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
13db0 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
13dc0 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
13dd0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
13de0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
13df0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
13e00 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
13e10 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
13e20 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
13e30 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  set..**.** Only 
13e40 64 61 74 61 62 61 73 65 20 69 44 62 20 61 6e 64  database iDb and
13e50 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
13e60 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69 74  se are made writ
13e70 61 62 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c  able by this cal
13e80 6c 2e 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c  l..** If iDb==0,
13e90 20 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61   then the main a
13ea0 6e 64 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  nd temp database
13eb0 73 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61  s are made writa
13ec0 62 6c 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62  ble.   If.** iDb
13ed0 3d 3d 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  ==1 then only th
13ee0 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
13ef0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
13f00 2e 20 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e  .  If iDb>1 then
13f10 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
13f20 64 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  d auxiliary data
13f30 62 61 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d  base and the tem
13f40 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6d  p database are m
13f50 61 64 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ade writable..*/
13f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
13f70 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
13f80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13f90 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
13fa0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
13fb0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
13fc0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13fd0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
13fe0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
13ff0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
14000 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
14010 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
14020 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
14030 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 29  ( setStatement )
14040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14050 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61  eAddOp(v, OP_Sta
14060 74 65 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b  tement, iDb, 0);
14070 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d  .  }.  if( iDb!=
14080 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
14090 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
140a0 69 6f 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53  ion(pParse, setS
140b0 74 61 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20  tatement, 1);.  
140c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
140d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f  ate code that co
140e0 6e 63 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61  ncludes an opera
140f0 74 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61  tion that may ha
14100 76 65 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68  ve changed.** th
14110 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
14120 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
14130 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
14140 74 65 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a  ted, then emit.*
14150 2a 20 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74  * an OP_Commit t
14160 68 61 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74  hat will cause t
14170 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65  he changes to be
14180 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
14190 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  sk..**.** Note t
141a0 68 61 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  hat checkpoints 
141b0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
141c0 79 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74  y committed at t
141d0 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73  he end of.** a s
141e0 74 61 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20  tatement.  Note 
141f0 61 6c 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  also that there 
14200 63 61 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  can be multiple 
14210 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
14220 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
14230 65 72 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68  eration() but th
14240 65 72 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ere should only 
14250 62 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63  be a single.** c
14260 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e  all to sqlite3En
14270 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  dWriteOperation(
14280 29 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  ) at the conclus
14290 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
142a0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
142b0 6c 69 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65  lite3EndWriteOpe
142c0 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
142d0 61 72 73 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65  arse){.  /* Dele
142e0 74 65 20 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75  te me! */.  retu
142f0 72 6e 3b 0a 7d 0a                                rn;.}.