/ Hex Artifact Content
Login

Artifact 44057a0aba7c57fb7a32ee4addd2e981fcb9de60:


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 32 32 20 32 30 30 34 2f 30 36 2f 31 38 20 30  222 2004/06/18 0
0300: 36 3a 30 32 3a 33 35 20 64 61 6e 69 65 6c 6b 31  6:02:35 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 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
44b0: 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  urn;.  if( SQLIT
44c0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
44d0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
44e0: 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
44f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4500: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
4520: 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73  init.iDb==1 ) is
4530: 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65  Temp = 1;.#ifnde
4540: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4550: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73  THORIZATION.  as
4560: 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20  sert( (isTemp & 
4570: 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20  1)==isTemp );.  
4580: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
4590: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
45a0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
45b0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
45c0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
45d0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
45e0: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
45f0: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
4600: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
4610: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
4620: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
4630: 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
4640: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
4650: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
4660: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
4670: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  EATE_TEMP_VIEW;.
4680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4690: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
46a0: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a  TE_CREATE_VIEW;.
46b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
46c0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54  e{.      if( isT
46d0: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
46e0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
46f0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ATE_TEMP_TABLE;.
4700: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4710: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
4720: 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b  TE_CREATE_TABLE;
4730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4740: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
4750: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
4760: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
4770: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  zDb) ){.      sq
4780: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4790: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
47a0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
47b0: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 72 79  .  /* Before try
47c0: 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 61 20  ing to create a 
47d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
47e0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   make sure the B
47f0: 74 72 65 65 20 66 6f 72 0a 20 20 2a 2a 20 68 6f  tree for.  ** ho
4800: 6c 64 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20  lding temporary 
4810: 74 61 62 6c 65 73 20 69 73 20 6f 70 65 6e 2e 0a  tables is open..
4820: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
4830: 70 20 26 26 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  p && db->aDb[1].
4840: 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
4850: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
4860: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4870: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
4880: 62 2c 20 30 2c 20 30 2c 20 4d 41 58 5f 50 41 47  b, 0, 0, MAX_PAG
4890: 45 53 2c 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e  ES, &db->aDb[1].
48a0: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pBt);.    if( rc
48b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
48c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
48d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
48e0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
48f0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
4900: 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
4910: 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
4920: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
4930: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4940: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nErr++;.      sq
4950: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
4960: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4970: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
4980: 3e 66 6c 61 67 73 20 26 20 21 64 62 2d 3e 61 75  >flags & !db->au
4990: 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
49a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
49b0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 64 62  reeBeginTrans(db
49c0: 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 2c 20 31 2c  ->aDb[1].pBt, 1,
49d0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
49e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
49f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4a10: 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 61  "unable to get a
4a20: 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 22   write lock on "
4a30: 0a 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20  .          "the 
4a40: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
4a50: 73 65 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  se file");.     
4a60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4a70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ame);.        re
4a80: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
4a90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
4aa0: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
4ab0: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
4ac0: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
4ad0: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
4ae0: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
4af0: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
4b00: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
4b10: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
4b20: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
4b30: 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  oes..  */.  pTab
4b40: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
4b50: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
4b60: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
4b70: 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  ame);.  if( pTab
4b80: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
4b90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4ba0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
4bb0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
4bc0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
4bd0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ree(zName);.    
4be0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
4bf0: 28 20 28 70 49 64 78 20 3d 20 73 71 6c 69 74 65  ( (pIdx = sqlite
4c00: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
4c10: 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 26 26 0a  Name, 0))!=0 &&.
4c20: 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 2d            (pIdx-
4c30: 3e 69 44 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e  >iDb==0 || !db->
4c40: 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20  init.busy) ){.  
4c50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4c60: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
4c70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
4c80: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
4c90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
4ca0: 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  teFree(zName);. 
4cb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
4cc0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
4cd0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
4ce0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
4cf0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
4d00: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
4d10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
4d20: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
4d30: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
4d40: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4d50: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
4d60: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
4d70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
4d80: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  0;.  pTable->aCo
4d90: 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d  l = 0;.  pTable-
4da0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
4db0: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
4dc0: 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 44 62  0;.  pTable->iDb
4dd0: 20 3d 20 69 44 62 3b 0a 20 20 69 66 28 20 70 50   = iDb;.  if( pP
4de0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
4df0: 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  ) sqlite3DeleteT
4e00: 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d  able(db, pParse-
4e10: 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70  >pNewTable);.  p
4e20: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
4e30: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
4e40: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
4e50: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
4e60: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
4e70: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
4e80: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
4e90: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
4ea0: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
4eb0: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
4ec0: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
4ed0: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
4ee0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
4ef0: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
4f00: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
4f10: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
4f20: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
4f30: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
4f40: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
4f50: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
4f60: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
4f70: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
4f80: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
4f90: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
4fa0: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
4fb0: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
4fc0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
4fd0: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
4fe0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
4ff0: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
5000: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
5010: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
5020: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
5030: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5040: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
5050: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
5060: 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69  iDb);.    if( !i
5070: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f  sTemp ){.      /
5080: 2a 20 45 76 65 72 79 20 74 69 6d 65 20 61 20 6e  * Every time a n
5090: 65 77 20 74 61 62 6c 65 20 69 73 20 63 72 65 61  ew table is crea
50a0: 74 65 64 20 74 68 65 20 66 69 6c 65 2d 66 6f 72  ted the file-for
50b0: 6d 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  mat.      ** and
50c0: 20 65 6e 63 6f 64 69 6e 67 20 6d 65 74 61 2d 76   encoding meta-v
50d0: 61 6c 75 65 73 20 61 72 65 20 73 65 74 20 69 6e  alues are set in
50e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
50f0: 6e 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20  n.      ** case 
5100: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
5110: 74 20 74 61 62 6c 65 20 63 72 65 61 74 65 64 2e  t table created.
5120: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5140: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5150: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  db->file_format,
5160: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5170: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5180: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
5190: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
51a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
51b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
51c0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  enc, 0);.      s
51d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
51e0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
51f0: 20 69 44 62 2c 20 34 29 3b 0a 20 20 20 20 7d 0a   iDb, 4);.    }.
5200: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
5210: 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69 44  asterTable(v, iD
5220: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
5230: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
5240: 65 77 52 65 63 6e 6f 2c 20 30 2c 20 30 29 3b 0a  ewRecno, 0, 0);.
5250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5260: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
5270: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
5280: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5290: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
52a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
52b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
52c0: 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
52d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
52e0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
52f0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
5300: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
5310: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
5320: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
5330: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
5340: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
5350: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
5360: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
5370: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
5380: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
5390: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
53a0: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
53b0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
53c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
53d0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
53e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
53f0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
5400: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
5410: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
5420: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
5430: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
5440: 7a 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  z = 0;.  Column 
5450: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
5460: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
5470: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
5480: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53  ;.  sqlite3SetNS
5490: 74 72 69 6e 67 28 26 7a 2c 20 70 4e 61 6d 65 2d  tring(&z, pName-
54a0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
54b0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
54c0: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
54d0: 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f  Dequote(z);.  fo
54e0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
54f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5500: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5510: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
5520: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
5530: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5540: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
5550: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
5560: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
5570: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
5580: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
5590: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
55a0: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
55b0: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
55c0: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
55d0: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 2d  qliteRealloc( p-
55e0: 3e 61 43 6f 6c 2c 20 28 70 2d 3e 6e 43 6f 6c 2b  >aCol, (p->nCol+
55f0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
5600: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
5610: 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
5620: 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  ;.    p->aCol = 
5630: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
5640: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
5650: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
5660: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
5670: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
5680: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
5690: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
56a0: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
56b0: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
56c0: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
56d0: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f  ffinity.  ** 'NO
56e0: 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73  NE'. If there is
56f0: 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65   a type specifie
5700: 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41  d, then sqlite3A
5710: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77  ddColumnType() w
5720: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c  ill.  ** be call
5730: 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70  ed next to set p
5740: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f  Col->affinity co
5750: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  rrectly..  */.  
5760: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
5770: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
5780: 3b 0a 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20  ;.  pCol->pColl 
5790: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
57a0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 70 2d 3e 6e 43  fltColl;.  p->nC
57b0: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
57c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
57d0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
57e0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
57f0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
5800: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
5810: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5820: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
5830: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
5840: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
5850: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
5860: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
5870: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
5880: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
5890: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
58a0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
58b0: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
58c0: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
58d0: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
58e0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
58f0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d  nt i;.  if( (p =
5900: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
5910: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
5920: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
5930: 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70  ;.  if( i>=0 ) p
5940: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c  ->aCol[i].notNul
5950: 6c 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  l = onError;.}..
5960: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5970: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
5980: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
5990: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
59a0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
59b0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
59c0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
59d0: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
59e0: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
59f0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
5a00: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
5a10: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
5a20: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
5a30: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
5a40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
5a50: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
5a60: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
5a70: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
5a80: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
5a90: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
5aa0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
5ab0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
5ac0: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
5ad0: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
5ae0: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
5af0: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
5b00: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
5b10: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
5b20: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 46 69 72  rse, Token *pFir
5b30: 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 4c 61 73 74  st, Token *pLast
5b40: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
5b50: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74   int i, j;.  int
5b60: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a   n;.  char *z, *
5b70: 2a 70 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  *pz;.  Column *p
5b80: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
5b90: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5ba0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
5bb0: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
5bc0: 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
5bd0: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
5be0: 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 70 7a 20  ->aCol[i];.  pz 
5bf0: 3d 20 26 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a  = &pCol->zType;.
5c00: 20 20 6e 20 3d 20 70 4c 61 73 74 2d 3e 6e 20 2b    n = pLast->n +
5c10: 20 41 64 64 72 28 70 4c 61 73 74 2d 3e 7a 29 20   Addr(pLast->z) 
5c20: 2d 20 41 64 64 72 28 70 46 69 72 73 74 2d 3e 7a  - Addr(pFirst->z
5c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 74 4e  );.  sqlite3SetN
5c40: 53 74 72 69 6e 67 28 70 7a 2c 20 70 46 69 72 73  String(pz, pFirs
5c50: 74 2d 3e 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 7a  t->z, n, 0);.  z
5c60: 20 3d 20 2a 70 7a 3b 0a 20 20 69 66 28 20 7a 3d   = *pz;.  if( z=
5c70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
5c80: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20  or(i=j=0; z[i]; 
5c90: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 63 20  i++){.    int c 
5ca0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  = z[i];.    if( 
5cb0: 69 73 73 70 61 63 65 28 63 29 20 29 20 63 6f 6e  isspace(c) ) con
5cc0: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 5b 6a 2b 2b  tinue;.    z[j++
5cd0: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 5b 6a  ] = c;.  }.  z[j
5ce0: 5d 20 3d 20 30 3b 0a 20 20 70 43 6f 6c 2d 3e 61  ] = 0;.  pCol->a
5cf0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
5d00: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 2c  3AffinityType(z,
5d10: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   n);.}../*.** Th
5d20: 65 20 67 69 76 65 6e 20 74 6f 6b 65 6e 20 69 73  e given token is
5d30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
5d40: 75 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ue for the last 
5d50: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 0a  column added to.
5d60: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ** the table cur
5d70: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
5d80: 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 22  struction.  If "
5d90: 6d 69 6e 75 73 46 6c 61 67 22 20 69 73 20 74 72  minusFlag" is tr
5da0: 75 65 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ue, it.** means 
5db0: 74 68 65 20 76 61 6c 75 65 20 74 6f 6b 65 6e 20  the value token 
5dc0: 77 61 73 20 70 72 65 63 65 64 65 64 20 62 79 20  was preceded by 
5dd0: 61 20 6d 69 6e 75 73 20 73 69 67 6e 2e 0a 2a 2a  a minus sign..**
5de0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5df0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
5e00: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
5e10: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
5e20: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
5e30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
5e40: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
5e50: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
5e60: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
5e70: 65 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 2c 20  e, Token *pVal, 
5e80: 69 6e 74 20 6d 69 6e 75 73 46 6c 61 67 29 7b 0a  int minusFlag){.
5e90: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
5ea0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  t i;.  char **pz
5eb0: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
5ec0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
5ed0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
5ee0: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
5ef0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
5f00: 3b 0a 20 20 70 7a 20 3d 20 26 70 2d 3e 61 43 6f  ;.  pz = &p->aCo
5f10: 6c 5b 69 5d 2e 7a 44 66 6c 74 3b 0a 20 20 69 66  l[i].zDflt;.  if
5f20: 28 20 6d 69 6e 75 73 46 6c 61 67 20 29 7b 0a 20  ( minusFlag ){. 
5f30: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
5f40: 72 69 6e 67 28 70 7a 2c 20 22 2d 22 2c 20 31 2c  ring(pz, "-", 1,
5f50: 20 70 56 61 6c 2d 3e 7a 2c 20 70 56 61 6c 2d 3e   pVal->z, pVal->
5f60: 6e 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n, 0);.  }else{.
5f70: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53      sqlite3SetNS
5f80: 74 72 69 6e 67 28 70 7a 2c 20 70 56 61 6c 2d 3e  tring(pz, pVal->
5f90: 7a 2c 20 70 56 61 6c 2d 3e 6e 2c 20 30 29 3b 0a  z, pVal->n, 0);.
5fa0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 71    }.  sqlite3Deq
5fb0: 75 6f 74 65 28 2a 70 7a 29 3b 0a 7d 0a 0a 2f 2a  uote(*pz);.}../*
5fc0: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
5fd0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
5fe0: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
5ff0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
6000: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
6010: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
6020: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
6030: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
6040: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
6050: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
6060: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
6070: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
6080: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
6090: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
60a0: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
60b0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
60c0: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
60d0: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
60e0: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
60f0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
6100: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
6110: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
6120: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
6130: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
6140: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
6150: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
6160: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
6170: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
6180: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
6190: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
61a0: 20 69 64 2e 20 20 28 45 78 63 65 70 74 69 6f 6e   id.  (Exception
61b0: 3a 0a 2a 2a 20 46 6f 72 20 62 61 63 6b 77 61 72  :.** For backwar
61c0: 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
61d0: 20 77 69 74 68 20 6f 6c 64 65 72 20 64 61 74 61   with older data
61e0: 62 61 73 65 73 2c 20 64 6f 20 6e 6f 74 20 64 6f  bases, do not do
61f0: 20 74 68 69 73 0a 2a 2a 20 69 66 20 74 68 65 20   this.** if the 
6200: 66 69 6c 65 20 66 6f 72 6d 61 74 20 76 65 72 73  file format vers
6210: 69 6f 6e 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  ion number is le
6220: 73 73 20 74 68 61 6e 20 31 2e 29 20 20 53 65 74  ss than 1.)  Set
6230: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
6240: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
6250: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
6260: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
6270: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6280: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
6290: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
62a0: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
62b0: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
62c0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
62d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
62e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
62f0: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
6300: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
6310: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
6320: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
6330: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
6340: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
6350: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
6360: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
6370: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
6380: 6d 61 72 79 4b 65 79 28 50 61 72 73 65 20 2a 70  maryKey(Parse *p
6390: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
63a0: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6f 6e 45 72  *pList, int onEr
63b0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
63c0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
63d0: 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  ewTable;.  char 
63e0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
63f0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
6400: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
6410: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
6420: 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61  _exit;.  if( pTa
6430: 62 2d 3e 68 61 73 50 72 69 6d 4b 65 79 20 29 7b  b->hasPrimKey ){
6440: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6450: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
6460: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
6470: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
6480: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
6490: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
64a0: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
64b0: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
64c0: 20 70 54 61 62 2d 3e 68 61 73 50 72 69 6d 4b 65   pTab->hasPrimKe
64d0: 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 4c 69  y = 1;.  if( pLi
64e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
64f0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
6500: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
6510: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
6520: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
6530: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6540: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
6550: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
6560: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
6570: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
6580: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6590: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
65a0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
65b0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
65c0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
65d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
65e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
65f0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
6600: 61 62 2d 3e 6e 43 6f 6c 20 29 20 70 54 61 62 2d  ab->nCol ) pTab-
6610: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
6620: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  imKey = 1;.    }
6630: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
6640: 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d  nExpr>1 ) iCol =
6650: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69   -1;.  }.  if( i
6660: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
6670: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
6680: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
6690: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
66a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
66b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
66c0: 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47  mp(zType, "INTEG
66d0: 45 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ER")==0 ){.    p
66e0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
66f0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
6700: 43 6f 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a  Conf = onError;.
6710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
6720: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
6730: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
6740: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
6750: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73   0, 0);.    pLis
6760: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
6770: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
6780: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6790: 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20  elete(pList);.  
67a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
67b0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
67c0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
67d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
67e0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
67f0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
6800: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
6810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
6820: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
6830: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6840: 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e   char *zType, in
6850: 74 20 6e 54 79 70 65 29 7b 0a 20 20 54 61 62 6c  t nType){.  Tabl
6860: 65 20 2a 70 3b 0a 20 20 49 6e 64 65 78 20 2a 70  e *p;.  Index *p
6870: 49 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Idx;.  CollSeq *
6880: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
6890: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
68a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
68b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
68c0: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
68d0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
68e0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
68f0: 72 73 65 2c 20 7a 54 79 70 65 2c 20 6e 54 79 70  rse, zType, nTyp
6900: 65 29 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e);.  p->aCol[i]
6910: 2e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  .pColl = pColl;.
6920: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c  .  /* If the col
6930: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
6940: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
6950: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
6960: 74 79 70 65 3e 22 2c 0a 20 20 2a 2a 20 74 68 65  type>",.  ** the
6970: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
6980: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
6990: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
69a0: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  before the.  ** 
69b0: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
69c0: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
69d0: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
69e0: 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  the case..  */. 
69f0: 20 66 6f 72 28 70 49 64 78 20 3d 20 70 2d 3e 70   for(pIdx = p->p
6a00: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
6a10: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
6a20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
6a30: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
6a40: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
6a50: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 20 70  Column[0]==i ) p
6a60: 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
6a70: 6c 6c 5b 30 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[0] = pColl;. 
6a80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61   }.}../*.** Loca
6a90: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  te and return an
6aa0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6ab0: 64 62 2e 61 43 6f 6c 6c 53 65 71 20 68 61 73 68  db.aCollSeq hash
6ac0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 20 65   table. If the e
6ad0: 6e 74 72 79 0a 2a 2a 20 73 70 65 63 69 66 69 65  ntry.** specifie
6ae0: 64 20 62 79 20 7a 4e 61 6d 65 20 61 6e 64 20 6e  d by zName and n
6af0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 66 6f 75 6e  Name is not foun
6b00: 64 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  d and parameter 
6b10: 27 63 72 65 61 74 65 27 20 69 73 0a 2a 2a 20 74  'create' is.** t
6b20: 72 75 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  rue, then create
6b30: 20 61 20 6e 65 77 20 65 6e 74 72 79 2e 20 4f 74   a new entry. Ot
6b40: 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 4e  herwise return N
6b50: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ULL..**.** Each 
6b60: 70 6f 69 6e 74 65 72 20 73 74 6f 72 65 64 20 69  pointer stored i
6b70: 6e 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 43  n the sqlite3.aC
6b80: 6f 6c 6c 53 65 71 20 68 61 73 68 20 74 61 62 6c  ollSeq hash tabl
6b90: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a 2a 2a  e contains an.**
6ba0: 20 61 72 72 61 79 20 6f 66 20 74 68 72 65 65 20   array of three 
6bb0: 43 6f 6c 6c 53 65 71 20 73 74 72 75 63 74 75 72  CollSeq structur
6bc0: 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 73  es. The first is
6bd0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
6be0: 65 71 75 65 6e 63 65 0a 2a 2a 20 70 72 65 66 66  equence.** preff
6bf0: 65 72 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c  erred for UTF-8,
6c00: 20 74 68 65 20 73 65 63 6f 6e 64 20 55 54 46 2d   the second UTF-
6c10: 31 36 6c 65 2c 20 61 6e 64 20 74 68 65 20 74 68  16le, and the th
6c20: 69 72 64 20 55 54 46 2d 31 36 62 65 2e 0a 2a 2a  ird UTF-16be..**
6c30: 0a 2a 2a 20 53 74 6f 72 65 64 20 69 6d 6d 65 64  .** Stored immed
6c40: 69 61 74 65 6c 79 20 61 66 74 65 72 20 74 68 65  iately after the
6c50: 20 74 68 72 65 65 20 63 6f 6c 6c 61 74 69 6f 6e   three collation
6c60: 20 73 65 71 75 65 6e 63 65 73 20 69 73 20 61 20   sequences is a 
6c70: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 63  copy of.** the c
6c80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
6c90: 65 20 6e 61 6d 65 2e 20 41 20 70 6f 69 6e 74 65  e name. A pointe
6ca0: 72 20 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67  r to this string
6cb0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
6cc0: 20 65 61 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   each collation 
6cd0: 73 65 71 75 65 6e 63 65 20 73 74 72 75 63 74 75  sequence structu
6ce0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  re..*/.static Co
6cf0: 6c 6c 53 65 71 20 2a 20 66 69 6e 64 43 6f 6c 6c  llSeq * findColl
6d00: 53 65 71 45 6e 74 72 79 28 0a 20 20 73 71 6c 69  SeqEntry(.  sqli
6d10: 74 65 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  te *db,.  const 
6d20: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
6d30: 6e 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  nt nName,.  int 
6d40: 63 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c  create.){.  Coll
6d50: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 66  Seq *pColl;.  if
6d60: 28 20 6e 4e 61 6d 65 3c 30 20 29 20 6e 4e 61 6d  ( nName<0 ) nNam
6d70: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
6d80: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
6d90: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
6da0: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
6db0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 0a 20 20 69 66  e, nName);..  if
6dc0: 28 20 30 3d 3d 70 43 6f 6c 6c 20 26 26 20 63 72  ( 0==pColl && cr
6dd0: 65 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f 6c  eate ){.    pCol
6de0: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
6df0: 28 20 33 2a 73 69 7a 65 6f 66 28 2a 70 43 6f 6c  ( 3*sizeof(*pCol
6e00: 6c 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 20 29  l) + nName + 1 )
6e10: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
6e20: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 5b 30  ){.      pColl[0
6e30: 5d 2e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ].zName = (char*
6e40: 29 26 70 43 6f 6c 6c 5b 33 5d 3b 0a 20 20 20 20  )&pColl[3];.    
6e50: 20 20 70 43 6f 6c 6c 5b 30 5d 2e 65 6e 63 20 3d    pColl[0].enc =
6e60: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
6e70: 20 20 20 20 70 43 6f 6c 6c 5b 31 5d 2e 7a 4e 61      pColl[1].zNa
6e80: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f  me = (char*)&pCo
6e90: 6c 6c 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f  ll[3];.      pCo
6ea0: 6c 6c 5b 31 5d 2e 65 6e 63 20 3d 20 53 51 4c 49  ll[1].enc = SQLI
6eb0: 54 45 5f 55 54 46 31 36 4c 45 3b 0a 20 20 20 20  TE_UTF16LE;.    
6ec0: 20 20 70 43 6f 6c 6c 5b 32 5d 2e 7a 4e 61 6d 65    pColl[2].zName
6ed0: 20 3d 20 28 63 68 61 72 2a 29 26 70 43 6f 6c 6c   = (char*)&pColl
6ee0: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  [3];.      pColl
6ef0: 5b 32 5d 2e 65 6e 63 20 3d 20 53 51 4c 49 54 45  [2].enc = SQLITE
6f00: 5f 55 54 46 31 36 42 45 3b 0a 20 20 20 20 20 20  _UTF16BE;.      
6f10: 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 5b 30 5d 2e  memcpy(pColl[0].
6f20: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
6f30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
6f40: 6c 5b 30 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  l[0].zName[nName
6f50: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 0;.      sql
6f60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
6f70: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 70 43  db->aCollSeq, pC
6f80: 6f 6c 6c 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 6e 4e  oll[0].zName, nN
6f90: 61 6d 65 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  ame, pColl);.   
6fa0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6fb0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
6fc0: 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20  Parameter zName 
6fd0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 55 54 46 2d  points to a UTF-
6fe0: 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
6ff0: 20 6e 4e 61 6d 65 20 62 79 74 65 73 20 6c 6f 6e   nName bytes lon
7000: 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  g..** Return the
7010: 20 43 6f 6c 6c 53 65 71 2a 20 70 6f 69 6e 74 65   CollSeq* pointe
7020: 72 20 66 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  r for the collat
7030: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
7040: 65 64 20 7a 4e 61 6d 65 0a 2a 2a 20 66 6f 72 20  ed zName.** for 
7050: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 27 65 6e  the encoding 'en
7060: 63 27 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  c' from the data
7070: 62 61 73 65 20 27 64 62 27 2e 0a 2a 2a 0a 2a 2a  base 'db'..**.**
7080: 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 73 70   If the entry sp
7090: 65 63 69 66 69 65 64 20 69 73 20 6e 6f 74 20 66  ecified is not f
70a0: 6f 75 6e 64 20 61 6e 64 20 27 63 72 65 61 74 65  ound and 'create
70b0: 27 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ' is true, then 
70c0: 63 72 65 61 74 65 20 61 0a 2a 2a 20 6e 65 77 20  create a.** new 
70d0: 65 6e 74 72 79 2e 20 20 4f 74 68 65 72 77 69 73  entry.  Otherwis
70e0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  e return NULL..*
70f0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
7100: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 0a 20  e3FindCollSeq(. 
7110: 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a 20 20 75   sqlite *db,.  u
7120: 38 20 65 6e 63 2c 0a 20 20 63 6f 6e 73 74 20 63  8 enc,.  const c
7130: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
7140: 74 20 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 63  t nName,.  int c
7150: 72 65 61 74 65 0a 29 7b 0a 20 20 43 6f 6c 6c 53  reate.){.  CollS
7160: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 66 69 6e 64  eq *pColl = find
7170: 43 6f 6c 6c 53 65 71 45 6e 74 72 79 28 64 62 2c  CollSeqEntry(db,
7180: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 63   zName, nName, c
7190: 72 65 61 74 65 29 3b 0a 20 20 69 66 28 20 70 43  reate);.  if( pC
71a0: 6f 6c 6c 20 29 20 73 77 69 74 63 68 28 20 65 6e  oll ) switch( en
71b0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
71c0: 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20  LITE_UTF8:.     
71d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
71e0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a   SQLITE_UTF16LE:
71f0: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 26  .      pColl = &
7200: 70 43 6f 6c 6c 5b 31 5d 3b 0a 20 20 20 20 20 20  pColl[1];.      
7210: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
7220: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a  SQLITE_UTF16BE:.
7230: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 26 70        pColl = &p
7240: 43 6f 6c 6c 5b 32 5d 3b 0a 20 20 20 20 20 20 62  Coll[2];.      b
7250: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
7260: 74 3a 20 0a 20 20 20 20 20 20 61 73 73 65 72 74  t: .      assert
7270: 28 21 22 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  (!"Cannot happen
7280: 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ");.  }.  return
7290: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 73 74 61 74 69   pColl;.}..stati
72a0: 63 20 76 6f 69 64 20 63 61 6c 6c 43 6f 6c 6c 4e  c void callCollN
72b0: 65 65 64 65 64 28 73 71 6c 69 74 65 20 2a 64 62  eeded(sqlite *db
72c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
72d0: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
72e0: 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6c 6c 61 74 69  .  /* No collati
72f0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74  on sequence of t
7300: 68 69 73 20 74 79 70 65 20 66 6f 72 20 74 68 69  his type for thi
7310: 73 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65  s encoding is re
7320: 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2a 20 43  gistered..  ** C
7330: 61 6c 6c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  all the collatio
7340: 6e 20 66 61 63 74 6f 72 79 20 74 6f 20 73 65 65  n factory to see
7350: 20 69 66 20 69 74 20 63 61 6e 20 73 75 70 70 6c   if it can suppl
7360: 79 20 75 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20  y us with one.. 
7370: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
7380: 20 2a 7a 45 78 74 65 72 6e 61 6c 20 3d 20 30 3b   *zExternal = 0;
7390: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
73a0: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 7c 7c 20 21  xCollNeeded || !
73b0: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
73c0: 36 20 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  6 );.  if( nName
73d0: 3c 30 20 29 20 6e 4e 61 6d 65 20 3d 20 73 74 72  <0 ) nName = str
73e0: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
73f0: 28 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65  ( db->xCollNeede
7400: 64 20 29 7b 0a 20 20 20 20 7a 45 78 74 65 72 6e  d ){.    zExtern
7410: 61 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  al = sqliteStrND
7420: 75 70 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  up(zName, nName)
7430: 3b 0a 20 20 20 20 69 66 28 20 21 7a 45 78 74 65  ;.    if( !zExte
7440: 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  rnal ) return;. 
7450: 20 20 20 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65       db->xCollNe
7460: 65 64 65 64 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65  eded(db->pCollNe
7470: 65 64 65 64 41 72 67 2c 20 64 62 2c 20 28 69 6e  ededArg, db, (in
7480: 74 29 64 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65  t)db->enc, zExte
7490: 72 6e 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rnal);.  }.  if(
74a0: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
74b0: 31 36 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  16 ){.    sqlite
74c0: 33 5f 76 61 6c 75 65 20 2a 70 54 6d 70 20 3d 20  3_value *pTmp = 
74d0: 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73 69  sqlite3GetTransi
74e0: 65 6e 74 56 61 6c 75 65 28 64 62 29 3b 0a 20 20  entValue(db);.  
74f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
7500: 74 53 74 72 28 70 54 6d 70 2c 20 2d 31 2c 20 7a  tStr(pTmp, -1, z
7510: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
7520: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7530: 29 3b 0a 20 20 20 20 7a 45 78 74 65 72 6e 61 6c  );.    zExternal
7540: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
7550: 65 78 74 28 70 54 6d 70 2c 20 53 51 4c 49 54 45  ext(pTmp, SQLITE
7560: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
7570: 20 20 20 69 66 28 20 21 7a 45 78 74 65 72 6e 61     if( !zExterna
7580: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
7590: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
75a0: 36 28 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65  6(db->pCollNeede
75b0: 64 41 72 67 2c 20 64 62 2c 20 28 69 6e 74 29 64  dArg, db, (int)d
75c0: 62 2d 3e 65 6e 63 2c 20 7a 45 78 74 65 72 6e 61  b->enc, zExterna
75d0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  l);.  }.}..stati
75e0: 63 20 69 6e 74 20 73 79 6e 74 68 43 6f 6c 6c 53  c int synthCollS
75f0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
7600: 2c 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  , CollSeq *pColl
7610: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  ){.  /* The coll
7620: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 66 61  ation factory fa
7630: 69 6c 65 64 20 74 6f 20 64 65 6c 69 76 65 72 20  iled to deliver 
7640: 61 20 66 75 6e 63 74 69 6f 6e 20 62 75 74 20 74  a function but t
7650: 68 65 72 65 20 6d 61 79 20 62 65 0a 20 20 2a 2a  here may be.  **
7660: 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20   other versions 
7670: 6f 66 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  of this collatio
7680: 6e 20 66 75 6e 63 74 69 6f 6e 20 28 66 6f 72 20  n function (for 
7690: 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64  other text encod
76a0: 69 6e 67 73 29 0a 20 20 2a 2a 20 61 76 61 69 6c  ings).  ** avail
76b0: 61 62 6c 65 2e 20 55 73 65 20 6f 6e 65 20 6f 66  able. Use one of
76c0: 20 74 68 65 73 65 20 69 6e 73 74 65 61 64 2e 20   these instead. 
76d0: 41 76 6f 69 64 20 61 20 55 54 46 2d 38 20 3c 2d  Avoid a UTF-8 <-
76e0: 3e 20 55 54 46 2d 31 36 0a 20 20 2a 2a 20 63 6f  > UTF-16.  ** co
76f0: 6e 76 65 72 73 69 6f 6e 20 69 66 20 70 6f 73 73  nversion if poss
7700: 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 43 6f 6c  ible..  */.  Col
7710: 6c 53 65 71 20 2a 70 43 6f 6c 6c 32 20 3d 20 30  lSeq *pColl2 = 0
7720: 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 43  ;.  char *z = pC
7730: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 69 6e  oll->zName;.  in
7740: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  t n = strlen(z);
7750: 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 72 73  .  switch( pPars
7760: 65 2d 3e 64 62 2d 3e 65 6e 63 20 29 7b 0a 20 20  e->db->enc ){.  
7770: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
7780: 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 70 43 6f  F16LE:.      pCo
7790: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ll2 = sqlite3Fin
77a0: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
77b0: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  >db, SQLITE_UTF1
77c0: 36 42 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20  6BE, z, n, 0);. 
77d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
77e0: 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ll2 );.      if(
77f0: 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 20   pColl2->xCmp ) 
7800: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 6f  break;.      pCo
7810: 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ll2 = sqlite3Fin
7820: 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2d  dCollSeq(pParse-
7830: 3e 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  >db, SQLITE_UTF8
7840: 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20  , z, n, 0);.    
7850: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 32    assert( pColl2
7860: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
7870: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
7880: 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20 20  E_UTF16BE:.     
7890: 20 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65   pColl2 = sqlite
78a0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61  3FindCollSeq(pPa
78b0: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55  rse->db,SQLITE_U
78c0: 54 46 31 36 4c 45 2c 20 7a 2c 20 6e 2c 20 30 29  TF16LE, z, n, 0)
78d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
78e0: 70 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20  pColl2 );.      
78f0: 69 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70  if( pColl2->xCmp
7900: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7910: 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33  pColl2 = sqlite3
7920: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72  FindCollSeq(pPar
7930: 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54  se->db,SQLITE_UT
7940: 46 38 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a 20 20  F8, z, n, 0);.  
7950: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
7960: 6c 32 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  l2 );.      brea
7970: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  k;..    case SQL
7980: 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20  ITE_UTF8:.      
7990: 70 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33  pColl2 = sqlite3
79a0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72  FindCollSeq(pPar
79b0: 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54  se->db,SQLITE_UT
79c0: 46 31 36 42 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b  F16BE, z, n, 0);
79d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
79e0: 43 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 69  Coll2 );.      i
79f0: 66 28 20 70 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20  f( pColl2->xCmp 
7a00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
7a10: 43 6f 6c 6c 32 20 3d 20 73 71 6c 69 74 65 33 46  Coll2 = sqlite3F
7a20: 69 6e 64 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  indCollSeq(pPars
7a30: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 55 54 46  e->db,SQLITE_UTF
7a40: 31 36 4c 45 2c 20 7a 2c 20 6e 2c 20 30 29 3b 0a  16LE, z, n, 0);.
7a50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
7a60: 6f 6c 6c 32 20 29 3b 0a 20 20 20 20 20 20 62 72  oll2 );.      br
7a70: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
7a80: 43 6f 6c 6c 32 2d 3e 78 43 6d 70 20 29 7b 0a 20  Coll2->xCmp ){. 
7a90: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 6c 6c 2c     memcpy(pColl,
7aa0: 20 70 43 6f 6c 6c 32 2c 20 73 69 7a 65 6f 66 28   pColl2, sizeof(
7ab0: 43 6f 6c 6c 53 65 71 29 29 3b 0a 20 20 7d 65 6c  CollSeq));.  }el
7ac0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  se{.    if( pPar
7ad0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
7ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e       sqlite3SetN
7af0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
7b00: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
7b10: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
7b20: 65 6e 63 65 3a 20 22 2c 20 0a 20 20 20 20 20 20  ence: ", .      
7b30: 20 20 20 20 2d 31 2c 20 7a 2c 20 6e 2c 20 30 29      -1, z, n, 0)
7b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
7b50: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
7b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
7b70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
7b80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7b90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7ba0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  ne is called on 
7bb0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
7bc0: 65 6e 63 65 20 62 65 66 6f 72 65 20 69 74 20 69  ence before it i
7bd0: 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 68 65  s used to.** che
7be0: 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ck that it is de
7bf0: 66 69 6e 65 64 2e 20 41 6e 20 75 6e 64 65 66 69  fined. An undefi
7c00: 6e 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ned collation se
7c10: 71 75 65 6e 63 65 20 65 78 69 73 74 73 20 77 68  quence exists wh
7c20: 65 6e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  en.** a database
7c30: 20 69 73 20 6c 6f 61 64 65 64 20 74 68 61 74 20   is loaded that 
7c40: 63 6f 6e 74 61 69 6e 73 20 72 65 66 65 72 65 6e  contains referen
7c50: 63 65 73 20 74 6f 20 63 6f 6c 6c 61 74 69 6f 6e  ces to collation
7c60: 20 73 65 71 75 65 6e 63 65 73 0a 2a 2a 20 74 68   sequences.** th
7c70: 61 74 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e  at have not been
7c80: 20 64 65 66 69 6e 65 64 20 62 79 20 73 71 6c 69   defined by sqli
7c90: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
7ca0: 74 69 6f 6e 28 29 20 65 74 63 2e 0a 2a 2a 0a 2a  tion() etc..**.*
7cb0: 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 74  * If required, t
7cc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  his routine call
7cd0: 73 20 74 68 65 20 27 63 6f 6c 6c 61 74 69 6f 6e  s the 'collation
7ce0: 20 6e 65 65 64 65 64 27 20 63 61 6c 6c 62 61 63   needed' callbac
7cf0: 6b 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  k to.** request 
7d00: 61 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  a definition of 
7d10: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
7d20: 71 75 65 6e 63 65 2e 20 49 66 20 74 68 69 73 20  quence. If this 
7d30: 64 6f 65 73 6e 27 74 20 77 6f 72 6b 2c 20 0a 2a  doesn't work, .*
7d40: 2a 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  * an equivalent 
7d50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7d60: 63 65 20 74 68 61 74 20 75 73 65 73 20 61 20 74  ce that uses a t
7d70: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 64 69 66  ext encoding dif
7d80: 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74  ferent.** from t
7d90: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7da0: 20 69 73 20 73 75 62 73 74 69 74 75 74 65 64 2c   is substituted,
7db0: 20 69 66 20 6f 6e 65 20 69 73 20 61 76 61 69 6c   if one is avail
7dc0: 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
7dd0: 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71  ite3CheckCollSeq
7de0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7df0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
7e00: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
7e10: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a  !pColl->xCmp ){.
7e20: 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e 65 65 64      callCollNeed
7e30: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ed(pParse->db, p
7e40: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72  Coll->zName, str
7e50: 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  len(pColl->zName
7e60: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f  ));.    if( !pCo
7e70: 6c 6c 2d 3e 78 43 6d 70 20 26 26 20 73 79 6e 74  ll->xCmp && synt
7e80: 68 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  hCollSeq(pParse,
7e90: 20 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   pColl) ){.     
7ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
7eb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
7ec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ed0: 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  OK;.}..int sqlit
7ee0: 65 33 43 68 65 63 6b 49 6e 64 65 78 43 6f 6c 6c  e3CheckIndexColl
7ef0: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
7f00: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
7f10: 0a 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20  .  if( pIdx ){. 
7f20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
7f30: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
7f40: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
7f50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
7f60: 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72  heckCollSeq(pPar
7f70: 73 65 2c 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66  se, pIdx->keyInf
7f80: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20  o.aColl[i]) ){. 
7f90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
7fa0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
7fb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7fc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7fe0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
7ff0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
8000: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
8010: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
8020: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
8030: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
8040: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
8050: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
8060: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
8070: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
8080: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
8090: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
80a0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
80b0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
80c0: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
80d0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
80e0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
80f0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
8100: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
8110: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
8120: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
8130: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
8140: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
8150: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
8160: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
8170: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
8180: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
8190: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
81a0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
81b0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
81c0: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
81d0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
81e0: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
81f0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
8200: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8210: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8220: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
8230: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 43 6f 6c 6c   pParse..*/.Coll
8240: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
8250: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
8260: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
8270: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
8280: 6e 4e 61 6d 65 29 7b 0a 20 20 75 38 20 65 6e 63  nName){.  u8 enc
8290: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
82a0: 6e 63 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  nc;.  u8 initbus
82b0: 79 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  y = pParse->db->
82c0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
82d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
82e0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
82f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63  (pParse->db, enc
8300: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
8310: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
8320: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
8330: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
8340: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 2f 2a  >xCmp) ){.    /*
8350: 20 4e 6f 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   No collation se
8360: 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 74  quence of this t
8370: 79 70 65 20 66 6f 72 20 74 68 69 73 20 65 6e 63  ype for this enc
8380: 6f 64 69 6e 67 20 69 73 20 72 65 67 69 73 74 65  oding is registe
8390: 72 65 64 2e 0a 20 20 20 20 2a 2a 20 43 61 6c 6c  red..    ** Call
83a0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
83b0: 61 63 74 6f 72 79 20 74 6f 20 73 65 65 20 69 66  actory to see if
83c0: 20 69 74 20 63 61 6e 20 73 75 70 70 6c 79 20 75   it can supply u
83d0: 73 20 77 69 74 68 20 6f 6e 65 2e 0a 20 20 20 20  s with one..    
83e0: 2a 2f 0a 20 20 20 20 63 61 6c 6c 43 6f 6c 6c 4e  */.    callCollN
83f0: 65 65 64 65 64 28 70 50 61 72 73 65 2d 3e 64 62  eeded(pParse->db
8400: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
8410: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
8420: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
8430: 70 50 61 72 73 65 2d 3e 64 62 2c 20 65 6e 63 2c  pParse->db, enc,
8440: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30   zName, nName, 0
8450: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
8460: 20 26 26 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   && !pColl->xCmp
8470: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
8480: 72 65 20 6d 61 79 20 62 65 20 61 20 76 65 72 73  re may be a vers
8490: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61  ion of the colla
84a0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
84b0: 61 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  at requires.    
84c0: 20 20 2a 2a 20 74 72 61 6e 73 6c 61 74 69 6f 6e    ** translation
84d0: 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e   between encodin
84e0: 67 73 2e 20 53 65 61 72 63 68 20 66 6f 72 20 69  gs. Search for i
84f0: 74 20 77 69 74 68 20 73 79 6e 74 68 43 6f 6c 6c  t with synthColl
8500: 53 65 71 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  Seq()..      */.
8510: 20 20 20 20 20 20 69 66 28 20 73 79 6e 74 68 43        if( synthC
8520: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8530: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
8540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
8550: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8560: 2f 2a 20 49 66 20 6e 6f 74 68 69 6e 67 20 68 61  /* If nothing ha
8570: 73 20 62 65 65 6e 20 66 6f 75 6e 64 2c 20 77 72  s been found, wr
8580: 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ite the error me
8590: 73 73 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73  ssage into pPars
85a0: 65 20 2a 2f 0a 20 20 69 66 28 20 21 69 6e 69 74  e */.  if( !init
85b0: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
85c0: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
85d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
85e0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
85f0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e       sqlite3SetN
8600: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
8610: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
8620: 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  h collation sequ
8630: 65 6e 63 65 3a 20 22 2c 20 2d 31 2c 0a 20 20 20  ence: ", -1,.   
8640: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 6e 4e         zName, nN
8650: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
8660: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
8670: 2b 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  +;.    pColl = 0
8680: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8690: 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  Coll;.}..../*.**
86a0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
86b0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
86c0: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
86d0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
86e0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
86f0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2f 0a 63  inity type..*/.c
8700: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
8710: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
8720: 61 72 20 2a 7a 54 79 70 65 2c 20 69 6e 74 20 6e  ar *zType, int n
8730: 54 79 70 65 29 7b 0a 20 20 69 6e 74 20 6e 2c 20  Type){.  int n, 
8740: 69 3b 0a 20 20 73 74 72 75 63 74 20 7b 0a 20 20  i;.  struct {.  
8750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
8760: 75 62 3b 20 20 2f 2a 20 4b 65 79 77 6f 72 64 73  ub;  /* Keywords
8770: 20 73 75 62 73 74 72 69 6e 67 20 74 6f 20 73 65   substring to se
8780: 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 20 20  arch for */.    
8790: 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20  int nSub;       
87a0: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
87b0: 7a 53 75 62 20 2a 2f 0a 20 20 20 20 63 68 61 72  zSub */.    char
87c0: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 2f   affinity;     /
87d0: 2a 20 41 66 66 69 6e 69 74 79 20 74 6f 20 72 65  * Affinity to re
87e0: 74 75 72 6e 20 69 66 20 69 74 20 6d 61 74 63 68  turn if it match
87f0: 65 73 20 2a 2f 0a 20 20 7d 20 73 75 62 73 74 72  es */.  } substr
8800: 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ings[] = {.    {
8810: 22 49 4e 54 22 2c 20 20 33 2c 20 53 51 4c 49 54  "INT",  3, SQLIT
8820: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 7d 2c 0a  E_AFF_INTEGER},.
8830: 20 20 20 20 7b 22 43 48 41 52 22 2c 20 34 2c 20      {"CHAR", 4, 
8840: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 7d  SQLITE_AFF_TEXT}
8850: 2c 0a 20 20 20 20 7b 22 43 4c 4f 42 22 2c 20 34  ,.    {"CLOB", 4
8860: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  , SQLITE_AFF_TEX
8870: 54 7d 2c 0a 20 20 20 20 7b 22 54 45 58 54 22 2c  T},.    {"TEXT",
8880: 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   4, SQLITE_AFF_T
8890: 45 58 54 7d 2c 0a 20 20 20 20 7b 22 42 4c 4f 42  EXT},.    {"BLOB
88a0: 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 46 46  ", 4, SQLITE_AFF
88b0: 5f 4e 4f 4e 45 7d 2c 0a 20 20 7d 3b 0a 0a 20 20  _NONE},.  };..  
88c0: 69 66 28 20 6e 54 79 70 65 3d 3d 30 20 29 7b 0a  if( nType==0 ){.
88d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
88e0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  E_AFF_NONE;.  }.
88f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
8900: 65 6f 66 28 73 75 62 73 74 72 69 6e 67 73 29 2f  eof(substrings)/
8910: 73 69 7a 65 6f 66 28 73 75 62 73 74 72 69 6e 67  sizeof(substring
8920: 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
8930: 20 69 6e 74 20 63 31 20 3d 20 73 75 62 73 74 72   int c1 = substr
8940: 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 5b 30 5d 3b  ings[i].zSub[0];
8950: 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 74 6f  .    int c2 = to
8960: 6c 6f 77 65 72 28 63 31 29 3b 0a 20 20 20 20 69  lower(c1);.    i
8970: 6e 74 20 6c 69 6d 69 74 20 3d 20 6e 54 79 70 65  nt limit = nType
8980: 20 2d 20 73 75 62 73 74 72 69 6e 67 73 5b 69 5d   - substrings[i]
8990: 2e 6e 53 75 62 3b 0a 20 20 20 20 63 6f 6e 73 74  .nSub;.    const
89a0: 20 63 68 61 72 20 2a 7a 20 3d 20 73 75 62 73 74   char *z = subst
89b0: 72 69 6e 67 73 5b 69 5d 2e 7a 53 75 62 3b 0a 20  rings[i].zSub;. 
89c0: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 3d 6c     for(n=0; n<=l
89d0: 69 6d 69 74 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  imit; n++){.    
89e0: 20 20 69 6e 74 20 63 20 3d 20 7a 54 79 70 65 5b    int c = zType[
89f0: 6e 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  n];.      if( (c
8a00: 3d 3d 63 31 20 7c 7c 20 63 3d 3d 63 32 29 0a 20  ==c1 || c==c2). 
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30              && 0
8a20: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
8a30: 70 28 26 7a 54 79 70 65 5b 6e 5d 2c 20 7a 2c 20  p(&zType[n], z, 
8a40: 73 75 62 73 74 72 69 6e 67 73 5b 69 5d 2e 6e 53  substrings[i].nS
8a50: 75 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ub) ){.        r
8a60: 65 74 75 72 6e 20 73 75 62 73 74 72 69 6e 67 73  eturn substrings
8a70: 5b 69 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [i].affinity;.  
8a80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8aa0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 7d 0a 0a  AFF_NUMERIC;.}..
8ab0: 2f 2a 0a 2a 2a 20 43 6f 6d 65 20 75 70 20 77 69  /*.** Come up wi
8ac0: 74 68 20 61 20 6e 65 77 20 72 61 6e 64 6f 6d 20  th a new random 
8ad0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 63  value for the sc
8ae0: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 4d 61  hema cookie.  Ma
8af0: 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 6e  ke sure.** the n
8b00: 65 77 20 76 61 6c 75 65 20 69 73 20 64 69 66 66  ew value is diff
8b10: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
8b20: 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ld..**.** The sc
8b30: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
8b40: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
8b50: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
8b60: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
8b70: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
8b80: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
8b90: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
8ba0: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
8bb0: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
8bc0: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
8bd0: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
8be0: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
8bf0: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
8c00: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
8c10: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
8c20: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
8c30: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
8c40: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
8c50: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
8c60: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
8c70: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
8c80: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
8c90: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
8ca0: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
8cb0: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
8cc0: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
8cd0: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
8ce0: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
8cf0: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
8d00: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
8d10: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
8d20: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
8d30: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
8d40: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
8d50: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
8d60: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
8d70: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
8d80: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
8d90: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
8da0: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
8db0: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
8dc0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
8dd0: 69 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 56  ie(sqlite *db, V
8de0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 44 62 29  dbe *v, int iDb)
8df0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
8e00: 72 20 72 3b 0a 20 20 69 6e 74 20 2a 70 53 63 68  r r;.  int *pSch
8e10: 65 6d 61 43 6f 6f 6b 69 65 20 3d 20 26 28 64 62  emaCookie = &(db
8e20: 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65 6d  ->aDb[iDb].schem
8e30: 61 5f 63 6f 6f 6b 69 65 29 3b 0a 0a 20 20 73 71  a_cookie);..  sq
8e40: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
8e50: 31 2c 20 26 72 29 3b 0a 20 20 2a 70 53 63 68 65  1, &r);.  *pSche
8e60: 6d 61 43 6f 6f 6b 69 65 20 3d 20 2a 70 53 63 68  maCookie = *pSch
8e70: 65 6d 61 43 6f 6f 6b 69 65 20 2b 20 72 20 2b 20  emaCookie + r + 
8e80: 31 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  1;.  db->flags |
8e90: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
8ea0: 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65  hanges;.  sqlite
8eb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8ec0: 5f 49 6e 74 65 67 65 72 2c 20 2a 70 53 63 68 65  _Integer, *pSche
8ed0: 6d 61 43 6f 6f 6b 69 65 2c 20 30 29 3b 0a 20 20  maCookie, 0);.  
8ee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ef0: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
8f00: 2c 20 69 44 62 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  , iDb, 0);.}../*
8f10: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
8f20: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
8f30: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
8f40: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
8f50: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
8f60: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
8f70: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
8f80: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
8f90: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
8fa0: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
8fb0: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  rminator..*/.sta
8fc0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
8fd0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
8fe0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  z){.  int n;.  i
8ff0: 6e 74 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 30  nt needQuote = 0
9000: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
9010: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
9020: 69 66 28 20 2a 7a 3d 3d 27 5c 27 27 20 29 7b 20  if( *z=='\'' ){ 
9030: 6e 2b 2b 3b 20 6e 65 65 64 51 75 6f 74 65 3d 31  n++; needQuote=1
9040: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
9050: 20 6e 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32   n + needQuote*2
9060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9070: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
9080: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
9090: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
90a0: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
90b0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
90c0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
90d0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
90e0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
90f0: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 29 7b 0a   char *zIdent){.
9100: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
9110: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
9120: 64 78 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  dx;.  for(j=0; z
9130: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
9140: 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d      if( !isalnum
9150: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
9160: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
9170: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
9180: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
9190: 5b 6a 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69  [j]!=0 || isdigi
91a0: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20  t(zIdent[0]).   
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
91c0: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
91d0: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
91e0: 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65  =TK_ID;.  if( ne
91f0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
9200: 20 3d 20 27 5c 27 27 3b 0a 20 20 66 6f 72 28 6a   = '\'';.  for(j
9210: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
9220: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
9230: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
9240: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
9250: 27 5c 27 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  '\'' ) z[i++] = 
9260: 27 5c 27 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20  '\'';.  }.  if( 
9270: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
9280: 2b 5d 20 3d 20 27 5c 27 27 3b 0a 20 20 7a 5b 69  +] = '\'';.  z[i
9290: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
92a0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
92b0: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
92c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
92d0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
92e0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
92f0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
9300: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
9310: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
9320: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
9330: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9340: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
9350: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
9360: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
9370: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
9380: 65 54 61 62 6c 65 53 74 6d 74 28 54 61 62 6c 65  eTableStmt(Table
9390: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
93a0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
93b0: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
93c0: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
93d0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
93e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
93f0: 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  i++){.    n += i
9400: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 61 43  dentLength(p->aC
9410: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[i].zName);.  
9420: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 5b 69 5d    if( p->aCol[i]
9430: 2e 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  .zType ){.      
9440: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 70 2d 3e  n += (strlen(p->
9450: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 29 20 2b  aCol[i].zType) +
9460: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
9470: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
9480: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
9490: 66 28 20 6e 3c 34 30 20 29 7b 0a 20 20 20 20 7a  f( n<40 ){.    z
94a0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
94b0: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
94c0: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
94d0: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
94e0: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
94f0: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
9500: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
9510: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
9520: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
9530: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
9540: 61 77 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  aw( n );.  if( z
9550: 53 74 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Stmt==0 ) return
9560: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 7a 53 74   0;.  strcpy(zSt
9570: 6d 74 2c 20 70 2d 3e 69 44 62 3d 3d 31 20 3f 20  mt, p->iDb==1 ? 
9580: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
9590: 4c 45 20 22 20 3a 20 22 43 52 45 41 54 45 20 54  LE " : "CREATE T
95a0: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
95b0: 74 72 6c 65 6e 28 7a 53 74 6d 74 29 3b 0a 20 20  trlen(zStmt);.  
95c0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
95d0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
95e0: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
95f0: 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ';.  for(i=0; i<
9600: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
9610: 20 20 20 73 74 72 63 70 79 28 26 7a 53 74 6d 74     strcpy(&zStmt
9620: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
9630: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
9640: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
9650: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
9660: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
9670: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
9680: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  me);.    if( p->
9690: 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70 65 20 29 7b  aCol[i].zType ){
96a0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b  .      zStmt[k++
96b0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 73  ] = ' ';.      s
96c0: 74 72 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c  trcpy(&zStmt[k],
96d0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 54 79 70   p->aCol[i].zTyp
96e0: 65 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  e);.      k += s
96f0: 74 72 6c 65 6e 28 70 2d 3e 61 43 6f 6c 5b 69 5d  trlen(p->aCol[i]
9700: 2e 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20  .zType);.    }. 
9710: 20 7d 0a 20 20 73 74 72 63 70 79 28 26 7a 53 74   }.  strcpy(&zSt
9720: 6d 74 5b 6b 5d 2c 20 7a 45 6e 64 29 3b 0a 20 20  mt[k], zEnd);.  
9730: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
9740: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9750: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
9760: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
9770: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
9780: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
9790: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
97a0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
97b0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
97c0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
97d0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
97e0: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
97f0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
9800: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
9810: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
9820: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
9830: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
9840: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
9850: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
9860: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
9870: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
9880: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
9890: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
98a0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
98b0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
98c0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
98d0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
98e0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
98f0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
9900: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
9910: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
9920: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
9930: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
9940: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
9950: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
9960: 61 6e 67 65 73 2c 20 73 6f 20 74 68 65 20 65 6e  anges, so the en
9970: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
9980: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
9990: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
99a0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
99b0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
99c0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
99d0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
99e0: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
99f0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
9a00: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
9a10: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
9a20: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
9a30: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
9a40: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
9a50: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
9a60: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
9a70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
9a80: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
9a90: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
9aa0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
9ab0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9ac0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
9ad0: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
9ae0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
9af0: 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 53  , Token *pEnd, S
9b00: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
9b10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
9b20: 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72  qlite *db = pPar
9b30: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 28  se->db;..  if( (
9b40: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
9b50: 63 74 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65  ct==0) || pParse
9b60: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
9b70: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
9b80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
9b90: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9ba0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
9bb0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
9bc0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
9bd0: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
9be0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
9bf0: 62 6c 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ble is generated
9c00: 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 2c 20   from a SELECT, 
9c10: 74 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 20 74  then construct t
9c20: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20  he.  ** list of 
9c30: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
9c40: 74 65 78 74 20 6f 66 20 74 68 65 20 74 61 62 6c  text of the tabl
9c50: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  e..  */.  if( pS
9c60: 65 6c 65 63 74 20 29 7b 0a 20 20 7d 0a 0a 20 20  elect ){.  }..  
9c70: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
9c80: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
9c90: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
9ca0: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
9cb0: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
9cc0: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
9cd0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
9ce0: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
9cf0: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
9d00: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
9d10: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
9d20: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
9d30: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
9d40: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
9d50: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
9d60: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
9d70: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
9d80: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
9d90: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
9da0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
9db0: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
9dc0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
9dd0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
9de0: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
9df0: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
9e00: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
9e10: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
9e20: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
9e30: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
9e40: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
9e50: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
9e60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
9e70: 2e 20 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75  .  The record nu
9e80: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
9e90: 65 20 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72  e new table entr
9ea0: 79 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  y should already
9eb0: 20 62 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b   be on the stack
9ec0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
9ed0: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
9ee0: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
9ef0: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
9f00: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
9f10: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
9f20: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
9f30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
9f40: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
9f50: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
9f60: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
9f70: 2a 76 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  *v;..    v = sql
9f80: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9f90: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
9fa0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
9fb0: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
9fc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
9fd0: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
9fe0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
9ff0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  dbeOp3(v, OP_Cre
a000: 61 74 65 54 61 62 6c 65 2c 20 30 2c 20 70 2d 3e  ateTable, 0, p->
a010: 69 44 62 2c 20 28 63 68 61 72 2a 29 26 70 2d 3e  iDb, (char*)&p->
a020: 74 6e 75 6d 2c 20 50 33 5f 50 4f 49 4e 54 45 52  tnum, P3_POINTER
a030: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a040: 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f      /* A view */
a050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a060: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
a070: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
a080: 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20    }.    p->tnum 
a090: 3d 20 30 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  = 0;..    sqlite
a0a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a0b0: 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 0a  _Close, 0, 0);..
a0c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
a0d0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
a0e0: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
a0f0: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
a100: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
a110: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
a120: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
a130: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
a140: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
a150: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
a160: 69 73 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  is on the top of
a170: 20 74 68 65 20 76 64 62 65 20 73 74 61 63 6b 2e   the vdbe stack.
a180: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
a190: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
a1a0: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
a1b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
a1c0: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
a1d0: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
a1e0: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
a1f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
a200: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
a210: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
a220: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
a230: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
a240: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 54  elect ){.      T
a250: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20  able *pSelTab;. 
a260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a280: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a2a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d  , OP_Integer, p-
a2b0: 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  >iDb, 0);.      
a2c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a2d0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
a2e0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
a2f0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
a300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
a310: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
a320: 6c 65 63 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  lect, SRT_Table,
a330: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   1, 0, 0, 0, 0);
a340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a350: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
a360: 6f 73 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ose, 1, 0);.    
a370: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
a380: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
a390: 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
a3a0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
a3b0: 65 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70  ect(pParse, 0, p
a3c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
a3d0: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
a3e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
a3f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
a400: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l==0 );.        
a410: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
a420: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
a430: 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
a440: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
a450: 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20    pSelTab->nCol 
a460: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65  = 0;.        pSe
a470: 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
a480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
a490: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53  eleteTable(0, pS
a4a0: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  elTab);.      }.
a4b0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 73 71 6c      }.  .    sql
a4c0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
a4d0: 62 6c 65 28 76 2c 20 70 2d 3e 69 44 62 29 3b 0a  ble(v, p->iDb);.
a4e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a4f0: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
a500: 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 70 53 65 6c  8, 0, 0, p->pSel
a510: 65 63 74 3d 3d 30 3f 22 74 61 62 6c 65 22 3a 22  ect==0?"table":"
a520: 76 69 65 77 22 2c 50 33 5f 53 54 41 54 49 43 29  view",P3_STATIC)
a530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a540: 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e  eOp3(v, OP_Strin
a550: 67 38 2c 20 30 2c 20 30 2c 20 70 2d 3e 7a 4e 61  g8, 0, 0, p->zNa
a560: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
a570: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
a580: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20  _String8, 0, 0, 
a590: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
a5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a5b0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 33  Op(v, OP_Pull, 3
a5c0: 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  , 0);..    if( p
a5d0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
a5e0: 63 68 61 72 20 2a 7a 20 3d 20 63 72 65 61 74 65  char *z = create
a5f0: 54 61 62 6c 65 53 74 6d 74 28 70 29 3b 0a 20 20  TableStmt(p);.  
a600: 20 20 20 20 6e 20 3d 20 7a 20 3f 20 73 74 72 6c      n = z ? strl
a610: 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20 20 20 20  en(z) : 0;.     
a620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a630: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
a640: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a650: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a660: 33 28 76 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  3(v, -1, z, n);.
a670: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
a680: 28 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (z);.    }else{.
a690: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65        if( p->pSe
a6a0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
a6b0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a6c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
a6d0: 20 30 2c 20 22 43 52 45 41 54 45 20 56 49 45 57   0, "CREATE VIEW
a6e0: 20 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a   ", P3_STATIC);.
a6f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a700: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a710: 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op3(v, OP_String
a720: 38 2c 20 30 2c 20 30 2c 20 22 43 52 45 41 54 45  8, 0, 0, "CREATE
a730: 20 54 41 42 4c 45 20 22 2c 20 50 33 5f 53 54 41   TABLE ", P3_STA
a740: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
a750: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64      assert( pEnd
a760: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  !=0 );.      n =
a770: 20 41 64 64 72 28 70 45 6e 64 2d 3e 7a 29 20 2d   Addr(pEnd->z) -
a780: 20 41 64 64 72 28 70 50 61 72 73 65 2d 3e 73 4e   Addr(pParse->sN
a790: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b  ameToken.z) + 1;
a7a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a7b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
a7c0: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
a7d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a7e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
a7f0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
a800: 6e 2e 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  n.z, n);.      s
a810: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a820: 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32 2c  v, OP_Concat, 2,
a830: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
a840: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a850: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a860: 35 2c 20 30 2c 20 22 74 74 74 69 74 22 2c 20 50  5, 0, "tttit", P
a870: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  3_STATIC);.    s
a880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a890: 76 2c 20 4f 50 5f 50 75 74 49 6e 74 4b 65 79 2c  v, OP_PutIntKey,
a8a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
a8b0: 70 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  p->iDb!=1 ){.   
a8c0: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
a8d0: 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 2d  Cookie(db, v, p-
a8e0: 3e 69 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >iDb);.    }.   
a8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a900: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30  p(v, OP_Close, 0
a910: 2c 20 30 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  , 0);..    sqlit
a920: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
a930: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
a940: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
a950: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
a960: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
a970: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
a980: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
a990: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a9a0: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  ==0 && pParse->n
a9b0: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61  Err==0 ){.    Ta
a9c0: 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46  ble *pOld;.    F
a9d0: 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 20 20  Key *pFKey;.    
a9e0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
a9f0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 44  shInsert(&db->aD
aa00: 62 5b 70 2d 3e 69 44 62 5d 2e 74 62 6c 48 61 73  b[p->iDb].tblHas
aa10: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 70 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  p->zName, strlen
aa40: 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 29  (p->zName)+1, p)
aa50: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29  ;.    if( pOld )
aa60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
aa70: 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d  p==pOld );  /* M
aa80: 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
aa90: 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61  failed inside Ha
aaa0: 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20  shInsert() */.  
aab0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
aac0: 7d 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d  }.    for(pFKey=
aad0: 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  p->pFKey; pFKey;
aae0: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
aaf0: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
ab00: 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72 6c 65 6e  int nTo = strlen
ab10: 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 20 2b 20 31  (pFKey->zTo) + 1
ab20: 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 70  ;.      pFKey->p
ab30: 4e 65 78 74 54 6f 20 3d 20 73 71 6c 69 74 65 33  NextTo = sqlite3
ab40: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
ab50: 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65 79 2c  b[p->iDb].aFKey,
ab60: 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54 6f   pFKey->zTo, nTo
ab70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ab80: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
ab90: 61 44 62 5b 70 2d 3e 69 44 62 5d 2e 61 46 4b 65  aDb[p->iDb].aFKe
aba0: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
abb0: 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20 20  To, pFKey);.    
abc0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
abd0: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
abe0: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
abf0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
ac00: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
ac10: 6e 67 65 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nges;.  }.}../*.
ac20: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
ac30: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
ac40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
ac50: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
ac60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
ac70: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
ac80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
ac90: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
aca0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
acb0: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
acc0: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
acd0: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
ace0: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
acf0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
ad00: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
ad10: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
ad20: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
ad30: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
ad40: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
ad50: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
ad60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ad70: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
ad80: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
ad90: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
ada0: 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
adb0: 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
adc0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
add0: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p         /* TRU
ade0: 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
adf0: 59 20 76 69 65 77 20 2a 2f 0a 29 7b 0a 20 20 54  Y view */.){.  T
ae00: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
ae10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
ae20: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
ae30: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
ae40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
ae50: 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  ..  sqlite3Start
ae60: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 42  Table(pParse, pB
ae70: 65 67 69 6e 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  egin, pName1, pN
ae80: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 29  ame2, isTemp, 1)
ae90: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
aea0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
aeb0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
aec0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
aed0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
aee0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
aef0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
af00: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
af10: 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
af20: 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
af30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
af40: 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
af50: 72 73 65 2c 20 70 2d 3e 69 44 62 2c 20 22 76 69  rse, p->iDb, "vi
af60: 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20  ew", pName).    
af70: 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  && sqlite3FixSel
af80: 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
af90: 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ct).  ){.    sql
afa0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
afb0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72  (pSelect);.    r
afc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
afd0: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
afe0: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
aff0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
b000: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
b010: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
b020: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
b030: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
b040: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
b050: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
b060: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
b070: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
b080: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
b090: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
b0a0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
b0b0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
b0c0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
b0d0: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
b0e0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
b0f0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
b100: 65 6c 65 63 74 44 75 70 28 70 53 65 6c 65 63 74  electDup(pSelect
b110: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
b120: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63 74  ctDelete(pSelect
b130: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  );.  if( !pParse
b140: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
b150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
b160: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
b170: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
b180: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
b190: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
b1a0: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
b1b0: 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
b1c0: 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
b1d0: 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
b1e0: 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
b1f0: 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45  tToken;.  if( sE
b200: 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45  nd.z[0]!=0 && sE
b210: 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
b220: 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
b230: 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
b240: 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 28  .n = 0;.  n = ((
b250: 69 6e 74 29 73 45 6e 64 2e 7a 29 20 2d 20 28 69  int)sEnd.z) - (i
b260: 6e 74 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  nt)pBegin->z;.  
b270: 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
b280: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28   while( n>0 && (
b290: 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  z[n-1]==';' || i
b2a0: 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20  sspace(z[n-1])) 
b2b0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64  ){ n--; }.  sEnd
b2c0: 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20  .z = &z[n-1];.  
b2d0: 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f  sEnd.n = 1;..  /
b2e0: 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64  * Use sqlite3End
b2f0: 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74  Table() to add t
b300: 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53  he view to the S
b310: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
b320: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  le */.  sqlite3E
b330: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  ndTable(pParse, 
b340: 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74  &sEnd, 0);.  ret
b350: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
b360: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
b370: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
b380: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
b390: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
b3a0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
b3b0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
b3c0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
b3d0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
b3e0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b3f0: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
b400: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
b410: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
b420: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
b430: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
b440: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
b450: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
b460: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
b470: 62 6c 65 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ble){.  ExprList
b480: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 53 65 6c 65   *pEList;.  Sele
b490: 63 74 20 2a 70 53 65 6c 3b 0a 20 20 54 61 62 6c  ct *pSel;.  Tabl
b4a0: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 20 20 69 6e  e *pSelTab;.  in
b4b0: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 61  t nErr = 0;..  a
b4c0: 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
b4d0: 0a 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  ..  /* A positiv
b4e0: 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
b4f0: 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
b500: 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
b510: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
b520: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
b530: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
b540: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
b550: 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
b560: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
b570: 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
b580: 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
b590: 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
b5a0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
b5b0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
b5c0: 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
b5d0: 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
b5e0: 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
b5f0: 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
b600: 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
b610: 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
b620: 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
b630: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
b640: 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
b650: 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
b660: 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
b670: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
b680: 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
b690: 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73 20   Actually, this 
b6a0: 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74 20  error is caught 
b6b0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20 73  previously and s
b6c0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
b6d0: 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  test.  ** should
b6e0: 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20 42   always fail.  B
b6f0: 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ut we will leave
b700: 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75 73   it in place jus
b710: 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20 20  t to be safe..  
b720: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
b730: 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
b740: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b750: 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
b760: 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
b770: 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
b780: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
b790: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
b7a0: 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
b7b0: 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
b7c0: 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
b7d0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
b7e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b7f0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
b800: 29 3b 20 2f 2a 20 49 66 20 6e 43 6f 6c 3d 3d 30  ); /* If nCol==0
b810: 2c 20 74 68 65 6e 20 70 54 61 62 6c 65 20 6d 75  , then pTable mu
b820: 73 74 20 62 65 20 61 20 56 49 45 57 20 2a 2f 0a  st be a VIEW */.
b830: 20 20 70 53 65 6c 20 3d 20 70 54 61 62 6c 65 2d    pSel = pTable-
b840: 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
b850: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
b860: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
b870: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
b880: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
b890: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
b8a0: 74 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 2e  ts in this list.
b8b0: 20 20 42 75 74 20 77 65 20 77 69 6c 6c 20 6e 65    But we will ne
b8c0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
b8d0: 65 20 6c 69 73 74 0a 20 20 2a 2a 20 62 61 63 6b  e list.  ** back
b8e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
b8f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
b900: 66 74 65 72 77 61 72 64 73 2c 20 73 6f 20 77 65  fterwards, so we
b910: 20 73 61 76 65 20 61 20 63 6f 70 79 20 6f 66 0a   save a copy of.
b920: 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61    ** the origina
b930: 6c 20 69 6e 20 70 45 4c 69 73 74 2e 0a 20 20 2a  l in pEList..  *
b940: 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  /.  pEList = pSe
b950: 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 53 65  l->pEList;.  pSe
b960: 6c 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  l->pEList = sqli
b970: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
b980: 45 4c 69 73 74 29 3b 0a 20 20 69 66 28 20 70 53  EList);.  if( pS
b990: 65 6c 2d 3e 70 45 4c 69 73 74 3d 3d 30 20 29 7b  el->pEList==0 ){
b9a0: 0a 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73  .    pSel->pELis
b9b0: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  t = pEList;.    
b9c0: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4d 61  return 1;  /* Ma
b9d0: 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
b9e0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   }.  pTable->nCo
b9f0: 6c 20 3d 20 2d 31 3b 0a 20 20 70 53 65 6c 54 61  l = -1;.  pSelTa
ba00: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
ba10: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
ba20: 72 73 65 2c 20 30 2c 20 70 53 65 6c 29 3b 0a 20  rse, 0, pSel);. 
ba30: 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
ba40: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
ba50: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
ba60: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
ba70: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
ba80: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f  .    pTable->aCo
ba90: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
baa0: 6c 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  l;.    pSelTab->
bab0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53  nCol = 0;.    pS
bac0: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
bad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
bae0: 74 65 54 61 62 6c 65 28 30 2c 20 70 53 65 6c 54  teTable(0, pSelT
baf0: 61 62 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ab);.    DbSetPr
bb00: 6f 70 65 72 74 79 28 70 50 61 72 73 65 2d 3e 64  operty(pParse->d
bb10: 62 2c 20 70 54 61 62 6c 65 2d 3e 69 44 62 2c 20  b, pTable->iDb, 
bb20: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
bb30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bb40: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
bb50: 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d  .    nErr++;.  }
bb60: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
bb70: 55 6e 62 69 6e 64 28 70 53 65 6c 29 3b 0a 20 20  Unbind(pSel);.  
bb80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
bb90: 65 6c 65 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69  elete(pSel->pELi
bba0: 73 74 29 3b 0a 20 20 70 53 65 6c 2d 3e 70 45 4c  st);.  pSel->pEL
bbb0: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
bbc0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
bbe0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
bbf0: 72 6f 6d 20 74 68 65 20 56 49 45 57 20 70 54 61  rom the VIEW pTa
bc00: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
bc10: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
bc20: 64 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 6f  d whenever any o
bc30: 74 68 65 72 20 74 61 62 6c 65 20 6f 72 20 76 69  ther table or vi
bc40: 65 77 20 69 73 20 6d 6f 64 69 66 69 65 64 2e 0a  ew is modified..
bc50: 2a 2a 20 54 68 65 20 76 69 65 77 20 70 61 73 73  ** The view pass
bc60: 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
bc70: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 70 65 6e  tine might depen
bc80: 64 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  d directly or in
bc90: 64 69 72 65 63 74 6c 79 0a 2a 2a 20 6f 6e 20 74  directly.** on t
bca0: 68 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64  he modified or d
bcb0: 65 6c 65 74 65 64 20 74 61 62 6c 65 20 73 6f 20  eleted table so 
bcc0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72  we need to clear
bcd0: 20 74 68 65 20 6f 6c 64 20 63 6f 6c 75 6d 6e 0a   the old column.
bce0: 2a 2a 20 6e 61 6d 65 73 20 73 6f 20 74 68 61 74  ** names so that
bcf0: 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
bd00: 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  computed..*/.sta
bd10: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
bd20: 69 65 77 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iewResetColumnNa
bd30: 6d 65 73 28 54 61 62 6c 65 20 2a 70 54 61 62 6c  mes(Table *pTabl
bd40: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  e){.  int i;.  C
bd50: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61  olumn *pCol;.  a
bd60: 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30  ssert( pTable!=0
bd70: 20 26 26 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c   && pTable->pSel
bd80: 65 63 74 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ect!=0 );.  for(
bd90: 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 6c 65  i=0, pCol=pTable
bda0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 6c 65  ->aCol; i<pTable
bdb0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
bdc0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  l++){.    sqlite
bdd0: 46 72 65 65 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  Free(pCol->zName
bde0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
bdf0: 65 28 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  e(pCol->zDflt);.
be00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
be10: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 7d  Col->zType);.  }
be20: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 54  .  sqliteFree(pT
be30: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70  able->aCol);.  p
be40: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
be50: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
be60: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
be70: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
be80: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
be90: 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
bea0: 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
beb0: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
bec0: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 20 2a  esetAll(sqlite *
bed0: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
bee0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
bef0: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
bf00: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
bf10: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
bf20: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
bf30: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
bf40: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 74 62 6c 48  b->aDb[idx].tblH
bf50: 61 73 68 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ash); i; i=sqlit
bf60: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
bf70: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
bf80: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
bf90: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
bfa0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
bfb0: 20 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73     sqliteViewRes
bfc0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54  etColumnNames(pT
bfd0: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ab);.    }.  }. 
bfe0: 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
bff0: 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
c000: 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 0a 2f  esetViews);.}../
c010: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
c020: 65 6e 2c 20 6c 6f 6f 6b 20 75 70 20 61 20 74 61  en, look up a ta
c030: 62 6c 65 20 77 69 74 68 20 74 68 61 74 20 6e 61  ble with that na
c040: 6d 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e  me.  If not foun
c050: 64 2c 20 6c 65 61 76 65 0a 2a 2a 20 61 6e 20 65  d, leave.** an e
c060: 72 72 6f 72 20 66 6f 72 20 74 68 65 20 70 61 72  rror for the par
c070: 73 65 72 20 74 6f 20 66 69 6e 64 20 61 6e 64 20  ser to find and 
c080: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
c090: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 54 61  Table *sqlite3Ta
c0a0: 62 6c 65 46 72 6f 6d 54 6f 6b 65 6e 28 50 61 72  bleFromToken(Par
c0b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
c0c0: 6e 20 2a 70 54 6f 6b 29 7b 0a 20 20 63 68 61 72  n *pTok){.  char
c0d0: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 54 61 62 6c 65   *zName;.  Table
c0e0: 20 2a 70 54 61 62 3b 0a 20 20 7a 4e 61 6d 65 20   *pTab;.  zName 
c0f0: 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4e 61  = sqlite3TableNa
c100: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 6f 6b  meFromToken(pTok
c110: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
c120: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c130: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
c140: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
c150: 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  db, zName, 0);. 
c160: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
c170: 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  e);.  if( pTab==
c180: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c190: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c1a0: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
c1b0: 20 25 54 22 2c 20 70 54 6f 6b 29 3b 0a 20 20 20   %T", pTok);.   
c1c0: 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
c1d0: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  hema = 1;.  }.  
c1e0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
c1f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
c200: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
c210: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
c220: 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
c230: 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
c240: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
c250: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
c260: 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
c270: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
c280: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
c290: 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
c2a0: 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 54  int isView){.  T
c2b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
c2c0: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 62 61 73  be *v;.  int bas
c2d0: 65 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  e;.  sqlite *db 
c2e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c2f0: 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
c300: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
c310: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
c320: 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69  ailed ) goto exi
c330: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
c340: 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
c350: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62  Src==1 );.  pTab
c360: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
c370: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
c380: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
c390: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
c3a0: 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20  tabase);..  if( 
c3b0: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
c3c0: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
c3d0: 20 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44    iDb = pTab->iD
c3e0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  b;.  assert( iDb
c3f0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
c400: 44 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Db );.#ifndef SQ
c410: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
c420: 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
c430: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
c440: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
c450: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 70 54   SCHEMA_TABLE(pT
c460: 61 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 63 6f  ab->iDb);.    co
c470: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
c480: 64 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44  db->aDb[pTab->iD
c490: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
c4a0: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
c4b0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
c4c0: 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
c4d0: 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20  0, zDb)){.      
c4e0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
c4f0: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
c500: 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20  if( isView ){.  
c510: 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 29      if( iDb==1 )
c520: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
c530: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
c540: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
c550: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
c560: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
c570: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
c580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c590: 66 28 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  f( iDb==1 ){.   
c5a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
c5b0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
c5c0: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
c5d0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
c5e0: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
c5f0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
c600: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c610: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
c620: 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
c630: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
c640: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
c650: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
c660: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
c670: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
c680: 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
c690: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
c6a0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
c6b0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
c6c0: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
c6d0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 61  #endif.  if( pTa
c6e0: 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
c6f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c700: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
c710: 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
c720: 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
c730: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 72  zName);.    pPar
c740: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
c750: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
c760: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  able;.  }.  if( 
c770: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
c780: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
c790: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c7a0: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
c7b0: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
c7c0: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
c7d0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
c7e0: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
c7f0: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
c800: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
c810: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
c820: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c830: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
c840: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
c850: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
c860: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
c870: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
c880: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  le;.  }..  /* Ge
c890: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
c8a0: 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
c8b0: 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
c8c0: 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
c8d0: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
c8e0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c8f0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
c900: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62  {.    static Vdb
c910: 65 4f 70 4c 69 73 74 20 64 72 6f 70 54 61 62 6c  eOpList dropTabl
c920: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
c930: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
c940: 2c 20 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a  , ADDR(13), 0},.
c950: 20 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e        { OP_Strin
c960: 67 38 2c 20 20 20 20 30 2c 20 30 2c 20 20 20 20  g8,    0, 0,    
c970: 20 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a      0}, /* 1 */.
c980: 20 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74        { OP_MemSt
c990: 6f 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20  ore,   1, 1,    
c9a0: 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20      0},.      { 
c9b0: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31  OP_MemLoad,    1
c9c0: 2c 20 30 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 0,        0}, 
c9d0: 2f 2a 20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20  /* 3 */.      { 
c9e0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
c9f0: 2c 20 32 2c 20 20 20 20 20 20 20 20 30 7d 2c 20  , 2,        0}, 
ca00: 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  /* sqlite_master
ca10: 2e 74 62 6c 5f 6e 61 6d 65 20 2a 2f 0a 20 20 20  .tbl_name */.   
ca20: 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20 20 20 20     { OP_Ne,     
ca30: 20 20 20 20 30 2c 20 41 44 44 52 28 31 32 29 2c      0, ADDR(12),
ca40: 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f   0},.      { OP_
ca50: 53 74 72 69 6e 67 38 2c 20 20 20 20 30 2c 20 30  String8,    0, 0
ca60: 2c 20 20 20 20 20 20 20 20 22 74 72 69 67 67 65  ,        "trigge
ca70: 72 22 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f  r"},.      { OP_
ca80: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 32  Column,     0, 2
ca90: 2c 20 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  ,        0}, /* 
caa0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 74 79  sqlite_master.ty
cab0: 70 65 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50  pe */.      { OP
cac0: 5f 45 71 2c 20 20 20 20 20 20 20 20 20 30 2c 20  _Eq,         0, 
cad0: 41 44 44 52 28 31 32 29 2c 20 30 7d 2c 0a 20 20  ADDR(12), 0},.  
cae0: 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65 74 65 2c      { OP_Delete,
caf0: 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20 20 20       0, 0,      
cb00: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
cb10: 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20  _Rewind,     0, 
cb20: 41 44 44 52 28 31 33 29 2c 20 30 7d 2c 0a 20 20  ADDR(13), 0},.  
cb30: 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20      { OP_Goto,  
cb40: 20 20 20 20 20 30 2c 20 41 44 44 52 28 33 29 2c       0, ADDR(3),
cb50: 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
cb60: 5f 4e 65 78 74 2c 20 20 20 20 20 20 20 30 2c 20  _Next,       0, 
cb70: 41 44 44 52 28 33 29 2c 20 20 30 7d 2c 20 2f 2a  ADDR(3),  0}, /*
cb80: 20 31 32 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20   12 */.    };.  
cb90: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
cba0: 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69     Trigger *pTri
cbb0: 67 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  gger;.    sqlite
cbc0: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
cbd0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
cbe0: 70 54 61 62 2d 3e 69 44 62 29 3b 0a 0a 20 20 20  pTab->iDb);..   
cbf0: 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
cc00: 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
cc10: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
cc20: 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
cc30: 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
cc40: 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
cc50: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
cc60: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
cc70: 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
cc80: 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
cc90: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
cca0: 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
ccb0: 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b   pTab->pTrigger;
ccc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54 72 69  .    while( pTri
ccd0: 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73  gger ){.      as
cce0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
ccf0: 69 44 62 3d 3d 70 54 61 62 2d 3e 69 44 62 20 7c  iDb==pTab->iDb |
cd00: 7c 20 70 54 72 69 67 67 65 72 2d 3e 69 44 62 3d  | pTrigger->iDb=
cd10: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
cd20: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
cd30: 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
cd40: 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  er, 1);.      if
cd50: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
cd60: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  n ){.        pTr
cd70: 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
cd80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
cd90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
cda0: 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
cdb0: 54 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d  Trigger;.      }
cdc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
cdd0: 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
cde0: 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
cdf0: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
ce00: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
ce10: 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
ce20: 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
ce30: 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
ce40: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
ce50: 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
ce60: 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
ce70: 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
ce80: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
ce90: 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
cea0: 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
ceb0: 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
cec0: 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
ced0: 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
cee0: 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
cef0: 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
cf00: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
cf10: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
cf20: 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
cf30: 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
cf40: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
cf50: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
cf60: 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2d 3e 69  Table(v, pTab->i
cf70: 44 62 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20  Db);.    base = 
cf80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cf90: 4c 69 73 74 28 76 2c 20 41 72 72 61 79 53 69 7a  List(v, ArraySiz
cfa0: 65 28 64 72 6f 70 54 61 62 6c 65 29 2c 20 64 72  e(dropTable), dr
cfb0: 6f 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71  opTable);.    sq
cfc0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
cfd0: 33 28 76 2c 20 62 61 73 65 2b 31 2c 20 70 54 61  3(v, base+1, pTa
cfe0: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
cff0: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
d000: 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20 70 54 61  ookie(db, v, pTa
d010: 62 2d 3e 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  b->iDb);.    sql
d020: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d030: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30 29   OP_Close, 0, 0)
d040: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ;.    if( !isVie
d050: 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
d060: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d070: 50 5f 44 65 73 74 72 6f 79 2c 20 70 54 61 62 2d  P_Destroy, pTab-
d080: 3e 74 6e 75 6d 2c 20 70 54 61 62 2d 3e 69 44 62  >tnum, pTab->iDb
d090: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
d0a0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
d0b0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
d0c0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
d0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0e0: 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
d0f0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 70 49 64   pIdx->tnum, pId
d100: 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  x->iDb);.      }
d110: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d120: 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74  e3EndWriteOperat
d130: 69 6f 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ion(pParse);.  }
d140: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
d150: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 65 73 63  e in-memory desc
d160: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
d170: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
d180: 45 78 63 65 70 74 69 6f 6e 3a 20 69 66 20 74 68  Exception: if th
d190: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
d1a0: 62 65 67 61 6e 20 77 69 74 68 20 74 68 65 20 45  began with the E
d1b0: 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 2c 0a  XPLAIN keyword,.
d1c0: 20 20 2a 2a 20 74 68 65 6e 20 6e 6f 20 63 68 61    ** then no cha
d1d0: 6e 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 6d  nges should be m
d1e0: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ade..  */.  if( 
d1f0: 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
d200: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 55 6e   ){.    sqliteUn
d210: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
d220: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
d230: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d240: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d250: 67 65 73 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ges;.  }.  sqlit
d260: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
d270: 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
d280: 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
d290: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
d2a0: 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pName);.}../*.*
d2b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d2c0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
d2d0: 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
d2e0: 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
d2f0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
d300: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
d310: 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
d320: 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
d330: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d340: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
d350: 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
d360: 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
d370: 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
d380: 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
d390: 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
d3a0: 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
d3b0: 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
d3c0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
d3d0: 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
d3e0: 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
d3f0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
d400: 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
d410: 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
d420: 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
d430: 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
d440: 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
d450: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
d460: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
d470: 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
d480: 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
d490: 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
d4a0: 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
d4b0: 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
d4c0: 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
d4d0: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
d4e0: 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
d4f0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
d500: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
d510: 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
d520: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
d530: 66 69 65 6c 64 2e 20 20 54 68 65 20 6e 65 77 20  field.  The new 
d540: 46 4b 65 79 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c  FKey.** is not l
d550: 69 6e 6b 65 64 20 69 6e 74 6f 20 64 62 2d 3e 61  inked into db->a
d560: 46 4b 65 79 20 61 74 20 74 68 69 73 20 70 6f 69  FKey at this poi
d570: 6e 74 20 2d 20 74 68 61 74 20 64 6f 65 73 20 6e  nt - that does n
d580: 6f 74 20 68 61 70 70 65 6e 0a 2a 2a 20 75 6e 74  ot happen.** unt
d590: 69 6c 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  il sqlite3EndTab
d5a0: 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le()..**.** The 
d5b0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
d5c0: 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
d5d0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
d5e0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
d5f0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
d600: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
d610: 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
d620: 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
d630: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
d640: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
d650: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
d660: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d670: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
d680: 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
d690: 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
d6a0: 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
d6b0: 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
d6c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
d6d0: 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
d6e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
d6f0: 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
d700: 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
d710: 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
d720: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
d730: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
d740: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
d750: 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
d760: 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
d770: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
d780: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
d790: 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
d7a0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
d7b0: 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
d7c0: 7a 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  z;.  FKey *pFKey
d7d0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
d7e0: 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28   pTo!=0 );.  if(
d7f0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
d800: 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 66 6b 5f  >nErr ) goto fk_
d810: 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
d820: 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
d830: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
d840: 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  -1;.    if( iCol
d850: 3c 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  <0 ) goto fk_end
d860: 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
d870: 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
d880: 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
d890: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d8a0: 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
d8b0: 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
d8c0: 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
d8d0: 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
d8e0: 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
d8f0: 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
d900: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
d910: 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
d920: 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
d930: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
d940: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
d950: 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
d960: 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
d970: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
d980: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d990: 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
d9a0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d9b0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
d9c0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
d9d0: 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
d9e0: 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
d9f0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
da00: 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
da10: 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
da20: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
da30: 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
da40: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
da50: 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 6e 43 6f  of(*pFKey) + nCo
da60: 6c 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  l*sizeof(pFKey->
da70: 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
da80: 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
da90: 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
daa0: 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
dab0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
dac0: 20 6e 42 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e   nByte += strlen
dad0: 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
dae0: 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a  ame) + 1;.    }.
daf0: 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71    }.  pFKey = sq
db00: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74  liteMalloc( nByt
db10: 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
db20: 3d 3d 30 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  ==0 ) goto fk_en
db30: 64 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f  d;.  pFKey->pFro
db40: 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
db50: 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
db60: 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
db70: 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20 20  r*)&pFKey[1];.  
db80: 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28 73  pFKey->aCol = (s
db90: 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29 7a  truct sColMap*)z
dba0: 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66 28  ;.  z += sizeof(
dbb0: 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29 2a  struct sColMap)*
dbc0: 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  nCol;.  pFKey->z
dbd0: 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
dbe0: 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
dbf0: 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
dc00: 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f   = 0;.  z += pTo
dc10: 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e  ->n+1;.  pFKey->
dc20: 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20 20 70  pNextTo = 0;.  p
dc30: 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
dc40: 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
dc50: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
dc60: 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
dc70: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
dc80: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
dc90: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
dca0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
dcb0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
dcc0: 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
dcd0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
dce0: 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
dcf0: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
dd00: 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
dd10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
dd20: 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
dd30: 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
dd40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dd60: 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
dd70: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
dd80: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
dd90: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
dda0: 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
ddb0: 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
ddc0: 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
ddd0: 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
dde0: 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
ddf0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
de00: 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
de10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
de20: 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
de30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
de40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
de50: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 54  nt n = strlen(pT
de60: 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
de70: 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
de80: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
de90: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
dea0: 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
deb0: 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
dec0: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
ded0: 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
dee0: 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
def0: 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
df00: 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66  FKey->deleteConf
df10: 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66 66 3b   = flags & 0xff;
df20: 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61 74 65  .  pFKey->update
df30: 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e  Conf = (flags >>
df40: 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20 20 70   8 ) & 0xff;.  p
df50: 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e 66  FKey->insertConf
df60: 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31 36 20   = (flags >> 16 
df70: 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f 2a 20  ) & 0xff;..  /* 
df80: 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
df90: 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
dfa0: 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
dfb0: 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
dfc0: 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
dfd0: 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
dfe0: 64 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  d:.  sqliteFree(
dff0: 70 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  pFKey);.  sqlite
e000: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
e010: 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
e020: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
e030: 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  te(pToCol);.}../
e040: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e050: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
e060: 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
e070: 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
e080: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
e090: 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
e0a0: 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
e0b0: 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
e0c0: 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
e0d0: 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
e0e0: 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
e0f0: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
e100: 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
e110: 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
e120: 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
e130: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
e140: 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
e150: 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
e160: 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
e170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e180: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
e190: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e1a0: 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
e1b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
e1c0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
e1d0: 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
e1e0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
e1f0: 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
e200: 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
e210: 20 72 65 74 75 72 6e 3b 0a 20 20 70 46 4b 65 79   return;.  pFKey
e220: 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 69  ->isDeferred = i
e230: 73 44 65 66 65 72 72 65 64 3b 0a 7d 0a 0a 2f 2a  sDeferred;.}../*
e240: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
e250: 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51   index for an SQ
e260: 4c 20 74 61 62 6c 65 2e 20 20 70 49 6e 64 65 78  L table.  pIndex
e270: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
e280: 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
e290: 64 20 70 54 61 62 6c 65 20 69 73 20 74 68 65 20  d pTable is the 
e2a0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
e2b0: 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
e2c0: 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
e2d0: 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
e2e0: 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
e2f0: 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
e300: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
e310: 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
e320: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
e330: 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
e340: 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
e350: 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
e360: 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
e370: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
e380: 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
e390: 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
e3a0: 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
e3b0: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
e3c0: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
e3d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e3e0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
e3f0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
e400: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
e410: 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
e420: 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
e430: 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
e440: 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
e450: 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
e460: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
e470: 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
e480: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
e490: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
e4a0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
e4b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
e4c0: 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
e4d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 41   *pParse,   /* A
e4e0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
e4f0: 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
e500: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
e510: 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70  e1,   /* First p
e520: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
e530: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
e540: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
e550: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
e560: 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
e570: 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
e580: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
e590: 6c 4e 61 6d 65 2c 20 20 2f 2a 20 54 61 62 6c 65  lName,  /* Table
e5a0: 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
e5b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
e5c0: 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
e5d0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
e5e0: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
e5f0: 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
e600: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
e610: 72 2c 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f  r,     /* OE_Abo
e620: 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
e630: 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
e640: 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
e650: 20 2a 70 53 74 61 72 74 2c 20 20 20 2f 2a 20 54   *pStart,   /* T
e660: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
e670: 74 68 61 74 20 62 65 67 69 6e 73 20 61 20 43 52  that begins a CR
e680: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
e690: 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ment */.  Token 
e6a0: 2a 70 45 6e 64 20 20 20 20 20 20 2f 2a 20 54 68  *pEnd      /* Th
e6b0: 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
e6c0: 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
e6d0: 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
e6e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
e6f0: 20 3d 20 30 3b 20 2f 2a 20 54 61 62 6c 65 20 74   = 0; /* Table t
e700: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
e710: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
e720: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 69 6e 64 65  = 0; /* The inde
e730: 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
e740: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
e750: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   = 0;.  int i, j
e760: 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
e770: 3b 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b  ;    /* Fake tok
e780: 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
e790: 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
e7a0: 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 2f 2a  ixer sFix;    /*
e7b0: 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64   For assigning d
e7c0: 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f  atabase names to
e7d0: 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   pTable */.  int
e7e0: 20 69 73 54 65 6d 70 3b 20 20 20 20 20 20 2f 2a   isTemp;      /*
e7f0: 20 54 72 75 65 20 66 6f 72 20 61 20 74 65 6d 70   True for a temp
e800: 6f 72 61 72 79 20 69 6e 64 65 78 20 2a 2f 0a 20  orary index */. 
e810: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
e820: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 6e 74  arse->db;..  int
e830: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f   iDb;          /
e840: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
e850: 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
e860: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
e870: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
e880: 3d 20 30 3b 20 2f 2a 20 55 6e 71 75 61 6c 69 66  = 0; /* Unqualif
e890: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
e8a0: 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
e8b0: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  */..  if( pParse
e8c0: 2d 3e 6e 45 72 72 20 7c 7c 20 73 71 6c 69 74 65  ->nErr || sqlite
e8d0: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
e8e0: 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
e8f0: 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 2f 2a 0a  te_index;..  /*.
e900: 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
e910: 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
e920: 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
e930: 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
e940: 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
e950: 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
e960: 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
e970: 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
e980: 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
e990: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
e9a0: 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
e9b0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
e9c0: 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
e9d0: 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
e9e0: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
e9f0: 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
ea00: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
ea10: 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
ea20: 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
ea30: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
ea40: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
ea50: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
ea60: 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
ea70: 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
ea80: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ea90: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
eaa0: 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75  index name was u
eab0: 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63  nqualified, chec
eac0: 6b 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62  k if the the tab
ead0: 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
eae0: 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
eaf0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
eb00: 73 65 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2f 0a  se to 1..    */.
eb10: 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
eb20: 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
eb30: 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
eb40: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65  );.    if( pName
eb50: 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d  2 && pName2->n==
eb60: 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
eb70: 62 2d 3e 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  b->iDb==1 ){.   
eb80: 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20     iDb = 1;.    
eb90: 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
eba0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
ebb0: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
ebc0: 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
ebd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ebe0: 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
ebf0: 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
ec00: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
ec10: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
ec20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
ec30: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
ec40: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 62  able(pParse, pTb
ec50: 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
ec60: 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
ec70: 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
ec80: 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
ec90: 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
eca0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
ecb0: 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
ecc0: 70 54 61 62 2d 3e 69 44 62 20 29 3b 0a 20 20 7d  pTab->iDb );.  }
ecd0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
ece0: 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ( pName==0 );.  
ecf0: 20 20 70 54 61 62 20 3d 20 20 70 50 61 72 73 65    pTab =  pParse
ed00: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
ed10: 20 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62   iDb = pTab->iDb
ed20: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61  ;.  }..  if( pTa
ed30: 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  b==0 || pParse->
ed40: 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
ed50: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
ed60: 20 69 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f   if( pTab->readO
ed70: 6e 6c 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nly ){.    sqlit
ed80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ed90: 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
eda0: 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
edb0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
edc0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
edd0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
ede0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
edf0: 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
ee00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ee10: 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
ee20: 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
ee30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
ee40: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
ee50: 20 20 69 73 54 65 6d 70 20 3d 20 70 54 61 62 2d    isTemp = pTab-
ee60: 3e 69 44 62 3d 3d 31 3b 0a 0a 20 20 2f 2a 0a 20  >iDb==1;..  /*. 
ee70: 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
ee80: 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
ee90: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
eea0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
eeb0: 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
eec0: 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
eed0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
eee0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
eef0: 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
ef00: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
ef10: 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
ef20: 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
ef30: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
ef40: 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
ef50: 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
ef60: 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
ef70: 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
ef80: 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
ef90: 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
efa0: 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
efb0: 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
efc0: 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
efd0: 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
efe0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
eff0: 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
f000: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
f010: 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
f020: 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
f030: 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
f040: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
f050: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
f060: 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
f070: 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
f080: 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
f090: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
f0a0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f0b0: 33 54 61 62 6c 65 4e 61 6d 65 46 72 6f 6d 54 6f  3TableNameFromTo
f0c0: 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 20 20  ken(pName);.    
f0d0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
f0e0: 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
f0f0: 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53  index;.    if( S
f100: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
f110: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
f120: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
f130: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
f140: 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
f150: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
f160: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f170: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
f180: 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  SameName;    /* 
f190: 41 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 77 69  Another index wi
f1a0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
f1b0: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
f1c0: 2a 70 54 53 61 6d 65 4e 61 6d 65 3b 20 20 20 20  *pTSameName;    
f1d0: 2f 2a 20 41 20 74 61 62 6c 65 20 77 69 74 68 20  /* A table with 
f1e0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
f1f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
f200: 69 66 28 20 28 70 49 53 61 6d 65 4e 61 6d 65 20  if( (pISameName 
f210: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
f220: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62  ex(db, zName, db
f230: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
f240: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
f250: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f260: 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
f270: 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
f280: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
f290: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
f2a0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
f2b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
f2c0: 54 53 61 6d 65 4e 61 6d 65 20 3d 20 73 71 6c 69  TSameName = sqli
f2d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
f2e0: 20 7a 4e 61 6d 65 2c 20 30 29 29 21 3d 30 20 29   zName, 0))!=0 )
f2f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f300: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f310: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
f320: 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
f330: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
f340: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
f350: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
f360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f370: 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65 3d 3d  else if( pName==
f380: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
f390: 75 66 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20  uf[30];.    int 
f3a0: 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
f3b0: 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
f3c0: 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
f3d0: 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
f3e0: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
f3f0: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 73 70 72 69   n++){}.    spri
f400: 6e 74 66 28 7a 42 75 66 2c 22 5f 25 64 22 2c 6e  ntf(zBuf,"_%d",n
f410: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30  );.    zName = 0
f420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
f430: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 22  String(&zName, "
f440: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
f450: 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  _", pTab->zName,
f460: 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29   zBuf, (char*)0)
f470: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
f480: 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
f490: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
f4a0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
f4b0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
f4c0: 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
f4d0: 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
f4e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
f4f0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
f500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
f510: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 54 61 62  b = db->aDb[pTab
f520: 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->iDb].zName;.  
f530: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
f540: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
f550: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
f560: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
f570: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
f580: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
f590: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
f5a0: 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
f5b0: 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
f5c0: 20 20 20 20 69 66 28 20 69 73 54 65 6d 70 20 29      if( isTemp )
f5d0: 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
f5e0: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
f5f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
f600: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
f610: 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
f620: 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
f630: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
f640: 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
f650: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
f660: 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
f670: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
f680: 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
f690: 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
f6a0: 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
f6b0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
f6c0: 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
f6d0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
f6e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
f6f0: 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
f700: 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
f710: 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
f720: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
f730: 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70 54     nullId.z = pT
f740: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
f750: 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
f760: 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74 72    nullId.n = str
f770: 6c 65 6e 28 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20  len(nullId.z);. 
f780: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
f790: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
f7a0: 28 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b  (0, 0, &nullId);
f7b0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
f7c0: 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
f7d0: 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
f7e0: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
f7f0: 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
f800: 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
f810: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
f820: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
f830: 49 6e 64 65 78 29 20 2b 20 73 74 72 6c 65 6e 28  Index) + strlen(
f840: 7a 4e 61 6d 65 29 20 2b 20 31 20 2b 0a 20 20 20  zName) + 1 +.   
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 28 73 69 7a 65 6f 66 28 69 6e 74       (sizeof(int
f870: 29 20 2b 20 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  ) + sizeof(CollS
f880: 65 71 2a 29 29 2a 70 4c 69 73 74 2d 3e 6e 45 78  eq*))*pList->nEx
f890: 70 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  pr );.  if( pInd
f8a0: 65 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ex==0 ) goto exi
f8b0: 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
f8c0: 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
f8d0: 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 6e 64  mn = (int*)&pInd
f8e0: 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  ex->keyInfo.aCol
f8f0: 6c 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 5d 3b  l[pList->nExpr];
f900: 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
f910: 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e 64 65   = (char*)&pInde
f920: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4c 69 73  x->aiColumn[pLis
f930: 74 2d 3e 6e 45 78 70 72 5d 3b 0a 20 20 73 74 72  t->nExpr];.  str
f940: 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  cpy(pIndex->zNam
f950: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  e, zName);.  pIn
f960: 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
f970: 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
f980: 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
f990: 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
f9a0: 6f 6e 45 72 72 6f 72 20 3d 20 6f 6e 45 72 72 6f  onError = onErro
f9b0: 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  r;.  pIndex->aut
f9c0: 6f 49 6e 64 65 78 20 3d 20 70 4e 61 6d 65 3d 3d  oIndex = pName==
f9d0: 30 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 44 62  0;.  pIndex->iDb
f9e0: 20 3d 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 53 63   = iDb;..  /* Sc
f9f0: 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
fa00: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
fa10: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
fa20: 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
fa30: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
fa40: 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
fa50: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
fa60: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
fa70: 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
fa80: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
fa90: 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  nd..  */.  for(i
faa0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
fab0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  pr; i++){.    fo
fac0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
fad0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
fae0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
faf0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
fb00: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
fb10: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[j].zName)==0 )
fb20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fb30: 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
fb40: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
fb50: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fb60: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
fb70: 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
fb80: 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
fb90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 4c 69  pTab->zName, pLi
fba0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
fbb0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
fbc0: 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
fbd0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
fbe0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a  >aiColumn[i] = j
fbf0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
fc00: 3e 61 5b 69 5d 2e 70 45 78 70 72 20 29 7b 0a 20  >a[i].pExpr ){. 
fc10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
fc20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
fc30: 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  pColl );.      p
fc40: 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  Index->keyInfo.a
fc50: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 4c 69 73 74 2d  Coll[i] = pList-
fc60: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 43 6f  >a[i].pExpr->pCo
fc70: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
fc80: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6b 65 79       pIndex->key
fc90: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Info.aColl[i] = 
fca0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43  pTab->aCol[j].pC
fcb0: 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  oll;.    }.    a
fcc0: 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6b  ssert( pIndex->k
fcd0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20  eyInfo.aColl[i] 
fce0: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
fcf0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 0a 20 20  init.busy && .  
fd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
fd10: 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ckCollSeq(pParse
fd20: 2c 20 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e 66  , pIndex->keyInf
fd30: 6f 2e 61 43 6f 6c 6c 5b 69 5d 29 20 0a 20 20 20  o.aColl[i]) .   
fd40: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
fd50: 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
fd60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
fd70: 6e 64 65 78 2d 3e 6b 65 79 49 6e 66 6f 2e 6e 46  ndex->keyInfo.nF
fd80: 69 65 6c 64 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  ield = pList->nE
fd90: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  xpr;..  if( pTab
fda0: 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
fdb0: 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
fdc0: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
fdd0: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
fde0: 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
fdf0: 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
fe00: 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
fe10: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
fe20: 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
fe30: 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
fe40: 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
fe50: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
fe60: 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
fe70: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
fe80: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
fe90: 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
fea0: 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
feb0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
fec0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
fed0: 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
fee0: 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
fef0: 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
ff00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
ff10: 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
ff20: 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
ff30: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
ff40: 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
ff50: 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
ff60: 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
ff70: 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
ff80: 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
ff90: 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
ffa0: 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
ffb0: 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
ffc0: 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
ffd0: 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
ffe0: 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
fff0: 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
10000 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
10010 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
10020 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10030 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
10040 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
10050 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
10060 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
10070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
10080 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
10090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
100a0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
100b0 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
100c0 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
100d0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
100e0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
100f0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
10100 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
10110 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   k++){.        i
10120 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
10130 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
10140 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
10150 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
10160 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f  Idx->keyInfo.aCo
10170 6c 6c 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 6b  ll[k]!=pIndex->k
10180 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20  eyInfo.aColl[k] 
10190 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
101a0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
101b0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20  dx->nColumn ){. 
101c0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
101d0 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
101e0 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
101f0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
10200 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
10210 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
10220 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
10230 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
10240 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
10250 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
10260 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
10270 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
10280 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
10290 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
102a0 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
102b0 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
102c0 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
102d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
102e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
102f0 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
10300 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
10310 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
10320 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
10330 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
10340 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
10350 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
10360 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
10370 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
10380 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ur for the index
10390 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
103a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
103b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
103c0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
103d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
103e0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
103f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10400 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10420 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
10430 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
10440 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
10450 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10460 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
10470 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
10480 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
10490 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
104a0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
104b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
104c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
104d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
104e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
104f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10500 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
10510 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
10520 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
10530 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
10540 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
10550 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
10560 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  s. .  */.  if( !
10570 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
10580 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
10590 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
105a0 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
105b0 61 44 62 5b 70 49 6e 64 65 78 2d 3e 69 44 62 5d  aDb[pIndex->iDb]
105c0 2e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  .idxHash, .     
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
105f0 65 2c 20 73 74 72 6c 65 6e 28 70 49 6e 64 65 78  e, strlen(pIndex
10600 2d 3e 7a 4e 61 6d 65 29 2b 31 2c 20 70 49 6e 64  ->zName)+1, pInd
10610 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
10620 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10630 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
10640 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
10650 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
10660 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
10670 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
10680 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
10690 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
106a0 61 6e 67 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  anges;.  }..  /*
106b0 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
106c0 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
106d0 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
106e0 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
106f0 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
10700 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
10710 20 74 68 65 20 64 69 73 6b 2e 20 20 53 6f 20 64   the disk.  So d
10720 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
10730 68 65 20 64 69 73 6b 0a 20 20 2a 2a 20 61 67 61  he disk.  ** aga
10740 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
10750 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 66 72   table number fr
10760 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
10770 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 0a 20  newTnum field.. 
10780 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
10790 69 74 2e 62 75 73 79 20 26 26 20 70 54 62 6c 4e  it.busy && pTblN
107a0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 70 49  ame!=0 ){.    pI
107b0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
107c0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
107d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
107e0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
107f0 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
10800 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
10810 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
10820 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
10830 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
10840 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
10850 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
10860 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
10870 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
10880 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
10890 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
108a0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
108b0 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
108c0 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
108d0 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
108e0 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
108f0 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
10900 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
10910 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
10920 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
10930 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
10940 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
10950 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
10960 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
10970 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
10980 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
10990 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
109a0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
109b0 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
109c0 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
109d0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
109e0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
109f0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
10a00 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
10a10 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
10a20 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
10a30 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
10a40 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
10a50 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
10a60 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
10a70 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
10a80 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
10a90 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
10aa0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
10ab0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
10ac0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62  */.  else if( db
10ad0 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
10ae0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
10af0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 69 6e   Vdbe *v;.    in
10b00 74 20 6c 62 6c 31 2c 20 6c 62 6c 32 3b 0a 0a 20  t lbl1, lbl2;.. 
10b10 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
10b20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
10b30 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
10b40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
10b50 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 54  ndex;.    if( pT
10b60 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
10b70 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
10b80 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
10b90 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
10ba0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
10bb0 4d 61 73 74 65 72 54 61 62 6c 65 28 76 2c 20 69  MasterTable(v, i
10bc0 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Db);.    }.    s
10bd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10be0 76 2c 20 4f 50 5f 4e 65 77 52 65 63 6e 6f 2c 20  v, OP_NewRecno, 
10bf0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
10c00 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
10c10 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 2c 20 22  String8, 0, 0, "
10c20 69 6e 64 65 78 22 2c 20 50 33 5f 53 54 41 54 49  index", P3_STATI
10c30 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
10c40 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 74 72  dbeOp3(v, OP_Str
10c50 69 6e 67 38 2c 20 30 2c 20 30 2c 20 70 49 6e 64  ing8, 0, 0, pInd
10c60 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
10c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10c80 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  3(v, OP_String8,
10c90 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
10ca0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  me, 0);.    sqli
10cb0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
10cc0 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 30 2c  _CreateIndex, 0,
10cd0 20 69 44 62 2c 28 63 68 61 72 2a 29 26 70 49 6e   iDb,(char*)&pIn
10ce0 64 65 78 2d 3e 74 6e 75 6d 2c 50 33 5f 50 4f 49  dex->tnum,P3_POI
10cf0 4e 54 45 52 29 3b 0a 20 20 20 20 70 49 6e 64 65  NTER);.    pInde
10d00 78 2d 3e 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  x->tnum = 0;.   
10d10 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
10d20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10d30 62 65 43 6f 64 65 28 76 2c 0a 20 20 20 20 20 20  beCode(v,.      
10d40 20 20 20 20 4f 50 5f 44 75 70 2c 20 20 20 20 20      OP_Dup,     
10d50 20 20 30 2c 20 20 20 20 20 20 30 2c 0a 20 20 20    0,      0,.   
10d60 20 20 20 20 20 20 20 4f 50 5f 49 6e 74 65 67 65         OP_Intege
10d70 72 2c 20 20 20 69 44 62 2c 20 20 20 20 30 2c 0a  r,   iDb,    0,.
10d80 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 20 20        0);.      
10d90 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
10da0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
10db0 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  1, 0,.          
10dc0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
10dd0 2a 29 26 70 49 6e 64 65 78 2d 3e 6b 65 79 49 6e  *)&pIndex->keyIn
10de0 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P3_KEYINFO);
10df0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10e00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
10e10 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
10e20 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
10e30 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   && pEnd ){.    
10e40 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
10e50 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  E_None ){.      
10e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10e70 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 43 52  ngeP3(v, -1, "CR
10e80 45 41 54 45 20 49 4e 44 45 58 20 22 2c 20 50 33  EATE INDEX ", P3
10e90 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
10ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10eb0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
10ec0 50 33 28 76 2c 20 2d 31 2c 20 22 43 52 45 41 54  P3(v, -1, "CREAT
10ed0 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 22  E UNIQUE INDEX "
10ee0 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
10ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
10f00 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10f10 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
10f20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 41 64 64  );.      n = Add
10f30 72 28 70 45 6e 64 2d 3e 7a 29 20 2d 20 41 64 64  r(pEnd->z) - Add
10f40 72 28 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 31 3b  r(pName->z) + 1;
10f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f60 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
10f70 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 6e 29 3b 0a  , pName->z, n);.
10f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10f90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
10fa0 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cat, 2, 0);.    
10fb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
10fc0 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
10fd0 65 63 6f 72 64 2c 20 35 2c 20 30 2c 20 22 74 74  ecord, 5, 0, "tt
10fe0 74 69 74 22 2c 20 50 33 5f 53 54 41 54 49 43 29  tit", P3_STATIC)
10ff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11000 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
11010 49 6e 74 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20  IntKey, 0, 0);. 
11020 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
11030 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11040 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11050 49 6e 74 65 67 65 72 2c 20 70 54 61 62 2d 3e 69  Integer, pTab->i
11060 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  Db, 0);.      sq
11070 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11080 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 32  , OP_OpenRead, 2
11090 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 29 3b 0a 20  , pTab->tnum);. 
110a0 20 20 20 20 20 2f 2a 20 56 64 62 65 43 6f 6d 6d       /* VdbeComm
110b0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 54  ent((v, "%s", pT
110c0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 20 2a 2f 0a  ab->zName)); */.
110d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
110e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
110f0 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 32 2c 20 70  NumColumns, 2, p
11100 54 61 62 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  Tab->nCol);.    
11110 20 20 6c 62 6c 32 20 3d 20 73 71 6c 69 74 65 33    lbl2 = sqlite3
11120 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11130 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11140 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
11150 65 77 69 6e 64 2c 20 32 2c 20 6c 62 6c 32 29 3b  ewind, 2, lbl2);
11160 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
11170 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11180 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
11190 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
111a0 64 65 78 4b 65 79 28 76 2c 20 70 49 6e 64 65 78  dexKey(v, pIndex
111b0 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
111c0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
111d0 5f 49 64 78 50 75 74 2c 20 31 2c 20 70 49 6e 64  _IdxPut, 1, pInd
111e0 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
111f0 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  None,.          
11200 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e 64              "ind
11210 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  exed columns are
11220 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20 50 33   not unique", P3
11230 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
11240 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11250 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 32 2c 20  (v, OP_Next, 2, 
11260 6c 62 6c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  lbl1);.      sql
11270 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11280 61 62 65 6c 28 76 2c 20 6c 62 6c 32 29 3b 0a 20  abel(v, lbl2);. 
11290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
112a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
112b0 65 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 2, 0);.      
112c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 2c  (v, OP_Close, 1,
112e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
112f0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
11300 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 54  {.      if( !isT
11310 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  emp ){.        s
11320 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
11330 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a  ie(db, v, iDb);.
11340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11360 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 2c 20 30  , OP_Close, 0, 0
11370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11380 45 6e 64 57 72 69 74 65 4f 70 65 72 61 74 69 6f  EndWriteOperatio
11390 6e 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  n(pParse);.    }
113a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
113b0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
113c0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
113d0 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
113e0 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
113f0 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
11400 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
11410 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
11420 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
11430 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
11440 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
11450 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
11460 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55  t operation of U
11470 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49  PDATE.  ** and I
11480 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  NSERT..  */.  if
11490 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
114a0 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
114b0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
114c0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
114d0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
114e0 6c 61 63 65 29 7b 0a 20 20 20 20 70 49 6e 64 65  lace){.    pInde
114f0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
11500 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61  >pIndex;.    pTa
11510 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
11520 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
11530 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d   Index *pOther =
11540 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
11550 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
11560 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
11570 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
11580 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
11590 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
115a0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
115b0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
115c0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
115d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 4f 74 68  >pNext;.    pOth
115e0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
115f0 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
11600 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61   = 0;..  /* Clea
11610 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
11620 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
11630 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
11640 70 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65 46  pIndex ) sqliteF
11650 72 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 73  ree(pIndex);.  s
11660 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11670 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73  lete(pList);.  s
11680 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
11690 65 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  ete(pTblName);. 
116a0 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
116b0 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
116c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
116d0 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
116e0 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
116f0 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
11700 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
11710 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
11720 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
11730 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
11740 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
11750 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
11760 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
11770 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
11780 3b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  ;.  sqlite *db =
11790 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
117a0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
117b0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
117c0 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
117d0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  rn;.  assert( pN
117e0 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
117f0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
11800 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
11810 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
11820 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
11830 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
11840 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
11850 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11860 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
11870 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
11880 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 70 50  Name, 0);.    pP
11890 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
118a0 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
118b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
118c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
118d0 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a  x->autoIndex ){.
118e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
118f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
11900 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
11910 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
11920 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
11930 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
11940 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
11950 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
11960 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
11970 20 7d 0a 2f 2a 0a 20 20 69 66 28 20 70 49 6e 64   }./*.  if( pInd
11980 65 78 2d 3e 69 44 62 3e 31 20 29 7b 0a 20 20 20  ex->iDb>1 ){.   
11990 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
119a0 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
119b0 20 61 6c 74 65 72 20 73 63 68 65 6d 61 20 6f 66   alter schema of
119c0 20 61 74 74 61 63 68 65 64 20 22 0a 20 20 20 20   attached ".    
119d0 20 20 20 22 64 61 74 61 62 61 73 65 73 22 2c 20     "databases", 
119e0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
119f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
11a00 7d 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.*/.#ifndef SQL
11a10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11a20 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
11a30 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
11a40 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
11a50 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
11a60 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
11a70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11a80 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 49 6e  Db = db->aDb[pIn
11a90 64 65 78 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 3b  dex->iDb].zName;
11aa0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
11ab0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
11ac0 41 42 4c 45 28 70 49 6e 64 65 78 2d 3e 69 44 62  ABLE(pIndex->iDb
11ad0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
11ae0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11af0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
11b00 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
11b10 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
11b20 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
11b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
11b40 6e 64 65 78 2d 3e 69 44 62 20 29 20 63 6f 64 65  ndex->iDb ) code
11b50 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
11b60 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
11b70 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11b80 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
11b90 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
11ba0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
11bb0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
11bc0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
11bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
11be0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
11bf0 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
11c00 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
11c10 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
11c20 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
11c30 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11c40 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
11c50 0a 20 20 20 20 73 74 61 74 69 63 20 56 64 62 65  .    static Vdbe
11c60 4f 70 4c 69 73 74 20 64 72 6f 70 49 6e 64 65 78  OpList dropIndex
11c70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 4f  [] = {.      { O
11c80 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30 2c  P_Rewind,     0,
11c90 20 41 44 44 52 28 39 29 2c 20 30 7d 2c 20 0a 20   ADDR(9), 0}, . 
11ca0 20 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67       { OP_String
11cb0 38 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20 20  8,     0, 0,    
11cc0 20 20 20 30 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20     0}, /* 1 */. 
11cd0 20 20 20 20 20 7b 20 4f 50 5f 4d 65 6d 53 74 6f       { OP_MemSto
11ce0 72 65 2c 20 20 20 31 2c 20 31 2c 20 20 20 20 20  re,   1, 1,     
11cf0 20 20 30 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50    0},.      { OP
11d00 5f 4d 65 6d 4c 6f 61 64 2c 20 20 20 20 31 2c 20  _MemLoad,    1, 
11d10 30 2c 20 20 20 20 20 20 20 30 7d 2c 20 2f 2a 20  0,       0}, /* 
11d20 33 20 2a 2f 0a 20 20 20 20 20 20 7b 20 4f 50 5f  3 */.      { OP_
11d30 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c 20 31  Column,     0, 1
11d40 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  ,       0},.    
11d50 20 20 7b 20 4f 50 5f 45 71 2c 20 20 20 20 20 20    { OP_Eq,      
11d60 20 20 20 30 2c 20 41 44 44 52 28 38 29 2c 20 30     0, ADDR(8), 0
11d70 7d 2c 0a 20 20 20 20 20 20 7b 20 4f 50 5f 4e 65  },.      { OP_Ne
11d80 78 74 2c 20 20 20 20 20 20 20 30 2c 20 41 44 44  xt,       0, ADD
11d90 52 28 33 29 2c 20 30 7d 2c 0a 20 20 20 20 20 20  R(3), 0},.      
11da0 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 20  { OP_Goto,      
11db0 20 30 2c 20 41 44 44 52 28 39 29 2c 20 30 7d 2c   0, ADDR(9), 0},
11dc0 0a 20 20 20 20 20 20 7b 20 4f 50 5f 44 65 6c 65  .      { OP_Dele
11dd0 74 65 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 20  te,     0, 0,   
11de0 20 20 20 20 30 7d 2c 20 2f 2a 20 38 20 2a 2f 0a      0}, /* 8 */.
11df0 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 62      };.    int b
11e00 61 73 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ase;..    sqlite
11e10 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
11e20 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
11e30 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
11e40 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
11e50 74 65 72 54 61 62 6c 65 28 76 2c 20 70 49 6e 64  terTable(v, pInd
11e60 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20 20 62 61  ex->iDb);.    ba
11e70 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
11e80 41 64 64 4f 70 4c 69 73 74 28 76 2c 20 41 72 72  AddOpList(v, Arr
11e90 61 79 53 69 7a 65 28 64 72 6f 70 49 6e 64 65 78  aySize(dropIndex
11ea0 29 2c 20 64 72 6f 70 49 6e 64 65 78 29 3b 0a 20  ), dropIndex);. 
11eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11ec0 61 6e 67 65 50 33 28 76 2c 20 62 61 73 65 2b 31  angeP3(v, base+1
11ed0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
11ee0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e   0);.    if( pIn
11ef0 64 65 78 2d 3e 69 44 62 21 3d 31 20 29 7b 0a 20  dex->iDb!=1 ){. 
11f00 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e       sqlite3Chan
11f10 67 65 43 6f 6f 6b 69 65 28 64 62 2c 20 76 2c 20  geCookie(db, v, 
11f20 70 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20  pIndex->iDb);.  
11f30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
11f40 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
11f50 6c 6f 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  lose, 0, 0);.   
11f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f70 70 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  p(v, OP_Destroy,
11f80 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 70   pIndex->tnum, p
11f90 49 6e 64 65 78 2d 3e 69 44 62 29 3b 0a 20 20 20  Index->iDb);.   
11fa0 20 73 71 6c 69 74 65 33 45 6e 64 57 72 69 74 65   sqlite3EndWrite
11fb0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
11fc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
11fd0 65 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ete the in-memor
11fe0 79 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  y description of
11ff0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
12000 2f 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  /.  if( !pParse-
12010 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
12020 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
12030 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
12040 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 64 62 2d  pIndex);.    db-
12050 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
12060 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
12070 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
12080 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
12090 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4e 61  rcListDelete(pNa
120a0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  me);.}../*.** Ap
120b0 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
120c0 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
120d0 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
120e0 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
120f0 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
12100 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
12110 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
12120 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
12130 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
12140 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
12150 70 70 65 6e 64 28 49 64 4c 69 73 74 20 2a 70 4c  ppend(IdList *pL
12160 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
12170 65 6e 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  en){.  if( pList
12180 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
12190 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
121a0 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
121b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
121c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
121d0 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
121e0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  c = 0;.  }.  if(
121f0 20 70 4c 69 73 74 2d 3e 6e 49 64 3e 3d 70 4c 69   pList->nId>=pLi
12200 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  st->nAlloc ){.  
12210 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
12220 69 74 65 6d 20 2a 61 3b 0a 20 20 20 20 70 4c 69  item *a;.    pLi
12230 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69  st->nAlloc = pLi
12240 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 35  st->nAlloc*2 + 5
12250 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
12260 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
12270 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  , pList->nAlloc*
12280 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
12290 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  0]) );.    if( a
122a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
122b0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
122c0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
122d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
122e0 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61 3b     pList->a = a;
122f0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
12300 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
12310 49 64 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Id], 0, sizeof(p
12320 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
12330 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
12340 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
12350 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
12360 49 64 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73  Id].zName;.    s
12370 71 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67  qlite3SetNString
12380 28 70 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  (pz, pToken->z, 
12390 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
123a0 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b     if( *pz==0 ){
123b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
123c0 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
123d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
123e0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
123f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
12400 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20  te(*pz);.    }. 
12410 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 6e 49 64 2b   }.  pList->nId+
12420 2b 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  +;.  return pLis
12430 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  t;.}../*.** Appe
12440 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
12450 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
12460 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
12470 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
12480 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
12490 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
124a0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
124b0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
124c0 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  oken is NULL..**
124d0 0a 2a 2a 20 41 20 6e 65 77 20 53 72 63 4c 69 73  .** A new SrcLis
124e0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
124f0 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
12500 28 29 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () fails..**.** 
12510 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
12520 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
12530 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
12540 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
12550 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
12560 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
12570 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
12580 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
12590 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
125a0 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
125b0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
125c0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
125d0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
125e0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
125f0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
12600 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
12610 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
12620 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
12630 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
12640 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
12650 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
12660 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
12670 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
12680 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
12690 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
126a0 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
126b0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
126c0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
126d0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
126e0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
126f0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
12700 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
12710 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
12720 69 73 74 41 70 70 65 6e 64 28 41 2c 42 2c 30 29  istAppend(A,B,0)
12730 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
12740 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
12750 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
12760 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
12770 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
12780 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
12790 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
127a0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
127b0 28 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  (A,B,C);.**.** T
127c0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
127d0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
127e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
127f0 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
12800 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
12810 70 65 6e 64 28 53 72 63 4c 69 73 74 20 2a 70 4c  pend(SrcList *pL
12820 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62  ist, Token *pTab
12830 6c 65 2c 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  le, Token *pData
12840 62 61 73 65 29 7b 0a 20 20 69 66 28 20 70 4c 69  base){.  if( pLi
12850 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
12860 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
12870 63 28 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  c( sizeof(SrcLis
12880 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
12890 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
128a0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
128b0 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
128c0 69 66 28 20 70 4c 69 73 74 2d 3e 6e 53 72 63 3e  if( pList->nSrc>
128d0 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
128e0 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
128f0 4e 65 77 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  New;.    pList->
12900 6e 41 6c 6c 6f 63 20 2a 3d 20 32 3b 0a 20 20 20  nAlloc *= 2;.   
12910 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 52 65   pNew = sqliteRe
12920 61 6c 6c 6f 63 28 70 4c 69 73 74 2c 0a 20 20 20  alloc(pList,.   
12930 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
12940 6f 66 28 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c  of(*pList) + (pL
12950 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ist->nAlloc-1)*s
12960 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
12970 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
12980 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
12990 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
129a0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ete(pList);.    
129b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
129c0 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  }.    pList = pN
129d0 65 77 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ew;.  }.  memset
129e0 28 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74  (&pList->a[pList
129f0 2d 3e 6e 53 72 63 5d 2c 20 30 2c 20 73 69 7a 65  ->nSrc], 0, size
12a00 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
12a10 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
12a20 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
12a30 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
12a40 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
12a50 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
12a60 26 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  & pTable ){.    
12a70 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
12a80 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
12a90 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
12aa0 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
12ab0 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Temp;.  }.  if( 
12ac0 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 63 68  pTable ){.    ch
12ad0 61 72 20 2a 2a 70 7a 20 3d 20 26 70 4c 69 73 74  ar **pz = &pList
12ae0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 5d  ->a[pList->nSrc]
12af0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69  .zName;.    sqli
12b00 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a  te3SetNString(pz
12b10 2c 20 70 54 61 62 6c 65 2d 3e 7a 2c 20 70 54 61  , pTable->z, pTa
12b20 62 6c 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ble->n, 0);.    
12b30 69 66 28 20 2a 70 7a 3d 3d 30 20 29 7b 0a 20 20  if( *pz==0 ){.  
12b40 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
12b50 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
12b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
12b70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12b80 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
12b90 28 2a 70 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (*pz);.    }.  }
12ba0 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
12bb0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
12bc0 7a 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  z = &pList->a[pL
12bd0 69 73 74 2d 3e 6e 53 72 63 5d 2e 7a 44 61 74 61  ist->nSrc].zData
12be0 62 61 73 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  base;.    sqlite
12bf0 33 53 65 74 4e 53 74 72 69 6e 67 28 70 7a 2c 20  3SetNString(pz, 
12c00 70 44 61 74 61 62 61 73 65 2d 3e 7a 2c 20 70 44  pDatabase->z, pD
12c10 61 74 61 62 61 73 65 2d 3e 6e 2c 20 30 29 3b 0a  atabase->n, 0);.
12c20 20 20 20 20 69 66 28 20 2a 70 7a 3d 3d 30 20 29      if( *pz==0 )
12c30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
12c40 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  rcListDelete(pLi
12c50 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
12c60 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 0;.    }else{.
12c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71        sqlite3Deq
12c80 75 6f 74 65 28 2a 70 7a 29 3b 0a 20 20 20 20 7d  uote(*pz);.    }
12c90 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
12ca0 70 4c 69 73 74 2d 3e 6e 53 72 63 5d 2e 69 43 75  pList->nSrc].iCu
12cb0 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 4c 69  rsor = -1;.  pLi
12cc0 73 74 2d 3e 6e 53 72 63 2b 2b 3b 0a 20 20 72 65  st->nSrc++;.  re
12cd0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
12ce0 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 63 75 72 73  *.** Assign curs
12cf0 6f 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ors to all table
12d00 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
12d10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
12d20 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
12d30 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
12d40 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
12d50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
12d60 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
12d70 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
12d80 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
12d90 69 43 75 72 73 6f 72 3c 30 20 29 7b 0a 20 20 20  iCursor<0 ){.   
12da0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69     pList->a[i].i
12db0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
12dc0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >nTab++;.    }. 
12dd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
12de0 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
12df0 6c 61 73 74 20 69 64 65 6e 74 69 66 69 65 72 20  last identifier 
12e00 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 69 64 65  on the given ide
12e10 6e 74 69 66 69 65 72 20 6c 69 73 74 2e 0a 2a 2f  ntifier list..*/
12e20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
12e30 4c 69 73 74 41 64 64 41 6c 69 61 73 28 53 72 63  ListAddAlias(Src
12e40 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
12e50 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
12e60 66 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  f( pList && pLis
12e70 74 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  t->nSrc>0 ){.   
12e80 20 69 6e 74 20 69 20 3d 20 70 4c 69 73 74 2d 3e   int i = pList->
12e90 6e 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 73 71  nSrc - 1;.    sq
12ea0 6c 69 74 65 33 53 65 74 4e 53 74 72 69 6e 67 28  lite3SetNString(
12eb0 26 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  &pList->a[i].zAl
12ec0 69 61 73 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ias, pToken->z, 
12ed0 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 30 29 3b 0a 20  pToken->n, 0);. 
12ee0 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
12ef0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  e(pList->a[i].zA
12f00 6c 69 61 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  lias);.  }.}../*
12f10 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64  .** Delete an Id
12f20 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  List..*/.void sq
12f30 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
12f40 65 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  e(IdList *pList)
12f50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
12f60 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
12f70 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
12f80 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
12f90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
12fa0 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
12fb0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
12fc0 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
12fd0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
12fe0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
12ff0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
13000 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
13010 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
13020 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
13030 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
13040 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13050 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
13060 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
13070 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
13080 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
13090 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
130a0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
130b0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
130c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
130d0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
130e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
130f0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
13100 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
13110 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   -1;.}../*.** De
13120 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
13130 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
13140 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
13150 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
13160 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
13170 65 74 65 28 53 72 63 4c 69 73 74 20 2a 70 4c 69  ete(SrcList *pLi
13180 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
13190 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
131a0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
131b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
131c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
131d0 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  eFree(pList->a[i
131e0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
131f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
13200 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
13210 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
13220 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69  pList->a[i].zAli
13230 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  as);.    if( pLi
13240 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 20 26 26  st->a[i].pTab &&
13250 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61   pList->a[i].pTa
13260 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 29  b->isTransient )
13270 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
13280 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 4c  eleteTable(0, pL
13290 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 3b  ist->a[i].pTab);
132a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
132b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
132c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65  List->a[i].pSele
132d0 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
132e0 45 78 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74  ExprDelete(pList
132f0 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b 0a 20 20 20  ->a[i].pOn);.   
13300 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
13310 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  lete(pList->a[i]
13320 2e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  .pUsing);.  }.  
13330 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
13340 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  );.}../*.** Begi
13350 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
13360 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
13370 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
13380 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
13390 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
133a0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20  Vdbe *v;..  if( 
133b0 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62  pParse==0 || (db
133c0 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20  =pParse->db)==0 
133d0 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  || db->aDb[0].pB
133e0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
133f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
13400 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  r || sqlite3_mal
13410 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
13420 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
13430 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13440 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
13450 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
13460 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
13470 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
13480 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13490 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
134a0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
134b0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 75 74 6f  AddOp(v, OP_Auto
134c0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
134d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
134e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
134f0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
13500 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
13510 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
13520 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
13530 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50  be *v;..  if( pP
13540 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
13550 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
13560 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
13570 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
13580 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
13590 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  || sqlite3_mallo
135a0 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72  c_failed ) retur
135b0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
135c0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
135d0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
135e0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
135f0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
13600 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13610 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13620 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
13630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13640 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
13650 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 0);.  }.}../
13660 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
13670 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
13680 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
13690 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ackTransaction(P
136a0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
136b0 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56   sqlite *db;.  V
136c0 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
136d0 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
136e0 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
136f0 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
13700 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13710 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
13720 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
13730 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
13740 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
13750 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13760 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
13770 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
13780 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  ", 0, 0) ) retur
13790 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  n;..  v = sqlite
137a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
137b0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
137c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
137d0 70 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  p(v, OP_AutoComm
137e0 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
137f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
13800 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
13810 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
13820 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
13830 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
13840 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
13850 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
13860 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
13870 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
13880 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
13890 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
138a0 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
138b0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
138c0 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
138d0 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
138e0 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
138f0 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
13900 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
13910 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
13920 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
13930 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
13940 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
13950 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
13960 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
13970 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
13980 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13990 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
139a0 4f 50 5f 47 6f 73 75 62 20 74 68 61 74 0a 2a 2a  OP_Gosub that.**
139b0 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
139c0 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
139d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
139e0 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
139f0 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
13a00 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
13a10 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
13a20 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
13a30 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
13a40 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
13a50 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
13a60 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
13a70 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
13a80 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
13a90 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
13aa0 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
13ab0 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
13ac0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
13ad0 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
13ae0 64 20 74 68 65 20 4f 50 5f 47 6f 73 75 62 20 50  d the OP_Gosub P
13af0 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
13b00 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
13b10 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
13b20 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
13b30 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
13b40 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
13b50 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
13b60 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
13b70 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
13b80 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  g()..*/.void sql
13b90 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
13ba0 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
13bb0 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
13bc0 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 56 64  sqlite *db;.  Vd
13bd0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73  be *v;.  int mas
13be0 6b 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  k;..  v = sqlite
13bf0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13c00 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
13c10 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
13c20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
13c30 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
13c40 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20  r error */.  db 
13c50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
13c60 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
13c70 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
13c80 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
13c90 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
13ca0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
13cb0 73 65 72 74 28 20 69 44 62 3c 33 32 20 29 3b 0a  sert( iDb<32 );.
13cc0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
13cd0 6f 6b 69 65 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20  okieMask==0 ){. 
13ce0 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
13cf0 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  eGoto = sqlite3V
13d00 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
13d10 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  oto, 0, 0);.  }.
13d20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b    mask = 1<<iDb;
13d30 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
13d40 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73  cookieMask & mas
13d50 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  k)==0 ){.    pPa
13d60 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
13d70 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 70 50 61  |= mask;.    pPa
13d80 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
13d90 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
13da0 69 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b  iDb].schema_cook
13db0 69 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ie;.  }.}../*.**
13dc0 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
13dd0 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
13de0 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
13df0 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
13e00 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
13e10 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
13e20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
13e30 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
13e40 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
13e50 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
13e60 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
13e70 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
13e80 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
13e90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
13ea0 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
13eb0 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
13ec0 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
13ed0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
13ee0 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
13ef0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
13f00 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
13f10 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
13f20 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
13f30 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
13f40 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
13f50 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
13f60 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
13f70 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
13f80 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
13f90 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
13fa0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
13fb0 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
13fc0 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
13fd0 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
13fe0 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
13ff0 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
14000 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
14010 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
14020 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
14030 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
14040 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
14050 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
14060 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64 61  t..**.** Only da
14070 74 61 62 61 73 65 20 69 44 62 20 61 6e 64 20 74  tabase iDb and t
14080 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
14090 20 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62   are made writab
140a0 6c 65 20 62 79 20 74 68 69 73 20 63 61 6c 6c 2e  le by this call.
140b0 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 2c 20 74  .** If iDb==0, t
140c0 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 61 6e 64  hen the main and
140d0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 73 20   temp databases 
140e0 61 72 65 20 6d 61 64 65 20 77 72 69 74 61 62 6c  are made writabl
140f0 65 2e 20 20 20 49 66 0a 2a 2a 20 69 44 62 3d 3d  e.   If.** iDb==
14100 31 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20  1 then only the 
14110 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 69 73  temp database is
14120 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20   made writable. 
14130 20 49 66 20 69 44 62 3e 31 20 74 68 65 6e 20 74   If iDb>1 then t
14140 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
14150 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
14160 73 65 20 61 6e 64 20 74 68 65 20 74 65 6d 70 20  se and the temp 
14170 64 61 74 61 62 61 73 65 20 61 72 65 20 6d 61 64  database are mad
14180 65 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 76  e writable..*/.v
14190 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
141a0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
141b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
141c0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
141d0 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
141e0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
141f0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
14200 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
14210 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  n;.  sqlite3Code
14220 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
14230 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61  rse, iDb);.  pPa
14240 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  rse->writeMask |
14250 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20  = 1<<iDb;.  if( 
14260 73 65 74 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  setStatement ){.
14270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14280 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 61 74 65  ddOp(v, OP_State
14290 6d 65 6e 74 2c 20 69 44 62 2c 20 30 29 3b 0a 20  ment, iDb, 0);. 
142a0 20 7d 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20   }.  if( iDb!=1 
142b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
142c0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
142d0 6e 28 70 50 61 72 73 65 2c 20 73 65 74 53 74 61  n(pParse, setSta
142e0 74 65 6d 65 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a  tement, 1);.  }.
142f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14300 65 20 63 6f 64 65 20 74 68 61 74 20 63 6f 6e 63  e code that conc
14310 6c 75 64 65 73 20 61 6e 20 6f 70 65 72 61 74 69  ludes an operati
14320 6f 6e 20 74 68 61 74 20 6d 61 79 20 68 61 76 65  on that may have
14330 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 68 65 20   changed.** the 
14340 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 61 20  database.  If a 
14350 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14360 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
14370 64 2c 20 74 68 65 6e 20 65 6d 69 74 0a 2a 2a 20  d, then emit.** 
14380 61 6e 20 4f 50 5f 43 6f 6d 6d 69 74 20 74 68 61  an OP_Commit tha
14390 74 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  t will cause the
143a0 20 63 68 61 6e 67 65 73 20 74 6f 20 62 65 20 63   changes to be c
143b0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
143c0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
143d0 74 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 72  t checkpoints ar
143e0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
143f0 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65  committed at the
14400 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 73 74 61   end of.** a sta
14410 74 65 6d 65 6e 74 2e 20 20 4e 6f 74 65 20 61 6c  tement.  Note al
14420 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 63 61  so that there ca
14430 6e 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 63 61  n be multiple ca
14440 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
14450 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
14460 61 74 69 6f 6e 28 29 20 62 75 74 20 74 68 65 72  ation() but ther
14470 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
14480 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63 61 6c   a single.** cal
14490 6c 20 74 6f 20 73 71 6c 69 74 65 33 45 6e 64 57  l to sqlite3EndW
144a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 29 20  riteOperation() 
144b0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
144c0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
144d0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
144e0 74 65 33 45 6e 64 57 72 69 74 65 4f 70 65 72 61  te3EndWriteOpera
144f0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
14500 73 65 29 7b 0a 20 20 2f 2a 20 44 65 6c 65 74 65  se){.  /* Delete
14510 20 6d 65 21 20 2a 2f 0a 20 20 72 65 74 75 72 6e   me! */.  return
14520 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  ;.}../* .** Retu
14530 72 6e 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  rn the transient
14540 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 6f   sqlite3_value o
14550 62 6a 65 63 74 20 75 73 65 64 20 66 6f 72 20 65  bject used for e
14560 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 73 69  ncoding conversi
14570 6f 6e 73 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51  ons.** during SQ
14580 4c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 2a  L compilation..*
14590 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  /.sqlite3_value 
145a0 2a 73 71 6c 69 74 65 33 47 65 74 54 72 61 6e 73  *sqlite3GetTrans
145b0 69 65 6e 74 56 61 6c 75 65 28 73 71 6c 69 74 65  ientValue(sqlite
145c0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 21 64 62   *db){.  if( !db
145d0 2d 3e 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ->pValue ){.    
145e0 64 62 2d 3e 70 56 61 6c 75 65 20 3d 20 73 71 6c  db->pValue = sql
145f0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
14600 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
14610 3e 70 56 61 6c 75 65 3b 0a 7d 0a 0a              >pValue;.}..